# SSH - secure shell _Протоколы · LinuxLab Knowledge Base_ **TL;DR:** SSH - зашифрованный канал к удалённому хосту: shell, копирование файлов, port-forwarding. Стандартный порт 22, аутентификация по ключам или паролю. ## Базовое подключение ```bash ssh user@host # по паролю или ключу из ~/.ssh ssh -p 2222 user@host # нестандартный порт ssh -i ~/.ssh/special_key user@host # конкретный приватный ключ ssh -v user@host # verbose: видим какой ключ пробуется, какой алгоритм ``` ## Ключевая аутентификация (правильно) Парольная - небезопасна (brute force). Ключи - стандарт: ```bash ssh-keygen -t ed25519 -C "alice@laptop" # сгенерировать пару (ed25519 - современный) # → создаст ~/.ssh/id_ed25519 (приватный) и ~/.ssh/id_ed25519.pub (публичный) ssh-copy-id user@host # положить .pub в ~user/.ssh/authorized_keys на host # → теперь ssh user@host работает без пароля ``` Файл `~/.ssh/authorized_keys` на сервере содержит публичные ключи которым разрешён вход. Права жёсткие - иначе sshd откажется: ```bash chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys # см. [file-permissions](/kb/file-permissions.md) ``` ## ~/.ssh/config - алиасы и опции ``` Host prod HostName 10.20.30.40 User deploy Port 2222 IdentityFile ~/.ssh/prod_key Host bastion HostName bastion.example.com User alice Host internal-* ProxyJump bastion # ходить через бастион автоматически User deploy ``` Теперь `ssh prod` или `ssh internal-db1` работает без флагов. ## Port forwarding ```bash # Local forward: localhost:8080 → host:80 ЧЕРЕЗ ssh ssh -L 8080:localhost:80 user@host # → теперь curl http://localhost:8080 идёт на удалённый :80 # Remote forward: на сервере открыть порт, направить ко мне локально ssh -R 9090:localhost:3000 user@host # → на удалённой машине localhost:9090 = моя локальная :3000 # Dynamic (SOCKS proxy) ssh -D 1080 user@host # → SOCKS5 proxy на localhost:1080, весь трафик идёт через host ``` Полезно для доступа к внутренним сервисам без VPN. ## SSH agent Чтобы не вводить passphrase ключа каждый раз: ```bash eval "$(ssh-agent)" # запустить агент ssh-add ~/.ssh/id_ed25519 # добавить ключ - passphrase спросят раз ssh user@host # теперь без пароля ssh-add -l # что в агенте ``` **Agent forwarding** (`ssh -A`) - рискованная фича: пробрасывает агент на удалённый хост. Не использовать на не-доверенных серверах (root там может подписать что угодно от твоего имени). ## scp / sftp / rsync Копирование файлов через тот же канал: ```bash scp file.txt user@host:/path/ # старая школа, простая scp -r dir/ user@host:/path/ # рекурсивно rsync -avzP file.txt user@host:/path/ # современный: incremental, прогресс, сжатие sftp user@host # интерактивный FTP-like ``` Используй `rsync` для всего нетривиального - резюмирует прерванное. ## Серверная сторона Конфиг - `/etc/ssh/sshd_config`: ``` Port 22 PermitRootLogin no # не пускать root напрямую PasswordAuthentication no # только ключи PubkeyAuthentication yes AllowUsers alice bob ``` После правки: ```bash sudo sshd -t # синтаксис-проверка sudo systemctl reload ssh # применить (HUP signal - не разорвёт текущие сессии) ``` ## Безопасность - **Только ключи**, не пароли - **Не root**: `PermitRootLogin no` - **fail2ban** или аналог - блокировать brute-force - **Нестандартный порт** - снижает шум, но НЕ заменяет защиту - **Известные хосты**: `~/.ssh/known_hosts` - проверка fingerprint'а сервера; warning «host key changed» - повод остановиться и проверить ## Команды ```bash ssh-keygen -t ed25519 -C 'alice@laptop' ``` Сгенерировать современный ключ (ed25519 быстрее и короче RSA) ```bash ssh-copy-id user@host ``` Положить публичный ключ на сервер для passwordless-входа ```bash ssh -L 5432:db.internal:5432 bastion ``` Local-forward: локальный 5432 → удалённая БД через bastion ```bash ssh -J bastion user@internal ``` ProxyJump через bastion одной строкой (без -L) ```bash ssh-add -l ``` Список ключей в текущем ssh-agent'е ## См. также - [TLS handshake](/kb/tls-handshake.md) - [TCP three-way handshake](/kb/tcp-handshake.md) - [rsync - инкрементальная синхронизация файлов](/kb/cmd-rsync.md) - [FTP и SFTP - передача файлов](/kb/ftp-sftp.md) - [SSH hardening - закрытие сервера](/kb/ssh-hardening.md) - [Kerberos - сетевой single sign-on](/kb/kerberos.md)