Перейти до змісту

Центри сертифікації SSH і підписування ключів

Передумови

  • Вміння використовувати засоби командного рядка
  • Керування вмістом з командного рядка
  • Попередній досвід створення ключів SSH корисний, але не обов’язковий
  • Базове розуміння SSH та інфраструктури відкритих ключів корисне, але не обов’язкове
  • Сервер, на якому працює демон sshd.

Вступ

Початкове з’єднання SSH із віддаленим хостом є небезпечним, якщо ви не можете перевірити відбиток ключа віддаленого хосту. Використання центру сертифікації для підпису відкритих ключів віддалених хостів захищає початкове підключення для кожного користувача, який довіряє ЦС.

ЦС також можна використовувати для підпису SSH-ключів користувача. Замість розповсюдження ключа кожному віддаленому хосту достатньо одного підпису, щоб авторизувати користувача для входу на декілька серверів.

Завдання

  • Покращення безпеки підключень SSH.
  • Покращення процесу реєстрації та управління ключами.

Примітки

  • Vim є текстовим редактором за вибором автора. Допускається використання інших текстових редакторів, наприклад nano або інших.
  • Використання sudo або root передбачає підвищені привілеї.

Початкове підключення

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

Відображення відбитка ключа на віддаленому хості:

user@rocky-vm ~]$ ssh-keygen -E sha256 -l -f /etc/ssh/ssh_host_ed25519_key.pub 
256 SHA256:bXWRZCpppNWxXs8o1MyqFlmfO8aSG+nlgJrBM4j4+gE no comment (ED25519)

Створення початкового підключення SSH від клієнта. Ключовий відбиток відображається, і його можна порівняти з попередньо отриманим:

[user@rocky ~]$ ssh user@rocky-vm.example.com
The authenticity of host 'rocky-vm.example (192.168.56.101)' can't be established.
ED25519 key fingerprint is SHA256:bXWRZCpppNWxXs8o1MyqFlmfO8aSG+nlgJrBM4j4+gE.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Створення центру сертифікації

Створення ЦС (приватного та відкритого ключів) і розміщення відкритого ключа у файлі known_hosts клієнта для ідентифікації всіх хостів, що належать до домену example.com:

[user@rocky ~]$ ssh-keygen -b 4096 -t ed25519 -f CA
[user@rocky ~]$ echo '@cert-authority *.example.com' $(cat CA.pub) >> ~/.ssh/known_hosts

Де:

  • -b: довжина ключа в байтах
  • -t: тип ключа: rsa, ed25519, ecdsa...
  • -f: вихідний файл ключа

Крім того, ви можете вказати файл known_hosts для всієї системи, відредагувавши файл конфігурації SSH /etc/ssh/ssh_config:

Host *
    GlobalKnownHostsFile /etc/ssh/ssh_known_hosts

Підписання відкритих ключів

Створення SSH-ключа користувача та його підписання:

[user@rocky ~]$ ssh-keygen -b 4096 -t ed2119
[user@rocky ~]$ ssh-keygen -s CA -I user -n user -V +55w  id_ed25519.pub

Отримання відкритого ключа сервера через scp і його підписання:

[user@rocky ~]$ scp user@rocky-vm.example.com:/etc/ssh/ssh_host_ed25519_key.pub .
[user@rocky ~]$ ssh-keygen -s CA -I rocky-vm -n rocky-vm.example.com -h -V +55w ssh_host_ed25519_key.pub

Де:

  • -s: ключ підпису
  • -I: ім'я, яке ідентифікує сертифікат для цілей реєстрації
  • -n: ідентифікує ім’я (хост або користувач, один або кілька), пов’язане з сертифікатом (якщо не вказано, сертифікати дійсні для всіх користувачів або хостів)
  • -h: визначає сертифікат як ключ хоста, на відміну від ключа клієнта
  • -V: термін дії сертифіката

Встановлення довіри

