Создание SSH ключа

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:

  1. Подключается к серверу
  2. Добавляет ваш публичный ключ в ~/.ssh/authorized_keys
  3. Устанавливает правильные права

Способ 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

Важно запомнить:

  1. Приватный ключ (id_rsa) — НИКОМУ НЕ ОТДАВАТЬ
  2. Публичный ключ (id_rsa.pub) — добавляем на серверы
  3. Правильные права — критически важны для безопасности
  4. Резервная копия — сохраните приватный ключ в безопасное место
  5. Пароль на ключ — рекомендуется, но для автоматизации можно без

Начните с простого одного ключа для всех серверов, а по мере роста опыта создавайте отдельные ключи для разных целей и окружений.

Оставьте комментарий