LDAP Linux LDAP TLS

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску

LDAP Шифрование

ТУТ я просто дублирую статью со своими комментариями.


Подготовка CA, выпуск корневого сертефиката

Предварительная настройка - создание инфраструктуры CA

Итак, мы создаём централизованную инфраструктуру открытых ключей (PKI) в миниатюре.

Для этого сформируем пару закрытый ключ/корневой сертификат удостоверяющего центра.

Причём сертификат будет подписан этим же закрытым ключом (т. е. станет «самоподписанным»).

Затем сгенерируем новые закрытые ключи для нашей службы каталогов и создадим для неё сертификаты, подписанный закрытым ключом нашего удостоверяющего центра. При этом клиенские рабочие станции должны знать только корневой сертификат.


Используя его они могут установить безопасное соединение с любым сервером, который имеет закрытый ключ и соответствующий ему сертификат, подписанный нашим CA.


Удостоверяющий центр (CA) желательно разворачивать на отдельной машине, не имеющей подключения к сети, но для простоты примера мы проделаем всю работу на ldap1 (node-3)


В конфигурационном файле /etc/ssl/openssl.cnf в секции [ CA_default ] для удобства поменяем значение директивы dir = ./demoCA на dir = ./. В этом же разделе директивой default_days задаётся срок действия выпускаемых сертификатов.


