О нас Руководства Проекты Контакты
Админка
пожалуйста подождите

SSH (Secure Shell) — основа безопасного администрирования серверов. Помимо базовой функции входа, SSH предоставляет мощные возможности для туннелирования, проброса портов и безопасной передачи файлов. Это руководство охватывает ключевые конфигурации SSH и продвинутые техники с точки зрения senior-разработчика.

Зачем осваивать SSH

Владение SSH позволяет:

  1. Безопасный доступ: Шифрованная связь с удалёнными серверами
  2. Аутентификация по ключам: Устранение уязвимостей, связанных с паролями
  3. Проброс портов: Безопасный доступ к внутренним сервисам
  4. Передача файлов: SFTP и SCP для безопасного копирования
  5. 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/

Ключевые выводы

  1. Используйте ключи Ed25519: Современные, безопасные и быстрые
  2. Настройте ~/.ssh/config: Упростите сложные подключения
  3. Отключите аутентификацию по паролю: На серверах используйте только ключи
  4. Используйте SSH agent: Избавьтесь от постоянного ввода passphrase
  5. Освойте туннелирование: Безопасно получайте доступ к внутренним сервисам
  6. Укрепляйте серверы: Ограничивайте пользователей, отключайте root, используйте сильные шифры

SSH — это гораздо больше, чем просто удалённый вход: это набор инструментов для безопасной работы с сетью, который при освоении существенно повышает и безопасность, и продуктивность.

 
 
 
Языки
Темы
Copyright © 1999 — 2026
Зетка Интерактив