Поиск по сайту:

Как создать SSH CA для проверки хостов и клиентов с помощью Ubuntu


Статус: устарело

В этой статье рассматривается версия Ubuntu, которая больше не поддерживается. Если вы в настоящее время используете сервер под управлением Ubuntu 12.04, мы настоятельно рекомендуем обновить или перейти на поддерживаемую версию Ubuntu:

  • Обновите Ubuntu до версии 14.04.
  • Обновление Ubuntu 14.04 до Ubuntu 16.04
  • Перенесите данные сервера в поддерживаемую версию.

Причина:

Смотрите вместо этого:

Введение

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

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

Мы обсудим, как использовать эти сертификаты обоими описанными выше способами. Мы продемонстрируем это на трех экземплярах Ubuntu 12.04 VPS. Один будет хостом, другой — клиентом, а третий — центром сертификации.

Как настроить сертификаты хоста

Мы начнем с настройки сертификатов, которые будут аутентифицировать наши серверы для наших клиентов. Это позволит нашим клиентам подключаться к нашим серверам, не подвергая сомнению подлинность сервера.

Начнем с машины, которую будем использовать в качестве центра сертификации. В этом примере мы будем называть это \auth.example.com.

Генерация ключей подписи

Во-первых, нам нужно сгенерировать несколько ключей RSA, которые будут функционировать как ключи подписи. Используйте любого пользователя, которого вы хотите, но пользователь root, вероятно, является хорошей идеей. Мы создадим ключи с именами \server_ca и \server_ca.pub, поскольку они будут использоваться для аутентификации наших серверов.

Давайте создадим эти ключи в нашем домашнем каталоге:

cd ~
ssh-keygen -f server_ca

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

ls
server_ca   server_ca.pub

Подписание ключей хоста

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

Мы должны начать с подписания ключа хоста самого центра сертификации. Мы можем сделать это, используя следующий синтаксис:

<пред>

Давайте разберемся, что все это значит.

  • -s: это только что созданный закрытый ключ, который мы будем использовать для подписи всех остальных ключей.
  • -I: это имя, которое используется для идентификации сертификата. Он используется для ведения журнала, когда сертификат используется для проверки подлинности.
  • -h: помечает полученный сертификат как ключ хоста, а не ключ клиента.
  • -n: используется для идентификации имени (пользователя или хоста), связанного с этим сертификатом.
  • -V: указывает срок действия сертификата. В этом случае мы указываем, что срок действия сертификата истекает через год (52 недели).

После этого мы указываем ключ, который мы хотим подписать.

В нашем случае, чтобы подписать собственный RSA-ключ хоста, мы будем использовать строку, которая выглядит следующим образом. Мы собираемся идентифицировать этот сервер как \host_auth_server. Нам будет предложено ввести парольную фразу, которую мы использовали при создании ключа подписи:

ssh-keygen -s server_ca -I host_auth_server -h -n auth.example.com -V +52w /etc/ssh/ssh_host_rsa_key.pub
Signed host key /etc/ssh/ssh_host_rsa_key-cert.pub: id "host_auth_server" serial 0 for auth.example.com valid from 2014-03-20T12:25:00 to 2015-03-19T12:26:05

Как видно из вывода, наш сертификат действителен в течение одного года. Он был создан в том же каталоге, что и ключ хоста нашего сервера (/etc/ssh/), и называется \ssh_host_rsa_key-cert.pub.

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

Скопируйте ключ хоста с нашего SSH-сервера. Мы будем называть эту машину \sshserver.example.com. Это можно сделать с помощью scp:

cd ~
scp root@sshserver.example.com:/etc/ssh/ssh_host_rsa_key.pub .

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

ssh-keygen -s server_ca -I host_sshserver -h -n sshserver.example.com -V +52w ssh_host_rsa_key.pub
Signed host key ssh_host_rsa_key-cert.pub: id "host_sshserver" serial 0 for sshserver.example.com valid from 2014-03-20T12:40:00 to 2015-03-19T12:41:48

Теперь нам нужно скопировать сгенерированный файл сертификата обратно на хост. Опять же, для этого мы можем использовать scp:

scp ssh_host_rsa_key-cert.pub root@sshserver.example.com:/etc/ssh/

После этого мы можем удалить как открытый ключ SSH-сервера, так и сертификат с нашего сервера аутентификации:

rm ssh_host_rsa_key.pub ssh_host_rsa_key-cert.pub

Теперь у нас есть подписанные сертификаты, нам просто нужно настроить наши компоненты для их использования.

