Пользователям Astra Linux
Введение
Related links
- https://help.ubuntu.com/community/Kerberos
- По аутентификации с использованием сертификатов здесь: http://k5wiki.kerberos.org/wiki/Pkinit_configuration
Основные понятия
- Key Distribution Center (KDC) - хранилище информации о паролях пользователей
- Admin server - основной сервер kerberos. У нас KDC и admin server находятся на одной машине
- Realm - "среда", в которой производится аутентификация
- Principal - пользователь или сервис, участвующий в механизме аутентификации. Мы пока рассматриваем только пользователей
Проверка модели устройства
- Подключите USB-токен к компьютеру.
- Для определения названия модели USB-токена откройте Терминал и введите команду:
$ lsusb
В результате в окне Терминала отобразится название модели USB-токена:
Убедитесь, что используете: Aktiv Rutoken ECP
Стенд
- две виртуальные машины с Ubuntu
Важно: время на клиенте и сервере должно быть синхронизировано. Невыполнение этого требования может привести к возникновению проблем.
<username> = testuser
<realm> = AKTIV-TEST
<server> = aktiv-test.ru
Сервер
- Установлены
krb5-kdc, krb5-admin-server, krb5-pkinit
- Kerberos realm:
AKTIV-TEST
, доменное имяaktiv-test.ru
(прописано в /etc/hosts на клиенте)
Примечание: доменное имя стоит делать минимум второго уровня для избежания ошибок - Пользователи:
testuser@AKTIV-TEST
Клиент
- Установлены
krb5-user, krb5-config, krb5-pkinit
- default realm:
AKTIV-TEST
- сервера (kdc, admin) указаны по IP-адресу (лучше указать их в /etc/hosts)
Первичная настройка
Сервер
Установить пакеты и создать новый realm
$ sudo apt-get install krb5-kdc krb5-admin-server krb5-pkinit # В диалогах указать: # realm = AKTIV-TEST # домен = aktiv-test.ru $ sudo krb5_newrealm # ввести пароль
В файле конфигурации сервера /etc/krb5.conf указать
[domain_realm] .aktiv-test.ru = AKTIV-TEST aktiv-test.ru = AKTIV-TEST
Завести на сервере нового пользователя
$ sudo kadmin.local # username = testuser # password = test kadmin.local:$ addprinc <username> # ... kadmin.local:$ quit
На сервере проверить, что для этого пользователя можно получить тикет
$ kinit <username> ... $ klist ... $ kdestroy
Клиент
Установим pkcs11 модуль rtpkcs11ecp.so (https://www.rutoken.ru/support/download/pkcs/)
Установим необходимые пакеты и сконфигурируем kerberos
sudo apt-get install krb5-user libpam-krb5 libpam-ccreds auth-client-config krb5-pkinit opensc libengine-pkcs11-openssl # В диалогах указать: # realm = AKTIV-TEST # домен = aktiv-test.ru sudo dpkg-reconfigure krb5-config
В файле конфигурации клиента /etc/krb5.conf указать
[domain_realm] .aktiv-test.ru = AKTIV-TEST aktiv-test.ru = AKTIV-TEST
Проверим, что пользователь может аутентифицироваться по паролю
$ kinit <username> ... $ klist ... $ kdestroy
Настройка аутентификации по Рутокену
Сервер
Создадим ключ и самоподписанный сертификат УЦ
$ openssl genrsa -out cakey.pem 2048 $ openssl req -key cakey.pem -new -x509 -out cacert.pem
Создадим файл pkinit_extensions со следующим содержимым
[ kdc_cert ] basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted keyUsage = nonRepudiation, digitalSignature, keyEncipherment, keyAgreement #Pkinit EKU extendedKeyUsage = 1.3.6.1.5.2.3.5 subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer # Copy subject details issuerAltName=issuer:copy # Add id-pkinit-san (pkinit subjectAlternativeName) subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:kdc_princ_name [kdc_princ_name] realm = EXP:0, GeneralString:${ENV::REALM} principal_name = EXP:1, SEQUENCE:kdc_principal_seq [kdc_principal_seq] name_type = EXP:0, INTEGER:1 name_string = EXP:1, SEQUENCE:kdc_principals [kdc_principals] princ1 = GeneralString:krbtgt princ2 = GeneralString:${ENV::REALM} [ client_cert ] # These extensions are added when 'ca' signs a request. basicConstraints=CA:FALSE keyUsage = digitalSignature, keyEncipherment, keyAgreement extendedKeyUsage = 1.3.6.1.5.2.3.4 subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:princ_name # Copy subject details issuerAltName=issuer:copy [princ_name] realm = EXP:0, GeneralString:${ENV::REALM} principal_name = EXP:1, SEQUENCE:principal_seq [principal_seq] name_type = EXP:0, INTEGER:1 name_string = EXP:1, SEQUENCE:principals [principals] princ1 = GeneralString:${ENV::CLIENT}
Создадим ключ и сертификат KDC
openssl genrsa -out kdckey.pem 2048 # создание запроса openssl req -new -out kdc.req -key kdckey.pem # подпись запроса REALM=<realm>; export REALM CLIENT=<server>; export CLIENT # содержимое файла pkinit_extensions выше openssl x509 -req -in kdc.req -CAkey cakey.pem -CA cacert.pem -out kdc.pem -extfile pkinit_extensions -extensions kdc_cert -CAcreateserial
Переместим файлы kdc.pem, kdckey.pem, cacert.pem в директорию /etc/krb5/
sudo mkdir /etc/krb5 sudo cp kdc.pem kdckey.pem cacert.pem /etc/krb5/
Включим preauth на сервере. Для этого опишем realm AKTIV-TEST в файле /etc/krb5kdc/kdc.conf
Включите preauth для пользователя
sudo kadmin.local kadmin.local$: modprinc +requires_preauth <username>
Клиент
Отформатируйте токен с помощью утилиты rtadmin
Сгенерируем ключевую пару клиента. Создаем заявку на сертификат.
# не забываем про ID! pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45 openssl OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so ... OpenSSL> req -engine pkcs11 -new -key 45 -keyform engine -out client.req -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=dev/CN=testuser/emailAddress=testuser@mail.com"
Сервер
Копируем заявку на сертификат (client.req). И подписываем ее.
$ REALM=<realm>; export REALM $ CLIENT=<username>; export CLIENT $ openssl x509 -CAkey cakey.pem -CA cacert.pem -req -in client.req -extensions client_cert -extfile pkinit_extensions -out client.pem
5.3.2 Перезапустим сервер и KDC
$ /etc/init.d/krb5-admin-server restart $ /etc/init.d/krb5-kdc restart
Обратно клиент
Получаем сертификат и записываем его на токен. Также нужно положить корневой сертификат в /etc/krb5/
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45 sudo cp cacert.pem /etc/krb5/cacert.pem
Изменим файл конфигурации /etc/krb5.conf
/etc/krb5.conf
[libdefaults] default_realm = <realm> pkinit_anchors = FILE:/etc/krb5/cacert.pem # для аутентификации по локальному ключу # pkinit_identities = FILE:/etc/krb5/client.pem,/etc/krb5/clientkey.pem # для аутентификации по токену pkinit_identities = PKCS11:/usr/lib/librtpkcs11ecp.so
Пробуем аутентифицироваться
$ kinit <username>