1. Создание SSH ключа
На локальном компьютере (откуда подключаемся):
bash
# Генерация ключа RSA (рекомендуется) ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # Или более современный алгоритм ed25519 ssh-keygen -t ed25519 -C "your_email@example.com"
Пояснение параметров:
-t rsa— тип ключа (RSA)-b 4096— длина ключа (4096 бит — безопасно)-C— комментарий (обычно email)
Пример сессии создания ключа:
bash
$ ssh-keygen -t rsa -b 4096 -C "admin@company.com" Generating public/private rsa key pair. Enter file in which to save the key (/home/username/.ssh/id_rsa): [Enter] Enter passphrase (empty for no passphrase): [Введите пароль или оставьте пустым] Enter same passphrase again: [Повторите пароль] Your identification has been saved in /home/username/.ssh/id_rsa Your public key has been saved in /home/username/.ssh/id_rsa.pub The key fingerprint is: SHA256:AbC123... admin@company.com
2. Что создается и где лежит
Структура каталога .ssh:
text
~/.ssh/ # Домашняя папка пользователя ├── id_rsa # ПРИВАТНЫЙ ключ (никому не отдавать!) ├── id_rsa.pub # ПУБЛИЧНЫЙ ключ (отдаем на сервера) ├── known_hosts # Известные сервера └── config # Конфигурация подключений (опционально)
Проверка созданных ключей:
bash
# Посмотреть содержимое .ssh директории ls -la ~/.ssh/ # Показать публичный ключ cat ~/.ssh/id_rsa.pub # Проверить права доступа (важно!) ls -l ~/.ssh/id_rsa # Должно быть: -rw------- (только владелец может читать)
3. Копирование ключа на сервер
Способ 1: Автоматически (рекомендуется)
bash
# Копирует публичный ключ на сервер ssh-copy-id username@server_ip # Пример: ssh-copy-id admin@192.168.1.100
Что делает ssh-copy-id:
- Подключается к серверу
- Добавляет ваш публичный ключ в
~/.ssh/authorized_keys - Устанавливает правильные права
Способ 2: Вручную через ssh
bash
# 1. Создать папку .ssh на сервере (если нет) ssh username@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh" # 2. Добавить ключ в authorized_keys cat ~/.ssh/id_rsa.pub | ssh username@server_ip "cat >> ~/.ssh/authorized_keys" # 3. Установить правильные права ssh username@server_ip "chmod 600 ~/.ssh/authorized_keys"
Способ 3: Через scp (если есть парольная аутентификация)
bash
# Копируем публичный ключ на сервер scp ~/.ssh/id_rsa.pub username@server_ip:/tmp/my_key.pub # Подключаемся к серверу ssh username@server_ip # На сервере: mkdir -p ~/.ssh cat /tmp/my_key.pub >> ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys rm /tmp/my_key.pub
4. Проверка подключения
bash
# Подключение без пароля ssh username@server_ip # С указанием конкретного ключа ssh -i ~/.ssh/id_rsa username@server_ip # Проверка с verbose выводом (для отладки) ssh -v username@server_ip
5. Настройка SSH на сервере (серверная сторона)
Основной конфиг SSH сервера:
bash
# Отредактировать конфиг sudo nano /etc/ssh/sshd_config
Важные настройки:
bash
# Разрешить аутентификацию по ключам PubkeyAuthentication yes # Запретить вход по парню root (рекомендуется) PermitRootLogin prohibit-password # Отключить аутентификацию по паролю (после настройки ключей) PasswordAuthentication no # Разрешить только определенных пользователей AllowUsers admin webuser deploy # Указать путь к authorized_keys AuthorizedKeysFile .ssh/authorized_keys
Применить изменения:
bash
# Проверить синтаксис конфига sudo sshd -t # Перезагрузить SSH сервер sudo systemctl restart sshd # Или для старых систем sudo service ssh restart
6. Практические примеры для разных сценариев
Пример 1: Ключ для конкретного проекта
bash
# Создаем ключ для проекта ssh-keygen -t rsa -b 4096 -f ~/.ssh/project_name -C "project_name_$(date +%Y%m%d)" # Копируем на сервер ssh-copy-id -i ~/.ssh/project_name.pub user@server # Подключаемся с этим ключом ssh -i ~/.ssh/project_name user@server
Пример 2: Настройка SSH config для удобства
bash
# Создаем/редактируем конфиг nano ~/.ssh/config
bash
# ~/.ssh/config
Host myserver
HostName 192.168.1.100
User admin
Port 22
IdentityFile ~/.ssh/id_rsa
Host webserver
HostName web.example.com
User webadmin
Port 2222
IdentityFile ~/.ssh/web_key
Host github.com
User git
IdentityFile ~/.ssh/github_key
Теперь подключаемся просто:
bash
ssh myserver # вместо ssh admin@192.168.1.100 ssh webserver # вместо ssh -p 2222 webadmin@web.example.com
Пример 3: Ключ для CI/CD (Jenkins/GitLab)
bash
# Генерируем ключ без пароля (для автоматизации) ssh-keygen -t rsa -b 4096 -f /opt/jenkins/.ssh/id_rsa -N "" # В Jenkins/GitLab добавляем приватный ключ # Публичный ключ добавляем на целевые серверы
7. Безопасность и best practices
Правильные права:
bash
# На локальной машине chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub chmod 644 ~/.ssh/known_hosts chmod 644 ~/.ssh/config # На сервере chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
Смена пароля ключа:
bash
# Добавить пароль к существующему ключу ssh-keygen -p -f ~/.ssh/id_rsa # Убрать пароль с ключа ssh-keygen -p -f ~/.ssh/id_rsa -P "old_password" -N ""
Ротация ключей (замена старых):
bash
# 1. Создаем новый ключ ssh-keygen -t ed25519 -f ~/.ssh/id_new -C "$(date +%Y%m%d)" # 2. Копируем на сервер ssh-copy-id -i ~/.ssh/id_new.pub user@server # 3. Проверяем работу ssh -i ~/.ssh/id_new user@server # 4. Удаляем старый ключ с сервера # На сервере: редактируем ~/.ssh/authorized_keys
8. Устранение неполадок
Проверка подключения с детальным выводом:
bash
ssh -vvv user@server
Частые проблемы и решения:
Проблема 1: Permission denied (publickey)
bash
# Решение: # 1. Проверить права на приватный ключ (должны быть 600) chmod 600 ~/.ssh/id_rsa # 2. Проверить наличие ключа на сервере ssh user@server "cat ~/.ssh/authorized_keys" # 3. Проверить настройки sshd_config
Проблема 2: Слишком открытые права
text
Bad permissions for .ssh/authorized_keys
bash
# Исправить права chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
Проблема 3: Несколько ключей
bash
# Указать конкретный ключ ssh -i ~/.ssh/specific_key user@server # Или добавить в ssh config
9. Работа с несколькими ключами
Создание ключа для разных целей:
bash
# Для работы ssh-keygen -f ~/.ssh/work_key -C "work_$(whoami)@company" # Для личных проектов ssh-keygen -f ~/.ssh/personal_key -C "personal_$(whoami)" # Для GitHub/GitLab ssh-keygen -f ~/.ssh/github_key -C "github_$(whoami)"
Использование ssh-agent для управления ключами:
bash
# Запустить ssh-agent eval "$(ssh-agent -s)" # Добавить ключ в агент ssh-add ~/.ssh/id_rsa ssh-add ~/.ssh/work_key # Просмотреть добавленные ключи ssh-add -l # Удалить ключ из агента ssh-add -d ~/.ssh/id_rsa
10. Автоматизация для администрирования нескольких серверов
Скрипт для массового копирования ключа:
bash
#!/bin/bash
# mass-ssh-copy.sh
KEY_PATH="$HOME/.ssh/id_rsa.pub"
USER="admin"
# Список серверов
SERVERS=(
"192.168.1.10"
"192.168.1.11"
"192.168.1.12"
"web.example.com"
)
for SERVER in "${SERVERS[@]}"; do
echo "Копирую ключ на $SERVER..."
ssh-copy-id -i "$KEY_PATH" "$USER@$SERVER"
if [ $? -eq 0 ]; then
echo "✓ Успешно: $SERVER"
else
echo "✗ Ошибка: $SERVER"
fi
echo "---"
done
Скрипт для проверки подключения:
bash
#!/bin/bash
# check-ssh-access.sh
USER="admin"
KEY="$HOME/.ssh/id_rsa"
while read SERVER; do
echo -n "Проверка $SERVER... "
# Пробуем подключиться
ssh -q -o BatchMode=yes -o ConnectTimeout=5 \
-i "$KEY" "$USER@$SERVER" exit
if [ $? -eq 0 ]; then
echo "✓ Доступен"
else
echo "✗ Недоступен"
fi
done < servers.txt
11. Cheat Sheet: Быстрые команды
bash
# Создать ключ RSA ssh-keygen -t rsa -b 4096 # Создать ключ ed25519 ssh-keygen -t ed25519 # Скопировать ключ на сервер ssh-copy-id user@host # Подключиться с ключом ssh -i /path/to/key user@host # Проверить права ls -la ~/.ssh/ # Показать отпечаток ключа ssh-keygen -l -f ~/.ssh/id_rsa # Добавить ключ в ssh-agent ssh-add ~/.ssh/key_name # Удалить хост из known_hosts ssh-keygen -R hostname
Важно запомнить:
- Приватный ключ (
id_rsa) — НИКОМУ НЕ ОТДАВАТЬ - Публичный ключ (
id_rsa.pub) — добавляем на серверы - Правильные права — критически важны для безопасности
- Резервная копия — сохраните приватный ключ в безопасное место
- Пароль на ключ — рекомендуется, но для автоматизации можно без
Начните с простого одного ключа для всех серверов, а по мере роста опыта создавайте отдельные ключи для разных целей и окружений.