Аутентификация с ключом ed25519

Ваши ключи SSH могут использовать один из следующих алгоритмов:

  • 🚨 DSA : это небезопасно и даже больше не поддерживается начиная с версии 7 OpenSSH, вам нужно обновить его!
  • ⚠️ RSA : зависит от размера ключа. Если он имеет длину 3072 или 4096 бит, то все хорошо. Меньше, вы, вероятно, захотите обновить его. 1024-битная длина считается небезопасной.
  • CD ECDSA : это зависит от того, насколько хорошо ваша машина может генерировать случайное число, которое будет использоваться для создания подписи. Существует также проблема достоверности на кривых NIST, которые используются ECDSA.
  • ✅ Ed25519 : Это самый рекомендуемый алгоритм с открытым ключом, доступный сегодня!
Аутентификация с ключом ed25519

Некоторые преимущества Ed25519

Ed25519 был представлен в OpenSSH версии 6.5. Это реализация EdDSA с использованием кривой Twisted Edwards . Он использует криптографию с эллиптическими кривыми, которая обеспечивает лучшую безопасность и более высокую производительность по сравнению с DSA или ECDSA.

Сегодня RSA является наиболее широко используемым алгоритмом открытого ключа для ключа SSH. Но по сравнению с Ed25519 он медленнее и считается небезопасным, если он генерируется с ключом длиной менее 2048 бит.

Открытый ключ Ed25519 компактен. Он содержит только 68 символов по сравнению с RSA 3072, который имеет 544 символа. Генерирование ключа почти так же быстро, как и процесс подписания. Также быстро выполнить проверку подписи пакета с Ed25519. Он создан для защиты от столкновений. Столкновение хэш-функции не сломает систему.

Сгенерируйте закрытый ключ ed25519 (с парольной фразой !!!):

ssh-keygen -t ed25519 

Вам будет предложено ввести ключевую фразу для этого ключа, используйте сильную. Вы также можете использовать ту же фразу-пароль, что и любой из ваших старых ключей SSH.

  • -o : Сохранить частный ключ , используя новый формат OpenSSH , а не формат PEM. На самом деле, эта опция подразумевается, когда вы указываете тип ключа как ed25519.
  • -a: Это количество раундов KDF (функция ключевого вывода). Более высокие числа приводят к более медленной проверке парольной фразы, увеличивая устойчивость к взлому паролем в случае кражи закрытого ключа.
  • -t: Указывает тип создаваемого ключа, в нашем случае Ed25519.
  • -f: Укажите имя файла сгенерированного ключевого файла. Если вы хотите, чтобы он был автоматически обнаружен агентом SSH, он должен храниться в каталоге `.ssh` по умолчанию в вашем домашнем каталоге.
  • -C: Возможность указать комментарий. Это чисто информационное и может быть что угодно. Но обычно он заполнен тем, <login>@<hostname>кто сгенерировал ключ.

Затем скопируйте открытый ключ на все серверы, которыми вы хотите управлять со своего компьютера:

ssh-copy-id -i ~/.ssh/id_ed25519.pub sshuser@host

🍏 Примечания для пользователя macOS
Если вы используете macOS Sierra 10.12.2 или более поздней версии, для автоматической загрузки ключей и сохранения парольных фраз в связке ключей вам необходимо настроить 
~/.ssh/configфайл:
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~ / .ssh / id_ed25519
IdentityFile ~ / .ssh / id_rsa

# Сохраните все старые файлы ключей, если хотите

Защитите серверную часть (SSHD):

Сделайте резервную копию вашего файла конфигурации:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bckp 

И отредактируйте это:

nano /etc/ssh/sshd_config

Отредактируйте слушателя OpenSSH:

port 22 

Выберите случайный порт (предпочтительно выше 1024), например:

port 10124 

Если у вас есть несколько интерфейсов, вы можете выделить IPV4 / 6 для управления со следующими строками:

ListenAddress ::
ListenAddress 0.0.0.0

