Ключи ssh

2022-02-17 · 5 мин. для прочтения

Создание и работа с ключами ssh.

Содержание

1 Алгоритмы шифрования ssh

1.1 Аутентификация

В SSH поддерживается четыре алгоритма аутентификации по открытым ключам:

  • DSA,
    • размер ключей DSA не может превышать 1024, его следует отключить
  • RSA
    • следует создавать ключ большого размера: 4096 бит
  • ECDSA
    • ECDSA завязан на технологиях NIST, его следует отключить
  • Ed25519
    • используется пока не везде

1.1.1 Отключение ключей у сервера sshd

  • Ключи отключаются у сервера.
  • Если просто удалить ключ, он будет повторно создан при перезапуске демона.
    • Можно воспользоваться обходным путём с создать заведомо нерабочую символическую ссылку, которая помешает создать и использовать ключ:
      cd /etc/ssh
      rm ssh_host_ecdsa_key*
      ln -s ssh_host_ecdsa_key ssh_host_ecdsa_key
      
      rm ssh_host_dsa_key*
      ln -s ssh_host_dsa_key ssh_host_dsa_key
      
      rm ssh_host_key*
      ln -s ssh_host_key ssh_host_key
      

1.1.2 Создание серверных ключей

  • Для RSA следует создать ключ большего размера:
    cd /etc/ssh
    rm ssh_host_rsa_key*
    ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key < /dev/null
    

1.1.3 Создание клиентских ключей

  • Для создания клиентских ключей лучше использовать команды:
    ssh-keygen -t ed25519
    ssh-keygen -t rsa -b 4096
    

1.2 Симметричные шифры

  • Из 15 поддерживаемых в SSH алгоритмов симметричного шифрования, безопасными можно считать:
    • chacha20-poly1305;
    • aes*-ctr;
    • aes*-gcm.
  • Шифры 3des-cbc и arcfour потенциально уязвимы в силу использования DES и RC4.
  • Шифр cast128-cbc применяет слишком короткий размер блока (64 бит).

1.2.1 Конфигурация сервера

  • В /etc/ssh/sshd_config рекомендуется добавить:
    Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
    

1.2.2 Конфигурация для клиентов

  • В /etc/ssh/ssh_config рекомендуется добавить:
    Host *
       Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
    

1.3 Обмен ключами

  • Применяемые в SSH методы обмена ключей DH (Diffie-Hellman) и ECDH (Elliptic Curve Diffie-Hellman) можно считать безопасными.
  • Из 8 поддерживаемых в SSH протоколов обмена ключами вызывают подозрения три, основанные на рекомендациях NIST:
    • ecdh-sha2-nistp256;
    • ecdh-sha2-nistp384;
    • ecdh-sha2-nistp521.
  • Не стоит использовать протоколы, основанные на SHA1.

1.3.1 Настройка сервера

  • В /etc/ssh/sshd_config рекомендуется указать:
    KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
    

1.3.2 Настройка клиента

  • В /etc/ssh/ssh_config рекомендуется добавить
    Host *
       KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
    

2 Файлы ssh-ключей

  • По умолчанию пользовательские ssh-ключи сохраняются в каталоге ~/.ssh в домашнем каталоге пользователя.

  • Убедитесь, что у вас ещё нет ключа.

  • Файлы закрытых ключей имеют названия типа id_<алгоритм> (например, id_dsa, id_rsa).

    • По умолчанию закрытые ключи имеют имена:
      id_dsa
      id_ecdsa
      id_ed25519
      id_rsa
      
  • Открытые ключи имеют дополнительные расширения .pub.

    • По умолчанию публичные ключи имеют имена:
      id_dsa.pub
      id_ecdsa.pub
      id_ed25519.pub
      id_rsa.pub
      

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

  • Ключ ssh создаётся командой:
    ssh-keygen -t <алгоритм>
    
  • Создайте ключи:
    • по алгоритму rsa с ключём размером 4096 бит:
      ssh-keygen -t rsa -b 4096
      
    • по алгоритму ed25519:
      ssh-keygen -t ed25519
      
  • При создании ключа команда попросит ввести любую ключевую фразу для более надёжной защиты вашего пароля. Можно пропустить этот этап, нажав Enter.
  • Сменить пароль на ключ можно с помощью команды:
    ssh-keygen -p
    

4 Добавление SSH-ключа в учётную запись GitHub

  • Скопируйте созданный SSH-ключ в буфер обмена командой:
    xclip -i < ~/.ssh/id_ed25519.pub
    
  • Откройте настройки своего аккаунта на GitHub и перейдем в раздел SSH and GPC keys.
  • Нажмите кнопку New SSH key.
  • Добавьте в поле Title название этого ключа, например, ed25519@<hostname>.
  • Вставьте из буфера обмена в поле Key ключ.
  • Нажмите кнопку Add SSH key.

5 Аутентификации на базе ключей SSH

  • При аутентификации по ключу можно войти на удалённый хост без пароля учетной записи для удаленного хоста.
  • На удалённом хосте для сервера ssh долен быть настроен вход по ключу:
    # Should we allow Pubkey (SSH version 2) authentication?
    PubkeyAuthentication yes
    
    # Where do we look for authorized public keys?
    # If it doesn't start with a slash, then it is
    # relative to the user's home directory
    AuthorizedKeysFile    .ssh/authorized_keys
    

5.1 Копирование открытого ключа на удалённый хост с использованием ssh-copy-id

  • Скопируйте на удалённый хост открытый ключ:
    ssh-copy-id username@remote_host
    

5.2 Копирование открытого ключа с помощью SSH

  • Можно загрузить на удалённый хост ключи с помощью стандартного метода SSH:
    cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
    

6 Настройка ключей

  • Для совместимости необходимо настроить разные типы ключей (см. Тип ключа ssh).

7 Явное указание ключа ssh

7.1 Возможная проблема

  • При попытке подключения к нужному узлу по SSH в терминал выводится сообщение об ошибке:
    Received disconnect from <HOST> port 22:2: Too many authentication failures
    Disconnected from <HOST> port 22
    
  • Это сообщение говорит о том, что вы превысили количество неудачных подключений к узлу.
  • Такое также возможно, когда у вас много ключей ssh:
    • Если в настройках подключения не указано, какой ключ использовать, агент SSH начинает перебирать все доступные ключи.
    • Получив отказ при попытке подключения с одним узлом, агент пробует подключиться со следующим.
    • Примерно после 6 попыток сервер ssh на удалённом узле блокирует подключение.
  • Рекомендуется явное указать ключ ssh.

7.2 Командная строка

  • В аргументах команды SSH можно явно задать путь к приватному ключу, который нужно использовать при подключении:
    ssh <user>@<host> -i /path/to/private/key
    
  • В этом случае перебора не происходит.

7.3 Файл настроек

  • Можно задать ключ в файле настроек.
  • Создайте в каталоге ~/.ssh/ файл config:
    touch ~/.ssh/config
    
  • Добавьте в файл ~/.ssh/config настройки подключения к нужным узлам:
    Host <name>
        Hostname       <host>
        IdentityFile   ~/.ssh/<private_key>
        IdentitiesOnly yes
    
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.