Начиная с очередного обновления 1.8 программное обеспечение Astra Linux Directory (ALD) исключено из состава Astra Linux Special Edition. Для организации доменов рекомендуется использовать программный комплекс ALD Pro. Также возможно использование доменов FreeIPA, Samba, Windows AD.

Настройка Kerberos-аутентификации

Введение

Дополнительные материалы

Основные понятия

Key Distribution Center (KDC) - хранилище информации о паролях пользователей
Admin server - основной сервер kerberos. У нас KDC и admin server находятся на одной машине
Realm - "среда", в которой производится аутентификация
Principal - пользователь или сервис, участвующий в механизме аутентификации. Мы пока рассматриваем только пользователей

Стенд

две машины с Astra Linux 1.3 x64 и настроенной ALD

Важно: время на клиенте и сервере должно быть синхронизировано. Невыполнение этого требования может привести к возникновению проблем.

<username> = test1
<realm> = RUSBITECH.RU
<server> = server.rusbitech.ru

Клиент

Установлены стандартные пакеты для работы с токенами:

libopenct1_0.6.20-1.2_amd64.deb
openct_0.6.20-1.2_amd64.deb
opensc_0.12.2-2_amd64.deb
libp11-2_0.2.8-2_amd64.deb
libengine-pkcs11-openssl_0.1.8-2_amd64.deb

Сервер и клиент

Kerberos realm: RUSBITECH.RU, доменное имя server.rusbitech.ru (прописано в /etc/hosts на клиенте)
Пользователи: test1@RUSBITECH.RU
Добавочно к предустановленным пакетам ald/kerberos установлен krb5-pkinit(krb5-pkinit_1.10.1+dfsg-3_amd64.deb, Debian Wheezy):

dpkg -i --force-depends krb5-pkinit_1.10.1+dfsg-3_amd64.deb

Общий порядок действий

Проверка получения тикета пользователем на сервере

$ kinit <username>
...
$ klist
...
$ kdestroy

Проверка получения билета пользователем на клиенте, используя идентификацию по паролю

$ kinit <username>@<realm>
...
$ klist
...
$ kdestroy

Настройка работы с сертификатами и токеном

Сервер

Создать ключ и сертификат CA:

openssl genrsa -out cakey.pem 2048
openssl req -key cakey.pem -new -x509 -out cacert.pem

Common name указать test1 (ваш пользователь).

Создать ключ и сертификат KDC:

openssl genrsa -out kdckey.pem 2048

Создание запроса

openssl req -new -out kdc.req -key kdckey.pem
Common name указать RUSBITECH.RU

Подпись запроса

export REALM=RUSBITECH.RU #Ваш домен
export CLIENT=server #Имя Вашего сервера
# файл pkinit_extensions следует положить в тот каталог, откуда вы выполняете команды.
openssl x509 -req -in kdc.req -CAkey cakey.pem -CA cacert.pem -out kdc.pem -extfile pkinit_extensions -extensions kdc_cert -CAcreateserial
Перенести следующие файлы в /var/lib/krb5kdc/:

kdc.pem
kdckey.pem
cacert.pem

Включить preauth на сервере.

Необходимо дополнить секцию kdcdefaults новыми параметрами из примера ниже:

/etc/krb5kdc/kdc.conf
[kdcdefaults]
    kdc_tcp_ports = 88
    pkinit_identity = FILE:/var/lib/krb5kdc/kdc.pem,/var/lib/krb5kdc/kdckey.pem
    pkinit_anchors = FILE:/var/lib/krb5kdc/cacert.pem
[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
    }

Включить preauth для пользователя

kadmin.local$: modprinc +requires_preauth <username>

Клиент

Создать каталог /etc/krb5/

Скопировать сертификат CA (cacert.pem) c сервера в /etc/krb5/ на клиенте

Отформатировать токен

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

Сгенерировать ключевую пару и заявку на сертификат на токене

# не забываем про ID!

pkcs15-init -G rsa/2048 --auth-id 02 --id 42 --label "testuser's key" --public-key-label "testuser's public key"
# ...
openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/ssl/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:opensc-pkcs11.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:42 -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

Сервер

Скопировать с клиента заявку (client.req) и подписать ее ключом CA:

export REALM=RUSBITECH.RU #Ваш домен
export CLIENT=testuser #Ваш пользователь
openssl x509 -CAkey cakey.pem -CA cacert.pem -req -in client.req -extensions client_cert -extfile pkinit_extensions -out client.pem
Перезапустить сервер и kdc:
/etc/init.d/krb5-admin-server restart
/etc/init.d/krb5-kdc restart

Клиент

Вернуть сертификат клиента (client.pem) и положить его в /etc/krb5/ <

Также записать его на токен

pkcs15-init --store-certificate client.pem --auth-id 02 --id 42 --format pem
client.pem должен быть подписан на сервере!

Настроить kerberos

/etc/krb5.conf
[libdefaults]
default_realm = RUSBITECH.RU
pkinit_anchors = FILE:/etc/krb5/cacert.pem
# для аутентификации по локальному ключу
# pkinit_identities = FILE:/etc/krb5/client.pem,/etc/krb5/clientkey.pem
# для аутентификации по токену
pkinit_identities = PKCS11:/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so

Проверить как оно все работает

$ kinit <username>