Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Введение

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

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

Стенды

  • две виртуальные машины с 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

Сервер
$ sudo apt-get install krb5-kdc krb5-admin-server krb5-pkinit
# В диалогах указать:
# realm = AKTIV-TEST
# домен = aktiv-test.ru
$ sudo krb5_newrealm
# ввести пароль
Клиент
$ 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

Добавить секцию[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

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

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

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

Сервер
Создать ключ и сертификат CA:
$ openssl genrsa -out cakey.pem 2048 
$ openssl req -key cakey.pem -new -x509 -out cacert.pem
Создать ключ и сертификат 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
Перенести следующие файлы в /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}
Включить 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
    } 
Включить preauth для пользователя
$ kadmin.local
kadmin.local$: modprinc +requires_preauth <username>
Клиент
Скопировать сертификат 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
# 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
Снова сервер
Скопировать с клиента заявку (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
Перезапустить сервер и 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
Настроить 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

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

$ kinit <username>
  • No labels