...
Введение
Related links
...
- две виртуальные машины с Ubuntu x86
Note |
---|
Важно: время на клиенте и сервере должно быть синхронизировано. Невыполнение этого требования может привести к возникновению проблем. |
...
- Установлены
krb5-user, krb5-config, krb5-pkinit
- default realm:
AKTIV-TEST
- сервера (kdc, admin) указаны по IP-адресу (лучше указать их в /etc/hosts)
Общий порядок действий
...
Первичная настройка
Сервер
Установить пакеты и создать новый realm
1.1 Сервер
Code Block |
---|
|
$ sudo apt-get install krb5-kdc krb5-admin-server krb5-pkinit
# В диалогах указать:
# realm = AKTIV-TEST
# домен = aktiv-test.ru
$ sudo krb5_newrealm
# ввести пароль |
1.2 Клиент
Code Block |
---|
|
$ sudo apt-get install krb5-user libpam-krb5 libpam-ccreds auth-client-config krb5-pkinit
# В диалогах указать:
# realm = AKTIV-TEST
# домен = aktiv-test.ru
$ sudo dpkg-reconfigure krb5-config |
...
В файле конфигурации сервера /etc/krb5.conf
...
указать
Code Block |
---|
|
[domain_realm]
.aktiv-test.ru = AKTIV-TEST
aktiv-test.ru = AKTIV-TEST |
...
Завести на сервере нового пользователя
...
Code Block |
---|
|
$ sudo kadmin.local
# username = testuser
# password = test
kadmin.local:$ addprinc <username>
# ...
kadmin.local:$ quit |
...
На сервере проверить, что для этого пользователя можно получить тикет
Code Block |
---|
|
$ kinit <username>
...
$ klist
...
$ kdestroy |
...
Клиент
Установим pkcs11 модуль rtpkcs11ecp.so (https://www.rutoken.ru/support/download/pkcs/)
Установим необходимые пакеты и сконфигурируем kerberos
Code Block |
---|
|
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 указать
Code Block |
---|
|
[domain_realm]
.aktiv-test.ru = AKTIV-TEST
aktiv-test.ru = AKTIV-TEST |
Проверим, что пользователь может аутентифицироваться по паролю
Code Block |
---|
|
$ kinit <username>@<realm><username>
...
$ klist
...
$ kdestroy |
5. Настроить работу с сертификатами и токеном
5.1 Сервер
...
Настройка аутентификации по Рутокену
Сервер
Создадим ключ и самоподписанный сертификат УЦ
Code Block |
---|
|
$ openssl genrsa -out cakey.pem 2048
$ openssl req -key cakey.pem -new -x509 -out cacert.pem |
5.1.2 Создать ключ и сертификат KDC:
Code Block |
---|
|
$ 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 |
5.1.3 Перенести следующие файлы в /var/lib/krb5kdc/:
kdc.pem
kdckey.pem
cacert.pem
Создадим файл pkinit_extensions со следующим содержимым
Code Block |
---|
language | bash |
---|
title | pkinit_extensions |
---|
collapse | true |
|
[ 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
Code Block |
---|
|
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/
Code Block |
---|
|
sudo mkdir /etc/krb5
sudo cp kdc.pem kdckey.pem cacert.pem /etc/krb5/ |
Включим preauth на сервере. Для этого опишем realm AKTIV-TEST в файле /etc/krb5kdc/kdc.conf
Code Block |
---|
language | bash |
---|
title | /etc/krb5kdc/kdc.conf |
---|
collapse | true |
---|
|
[realms]
AKTIV-TEST = {
database_name = /var/lib/krb5kdc/principal
admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab
acl_file = /etc/krb5kdc/kadm5.acl
key_stash_file = /etc/krb5kdc/stash
max_life = 10h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = des3-hmac-sha1
supported_enctypes = aes256-cts:normal arcfour-hmac:normal des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3
default_principal_flags = +preauth
} |
...
pkinit_anchors = FILE:/etc/krb5/cacert.pem
pkinit_identity = FILE:/etc/krb5/kdc.pem,/etc/krb5/kdckey.pem
} |
Включите preauth для пользователя
Code Block |
---|
|
$sudo kadmin.local
kadmin.local$: modprinc +requires_preauth <username> |
5.2 Клиент
5.2.1 Скопировать сертификат CA (cacert.pem) c сервера в /etc/krb5/ на клиенте
5.2.2 Отформатировать токен
Code Block |
---|
|
$ pkcs15-init --erase-card -p rutoken_ecp
$ pkcs15-init --create-pkcs15 --so-pin "87654321" --so-puk ""
$ pkcs15-init --store-pin --label "User PIN" --auth-id 02 --pin "12345678" --puk "" --so-pin "87654321" --finalize |
...
Клиент
Сгенерируем ключевую пару клиента. Создаем заявку на сертификат.
Code Block |
---|
|
# не забываем про ID!
$pkcs11-tool pkcs15-init -G rsa/2048module /usr/lib/librtpkcs11ecp.so --auth-id 02 --id 42 --label "testuser's key" --public-key-label "testuser's public key"
# ...
$ openssl
# NB: пути! на multiarch-системах opensc-pkcs11.so и engine_pkcs11.so могут лежать в других местах
keypairgen --key-type rsa:2048 -l --id 45
openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/opensslx86_64-linux-gnu/engines-1.1/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:opensc-pkcs11librtpkcs11ecp.so
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/lib/openssl/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine...
OpenSSL> req -engine pkcs11 -new -key 1:4245 -keyform engine -out client.req -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=dev/CN=testuser/emailAddress=testuser@mail.com"
engine "pkcs11" set.
PKCS#11 token PIN:
OpenSSL> quit |
5.3 Снова сервер
...
Сервер
Копируем заявку на сертификат (client.req)
...
. И подписываем ее.
Code Block |
---|
|
$ 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
Code Block |
---|
$ /etc/init.d/krb5-admin-server restart
$ /etc/init.d/krb5-kdc restart |
...
Обратно клиент
...
Получаем сертификат и записываем его на токен. Также нужно положить корневой сертификат в /etc/krb5/
...
Code Block |
---|
|
$pkcs11-tool pkcs15-init--module /usr/lib/librtpkcs11ecp.so --store-certificate l -y cert -w ./client.pem --auth-id 02 --id 42 --format pem |
...
45
sudo cp cacert.pem /etc/krb5/cacert.pem |
Изменим файл конфигурации /etc/krb5.conf
Code Block |
---|
language | bash |
---|
title | /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/opensc-pkcs11librtpkcs11ecp.so |
...
Пробуем аутентифицироваться
Code Block |
---|
|
$ kinit <username> |
...