SSH (Secure Shell) — основа безопасного администрирования серверов. Помимо базовой функции входа, SSH предоставляет мощные возможности для туннелирования, проброса портов и безопасной передачи файлов. Это руководство охватывает ключевые конфигурации SSH и продвинутые техники с точки зрения senior-разработчика.
Зачем осваивать SSH
Владение SSH позволяет:
- Безопасный доступ: Шифрованная связь с удалёнными серверами
- Аутентификация по ключам: Устранение уязвимостей, связанных с паролями
- Проброс портов: Безопасный доступ к внутренним сервисам
- Передача файлов: SFTP и SCP для безопасного копирования
- Jump hosts: Безопасное пересечение сетевых границ
Управление SSH-ключами
Генерация SSH-ключей
# Современный Ed25519 (рекомендуется)
ssh-keygen -t ed25519 -f ~/.ssh/project_name -C "[email protected]"
# RSA для старых серверов
ssh-keygen -t rsa -b 4096 -f ~/.ssh/project_name -C "[email protected]"
У вас будет два файла:
~/.ssh/project_name — приватный ключ (держите в секрете)~/.ssh/project_name.pub — публичный ключ (можно свободно распространять)
Копирование ключа на сервер
# Автоматизированный способ
ssh-copy-id -i ~/.ssh/project_name user@hostname
# Ручной способ
cat ~/.ssh/project_name.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Установка корректных прав доступа
chmod 700 ~/.ssh
chmod 600 ~/.ssh/project_name
chmod 644 ~/.ssh/project_name.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config
Файл конфигурации SSH
Создайте ~/.ssh/config для удобных подключений:
# Default settings for all hosts
Host *
AddKeysToAgent yes
IdentitiesOnly yes
ServerAliveInterval 60
ServerAliveCountMax 3
# Production server
Host prod
HostName 192.168.1.100
User admin
Port 22
IdentityFile ~/.ssh/production_key
# Staging with non-standard port
Host staging
HostName staging.example.com
User deploy
Port 2222
IdentityFile ~/.ssh/staging_key
# Jump through bastion host
Host internal-server
HostName 10.0.0.50
User admin
ProxyJump bastion
Host bastion
HostName bastion.example.com
User jumpuser
IdentityFile ~/.ssh/bastion_key
# Development with forwarding
Host dev
HostName dev.example.com
User developer
LocalForward 3306 localhost:3306
LocalForward 6379 localhost:6379
Теперь подключайтесь простыми командами:
ssh prod
ssh staging
ssh internal-server
SSH-туннели и проброс портов
Локальный проброс портов
Доступ к удалённым сервисам так, как будто они локальные:
# Проброс local:8080 на remote:80
ssh -L 8080:localhost:80 user@server
# Локальный доступ к удалённой базе данных
ssh -L 3306:localhost:3306 user@server
# Доступ к сервису в удалённой сети
ssh -L 8080:internal-db:5432 user@bastion
Теперь localhost:8080 подключается к удалённому сервису.
Удалённый проброс портов
Откройте локальные сервисы для удалённого сервера:
# Сделать local:3000 доступным на remote:8080
ssh -R 8080:localhost:3000 user@server
Удалённые пользователи могут обращаться к server:8080, чтобы попасть в ваше локальное приложение.
Динамический проброс портов (SOCKS Proxy)
Создайте SOCKS-прокси через SSH:
ssh -D 1080 user@server
Настройте браузер/приложение на использование SOCKS5-прокси по адресу localhost:1080.
SSH-туннель для доступа к базе данных
Доступ к базе данных, которая разрешает подключения только с localhost:
# MySQL
ssh -L 3306:127.0.0.1:3306 user@db-server
mysql -h 127.0.0.1 -P 3306 -u dbuser -p
# PostgreSQL
ssh -L 5432:127.0.0.1:5432 user@db-server
psql -h 127.0.0.1 -p 5432 -U dbuser database
Постоянный туннель с autossh
Автоматически поддерживайте туннели активными:
# Установить autossh
sudo apt install autossh
# Создать постоянный туннель
autossh -M 0 -f -N -L 3306:localhost:3306 user@server
Доступ к сервисам, доступным только с localhost
Некоторые сервисы (например, phpMyAdmin) принимают подключения только с localhost. Используйте SSH-туннелирование:
ssh -N -L 8080:127.0.0.1:80 -i key.pem user@server
Откройте http://localhost:8080 в браузере.
SSHFS — монтирование удалённых файловых систем
Монтируйте удалённые директории локально:
# Установить sshfs
sudo apt install sshfs
# Смонтировать удалённую директорию
sshfs user@server:/remote/path /local/mount -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
# С переходом по symlinks
sshfs user@server:/remote/path /local/mount -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,follow_symlinks
# Размонтировать
fusermount -u /local/mount
SSH Agent
Управляйте ключами без повторного ввода passphrase:
# Запустить agent
eval "$(ssh-agent -s)"
# Добавить ключ
ssh-add ~/.ssh/project_name
# Показать загруженные ключи
ssh-add -l
# Удалить все ключи
ssh-add -D
Сохранение passphrase в Agent
Добавьте в ~/.ssh/config:
Host *
AddKeysToAgent yes
UseKeychain yes # macOS only
Усиление защиты на стороне сервера
Безопасная конфигурация SSH Daemon
Отредактируйте /etc/ssh/sshd_config:
# Disable root login
PermitRootLogin no
# Disable password authentication
PasswordAuthentication no
ChallengeResponseAuthentication no
# Use only SSH Protocol 2
Protocol 2
# Restrict to specific users/groups
AllowUsers admin deploy
AllowGroups ssh-users
# Limit authentication attempts
MaxAuthTries 3
# Set idle timeout
ClientAliveInterval 300
ClientAliveCountMax 2
# Disable empty passwords
PermitEmptyPasswords no
# Disable X11 forwarding if not needed
X11Forwarding no
# Use strong ciphers only
Ciphers [email protected],[email protected]
MACs [email protected],[email protected]
KexAlgorithms curve25519-sha256,[email protected]
Перезапустите SSH после изменений:
sudo systemctl restart sshd
Ограничение root для конкретных IP
# In /etc/ssh/sshd_config
Match Address 10.0.0.0/8
PermitRootLogin yes
Ограничение использования ключа по исходному IP
В ~/.ssh/authorized_keys:
from="192.168.1.100,10.0.0.0/24" ssh-ed25519 AAAAC3... user@host
SSH через Proxy
HTTP Proxy
# С использованием netcat
ssh -o ProxyCommand='nc -X connect -x proxy:3128 %h %p' user@server
# В файле config
Host server
ProxyCommand nc -X connect -x proxy:3128 %h %p
SOCKS Proxy
ssh -o ProxyCommand='nc -X 5 -x localhost:1080 %h %p' user@server
Устранение неполадок
Отладка проблем с подключением
# Подробный вывод
ssh -v user@server
# Ещё более подробный вывод
ssh -vv user@server
# Максимальная подробность
ssh -vvv user@server
Распространённые ошибки прав доступа
# Ошибка "Permissions are too open"
chmod 600 ~/.ssh/private_key
# Ошибка "Host key verification failed"
ssh-keygen -R hostname # Удалить старый host key
Тайм-аут подключения
# Увеличить тайм-аут подключения
ssh -o ConnectTimeout=30 user@server
# Поддерживать соединение активным
ssh -o ServerAliveInterval=60 user@server
Безопасная передача файлов
SCP
# Скопировать на удалённый хост
scp local_file user@server:/remote/path/
# Скопировать с удалённого хоста
scp user@server:/remote/file ./local/
# Скопировать директорию рекурсивно
scp -r ./local/dir user@server:/remote/
SFTP
sftp user@server
# Интерактивные команды: get, put, ls, cd, mkdir, rm
Rsync по SSH
rsync -avz -e ssh ./local/ user@server:/remote/
Ключевые выводы
- Используйте ключи Ed25519: Современные, безопасные и быстрые
- Настройте
~/.ssh/config: Упростите сложные подключения - Отключите аутентификацию по паролю: На серверах используйте только ключи
- Используйте SSH agent: Избавьтесь от постоянного ввода passphrase
- Освойте туннелирование: Безопасно получайте доступ к внутренним сервисам
- Укрепляйте серверы: Ограничивайте пользователей, отключайте root, используйте сильные шифры
SSH — это гораздо больше, чем просто удалённый вход: это набор инструментов для безопасной работы с сетью, который при освоении существенно повышает и безопасность, и продуктивность.