# cat /etc/ssl/openssl.cnf | grep -v '#' | grep -v ^$
HOME			= .
RANDFILE		= $ENV::HOME/.rnd
oid_section		= new_oids
[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
[ ca ]
[ CA_default ]
dir = ./.
default_days	= 3650
policy		= policy_match
[ policy_match ]
countryName		= match
stateOrProvinceName	= match
organizationName	= match
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional
[ policy_anything ]
countryName		= optional
stateOrProvinceName	= optional
localityName		= optional
organizationName	= optional
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional
[ req ]
default_bits		= 2048
default_keyfile 	= privkey.pem
distinguished_name	= req_distinguished_name
attributes		= req_attributes
string_mask = utf8only
[ req_distinguished_name ]
countryName			= Country Name (2 letter code)
countryName_default		= AU
countryName_min			= 2
countryName_max			= 2
stateOrProvinceName		= State or Province Name (full name)
stateOrProvinceName_default	= Some-State
localityName			= Locality Name (eg, city)
0.organizationName		= Organization Name (eg, company)
0.organizationName_default	= Internet Widgits Pty Ltd
organizationalUnitName		= Organizational Unit Name (eg, section)
commonName			= Common Name (e.g. server FQDN or YOUR name)
commonName_max			= 64
emailAddress			= Email Address
emailAddress_max		= 64
[ req_attributes ]
challengePassword		= A challenge password
challengePassword_min		= 4
challengePassword_max		= 20
unstructuredName		= An optional company name
[ usr_cert ]
basicConstraints=CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
keyUsage = cRLSign, keyCertSign
[ crl_ext ]
authorityKeyIdentifier=keyid:always
[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment			= "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
[ tsa ]
[ tsa_config1 ]

Файлы index.txt и serial будут играть роль своеобразной базы данных, чтобы отслеживать статус выпущенных закрытых ключей и сертификатов.


Создадим каталог для нашего удостоверяющего центра (CA) и установим безопасные права доступа. Затем зададим значение umask таким, чтобы вновь создаваемые файлы имели права доступа чтения и записи только для создавшего их пользователя, затем создадим структуру каталогов и файлов для своего удостоверяющего центра и Сгенерируем закрытый ключ удостоверяющего центра (длиной 4096 бит).

Он должен хранится особенно бережно. Поэтому мы защитим его при помощи шифра AES. Вам будет предложено ввести пароль для доступа к новому закрытому ключу.

Запомните его и не потеряйте. Это последний рубеж защиты от злоумышленника. Без пароля выпустить новые сертификаты не получится. (в моем пример ключ - r00tme)


0010_prepere_CA.sh
mkdir /root/CA

chmod u=rwx,g=,o= /root/CA
pushd /root/CA
umask 066


mkdir certs crl newcerts private.
chmod 700 private
touch index.txt
echo 1000 > serial


# Create key pass = r00tme
openssl genrsa -aes256 -out private/rootca.key 4096
chmod 400 private/rootca.key
chattr +i private/rootca.key

popd

Выпуск корневого сертификата CA

Сейчас мы можем выпустить корневой сертификат удостоверяющего центра, подписав его закрытым ключом rootca.key. Так как это сертификат УЦ, используем расширение v3_ca

0011_rootCa_crt.sh
openssl req \
-sha256 \
-new \
-x509 \
-days 3650 \
-extensions v3_ca \
-key private/rootca.key \
-out certs/rootca.crt \
-subj /C=UA/ST=Kharkov/L=Kharkov/O=MirantisInc/OU=ServicesDepartment/CN=ca-server/emailAddress=mmaxur@mirantis.com

chmod 444 certs/rootca.crt
chattr +i certs/rootca.crt

openssl x509 -in certs/rootca.crt -noout -text

popd



С помощью модификатора subj заносим в сертификат информацию:

C - Country Name (страна) ST - State or Province Name (штат или провинция) L - Locality Name (город) O - Organization Name (наименование организации) OU - Organizational Unit Name (наименование подразделения) CN - Common Name (имя субъекта или FQDN сервера) emailAddress - Email Address (адрес электронной почты)


Можем посмотреть содержимое сертификата следующей командой:

openssl x509 -in certs/rootca.crt -noout -text

Удостоверяющий центр готов к выпуску сертификатов.

Создание сертификатов для серверов

Сертификат для сервеа LDAP1

Закрытый Ключ

Создадим закрытый ключ для сервера службы каталогов ldap1

0012_private_key_for_ldap1.sh
pushd /root/CA
openssl genrsa \
-out private/ldap1.key 4096

chmod 400 private/ldap1.key

popd

Запрос на сертификат

Сгенерируем запрос на подпись сертификата. Наименование организации должно совпадать с наименованием в корневом сертификате УЦ. В качестве Common Name укажем FQDN нашего сервера (в моем случае это ldap1)

0013_create_cert_request_for_ldap1.sh
pushd /root/CA

openssl req \
-sha256 -new \
-key private/ldap1.key \
-out certs/ldap1.csr \
-subj /C=UA/ST=Kharkov/L=Kharkov/O=MirantisInc/OU=ServicesDepartment/CN=ldap1/emailAddress=mmaxur@mirantis.com

popd

Генерируем сертификат подписанный своим СА

Подпишем его с помощью своего собственного CA:

0014_create_and_sign_cert_for_ldap1.sh
pushd /root/CA

openssl ca \
-extensions usr_cert \
-notext \
-md sha256 \
-keyfile private/rootca.key \
-cert certs/rootca.crt \
-in certs/ldap1.csr \
-out certs/ldap1.crt

chmod 444 certs/ldap1.crt

popd

Копирование файлов

Так как у нас сертификат генерировался на том же сервере где и используется (node-3 он же ldap1) - то можно просто скопировать его в правильное место и установить права.

0015_move_certs_to_ldap_config_dir.sh
pushd /root/CA

mkdir /etc/ldap/ssl
chown openldap:openldap /etc/ldap/ssl
chmod 0500 /etc/ldap/ssl
cp certs/ldap1.crt private/ldap1.key /etc/ldap/ssl


chown openldap:openldap /etc/ldap/ssl/{ldap1.crt,ldap1.key}
chmod 0400 /etc/ldap/ssl/{ldap1.crt,ldap1.key}

cp certs/rootca.crt /etc/ssl/certs/

chmod 0644 /etc/ssl/certs/rootca.crt

popd

Проверка сертификата

0016_check_cert.sh
openssl verify -verbose -CAfile /etc/ssl/certs/rootca.crt  /etc/ldap/ssl/ldap1.crt

Конфигурация LDAP сервера

Внести исправления в конфигурацию

0201_install_tls_certs.ldif
dn: cn=config
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap1.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap1.key
-
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/rootca.crt


0202_configure_ldap_to_use_tls.sh
ldapmodify -Y EXTERNAL -H ldapi:/// <0201_install_tls_certs.ldif

Запретить нешифрованные подключения

Для того тто бы использовать ldaps:// в настройках /etc/default/slapd

SLAPD_SERVICES="ldaps://ldap1  ldapi:///"

После рестарта - проверить:

netstat  -ntpl | grep slap
tcp        0      0 10.20.0.3:636           0.0.0.0:*               LISTEN      17649/slapd

Настроить /etc/ldap/ldap.conf

Настроить файл конфигурации /etc/ldap/ldap.conf который используют клиенты:

BASE            dc=fuel_domain
URI             ldaps://ldap1
TLS_CACERT      /etc/ssl/certs/rootca.crt
TLS_REQCERT     demand
TIMELIMIT       15
TIMEOUT         20


Проверка конфигурации

Проверить конфигурацию:

0203_check_config.sh
ldapsearch -QLLLY EXTERNAL -H ldapi:/// -b cn=config -s base | grep -i tls


olcTLSCACertificateFile: /etc/ssl/certs/rootca.crt
olcTLSCertificateFile: /etc/ldap/ssl/ldap1.crt
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap1.key
olcTLSVerifyClient: never

3

0204_check_tls_connection.sh
gnutls-cli \
-p 636 ldap1 \
-d 1 \
--print-cert \
--x509cafile  /etc/ssl/certs/rootca.crt

3

1012_private_key_for_ldap2.sh
pushd /root/CA
openssl genrsa \
-out private/ldap2.key 4096


chmod 400 private/ldap2.key


popd

3

1013_create_cert_request_for_ldap2.sh
pushd /root/CA


openssl req \
-sha256 -new \
-key private/ldap2.key \
-out certs/ldap2.csr \
-subj /C=UA/ST=Kharkov/L=Kharkov/O=MirantisInc/OU=ServicesDepartment/CN=ldap2/emailAddress=mmaxur@mirantis.com

popd

3

1014_create_and_sign_cert_for_ldap2.sh
pushd /root/CA

openssl ca \
-extensions usr_cert \
-notext \
-md sha256 \
-keyfile private/rootca.key \
-cert certs/rootca.crt \
-in certs/ldap2.csr \
-out certs/ldap2.crt

chmod 444 certs/ldap2.crt

popd

3

2012_private_key_for_ldap.sh
pushd /root/CA
openssl genrsa \
-out private/ldap.key 4096

chmod 400 private/ldap.key

popd

3

2013_create_cert_request_for_ldap.sh
pushd /root/CA


openssl req \
-sha256 -new \
-key private/ldap.key \
-out certs/ldap.csr \
-subj /C=UA/ST=Kharkov/L=Kharkov/O=MirantisInc/OU=ServicesDepartment/CN=ldap/emailAddress=mmaxur@mirantis.com


popd

3

2014_create_and_sign_cert_for_ldap.sh
pushd /root/CA

openssl ca \
-extensions usr_cert \
-notext \
-md sha256 \
-keyfile private/rootca.key \
-cert certs/rootca.crt \
-in certs/ldap.csr \
-out certs/ldap.crt

chmod 444 certs/ldap.crt

popd

3

3201_install_tls_certs.ldif
dn: cn=config
replace: olcTLSVerifyClient
olcTLSVerifyClient: never
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.key
-
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/rootca.crt
3202_configure_ldap_to_u~s_one_name_on_cluster.sh
ldapmodify -Y EXTERNAL -H ldapi:/// <3201_install_tls_certs.ldif