Копіювання сертифіката віддаленого хоста, щоб віддалений хост представив його разом із відкритим ключем під час підключення до:

[user@rocky ~]$ scp ssh_host_ed25519_key-cert.pub root@rocky-vm.example.com:/etc/ssh/

Копіювання відкритого ключа ЦС на віддалений хост, щоб він довіряв сертифікатам, підписаним ЦС:

[user@rocky ~]$ scp CA.pub root@rocky-vm.example.com:/etc/ssh/

Додайте наступні рядки до файлу /etc/ssh/sshd_config, щоб указати попередньо скопійований ключ і сертифікат для використання сервером і довірити ЦС для ідентифікації користувачів:

[user@rocky ~]$ ssh user@rocky-vm.example.com
[user@rocky-vm ~]$ sudo vim /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_ed25519_key
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
TrustedUserCAKeys /etc/ssh/CA.pub

Перезапуск служби sshd на сервері:

[user@rocky-vm ~]$ systemctl restart sshd

Тестування підключення

Видалення відбитка пальця віддаленого сервера з вашого файлу known_hosts і перевірка налаштувань шляхом встановлення з’єднання SSH:

[user@rocky ~]$ ssh-keygen -R rocky-vm.example.com
[user@rocky ~]$ ssh user@rocky-vm.example.com

Відкликання ключа

Відкликання ключів хоста або користувача може мати вирішальне значення для безпеки всього середовища. Таким чином, важливо зберігати раніше підписані відкриті ключі, щоб ви могли відкликати їх пізніше.

Створення порожнього списку відкликань і відкликання відкритого ключа користувача2:

[user@rocky ~]$ sudo ssh-keygen -k -f /etc/ssh/revokation_list.krl
[user@rocky ~]$ sudo ssh-keygen -k -f /etc/ssh/revokation_list.krl -u /path/to/user2_id_ed25519.pub

Копіювання списку відкликань на віддалений хост і вказівка ​​його у файлі sshd_config:

[user@rocky ~]$ scp /etc/ssh/revokation_list.krl root@rocky-vm.example.com:/etc/ssh/
[user@rocky ~]$ ssh user@rocky-vm.example.com
[user@rocky ~]$ sudo vim /etc/ssh/sshd_config

У наступному рядку вказано список відкликань:

RevokedKeys /etc/ssh/revokation_list.krl

Для перезавантаження конфігурації потрібно перезапустити демон SSHD:

[user@rocky-vm ~]$ sudo systemctl restart sshd

Користувача 2 відхилено сервером:

[user2@rocky ~]$ ssh user2@rocky-vm.example.com
user2@rocky-vm.example.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

Відкликати ключі сервера також можливо:

[user@rocky ~]$ sudo ssh-keygen -k -f /etc/ssh/revokation_list.krl -u /path/to/ssh_host_ed25519_key.pub

Наступні рядки в /etc/ssh/ssh_config застосовують список відкликаних хостів для всієї системи:

Host *
        RevokedHostKeys /etc/ssh/revokation_list.krl

Спроба підключитися до хосту призводить до наступного:

[user@rocky ~]$ ssh user@rocky-vm.example.com
Host key ED25519-CERT SHA256:bXWRZCpppNWxXs8o1MyqFlmfO8aSG+nlgJrBM4j4+gE revoked by file /etc/ssh/revokation_list.krl

Ведення та оновлення списків відкликань є важливим. Ви можете автоматизувати процес, щоб усі хости та користувачі мали доступ до останніх списків відкликань.

Висновок

SSH є одним із найцінніших протоколів для керування віддаленими серверами. Запровадження центрів сертифікації може бути корисним, особливо у великих середовищах із великою кількістю серверів і користувачів. Важливо вести списки відкликань. Він легко скасовує зламані ключі, не замінюючи всю критичну інфраструктуру.

Author: Julian Patocki

Contributors: Steven Spencer, Ganna Zhyrnova