open atlas
↑ К треку
Командная строка CLI · 09 · 01

Основы SSH

ssh открывает зашифрованную оболочку. TOFU: прими ключ хоста однажды — SSH предупредит при изменении. ~/.ssh/config хранит псевдонимы хостов, пользователей, портов.

CLI Senior ◷ 25 min
Уровень
ОсновыJuniorMiddleSenior

Каждая производственная задача, которую нельзя выполнить локально — деплой кода, просмотр логов, перезапуск сервиса, отладка запущенного процесса — требует удалённой оболочки. SSH (Secure Shell) — это такая оболочка. Он шифрует всё между твоим терминалом и удалённым хостом, чтобы ничего не утекло по сети. Но SSH также имеет свои принципы: при первом подключении к хосту он просит проверить его личность. Этот запрос — не шум, а механизм доверия, защищающий тебя от подключения к неправильной машине. Понимание этого отличает дисциплинированного оператора от того, кто слепо печатает «yes» на всё подряд.

К концу урока ты поймёшь базовый синтаксис ssh user@host, запрос ключа хоста и что означает Trust On First Use (TOFU), флаг -p для нестандартных портов, и как ~/.ssh/config устраняет когнитивную нагрузку от запоминания флагов для каждого сервера.

Цель

После этого урока ты сможешь открыть удалённую оболочку командой ssh user@host, объяснить, что означает запрос отпечатка ключа хоста и почему его принятие — одноразовое обязательство, подключиться к нестандартному порту через -p, и создать записи ~/.ssh/config с Host, HostName, User и Port, чтобы печатать ssh prod вместо ssh deploy@server.example -p 2222.

1

ssh user@host открывает зашифрованную интерактивную оболочку на удалённой машине. Синтаксис прост: user — это Unix-аккаунт на удалённой стороне; host — имя хоста или IP-адрес.

ssh deploy@server.example

SSH согласовывает зашифрованный канал (асимметричная криптография для обмена ключами, симметричная для основных данных), аутентифицирует тебя (по паролю или ключу — об этом в следующем уроке) и переводит тебя в оболочку на удалённой машине. Ввод из терминала передаётся по зашифрованному каналу; удалённый вывод возвращается тем же путём.

ssh deploy@198.51.100.10          # подключение по IP
ssh deploy@server.example -p 2222 # нестандартный порт

Порт по умолчанию — 22. Когда администраторы меняют его для снижения автоматизированного сканирования, ты передаёшь -p ПОРТ.

2

Запрос ключа хоста реализует Trust On First Use (TOFU). При первом SSH-подключении к хосту ты видишь что-то вроде:

The authenticity of host 'server.example (198.51.100.10)' can't be established.
ED25519 key fingerprint is SHA256:abc123XYZfakeFingerprint+placeholder/example.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

SSH говорит тебе: «Я никогда не видел этот хост. Отпечаток его публичного ключа — X. Это действительно та машина, к которой ты хочешь подключиться?» Если ты соглашаешься, SSH сохраняет публичный ключ хоста в ~/.ssh/known_hosts. При каждом следующем подключении он сравнивает ключ сервера с сохранённым. Если они отличаются, SSH отказывается подключаться и выводит громкое предупреждение — потому что несовпадение означает либо пересборку сервера, либо перехват соединения.

Правильная практика: проверь отпечаток через сторонний канал (консоль облачного провайдера, систему провизионирования или коллегу), прежде чем печатать «yes». На практике во внутренних доверенных сетях этот шаг часто пропускают — но для публичных серверов проверка важна.

3

~/.ssh/known_hosts хранит ранее доверенные ключи хостов. После того как ты принял запрос, файл пополняется одной строкой:

server.example,198.51.100.10 ssh-ed25519 AAAA...base64key...

Если тот же сервер впоследствии пересобирается, его ключ хоста меняется. SSH выведет заметное предупреждение и откажется подключаться:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Для восстановления удали устаревшую запись командой ssh-keygen -R server.example и переподключись. То же предупреждение появляется при атаке типа «человек посередине» — поэтому не следует слепо удалять запись, не убедившись, что сервер действительно был законно пересобран.

4

~/.ssh/config устраняет повторение флагов. Печатать ssh -p 2222 deploy@web01.example.com при каждом подключении ненадёжно. Файл конфигурации сопоставляет короткие псевдонимы с полными параметрами подключения:

Host prod
    HostName web01.example.com
    User     deploy
    Port     2222

Host staging
    HostName 203.0.113.50
    User     deploy
    Port     22

С этим конфигом ssh prod эквивалентно ssh -p 2222 deploy@web01.example.com. Файл использует отступы (пробелы или табуляции — SSH не важно) под каждым блоком Host. HostName — реальный адрес (значение Host — только локальный псевдоним). User задаёт имя удалённого пользователя. Port переопределяет порт по умолчанию 22.

Можно также задать глобальные настройки перед любым блоком Host:

ServerAliveInterval 60
ServerAliveCountMax 3

Эти две строки отправляют keepalive-пакет каждые 60 секунд — полезно для предотвращения сброса простаивающих соединений NAT или файрволами.

5

~/.ssh/config также поддерживает шаблоны. Блок Host * в конце применяется ко всем подключениям, не совпавшим с предыдущими блоками:

Host prod
    HostName web01.example.com
    User     deploy
    Port     2222

Host *.example.com
    User     deploy

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

SSH читает файл сверху вниз и применяет первое совпадающее значение для каждой настройки. Так prod получает конкретные HostName и Port, любой другой хост .example.com получает User deploy, и каждое подключение получает keepalive. Это слоение позволяет не повторять одинаковые значения для множества хостов.

Разбор примера

Настройка ~/.ssh/config для трёхсерверного деплоя.

Ты управляешь тремя серверами: продакшн веб-сервер, staging-сервер и бастионный jump-хост. Без конфига постоянно приходится печатать длинные команды. С конфигом:

Host bastion
    HostName 198.51.100.1
    User     ops
    Port     22

Host prod
    HostName web01.example.com
    User     deploy
    Port     2222
    ProxyJump bastion

Host staging
    HostName 203.0.113.20
    User     deploy
    Port     22
    ProxyJump bastion

ProxyJump bastion автоматически маршрутизирует подключения prod и staging через бастионный хост. Теперь:

ssh prod        # подключиться к prod через bastion, одна команда
ssh staging     # подключиться к staging через bastion
ssh bastion     # подключиться напрямую к bastion

SSH прозрачно обрабатывает прыжок. Никаких VPN, никаких ручных туннелей — конфиг кодирует топологию инфраструктуры в одном файле.

Почему это работает

На macOS ~/.ssh/config поддерживает дополнительные директивы: UseKeychain yes в сочетании с AddKeysToAgent yes. Они интегрируют SSH-ключи с Keychain macOS, чтобы не запрашивать парольную фразу при каждом перезапуске сессии. На Linux ssh-agent управляет кешированием ключей (об этом в следующем уроке), но он не сохраняется между перезагрузками — нужно добавлять ключи в агент после каждого входа.

Частая ошибка

Распространённая ошибка: создание ~/.ssh/config с общедоступными правами чтения. SSH молча отклонит конфиг (или выдаст предупреждение), если права файла слишком открыты. Правильные права — 600 (только чтение/запись владельцем):

chmod 600 ~/.ssh/config

То же касается приватных ключей (~/.ssh/id_ed25519) — они должны быть 600. Публичные ключи (~/.ssh/id_ed25519.pub) и authorized_keys должны быть 644. SSH строг в этом вопросе: публичный приватный ключ или конфиг утекает информацию всем пользователям системы.

Проверь себя
Викторина

Ты подключаешься к новому серверу, и SSH показывает запрос отпечатка ключа хоста. Ты вводишь «yes». Что произойдёт при следующем подключении к тому же серверу?

Итог

ssh user@host открывает зашифрованную удалённую оболочку. Запрос отпечатка при первом подключении — это Trust On First Use (TOFU): SSH сохраняет публичный ключ хоста в ~/.ssh/known_hosts и при каждом следующем подключении проверяет его совпадение — несовпадение вызывает громкое предупреждение, которое никогда не следует игнорировать. -p ПОРТ переопределяет порт по умолчанию 22. ~/.ssh/config сопоставляет короткие псевдонимы (prod, staging) с полными параметрами подключения (HostName, User, Port, ProxyJump), устраняя повторение и кодируя топологию инфраструктуры в одном файле. Файлы в ~/.ssh/ должны иметь права 600 — SSH это строго контролирует.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.