Отключите прямое соединение в root с помощью этой строки:

PermitRootLogin no 

Вы также можете разрешить определенных пользователей, добавив следующую строку:

AllowUsers user1 user2

Затем отключите аутентификацию по паролю ( только если аутентификация с открытым ключом работает! ):

PermitEmptyPasswords no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

Отключите использование ключей DSA, RSA и ECDSA (которые являются слабыми). Просто закокомментируйте следующие строки:

#HostKey /etc/ssh/ssh_host_dsa_key
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key

И обязательно иметь следующую строку:

HostKey /etc/ssh/ssh_host_ed25519_key

Затем укажите параметры обмена и аутентификации:

KexAlgorithms curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com
MACs umac-128-etm@openssh.com,umac-128@openssh.com

Перезапустите сервер OpenSSH:

service sshd restart

Защитите клиентскую часть (SSH):

Сделайте резервную копию вашего файла конфигурации:

cp /etc/ssh/ssh_config /etc/ssh/ssh_config.bckp

И отредактируйте это:

nano /etc/ssh/ssh_config

Перетащите существующую конфигурацию и поместите ее:

HashKnownHosts yes
Host *
ConnectTimeout 30
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
ServerAliveInterval 10
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socket-%r@%h:%p

Как видите, больше вещей разрешено, чем в серверной части.

Таким образом, он не будет блокироваться старыми версиями OpenSSH.

Если вы используете только SSH-серверы, настроенные с этой процедурой, то используйте следующую конфигурацию:

HashKnownHosts yes
Host *
ConnectTimeout 30
KexAlgorithms curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com
MACs umac-128-etm@openssh.com,umac-128@openssh.com
ServerAliveInterval 10
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socket-%r@%h:%p

Настроить SSHFP

Если на DNS-серверах вашего домена включена поддержка DNSSEC , то будет интересно использовать записи SSHFP для аутентификации подписей SSH ваших серверов с использованием DNS.

Запустите следующую команду на каждом из ваших серверов:

ssh-keygen -r domain.com -f /etc/ssh/ssh_host_ed25519_key.pub 

У вас будет такой результат:

domain.com IN SSHFP 4 1 d305e4851588958f9074356f0a2b6ea7c59708a8
domain.com IN SSHFP 4 2 66b627ea6687d41b80dc5399b5292a3f1488ea0d9c353814d09ffa2ce1192a9b

Вы можете оставить только часть 4 2 SSHFP, так как ed25519 все равно не использует SHA1:

domain.com IN SSHFP 4 2 66b627ea6687d41b80dc5399b5292a3f1488ea0d9c353814d09ffa2ce1192a9b

Просто добавьте эту запись в свой DNS.

Затем выполните следующую команду, чтобы включить проверку записей SSHFP перед подключением:

echo "VerifyHostKeyDNS yes" >> /etc/ssh/ssh_config && service ssh restart 

Скрыть SSH-сервер за брандмауэром

И последнее, но не менее важное : вы также можете скрыть свой порт SSH с помощью UFW (или Iptables), разрешив подключение только с вашего IP-адреса.

Установите UFW:

apt-get install ufw -y

Определите правила по умолчанию (мы принимаем весь вывод и отказываемся от любого ввода):

ufw default deny incoming
ufw default allow outgoing

Теперь разрешите SSH только с вашего IP-адреса (измените IPV4 / 6 и 22 с вашей конфигурацией):

ufw allow from IPV4 to any port 22
ufw allow from IPV6 to any port 22

Авторизуйте другие порты, такие как общедоступная сеть:

ufw allow 80
ufw allow 443

И активируем зверя:

ufw enable

Вы можете добавить запись в ~/.ssh/configфайл для настройки параметров:

Host awesome 
HostName 98.22.11.3
User xakinfo.ru
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes

После того, как настройки будут сохранены, позже вы можете использовать SSH для вашего целевого хоста следующим образом:

ssh awesome