Настройка компонентов для использования сертификатов хоста

Во-первых, нам нужно продолжить работу с обоими нашими серверами (sshserver.example.com), чтобы сообщить им о созданных нами файлах сертификатов.

На обеих этих машинах нам придется отредактировать основной файл конфигурации демона SSH. Убедитесь, что вы редактируете файл sshd_config, а не файл ssh_config:

sudo nano /etc/ssh/sshd_config

Если вы можете найти строку HostCertificate, измените ее. В противном случае добавьте это в конец файла. Нам нужно установить путь к нашему файлу сертификата хоста:

HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

Сохраните и закройте файл, когда закончите.

Теперь перезапустите демон SSH, чтобы эти изменения вступили в силу:

sudo service ssh restart

Сделайте это на всех серверах, для которых вы настраиваете сертификаты хоста.

Теперь наши серверы настроены на использование сертификата, но наш клиент не знает, как проверить сертификат, который представит сервер.

На нашем клиентском компьютере, который мы будем называть \client.example.com, откройте или создайте файл \~/.ssh/known_hosts. :

nano ~/.ssh/known_hosts

Нам нужно удалить все записи, связанные с серверами, которые мы настраиваем для ввода сертификата. Может быть, лучше удалить все.

После этого нам нужно добавить специальную запись, указывающую открытый ключ, который мы должны использовать для проверки сертификата, который наши хосты предоставят нам при входе в систему. Начните с @cert-authority. После этого он может включать ограничение домена, к которому будет применяться ключ, за которым следует открытый ключ центра сертификации, которым мы все подписывали.

На компьютере вашего центра сертификации вы можете получить открытый ключ подписи сертификата, набрав:

cat ~/server_ca.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/+G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc++8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth

Используя эту информацию, строка в вашем файле ~/.ssh/known_hosts должна выглядеть так:

@cert-authority *.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/+G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc++8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth

Сохраните и закройте файл, когда закончите.

Теперь, когда вы впервые посещаете SSH-сервер со своего клиента (используя полное имя хоста), вас не должны спрашивать, доверяете ли вы удаленному хосту. Это связано с тем, что хост представил вам свой сертификат хоста, подписанный центром сертификации. Вы проверили файл known_hosts и убедились, что сертификат является законным.

Как настроить пользовательские ключи

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

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

ssh-keygen -f users_ca

Снова выберите парольную фразу, чтобы ваш ключ был защищен, если кто-то получит доступ.

Настройка серверов для приема входа с сертификацией пользователя

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

scp users_ca.pub root@sshserver.example.com:/etc/ssh/

Нам нужно изменить конфигурацию нашего демона SSH на нашем сервере SSH, чтобы искать этот ключ.

На нашем хосте \sshserver.example.com откройте файл конфигурации:

sudo nano /etc/ssh/sshd_config

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

TrustedUserCAKeys /etc/ssh/users_ca.pub

Опять же, нам нужно перезапустить демон SSH, чтобы эти изменения вступили в силу:

sudo service ssh restart

Подписание ключей входа пользователя

Теперь, когда серверы настроены на доверие ключам, подписанным ключом users_ca, нам нужно фактически подписать ключи аутентификации пользователей, чтобы эта схема работала.

Во-первых, нам нужно передать наш клиентский ключ на сервер центра сертификации с помощью scp. На сервере сертификатов введите:

<пред>

Теперь, когда у нас есть ключ на машине с сертификатами, мы можем подписать его с помощью нашего ключа users_ca. Это будет очень похоже на прошлый раз, когда мы подписывали ключи с помощью ключей server_ca, только теперь мы не включаем параметр -h, потому что это пользовательские ключи.

Команда, которую мы хотим, выглядит примерно так. Измените значение \username, чтобы оно отражало имя пользователя, которого вы подписываете, для упрощения управления:

<пред>

Вам будет предложено ввести парольную фразу users_ca, заданную при создании ключа. Теперь у нас есть файл id_rsa-cert.pub в нашем каталоге, который нам нужно перенести обратно на наш клиентский компьютер:

<пред>

Теперь, когда вы входите в sshserver.example.com со своего клиентского компьютера, вас не должны запрашивать данные аутентификации, даже если вы никогда раньше не входили на этот сервер как этот пользователь.

Заключение

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

Хотя, возможно, это не самый мощный способ создания централизованной аутентификации, его легко настроить и использовать существующие инструменты, не требуя много времени и настройки. Это также имеет то преимущество, что сервер CA не требует подключения к сети для проверки сертификатов.

Джастин Эллингвуд