ITcompressor IT — сжато и по делу
← Назад к статьям

SSH

SSH — протокол шифрованного удалённого доступа: шелл на сервере, копирование файлов и туннелирование трафика через один порт. Сценарий статьи: сервер web1.example.com, пользователь admin.

Установка сервера#

sudo apt update
sudo apt install openssh-server

Клиент (openssh-client) на Ubuntu уже установлен; на машинах без сервера — только клиент.

Настройка сервера#

Конфигурация — /etc/ssh/sshd_config. Базовый безопасный набор:

Port 22

# Вход root по SSH запрещён
PermitRootLogin no

# Аутентификация по ключам
PubkeyAuthentication yes

# Ключи лежат здесь
AuthorizedKeysFile .ssh/authorized_keys

# Парольный вход — выключить, когда ключи отлажены
PasswordAuthentication no

# Подробный лог попыток подключения
LogLevel VERBOSE

Проверка синтаксиса и перезапуск:

sudo sshd -t
sudo systemctl restart ssh

sshd -t проверяет конфиг до перезапуска — так не отрежете себе доступ из-за опечатки. На Ubuntu/Debian служба называется ssh, в RHEL-семействе — sshd.

PasswordAuthentication no включайте только после того, как ключи уже работают: иначе останетесь без серверного входа (последний шанс — консоль хостера/VNC).

Генерация ключей#

Современный тип — Ed25519 (короткие ключи, быстрая проверка):

ssh-keygen -t ed25519 -C "admin@laptop"

Ключи появятся в ~/.ssh/: приватный id_ed25519 (никогда не покидает машину) и публичный id_ed25519.pub (его раскидываем по серверам).

RSA (ssh-keygen -t rsa -b 4096) — для совсем старых серверов, в которых Ed25519 ещё не реализован.

Права на ~/.ssh и приватный ключ ssh проверяет жёстко:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519

Копирование ключа на сервер#

ssh-copy-id admin@web1.example.com

# Нестандартный порт сервера
ssh-copy-id -p 2222 admin@web1.example.com

Публичный ключ допишется в authorized_keys сервера — вход по паролю больше не понадобится.

Подключение#

ssh admin@web1.example.com

# Нестандартный порт
ssh -p 2222 admin@web1.example.com

# Разовая команда, без интерактивного шелла
ssh admin@web1.example.com "df -h /"

# Отладка проблем подключения (-vv — многословнее)
ssh -v admin@web1.example.com

Файл ~/.ssh/config#

Псевдонимы хостов: раз — и потом короткие ssh web1 без имён/портов/ключей:

# ~/.ssh/config
Host web1
    HostName web1.example.com
    User admin
    IdentityFile ~/.ssh/id_ed25519

Host db1
    HostName db1.example.com
    User admin
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
ssh web1
scp backup.sh web1:/opt/

Все опции из config применяются и к scp, и к ssh-copy-id — хост с псевдонимом ведёт себя как обычное имя. Файл должен быть доступен только вам: chmod 600 ~/.ssh/config.

Для входа через промежуточный сервер (bastion) — опция ProxyJump: ssh -J bastion web1 или ProxyJump bastion в блоке Host web1.

Копирование файлов: scp#

# Файл на сервер
scp deploy.sh admin@web1.example.com:/tmp/

# Файл с сервера сюда
scp admin@web1.example.com:/var/log/app.log .

# Каталог целиком (рекурсивно)
scp -r ./assets admin@web1.example.com:/var/www/

# Порт указывается заглавной -P (в ssh — строчная -p!)
scp -P 2222 file.txt admin@web1.example.com:~

# Сохранить времена и права файлов (-p)
scp -p admin@web1.example.com:/etc/nginx/nginx.conf .

Начиная с OpenSSH 9.0 протокол по умолчанию — SFTP; для очень старых серверов добавьте -O (режим старого SCP-протокола). Для больших каталогов и повторяющихся синхронизаций удобнее rsync -avz … — докачивает и перекачивает только изменившееся.

SSH-агент#

Агент держит расшифрованные ключи в памяти — пароль ключа спрашивается один раз за сессию:

eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519

На десктопах (macOS, GNOME) агент обычно уже запущен — достаточно ssh-add. На macOS ключ можно держать в связке Keychain: ssh-add --apple-use-keychain.

Туннели#

# Локальное перенаправление: localhost:5432 → БД на стороне сервера
ssh -L 5432:localhost:5432 admin@db1.example.com

# Обратное: порт сервера ведёт на сервис вашей локальной машины
# (покажите локальную разработку коллеге с сервера)
ssh -R 8080:localhost:3000 admin@web1.example.com

# SOCKS-прокси на localhost:1080 — трафик браузера через сервер
ssh -D 1080 admin@web1.example.com

Туннель живёт, пока живо ssh-подключение; запускайте с -N (без шелла) и -T, если нужен только туннель: ssh -N -L 5432:localhost:5432 admin@db1.example.com.

← Назад к статьям