Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Введение

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

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

Проверка модели устройства

  1. Подключите USB-токен к компьютеру.
  2. Для определения названия модели USB-токена откройте Терминал и введите команду:
$ lsusb 

В результате в окне Терминала отобразится название модели USB-токена:

Убедитесь, что используете: Aktiv Rutoken ECP

Стенды

  • две виртуальные машины с Ubuntu 12.10 x86
  • две виртуальные машины с Astra Linux 1.3 x64
Важно: время на клиенте и сервере должно быть синхронизировано. Невыполнение этого требования может привести к возникновению проблем.

 

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)

Astra Linux 1.3 Смоленск 


  • <username> = test1
  • <realm> = RUSBITECH.RU
  • <server> = server.rusbitech.ru
Клиент

Установлены стандартные пакеты для работы с токенами (openct, opensc)

Сервер и клиент
  • 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 

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

1. /* только для Ubuntu */ Установить пакеты и создать новый realm

Для Astra Linux достаточно только установить krb5-pkinit

1.1 Сервер
$ sudo apt-get install krb5-kdc krb5-admin-server krb5-pkinit
# В диалогах указать:
# realm = AKTIV-TEST
# домен = aktiv-test.ru
$ sudo krb5_newrealm
# ввести пароль
1.2 Клиент
$ 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
1.3 Добавить секцию[domain_realm] в  /etc/krb5.conf на клиенте и сервере
[domain_realm]
	.aktiv-test.ru = AKTIV-TEST
	aktiv-test.ru = AKTIV-TEST

2. /* Только для Ubuntu */ Завести на сервере нового пользователя с помощью kadmin.local 

$ sudo kadmin.local
# username = testuser
# password = test
kadmin.local:$ addprinc <username>
# ...
kadmin.local:$ quit

3. На сервере проверить, что для этого пользователя можно получить тикет

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

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

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

5. Настроить работу с сертификатами и токеном

5.1 Сервер

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

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

5.1.2 Создать ключ и сертификат 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

5.1.3 Перенести следующие файлы в /var/lib/krb5kdc/:

  • kdc.pem
  • kdckey.pem
  • 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}

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

Astra Linux: надо просто переписать секцию 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
    } 

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

$ kadmin.local
kadmin.local$: modprinc +requires_preauth <username>
5.2 Клиент

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

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

$ 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

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

# не забываем про ID!
$ pkcs15-init -G rsa/2048 --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 могут лежать в других местах
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/openssl/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
5.3 Снова сервер

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

$ 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
5.4 Обратно клиент

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

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

$ pkcs15-init --store-certificate client.pem --auth-id 02 --id 42 --format pem

5.4.3 Настроить kerberos

/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-pkcs11.so

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

$ kinit <username>

 

 

  • Нет меток