Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
Appearance settings
Создание пары ключей SSH
Настоящая инструкция применима к Windows.
- Установить OpenSSH.
- Запустить
cmd.exe
,powershell.exe
илиbash.exe
. - Создать новый ключ с помощью команды
ssh-keygen
:
ssh-keygen -t ed25519 -C "<опциональный_комментарий>"
Вы можете передать в параметре
-C
пустую строку, чтобы не добавлять комментарий, или не указывать параметр-C
вообще — в таком случае будет добавлен комментарий по умолчанию.
После выполнения команды вам будет предложено указать имя и путь к файлам с ключами, а также ввести пароль (passphrase) для закрытого ключа. Если задать только имя, пара ключей будет создана в текущей директории. Открытый ключ будет сохранен в файле с расширением .pub
, закрытый ключ — в файле без расширения.
По умолчанию команда предлагает сохранить ключ под именем id_ed25519
в папку C:\Users\<имя_пользователя>/.ssh
. Если в этой директории уже есть SSH-ключ с именем id_ed25519
, вы можете случайно перезаписать его и потерять доступ к ресурсам, в которых он используется. Поэтому рекомендуется использовать уникальные имена для всех SSH-ключей.
Подключение к ВМ
Для подключения к ВМ в командной строке выполните команду:
ssh -i <путь_к_ключу\имя_файла_ключа> <имя_пользователя>@<публичный_IP-адрес_ВМ>
При первом подключении к ВМ появится предупреждение о неизвестном хосте:
The authenticity of host '89.169.132.223 (89.169.132.223)' can't be established.
ECDSA key fingerprint is SHA256:DfjfFB+in0q0MGi0HnqLNMdHssLfm1yRanB********.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Введите в командной строке yes
и нажмите Enter.
📂 Yandex Cloud
Последнее изменение: 23.09.2024 15:20
Кратко:
- Доступ к серийной консоли возможен через SSH, консоль управления Yandex Cloud или CLI.
- Для подключения по SSH необходимо знать идентификатор и имя пользователя.
- Шаблон команды подключения для Linux: ssh -t -p 9600 -o IdentitiesOnly=yes -i ~/.ssh/<имя закрытого ключа> .<имя пользователя>@serialssh.cloud.yandex.net.
- Для отключения от серийной консоли нажмите Enter, затем введите ~ (тильда и точка) или используйте Ctrl + D.
- Вход через консоль управления: используйте логин и пароль, установленные при подключении к ВМ.
Получаем доступ к серийной консоли
Работа серийной консоли зависит от настроек операционной системы. Yandex Compute Cloud обеспечивает канал связи между пользователем и COM-портом ВМ, но не гарантирует стабильность работы консоли со стороны операционной системы ВМ.
Доступ к серийной консоли ВМ с ОС на базе Linux возможен следующими способами:
- по протоколу SSH с другого компьютера;
- через консоль управления Yandex Cloud;
- с помощью интерфейса командной строки Yandex Cloud CLI. Подробнее работу с CLI мы рассмотрим в одной из следующих практических работ.
Вход по протоколу SSH
- Подключитесь к ВМ по протоколу SSH. Установите пароль текущему пользователю с помощью утилиты
passwd
в привилегированном режиме:
sudo passwd <имя_пользователя>
После ввода команды дважды наберите одинаковый пароль.
-
Для доступа к серийной консоли ВМ необходимо знать её идентификатор (ID). В консоли управления перейдите в раздел Compute Cloud. По умолчанию откроется страница со списком ВМ. В столбце справа указан идентификатор каждой ВМ.
-
Используйте для входа идентификатор ВМ и имя (логин) созданного в ней пользователя. Вот шаблон команды подключения для Linux:
ssh -t -p 9600 -o IdentitiesOnly=yes -i ~/.ssh/<имя закрытого ключа> <ID виртуальной машины>.<имя пользователя>@serialssh.cloud.yandex.net
- Вот так вы подключитесь к консоли, если в ВМ с ID
fhm0b28lgfp4tkoa3jl6
есть пользовательyc-user
:
ssh -t -p 9600 -o IdentitiesOnly=yes -i ~/.ssh/id_rsa Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
- Введите установленный ранее пароль.
- Чтобы отключиться от серийной консоли, нажмите клавишу
Enter
, а затем введите символы~.
(тильда и точка). В терминалах Linux для отключения также можно использовать комбинацию клавиш Ctrl + D.
Вход через консоль управления
В консоли управления откройте страницу ВМ и через меню слева перейдите на страницу Серийная консоль. При авторизации используйте логин, указанный при создании ВМ, и пароль, который вы установили после подключения к ней.
- Категория: Cloud Services Engineer
-
Просмотров: 295
В чём, собственно, проблема зайти на виртуальную машину в облаке по SSH?
Во-первых чтобы зайти на виртуальную машину по SSH, ни о чём не думая, нужно держать
на ней белый адрес IP, за который, по естественным в наше время причинам,
облачные провайдеры просят отдельных денег. Которые при массовом использовании
становятся заметными.
Во-вторых, если мы плюнули и потратились на внешние адреса для всех виртуалок,
к которым нужен доступ по SSH, мы оказываемся должны ещё плюнуть и потратиться
на организацию и поддержку файрволла для защиты сервисов, установленных на этих
виртуалках.
Традиционно обозначенные проблемы решаются при помощи т.н. хоста-бастиона.
Заводится хост, на который есть доступ из внешней сети, с которого, в свою
очередь, есть доступ во внутреннюю сеть. Ко всем остальным хостам есть доступ
только из внутренней сети. Оператор заходит по SSH на бастион и оттуда, уже
имея доступ к внутренним адресам, на конечную машину.
В этом подходе вопросы может вызвать задача сопоставления имени внутренней
машины её адресу IP. Традиционно заводится сервер DNS с поддержкой внутренней
зоны. При разумном количестве статических адресов соответствие можно прописывать
прямо при помощи ssh_config. Как мы суть облачные жители, для определения
адресов воспользуемся API облака.
Предполагаем, что в каждом каталоге уже создана виртуальная машина под
названием bastion-0 и на всех виртуальных машинах облака созданы учётные
записи оператора с ключами ssh.
Заведём профиль для каждого каталога нашего облака и настроим SSH так, чтобы
на виртуальную машину можно было попасть по псевдоадресу
<instance-name>.<profile>.
Для настройки профиля можно запустить yc init и далее идти по диалогам:
> yc init Welcome! This command will take you through the configuration process. Pick desired action: [1] Re-initialize this profile 'default' with new settings [2] Create a new profile Please enter your numeric choice: 2 Enter profile name. Names start with a lower case letter and contain only lower case letters a-z, digits 0-9, and hyphens '-': prod Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id=QMbwL7XPUHpyRdEAwr9o2RWVmuc4dyf7 in order to obtain OAuth token. Please enter OAuth token: zqHooQukL47xAGXL7od68jYnWLGVZOs4q_F0XQ4 You have one cloud available: 'mycloyd' (id = j1rhzWJevebiwI9x40fe). It is going to be used by default. Please choose folder to use: [1] prod (id = zss8DfD5hWRGvmSeZTcq) [2] dev (id = guLhrfu4uPfUtQeynPUp) Please enter your numeric choice: 1 Your current folder has been set to 'prod' (id = zss8DfD5hWRGvmSeZTcq). Do you want to configure a default Compute zone? [Y/n] n >
И так для каждого каталога. Если уже известен токен OAuth, возможно, удобнее
будет просто отредактировать файл ~/.config/yandex-cloud/config.yaml:
current: dev profiles: prod: token: zqHooQukL47xAGXL7od68jYnWLGVZOs4q_F0XQ4 cloud-id: j1rhzWJevebiwI9x40fe folder-id: zss8DfD5hWRGvmSeZTcq dev: token: zqHooQukL47xAGXL7od68jYnWLGVZOs4q_F0XQ4 cloud-id: j1rhzWJevebiwI9x40fe folder-id: guLhrfu4uPfUtQeynPUp
Для профилей заведём в ~/.ssh/config записи:
Host *.prod ProxyCommand yc_ssh_proxy %h %p bastion-0 Host *.dev ProxyCommand yc_ssh_proxy %h %p bastion-0
Основной скрипт yc_ssh_proxy разместим по пути, перечисленному в $PATH
(мне удобно держать в ~/bin/). Для работы скрипта понадобится python. Так
получилось.
#!/bin/sh # # Usage: yc_ssh_proxy host.env port bastion # HOST=$(echo $1 | cut -d. -f1) PROFILE=$(echo $1 | cut -d. -f2) instance() { yc --profile $PROFILE compute instance get $1 --format json; } prop() { cat | python -c "import json;import sys;print(json.load(sys.stdin)['network_interfaces'][0]['primary_v4_address']$1)"; } ADDR=$(instance $HOST | prop '["address"]') BASTION=$(instance $3 | prop '["one_to_one_nat"]["address"]') exec ssh -W $ADDR:$2 -q $BASTION
Проверим доступность машин облака по ssh:
> yc --profile prod compute instance list +----------------------+---------------------------+---------------+---------+---------------+-------------+ | ID | NAME | ZONE ID | STATUS | EXTERNAL IP | INTERNAL IP | +----------------------+---------------------------+---------------+---------+---------------+-------------+ | yisv06r81u30jn925rhp | ut6ikj8lxmgmo4ikmymt-bl7c | ru-central1-a | RUNNING | | 10.2.0.23 | | fnyxiigmjy547fmr19l9 | bastion-0 | ru-central1-a | RUNNING | 152.2.34.233 | 10.4.0.36 | +----------------------+---------------------------+---------------+---------+---------------+-------------+ > ssh ut6ikj8lxmgmo4ikmymt-bl7c.prod Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-55-generic x86_64) . . . admin@ut6ikj8lxmgmo4ikmymt-bl7c:~$
Замечу, что при таком подходе статический адрес бастиону не требуется, он будет
запрашиваться по Cloud API. Прерываемой же машину делать не стоит, замучаешься
адреса подтверждать.
p.s.
Недавно снова нашёл потерянный репозиторий с плагином ansible inventory для
облака Яндекс. На радостях добавлю пример настройки inventory для доступа к
нодам кластера Managed Kubernetes.
Пока Яндекс определяется, как распространять плагин, положим его в
~/.ansible/plugins/inventory:
mkdir -p ~/.ansible/plugins/inventory curl https://raw.githubusercontent.com/st8f/community.general/yc_compute/plugins/inventory/yc_compute.py > ~/.ansible/plugins/inventory/yc_compute.py
Inventory запишем в файл yc_compute.yml:
plugin: community.general.yc_compute folders: - zss8DfD5hWRGvmSeZTcq filters: - labels['managed-kubernetes-cluster-id'] == 'catsv06r81u30jn925rh' auth_kind: oauth hostnames: - "{{ name }}.prod" keyed_groups: - key: labels['managed-kubernetes-node-group-id'] prefix: node_group
Вся соль здесь в ключе hostnames. Там каждой машине назначается имя, которое
распознаёт настроенный нами клиент ssh. filters отбирает только машины
заданного кластера (см. yc managed-kubernetes cluster list), а
keyed_groups группирует их по ID групп инстансов. Связь проверим командой
> ansible all -i yc_compute.yml -m ping -o ut6ikj8lxmgmo4ikmymt-bl7c.prod | SUCCESS => {"changed": false,"ping": "pong"}