LDAP Linux LDAP TLS: различия между версиями
Sirmax (обсуждение | вклад) (→3) |
Sirmax (обсуждение | вклад) |
||
(не показаны 34 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | [[Категория:LDAP]] |
||
+ | [[Категория:Linux]] |
||
+ | [[Категория:SSL]] |
||
=LDAP Шифрование= |
=LDAP Шифрование= |
||
* http://pro-ldap.ru/books/openldap-ubuntu-in-practice/tls.html |
* http://pro-ldap.ru/books/openldap-ubuntu-in-practice/tls.html |
||
− | ТУТ я просто дублирую статью со своими комментариями |
+ | ТУТ я просто дублирую статью со своими комментариями и изменениями |
+ | |||
+ | <BR> |
||
+ | У меня в отличие от примера - 2 сервера в режиме мастер-мастер репликации, потому мне нужно 3 сертификата (по факту - 1 на оба сервера но на момент написания статьи я этого не понимал) |
||
+ | |||
+ | * Для сервера ldap1 |
||
+ | * Для сервера ldap2 |
||
+ | * Для сервера ldap - адрес который будет проксировать запросы на один из 2 серверов. |
||
+ | |||
+ | Так как в конечной конфигурации все запросы приходят на ldap (HAProxy) то фактически нужно установить этот сертификат на обоих серверах. |
||
+ | Потому часть с генерацией отдельных сертификатов для каждого из серверов можно пропустить. |
||
+ | |||
+ | ==Подготовка CA, выпуск корневого сертефиката== |
||
+ | ===Предварительная настройка - создание инфраструктуры CA === |
||
+ | |||
+ | Итак, мы создаём централизованную инфраструктуру открытых ключей (PKI) в миниатюре. |
||
+ | |||
+ | Для этого сформируем пару закрытый ключ/корневой сертификат удостоверяющего центра. |
||
+ | |||
+ | Причём сертификат будет подписан этим же закрытым ключом (т. е. станет «самоподписанным»). |
||
+ | |||
+ | Затем сгенерируем новые закрытые ключи для нашей службы каталогов и создадим для неё сертификаты, |
||
+ | подписанный закрытым ключом нашего удостоверяющего центра. При этом клиенские рабочие станции должны знать только корневой сертификат. |
||
+ | |||
+ | |||
+ | Используя его они могут установить безопасное соединение с любым сервером, который имеет закрытый ключ и соответствующий ему сертификат, подписанный нашим CA. |
||
+ | |||
+ | |||
+ | Удостоверяющий центр (CA) желательно разворачивать на отдельной машине, не имеющей подключения к сети, |
||
+ | но для простоты примера мы проделаем всю работу на ldap1 (node-3) |
||
+ | |||
+ | |||
+ | В конфигурационном файле /etc/ssl/openssl.cnf в секции [ CA_default ] для удобства поменяем значение |
||
+ | директивы dir = ./demoCA на dir = ./. В этом же разделе директивой default_days задаётся срок действия выпускаемых сертификатов. |
||
+ | |||
+ | |||
+ | <PRE> |
||
+ | # cat /etc/ssl/openssl.cnf | grep -v '#' | grep -v ^$ |
||
+ | </PRE> |
||
+ | |||
+ | <PRE> |
||
+ | 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 ] |
||
+ | |||
+ | </PRE> |
||
+ | |||
+ | Файлы index.txt и serial будут играть роль своеобразной базы данных, чтобы отслеживать статус выпущенных |
||
+ | закрытых ключей и сертификатов. |
||
+ | |||
+ | |||
+ | Создадим каталог для нашего удостоверяющего центра (CA) и установим безопасные права доступа. Затем зададим значение umask таким, чтобы вновь создаваемые файлы имели права доступа чтения и записи только для создавшего их пользователя, затем создадим структуру каталогов и файлов для своего удостоверяющего центра и Сгенерируем закрытый ключ удостоверяющего центра (длиной 4096 бит). |
||
+ | |||
+ | Он должен хранится особенно бережно. Поэтому мы защитим его при помощи шифра AES. Вам будет предложено ввести пароль для доступа к новому закрытому ключу. |
||
+ | |||
+ | Запомните его и не потеряйте. Это последний рубеж защиты от злоумышленника. Без пароля выпустить новые сертификаты не получится. (в моем пример ключ - r00tme) |
||
+ | |||
− | ==1== |
||
<PRE> |
<PRE> |
||
0010_prepere_CA.sh |
0010_prepere_CA.sh |
||
Строка 18: | Строка 150: | ||
− | mkdir certs crl newcerts private |
+ | mkdir certs crl newcerts private |
chmod 700 private |
chmod 700 private |
||
touch index.txt |
touch index.txt |
||
Строка 32: | Строка 164: | ||
</PRE> |
</PRE> |
||
+ | ===Выпуск корневого сертификата CA=== |
||
− | ==2== |
||
+ | Сейчас мы можем выпустить корневой сертификат удостоверяющего центра, подписав его закрытым ключом rootca.key. Так как это сертификат УЦ, используем расширение v3_ca |
||
+ | |||
<PRE> |
<PRE> |
||
0011_rootCa_crt.sh |
0011_rootCa_crt.sh |
||
Строка 56: | Строка 190: | ||
</PRE> |
</PRE> |
||
+ | |||
− | ==3== |
||
+ | |||
+ | |||
+ | С помощью модификатора 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 (адрес электронной почты) |
||
+ | |||
+ | |||
+ | Можем посмотреть содержимое сертификата следующей командой: |
||
+ | |||
+ | <PRE> |
||
+ | openssl x509 -in certs/rootca.crt -noout -text |
||
+ | </PRE> |
||
+ | Удостоверяющий центр готов к выпуску сертификатов. |
||
+ | |||
+ | ==Создание сертификатов для серверов== |
||
+ | ===Сертификат для сервеа LDAP1=== |
||
+ | ====Закрытый Ключ==== |
||
+ | Создадим закрытый ключ для сервера службы каталогов ldap1 |
||
<PRE> |
<PRE> |
||
0012_private_key_for_ldap1.sh |
0012_private_key_for_ldap1.sh |
||
Строка 71: | Строка 229: | ||
</PRE> |
</PRE> |
||
+ | ====Запрос на сертификат==== |
||
− | ==3== |
||
+ | |||
+ | Сгенерируем запрос на подпись сертификата. Наименование организации должно совпадать с наименованием в корневом сертификате УЦ. |
||
+ | В качестве Common Name укажем FQDN нашего сервера (в моем случае это ldap1) |
||
+ | |||
<PRE> |
<PRE> |
||
0013_create_cert_request_for_ldap1.sh |
0013_create_cert_request_for_ldap1.sh |
||
Строка 88: | Строка 250: | ||
</PRE> |
</PRE> |
||
+ | ====Генерируем сертификат подписанный своим СА==== |
||
− | ==3== |
||
+ | Подпишем его с помощью своего собственного CA: |
||
<PRE> |
<PRE> |
||
0014_create_and_sign_cert_for_ldap1.sh |
0014_create_and_sign_cert_for_ldap1.sh |
||
Строка 110: | Строка 273: | ||
</PRE> |
</PRE> |
||
+ | ====Копирование файлов==== |
||
− | ==3== |
||
+ | Так как у нас сертификат генерировался на том же сервере где и используется (node-3 он же ldap1) - то можно просто скопировать его в правильное место и установить права. |
||
<PRE> |
<PRE> |
||
0015_move_certs_to_ldap_config_dir.sh |
0015_move_certs_to_ldap_config_dir.sh |
||
Строка 134: | Строка 298: | ||
</PRE> |
</PRE> |
||
+ | ====Проверка сертификата==== |
||
− | ==3== |
||
<PRE> |
<PRE> |
||
0016_check_cert.sh |
0016_check_cert.sh |
||
Строка 143: | Строка 307: | ||
</PRE> |
</PRE> |
||
+ | ==Конфигурация LDAP сервера== |
||
− | ==3== |
||
+ | ===Внести исправления в конфигурацию=== |
||
<PRE> |
<PRE> |
||
0201_install_tls_certs.ldif |
0201_install_tls_certs.ldif |
||
Строка 172: | Строка 337: | ||
</PRE> |
</PRE> |
||
+ | ===Запретить нешифрованные подключения=== |
||
− | ==3== |
||
+ | Для того тто бы использовать ldap<B>s</B>:// в настройках <B>/etc/default/slapd</B> |
||
+ | <PRE> |
||
+ | SLAPD_SERVICES="ldaps://ldap1 ldapi:///" |
||
+ | </PRE> |
||
+ | |||
+ | После рестарта - проверить: |
||
+ | <PRE> |
||
+ | netstat -ntpl | grep slap |
||
+ | tcp 0 0 10.20.0.3:636 0.0.0.0:* LISTEN 17649/slapd |
||
+ | </PRE> |
||
+ | |||
+ | ===Настроить /etc/ldap/ldap.conf=== |
||
+ | Настроить файл конфигурации /etc/ldap/ldap.conf который используют клиенты: |
||
+ | <PRE> |
||
+ | BASE dc=fuel_domain |
||
+ | URI ldaps://ldap1 |
||
+ | TLS_CACERT /etc/ssl/certs/rootca.crt |
||
+ | TLS_REQCERT demand |
||
+ | TIMELIMIT 15 |
||
+ | TIMEOUT 20 |
||
+ | </PRE> |
||
+ | |||
+ | |||
+ | ===Проверка конфигурации=== |
||
+ | Проверить конфигурацию: |
||
<PRE> |
<PRE> |
||
0203_check_config.sh |
0203_check_config.sh |
||
Строка 181: | Строка 371: | ||
</PRE> |
</PRE> |
||
+ | |||
− | ==3== |
||
+ | <PRE> |
||
+ | olcTLSCACertificateFile: /etc/ssl/certs/rootca.crt |
||
+ | olcTLSCertificateFile: /etc/ldap/ssl/ldap1.crt |
||
+ | olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap1.key |
||
+ | olcTLSVerifyClient: never |
||
+ | </PRE> |
||
+ | |||
+ | Проверить подключение на уровне tls/ssl (так же можно провериять и другие подключения - не только LDAP): |
||
<PRE> |
<PRE> |
||
0204_check_tls_connection.sh |
0204_check_tls_connection.sh |
||
Строка 195: | Строка 393: | ||
</PRE> |
</PRE> |
||
+ | <PRE> |
||
− | ==3== |
||
+ | Processed 1 CA certificate(s). |
||
+ | Resolving 'ldap1'... |
||
+ | Connecting to '10.20.0.6:636'... |
||
+ | - Certificate type: X.509 |
||
+ | - Got a certificate list of 2 certificates. |
||
+ | - Certificate[0] info: |
||
+ | - subject `C=UA,ST=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ldap1,EMAIL=mmaxur@mirantis.com', issuer `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', RSA key 4096 bits, signed using RSA-SHA256, activated `2016-05-26 17:23:29 UTC', expires `2026-05-24 17:23:29 UTC', SHA-1 fingerprint `a8d1ac296e514badd9aed44fbc405a76e7e63d1b' |
||
+ | |||
+ | -----BEGIN CERTIFICATE----- |
||
+ | MIIGKTCCBBGgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgZwxCzAJBgNVBAYTAlVB |
||
+ | MRAwDgYDVQQIDAdLaGFya292MRAwDgYDVQQHDAdLaGFya292MRQwEgYDVQQKDAtN |
||
+ | aXJhbnRpc0luYzEbMBkGA1UECwwSU2VydmljZXNEZXBhcnRtZW50MRIwEAYDVQQD |
||
+ | DAljYS1zZXJ2ZXIxIjAgBgkqhkiG9w0BCQEWE21tYXh1ckBtaXJhbnRpcy5jb20w |
||
+ | HhcNMTYwNTI2MTcyMzI5WhcNMjYwNTI0MTcyMzI5WjCBhTELMAkGA1UEBhMCVUEx |
||
+ | EDAOBgNVBAgMB0toYXJrb3YxFDASBgNVBAoMC01pcmFudGlzSW5jMRswGQYDVQQL |
||
+ | DBJTZXJ2aWNlc0RlcGFydG1lbnQxDTALBgNVBAMMBGxkYXAxIjAgBgkqhkiG9w0B |
||
+ | CQEWE21tYXh1ckBtaXJhbnRpcy5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw |
||
+ | ggIKAoICAQC1a5nMVGd00XODBLZmPJIME89ybRrxzJIhlPk33p6g/8Hh9sTj3U9m |
||
+ | JQ/QLWORyDGXVJM5UEdInYD5xSU9l/CZY81Z6Uwk4X6GtRng8Au/8mT0hidSPy0F |
||
+ | BtJmgzgafMjUHbQWJbgXzbXz6Gu4Pu+NKh2gkaCrFN59wOJOGOhnf4TMVLoVw+f9 |
||
+ | rn7hA0NcWWhs0sQ6ZPvhsic0A6qh1LgYEzTSSFReywbKH2xg+v4qGoHnnkw2U4r0 |
||
+ | pBUYF22WGMrD1khh9QKbsWtQrH5YNcrTJ8c3gIYioTtAH/BwvAvVZp3G2i3R5cD4 |
||
+ | gDY56OUIuFfTuuYJvpSWC8dInGRxwoZ3RnFvKFn5N1RwKULe9LlR2+ATi4PwIn7q |
||
+ | rJaa4ukhhr6SRNBSRQsQH1b7kXCIpwSbCNxzTBL/HdvzYHd0CmFhiu3BgiyvjY0u |
||
+ | WvnKk8q/u3j0SkjoG7rebrMhZcXz7Leza2F3O8tSZ7bXeBty1HVnFc8a4SQ52N/f |
||
+ | IIAwBgZQoIGgfkNKzriUZnRn6+tABj6JE5dEv9/BQ77FceoB/cLaK7BnEXRxbTYQ |
||
+ | qyqjLXIwaRM14hDUSuVmRxHA6eGiTZ1YktYQwwZM9/erSw/EpD8Eweg2G8Bf1I1C |
||
+ | JoJkP3Bj5RojE6OM5xcn4G3EsPylunoBcZLwVVqEiyBCpgoIU84uYwIDAQABo4GJ |
||
+ | MIGGMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMCwGCWCGSAGG+EIBDQQfFh1PcGVu |
||
+ | U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUgtaUYQW3gDDQnTcP |
||
+ | b0KA4WeeWAEwHwYDVR0jBBgwFoAU/msFAiI92/9ld4t5M9XYonUlHyIwDQYJKoZI |
||
+ | hvcNAQELBQADggIBAINHcZZCARgRLZYKGjNkste5L14z+YMA51aBrS6RcwllTM8b |
||
+ | 1UAWAwtcVD/GsU21nNYKlRu0cH2Iv8CbZiT1zhrZDCfbcr2l+P5LAtxhObvdr+pk |
||
+ | +tHijGbRgAXGYGlDXUT7sECf8Hw588IVMJw5DPUo0Fl4yppsE6/YBodbCl4dD+/R |
||
+ | uqBrJVT6HwA/Hx1Cgz5+wjTNSztsljQE7U9eJNVoH1hk/W1iHjweAPkgmjdnpfA9 |
||
+ | zYxWxAIW4wMY2RAnIaQuyYt4a8L0097VEOUlM9N+dHMtImS0Z+Qgyr7tCViYwHZV |
||
+ | MehpzxsaGbDU0fe8qF474LyA9D62u+BqpHA1FVjQXPtY39zFnWBc83ZQgj2y6gfV |
||
+ | XuYtAcnK7j/QZqE+KfemlNc5G45rvWstkNkbnNgl78R3h3Jx0Dsu0JrBsqU0qjmp |
||
+ | CPyZfbUi6F21B3hf+BzKhTiE4g8MRvddLVRiXGTsyorzbsFnj5R5LyVTDFobvS4W |
||
+ | 9KEjd7jaHxrlTLo/e3G1PRymF63wIa90mgcQgjTuKsO4R7BU7KRSPJr/oBUhYS0/ |
||
+ | p2QHDxEWmH/uy+Qc3X7tNUqpnqbd3tx3WnXFNClqbp3RVymwrolZV/8dgrE1sy1/ |
||
+ | +DwfXsmeK06+Bykppun6glQGL1GX+E9kMZsiWXIrfOocvRqLtbAmX1qt1/jk |
||
+ | -----END CERTIFICATE----- |
||
+ | |||
+ | - Certificate[1] info: |
||
+ | - subject `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', issuer `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', RSA key 4096 bits, signed using RSA-SHA256, activated `2016-05-26 10:16:07 UTC', expires `2026-05-24 10:16:07 UTC', SHA-1 fingerprint `0f74fdaf2195ae2b1f599e3963e3b18970cb81a3' |
||
+ | |||
+ | -----BEGIN CERTIFICATE----- |
||
+ | MIIGGjCCBAKgAwIBAgIJAN1rpxx3AA9AMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD |
||
+ | VQQGEwJVQTEQMA4GA1UECAwHS2hhcmtvdjEQMA4GA1UEBwwHS2hhcmtvdjEUMBIG |
||
+ | A1UECgwLTWlyYW50aXNJbmMxGzAZBgNVBAsMElNlcnZpY2VzRGVwYXJ0bWVudDES |
||
+ | MBAGA1UEAwwJY2Etc2VydmVyMSIwIAYJKoZIhvcNAQkBFhNtbWF4dXJAbWlyYW50 |
||
+ | aXMuY29tMB4XDTE2MDUyNjEwMTYwN1oXDTI2MDUyNDEwMTYwN1owgZwxCzAJBgNV |
||
+ | BAYTAlVBMRAwDgYDVQQIDAdLaGFya292MRAwDgYDVQQHDAdLaGFya292MRQwEgYD |
||
+ | VQQKDAtNaXJhbnRpc0luYzEbMBkGA1UECwwSU2VydmljZXNEZXBhcnRtZW50MRIw |
||
+ | EAYDVQQDDAljYS1zZXJ2ZXIxIjAgBgkqhkiG9w0BCQEWE21tYXh1ckBtaXJhbnRp |
||
+ | cy5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCuZEMVa87WGQJl |
||
+ | 1foQGNt4Qh/CWcggjjIqn8IYSPPtqn3YAxvUnubA+DQxkH7PNYR6G9PdNgQon2mV |
||
+ | xvwVFL6YouDkPtEO101B3vM28U3vEEOSLUcign+2XqzKf7lqyXzMK7/wk+iubAfH |
||
+ | hVhXosC+TSwH+eywO1lo2vbOZkf93ZiURDEZfixcMLuYMM8xdOeWeWtnQIA7D8QF |
||
+ | E5wADWXaYpMlmZzHmmtx76l5BGZL75pG0YkAexllu5idlqADhN77xGM69ZSV/pYJ |
||
+ | apMRhy4z0e17UzEbGWgv6OnUNhwGhOCgyIRk7PTKyjU+mxh3qdoNaqNt7Jj60EB7 |
||
+ | dvzHeosrizcYaFwaqbBxVRMKJOcNYh7ZYlyrdexa9Wau3xf0NFvyBZ8rvsBv9Ax+ |
||
+ | xuRCq2uVGc3rQHZzkwocquAgACY+1GpxFtpNUBhvmi25TUbm8OkAq7lYpf2sptJH |
||
+ | ReZf4EdHhWuHLI93X5Pm6cb0uE+85kuJPNGMprcwvWM5QiT1N56LAVKiApZTSqo8 |
||
+ | bcuJZs+nXI4IrYRXjCn75E0LLRpVLXc7+vfKHgHClL9/bhOxcOdwyXejnDQVzWe4 |
||
+ | 5JvwzLtL3/4KDiTLjG4foJztosxn92cAJAp30cdUalf7QkEFqp5RCvRY2vFVosM5 |
||
+ | 0Vu3bicGcyucHyxigxWP44qpaJe9WwIDAQABo10wWzAdBgNVHQ4EFgQU/msFAiI9 |
||
+ | 2/9ld4t5M9XYonUlHyIwHwYDVR0jBBgwFoAU/msFAiI92/9ld4t5M9XYonUlHyIw |
||
+ | DAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHMZ |
||
+ | 609hm52CYxouUnvH+timAgiqbVv8QCb6IzgM5uRNejlxTzj63RBFvxC6n2UPqBpj |
||
+ | yGtYuwpO249e+sD01ZS0r4B69a3yBePH6Ay4leqfStuqc9dcyamK7lQk8PAsF4wv |
||
+ | yrywNpgGbecDReHJPrOmc5nQw3AlhwcwceHHS7mqaS+SWj1md97saD8uqHK0O5vu |
||
+ | PFlJUKiztQqR2PMPWiKw+Pjri+RAXHj4TCxjPt5Z0wSR+xP/YE1MymvegPUrZ7/7 |
||
+ | rFWuqfHDVLh7IA16q+h1xU+FMnVdiPigEJ+Omn6dDfqHD9BBcKOUFYOJiXtG4TDc |
||
+ | tX401kpG1Qm00kS3XtveQgGPF1OWNLyyDr1dDy8/B+77W1yli/VbzK6H4jwrVGy7 |
||
+ | EAEzpfbwRJnSIIUczG8//1G6a5yrpcjohKhWY1uBrv56LJdq16OVN3aK5nacMKmQ |
||
+ | p+YpPu/ZT5LVUOzt8I32Q8i1Tn9YZma7vEftvGCZKVcgqlVIpb3P7/7dyRXoMuFD |
||
+ | bErDIDxScMvg82Vg2JF4NzaOp+CXRAYuXbel5anoFOt7FFfnO2w0/aLQpAT+jpze |
||
+ | qcL37IGyCGxOloej7NkdQsX9eJJNIdy5oLjniJ8/d402A0zziPdfrqa0c3FpGukZ |
||
+ | syWlWH0RCerDgVmq+i6l5zGbtx/tKPpLYcJkAetJ |
||
+ | -----END CERTIFICATE----- |
||
+ | |||
+ | - The hostname in the certificate matches 'ldap1'. |
||
+ | - Peer's certificate is trusted |
||
+ | - Version: TLS1.2 |
||
+ | - Key Exchange: RSA |
||
+ | - Cipher: AES-128-CBC |
||
+ | - MAC: SHA1 |
||
+ | - Compression: NULL |
||
+ | - Handshake was completed |
||
+ | |||
+ | - Simple Client Mode: |
||
+ | </PRE> |
||
+ | |||
+ | ==Создание сертификата для сервера LDAP2== |
||
+ | Все действия - аналогичны LDAP1 |
||
+ | ===Ключ=== |
||
<PRE> |
<PRE> |
||
1012_private_key_for_ldap2.sh |
1012_private_key_for_ldap2.sh |
||
Строка 213: | Строка 509: | ||
</PRE> |
</PRE> |
||
+ | ===Запрос на сертефикат=== |
||
− | ==3== |
||
<PRE> |
<PRE> |
||
1013_create_cert_request_for_ldap2.sh |
1013_create_cert_request_for_ldap2.sh |
||
Строка 231: | Строка 527: | ||
</PRE> |
</PRE> |
||
+ | ===Создание и подписывание сертификата=== |
||
− | ==3== |
||
<PRE> |
<PRE> |
||
1014_create_and_sign_cert_for_ldap2.sh |
1014_create_and_sign_cert_for_ldap2.sh |
||
Строка 253: | Строка 549: | ||
</PRE> |
</PRE> |
||
− | == |
+ | ==HA Mode== |
+ | Так как в дальнейшем нам понадобиться <B>Единый</B> сертификат - то генерируем его полностью аналогичным образом. |
||
+ | <BR> |
||
+ | Причины, почему нужно использовать один сертификат на всех серверах реплики |
||
+ | |||
+ | * Запрос приходит на hostname = <B>LDAP</B> а не на hostname = LDAP1/LDAP2 соответственно в сертефикате должно быть указано "имя" кластера. Запросы к нодам кластера напрямую по их именам в этом случае требуют игнорирования ошибок TLS |
||
+ | * Так как репликация касается в том числе и имен файлов сертификатов лучше что бы они были одинаковы для всех серверов. |
||
+ | |||
+ | |||
<PRE> |
<PRE> |
||
2012_private_key_for_ldap.sh |
2012_private_key_for_ldap.sh |
||
Строка 268: | Строка 572: | ||
</PRE> |
</PRE> |
||
+ | |||
− | ==3== |
||
<PRE> |
<PRE> |
||
2013_create_cert_request_for_ldap.sh |
2013_create_cert_request_for_ldap.sh |
||
Строка 287: | Строка 591: | ||
</PRE> |
</PRE> |
||
− | ==3== |
||
<PRE> |
<PRE> |
||
2014_create_and_sign_cert_for_ldap.sh |
2014_create_and_sign_cert_for_ldap.sh |
||
Строка 309: | Строка 612: | ||
</PRE> |
</PRE> |
||
− | ==3== |
||
<PRE> |
<PRE> |
||
3201_install_tls_certs.ldif |
3201_install_tls_certs.ldif |
||
Строка 329: | Строка 631: | ||
</PRE> |
</PRE> |
||
− | ==3== |
||
<PRE> |
<PRE> |
||
+ | 3202_configure_ldap_to_u~s_one_name_on_cluster.sh |
||
</PRE> |
</PRE> |
||
<PRE> |
<PRE> |
||
+ | ldapmodify -Y EXTERNAL -H ldapi:/// <3201_install_tls_certs.ldif |
||
− | </PRE> |
||
− | ==3== |
||
− | <PRE> |
||
− | </PRE> |
||
− | |||
− | <PRE> |
||
− | </PRE> |
||
− | ==3== |
||
− | <PRE> |
||
− | </PRE> |
||
− | |||
− | <PRE> |
||
− | </PRE> |
||
− | |||
− | ==3== |
||
− | ==3== |
||
− | ==3== |
||
− | ==3== |
||
− | ==3== |
||
− | ==3== |
||
− | ==3== |
||
− | ==3== |
||
− | ==3== |
||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | <PRE> |
||
− | \ldapmodify -Y EXTERNAL -H ldapi:/// < 01_certs.ldif |
||
− | </PRE> |
||
− | <PRE> |
||
− | SASL/EXTERNAL authentication started |
||
− | SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth |
||
− | SASL SSF: 0 |
||
− | modifying entry "cn=config" |
||
− | </PRE> |
||
− | <PRE> |
||
− | \ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config -s base |
||
− | </PRE> |
||
− | Вывод: |
||
− | <PRE> |
||
− | # config |
||
− | dn: cn=config |
||
− | objectClass: olcGlobal |
||
− | cn: config |
||
− | olcArgsFile: /var/run/slapd/slapd.args |
||
− | olcLogLevel: none |
||
− | olcPidFile: /var/run/slapd/slapd.pid |
||
− | olcToolThreads: 1 |
||
− | olcTLSVerifyClient: never |
||
− | olcTLSCertificateFile: /etc/ldap/ssl/ldap-srv.example.com.crt |
||
− | olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap-srv.example.com.key |
||
− | olcTLSCACertificateFile: /etc/ssl/certs/rootca.crt |
||
− | </PRE> |
||
− | |||
− | |||
− | |||
− | |||
− | |||
− | <PRE> |
||
− | root@node-3:/etc/ldap# netstat -ntpl | grep slap |
||
− | tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 2875/slapd |
||
− | tcp6 0 0 :::389 :::* LISTEN 2875/slapd |
||
− | </PRE> |
||
− | <PRE> |
||
− | # /etc/init.d/slapd restart |
||
− | * Stopping OpenLDAP slapd [ OK ] |
||
− | * Starting OpenLDAP slapd [ OK ] |
||
− | </PRE> |
||
− | <PRE> |
||
− | # netstat -ntpl | grep slap |
||
− | tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN 6294/slapd |
||
− | tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 6294/slapd |
||
− | tcp6 0 0 :::636 :::* LISTEN 6294/slapd |
||
− | tcp6 0 0 :::389 :::* LISTEN 6294/slapd |
||
− | </PRE> |
||
− | |||
− | |||
− | |||
− | ==Проверка== |
||
− | <PRE> |
||
− | gnutls-cli -p 636 ldap1 -d 1 --print-cert --x509cafile /etc/ssl/certs/rootca.crt |
||
− | </PRE> |
||
− | <PRE> |
||
− | Processed 1 CA certificate(s). |
||
− | Resolving 'ldap1'... |
||
− | Connecting to '10.20.0.3:636'... |
||
− | - Certificate type: X.509 |
||
− | - Got a certificate list of 2 certificates. |
||
− | - Certificate[0] info: |
||
− | - subject `C=UA,ST=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ldap1,EMAIL=mmaxur@mirantis.com', issuer `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', RSA key 4096 bits, signed using RSA-SHA256, activated `2016-05-26 10:25:31 UTC', expires `2026-05-24 10:25:31 UTC', SHA-1 fingerprint `c07f85c03b773984ed3c4df7530b4d2366f4dad6' |
||
− | |||
− | -----BEGIN CERTIFICATE----- |
||
− | MIIGKjCCBBKgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZwxCzAJBgNVBAYTAlVB |
||
− | MRAwDgYDVQQIDAdLaGFya292MRAwDgYDVQQHDAdLaGFya292MRQwEgYDVQQKDAtN |
||
− | aXJhbnRpc0luYzEbMBkGA1UECwwSU2VydmljZXNEZXBhcnRtZW50MRIwEAYDVQQD |
||
− | DAljYS1zZXJ2ZXIxIjAgBgkqhkiG9w0BCQEWE21tYXh1ckBtaXJhbnRpcy5jb20w |
||
− | HhcNMTYwNTI2MTAyNTMxWhcNMjYwNTI0MTAyNTMxWjCBhjELMAkGA1UEBhMCVUEx |
||
− | EDAOBgNVBAgMB0toYXJrb3YxFDASBgNVBAoMC01pcmFudGlzSW5jMRswGQYDVQQL |
||
− | DBJTZXJ2aWNlc0RlcGFydG1lbnQxDjAMBgNVBAMMBWxkYXAxMSIwIAYJKoZIhvcN |
||
− | AQkBFhNtbWF4dXJAbWlyYW50aXMuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A |
||
− | MIICCgKCAgEA17ksfFHcbpLGQyJfvu4gfDhcmFQr4Le6UiLfefKugtaB4dX5c6Fd |
||
− | 4h2EHWCtkrZAZiXvRnNavSxaU+VNLraFjpIILUbzbg/2uYYIPofy9RQzdqDJhnKj |
||
− | 1avVPPH19YIfTWHP07Y/flH3Ac/QR2uiSFitJrjLU8LsjEXwLRYhewPukWrj5Uqa |
||
− | oaCIUr91V0NMX6qKlJA/Ri9j3yI/P9UsvNjANDSiqI4EqKZkxsN+ck4eZAcjFUYR |
||
− | vomu0LO7mPxHUekzJhN3Gl6Yt4meyH5fP3HnHOYk93hKL78hewZ2riEv7Nwwg+zy |
||
− | Hb0RG9Mfx0Yz6it/fwT3obycWXhBab2FgLW5K1yYiqLo1oVfl80MO5ZNsNK4WMcy |
||
− | qQx60i2qLT48+uC6LgUOzhFWjTlTMsEOgj35EJn3rsjUUJpdtA6SiXJpE6lVFoRu |
||
− | ACt+Iwqu7Dq9QuJKeYcGmWsatMPkpeWz93pV1TT2rtdABJgeiIKDtJWu8Oh2Y/NV |
||
− | vwqAghprjO84Vlxqq9xkXX8YvRRN8bwLSWlyCj2QDcRhLjDTeGqk0qUuV+nNfOBh |
||
− | bJ6MX3IhOhu55VjzFdGcOd/cZzg+yGugPFsT2WXDp1sxROGf3MLhBbymG2egh98k |
||
− | qFzTAM2DXGB8ZkfxEuaRW3rNA3Fjg2kElKP+6GaUYtEj4MTbuoppBBsCAwEAAaOB |
||
− | iTCBhjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF4DAsBglghkgBhvhCAQ0EHxYdT3Bl |
||
− | blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFFpPbsihmyodcQkK |
||
− | ii7/IArfCH8sMB8GA1UdIwQYMBaAFP5rBQIiPdv/ZXeLeTPV2KJ1JR8iMA0GCSqG |
||
− | SIb3DQEBCwUAA4ICAQCdfkpuE69mGfQwLe2kHEA45TPjogOalPp8H73dqLDxE80T |
||
− | s1W5XyJBZQccpVFoXS25M9fDeWjuvMTwdIP6q6DDArC1lVs0zdAOhTt6POpI7Cvu |
||
− | zrBM/wa6YUVZtXSM4Qtw4tE3Nx71s9Tp2jVra75RvjQrUnISwPfop3zapzCpTqEQ |
||
− | zvrl5Vsfd0AMmN1RKoFdYQr6LX7nInf029a8IBOCXzv6Ufd3NwxxelKkO2U49XYo |
||
− | tFycxyDzo/B//cS8b8a7fu3yysP8W5b3oNgE6Tth1vR3zLy4uiwpIi6ptYBUlkG+ |
||
− | gqIXzqI+2MIyYWaA3UXIfRhi7j3CENGIA1TAAPSvfFnolYiFSXiY28b6P2nyl8WC |
||
− | xCySbdZtGh+fvxeP+cNl1VMDEmU94XDIgA7Nl5yacPLY4GwKnjAkfyp4uL9dYvJV |
||
− | 1wKgzYohF1Elm6YiPa2Wv1fuMNkT9iZ0DMyLV4ixxkKkuuCXCLKXmg4REQPsnE6V |
||
− | Eu/tQ6mfUugO6+d1ZkI/iAc0cjNtjrOKhS/Fsb49UWThjM+pyOFVO0hMybKYBwZL |
||
− | 1JDiwSM1uYts3TUxLBNb4SXeYoqZRFoFJiP14yjw9j0nuU1Au7ginFf0IYYq2VHI |
||
− | M7woolzYH+/vlOK+5aQrgcsanCy/7s4prux4IRTx5SGzqW+idA2UW26+5WyKbg== |
||
− | -----END CERTIFICATE----- |
||
− | |||
− | - Certificate[1] info: |
||
− | - subject `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', issuer `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', RSA key 4096 bits, signed using RSA-SHA256, activated `2016-05-26 10:16:07 UTC', expires `2026-05-24 10:16:07 UTC', SHA-1 fingerprint `0f74fdaf2195ae2b1f599e3963e3b18970cb81a3' |
||
− | |||
− | -----BEGIN CERTIFICATE----- |
||
− | MIIGGjCCBAKgAwIBAgIJAN1rpxx3AA9AMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD |
||
− | VQQGEwJVQTEQMA4GA1UECAwHS2hhcmtvdjEQMA4GA1UEBwwHS2hhcmtvdjEUMBIG |
||
− | A1UECgwLTWlyYW50aXNJbmMxGzAZBgNVBAsMElNlcnZpY2VzRGVwYXJ0bWVudDES |
||
− | MBAGA1UEAwwJY2Etc2VydmVyMSIwIAYJKoZIhvcNAQkBFhNtbWF4dXJAbWlyYW50 |
||
− | aXMuY29tMB4XDTE2MDUyNjEwMTYwN1oXDTI2MDUyNDEwMTYwN1owgZwxCzAJBgNV |
||
− | BAYTAlVBMRAwDgYDVQQIDAdLaGFya292MRAwDgYDVQQHDAdLaGFya292MRQwEgYD |
||
− | VQQKDAtNaXJhbnRpc0luYzEbMBkGA1UECwwSU2VydmljZXNEZXBhcnRtZW50MRIw |
||
− | EAYDVQQDDAljYS1zZXJ2ZXIxIjAgBgkqhkiG9w0BCQEWE21tYXh1ckBtaXJhbnRp |
||
− | cy5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCuZEMVa87WGQJl |
||
− | 1foQGNt4Qh/CWcggjjIqn8IYSPPtqn3YAxvUnubA+DQxkH7PNYR6G9PdNgQon2mV |
||
− | xvwVFL6YouDkPtEO101B3vM28U3vEEOSLUcign+2XqzKf7lqyXzMK7/wk+iubAfH |
||
− | hVhXosC+TSwH+eywO1lo2vbOZkf93ZiURDEZfixcMLuYMM8xdOeWeWtnQIA7D8QF |
||
− | E5wADWXaYpMlmZzHmmtx76l5BGZL75pG0YkAexllu5idlqADhN77xGM69ZSV/pYJ |
||
− | apMRhy4z0e17UzEbGWgv6OnUNhwGhOCgyIRk7PTKyjU+mxh3qdoNaqNt7Jj60EB7 |
||
− | dvzHeosrizcYaFwaqbBxVRMKJOcNYh7ZYlyrdexa9Wau3xf0NFvyBZ8rvsBv9Ax+ |
||
− | xuRCq2uVGc3rQHZzkwocquAgACY+1GpxFtpNUBhvmi25TUbm8OkAq7lYpf2sptJH |
||
− | ReZf4EdHhWuHLI93X5Pm6cb0uE+85kuJPNGMprcwvWM5QiT1N56LAVKiApZTSqo8 |
||
− | bcuJZs+nXI4IrYRXjCn75E0LLRpVLXc7+vfKHgHClL9/bhOxcOdwyXejnDQVzWe4 |
||
− | 5JvwzLtL3/4KDiTLjG4foJztosxn92cAJAp30cdUalf7QkEFqp5RCvRY2vFVosM5 |
||
− | 0Vu3bicGcyucHyxigxWP44qpaJe9WwIDAQABo10wWzAdBgNVHQ4EFgQU/msFAiI9 |
||
− | 2/9ld4t5M9XYonUlHyIwHwYDVR0jBBgwFoAU/msFAiI92/9ld4t5M9XYonUlHyIw |
||
− | DAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHMZ |
||
− | 609hm52CYxouUnvH+timAgiqbVv8QCb6IzgM5uRNejlxTzj63RBFvxC6n2UPqBpj |
||
− | yGtYuwpO249e+sD01ZS0r4B69a3yBePH6Ay4leqfStuqc9dcyamK7lQk8PAsF4wv |
||
− | yrywNpgGbecDReHJPrOmc5nQw3AlhwcwceHHS7mqaS+SWj1md97saD8uqHK0O5vu |
||
− | PFlJUKiztQqR2PMPWiKw+Pjri+RAXHj4TCxjPt5Z0wSR+xP/YE1MymvegPUrZ7/7 |
||
− | rFWuqfHDVLh7IA16q+h1xU+FMnVdiPigEJ+Omn6dDfqHD9BBcKOUFYOJiXtG4TDc |
||
− | tX401kpG1Qm00kS3XtveQgGPF1OWNLyyDr1dDy8/B+77W1yli/VbzK6H4jwrVGy7 |
||
− | EAEzpfbwRJnSIIUczG8//1G6a5yrpcjohKhWY1uBrv56LJdq16OVN3aK5nacMKmQ |
||
− | p+YpPu/ZT5LVUOzt8I32Q8i1Tn9YZma7vEftvGCZKVcgqlVIpb3P7/7dyRXoMuFD |
||
− | bErDIDxScMvg82Vg2JF4NzaOp+CXRAYuXbel5anoFOt7FFfnO2w0/aLQpAT+jpze |
||
− | qcL37IGyCGxOloej7NkdQsX9eJJNIdy5oLjniJ8/d402A0zziPdfrqa0c3FpGukZ |
||
− | syWlWH0RCerDgVmq+i6l5zGbtx/tKPpLYcJkAetJ |
||
− | -----END CERTIFICATE----- |
||
− | |||
− | - The hostname in the certificate matches 'ldap1'. |
||
− | - Peer's certificate is trusted |
||
− | - Version: TLS1.2 |
||
− | - Key Exchange: RSA |
||
− | - Cipher: AES-128-CBC |
||
− | - MAC: SHA1 |
||
− | - Compression: NULL |
||
− | - Handshake was completed |
||
− | |||
− | - Simple Client Mode: |
||
</PRE> |
</PRE> |
Текущая версия на 09:06, 30 октября 2023
LDAP Шифрование
ТУТ я просто дублирую статью со своими комментариями и изменениями
У меня в отличие от примера - 2 сервера в режиме мастер-мастер репликации, потому мне нужно 3 сертификата (по факту - 1 на оба сервера но на момент написания статьи я этого не понимал)
- Для сервера ldap1
- Для сервера ldap2
- Для сервера ldap - адрес который будет проксировать запросы на один из 2 серверов.
Так как в конечной конфигурации все запросы приходят на ldap (HAProxy) то фактически нужно установить этот сертификат на обоих серверах. Потому часть с генерацией отдельных сертификатов для каждого из серверов можно пропустить.
Подготовка 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
Проверить подключение на уровне tls/ssl (так же можно провериять и другие подключения - не только LDAP):
0204_check_tls_connection.sh
gnutls-cli \ -p 636 ldap1 \ -d 1 \ --print-cert \ --x509cafile /etc/ssl/certs/rootca.crt
Processed 1 CA certificate(s). Resolving 'ldap1'... Connecting to '10.20.0.6:636'... - Certificate type: X.509 - Got a certificate list of 2 certificates. - Certificate[0] info: - subject `C=UA,ST=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ldap1,EMAIL=mmaxur@mirantis.com', issuer `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', RSA key 4096 bits, signed using RSA-SHA256, activated `2016-05-26 17:23:29 UTC', expires `2026-05-24 17:23:29 UTC', SHA-1 fingerprint `a8d1ac296e514badd9aed44fbc405a76e7e63d1b' -----BEGIN CERTIFICATE----- MIIGKTCCBBGgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgZwxCzAJBgNVBAYTAlVB MRAwDgYDVQQIDAdLaGFya292MRAwDgYDVQQHDAdLaGFya292MRQwEgYDVQQKDAtN aXJhbnRpc0luYzEbMBkGA1UECwwSU2VydmljZXNEZXBhcnRtZW50MRIwEAYDVQQD DAljYS1zZXJ2ZXIxIjAgBgkqhkiG9w0BCQEWE21tYXh1ckBtaXJhbnRpcy5jb20w HhcNMTYwNTI2MTcyMzI5WhcNMjYwNTI0MTcyMzI5WjCBhTELMAkGA1UEBhMCVUEx EDAOBgNVBAgMB0toYXJrb3YxFDASBgNVBAoMC01pcmFudGlzSW5jMRswGQYDVQQL DBJTZXJ2aWNlc0RlcGFydG1lbnQxDTALBgNVBAMMBGxkYXAxIjAgBgkqhkiG9w0B CQEWE21tYXh1ckBtaXJhbnRpcy5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQC1a5nMVGd00XODBLZmPJIME89ybRrxzJIhlPk33p6g/8Hh9sTj3U9m JQ/QLWORyDGXVJM5UEdInYD5xSU9l/CZY81Z6Uwk4X6GtRng8Au/8mT0hidSPy0F BtJmgzgafMjUHbQWJbgXzbXz6Gu4Pu+NKh2gkaCrFN59wOJOGOhnf4TMVLoVw+f9 rn7hA0NcWWhs0sQ6ZPvhsic0A6qh1LgYEzTSSFReywbKH2xg+v4qGoHnnkw2U4r0 pBUYF22WGMrD1khh9QKbsWtQrH5YNcrTJ8c3gIYioTtAH/BwvAvVZp3G2i3R5cD4 gDY56OUIuFfTuuYJvpSWC8dInGRxwoZ3RnFvKFn5N1RwKULe9LlR2+ATi4PwIn7q rJaa4ukhhr6SRNBSRQsQH1b7kXCIpwSbCNxzTBL/HdvzYHd0CmFhiu3BgiyvjY0u WvnKk8q/u3j0SkjoG7rebrMhZcXz7Leza2F3O8tSZ7bXeBty1HVnFc8a4SQ52N/f IIAwBgZQoIGgfkNKzriUZnRn6+tABj6JE5dEv9/BQ77FceoB/cLaK7BnEXRxbTYQ qyqjLXIwaRM14hDUSuVmRxHA6eGiTZ1YktYQwwZM9/erSw/EpD8Eweg2G8Bf1I1C JoJkP3Bj5RojE6OM5xcn4G3EsPylunoBcZLwVVqEiyBCpgoIU84uYwIDAQABo4GJ MIGGMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMCwGCWCGSAGG+EIBDQQfFh1PcGVu U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUgtaUYQW3gDDQnTcP b0KA4WeeWAEwHwYDVR0jBBgwFoAU/msFAiI92/9ld4t5M9XYonUlHyIwDQYJKoZI hvcNAQELBQADggIBAINHcZZCARgRLZYKGjNkste5L14z+YMA51aBrS6RcwllTM8b 1UAWAwtcVD/GsU21nNYKlRu0cH2Iv8CbZiT1zhrZDCfbcr2l+P5LAtxhObvdr+pk +tHijGbRgAXGYGlDXUT7sECf8Hw588IVMJw5DPUo0Fl4yppsE6/YBodbCl4dD+/R uqBrJVT6HwA/Hx1Cgz5+wjTNSztsljQE7U9eJNVoH1hk/W1iHjweAPkgmjdnpfA9 zYxWxAIW4wMY2RAnIaQuyYt4a8L0097VEOUlM9N+dHMtImS0Z+Qgyr7tCViYwHZV MehpzxsaGbDU0fe8qF474LyA9D62u+BqpHA1FVjQXPtY39zFnWBc83ZQgj2y6gfV XuYtAcnK7j/QZqE+KfemlNc5G45rvWstkNkbnNgl78R3h3Jx0Dsu0JrBsqU0qjmp CPyZfbUi6F21B3hf+BzKhTiE4g8MRvddLVRiXGTsyorzbsFnj5R5LyVTDFobvS4W 9KEjd7jaHxrlTLo/e3G1PRymF63wIa90mgcQgjTuKsO4R7BU7KRSPJr/oBUhYS0/ p2QHDxEWmH/uy+Qc3X7tNUqpnqbd3tx3WnXFNClqbp3RVymwrolZV/8dgrE1sy1/ +DwfXsmeK06+Bykppun6glQGL1GX+E9kMZsiWXIrfOocvRqLtbAmX1qt1/jk -----END CERTIFICATE----- - Certificate[1] info: - subject `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', issuer `C=UA,ST=Kharkov,L=Kharkov,O=MirantisInc,OU=ServicesDepartment,CN=ca-server,EMAIL=mmaxur@mirantis.com', RSA key 4096 bits, signed using RSA-SHA256, activated `2016-05-26 10:16:07 UTC', expires `2026-05-24 10:16:07 UTC', SHA-1 fingerprint `0f74fdaf2195ae2b1f599e3963e3b18970cb81a3' -----BEGIN CERTIFICATE----- MIIGGjCCBAKgAwIBAgIJAN1rpxx3AA9AMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD VQQGEwJVQTEQMA4GA1UECAwHS2hhcmtvdjEQMA4GA1UEBwwHS2hhcmtvdjEUMBIG A1UECgwLTWlyYW50aXNJbmMxGzAZBgNVBAsMElNlcnZpY2VzRGVwYXJ0bWVudDES MBAGA1UEAwwJY2Etc2VydmVyMSIwIAYJKoZIhvcNAQkBFhNtbWF4dXJAbWlyYW50 aXMuY29tMB4XDTE2MDUyNjEwMTYwN1oXDTI2MDUyNDEwMTYwN1owgZwxCzAJBgNV BAYTAlVBMRAwDgYDVQQIDAdLaGFya292MRAwDgYDVQQHDAdLaGFya292MRQwEgYD VQQKDAtNaXJhbnRpc0luYzEbMBkGA1UECwwSU2VydmljZXNEZXBhcnRtZW50MRIw EAYDVQQDDAljYS1zZXJ2ZXIxIjAgBgkqhkiG9w0BCQEWE21tYXh1ckBtaXJhbnRp cy5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCuZEMVa87WGQJl 1foQGNt4Qh/CWcggjjIqn8IYSPPtqn3YAxvUnubA+DQxkH7PNYR6G9PdNgQon2mV xvwVFL6YouDkPtEO101B3vM28U3vEEOSLUcign+2XqzKf7lqyXzMK7/wk+iubAfH hVhXosC+TSwH+eywO1lo2vbOZkf93ZiURDEZfixcMLuYMM8xdOeWeWtnQIA7D8QF E5wADWXaYpMlmZzHmmtx76l5BGZL75pG0YkAexllu5idlqADhN77xGM69ZSV/pYJ apMRhy4z0e17UzEbGWgv6OnUNhwGhOCgyIRk7PTKyjU+mxh3qdoNaqNt7Jj60EB7 dvzHeosrizcYaFwaqbBxVRMKJOcNYh7ZYlyrdexa9Wau3xf0NFvyBZ8rvsBv9Ax+ xuRCq2uVGc3rQHZzkwocquAgACY+1GpxFtpNUBhvmi25TUbm8OkAq7lYpf2sptJH ReZf4EdHhWuHLI93X5Pm6cb0uE+85kuJPNGMprcwvWM5QiT1N56LAVKiApZTSqo8 bcuJZs+nXI4IrYRXjCn75E0LLRpVLXc7+vfKHgHClL9/bhOxcOdwyXejnDQVzWe4 5JvwzLtL3/4KDiTLjG4foJztosxn92cAJAp30cdUalf7QkEFqp5RCvRY2vFVosM5 0Vu3bicGcyucHyxigxWP44qpaJe9WwIDAQABo10wWzAdBgNVHQ4EFgQU/msFAiI9 2/9ld4t5M9XYonUlHyIwHwYDVR0jBBgwFoAU/msFAiI92/9ld4t5M9XYonUlHyIw DAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHMZ 609hm52CYxouUnvH+timAgiqbVv8QCb6IzgM5uRNejlxTzj63RBFvxC6n2UPqBpj yGtYuwpO249e+sD01ZS0r4B69a3yBePH6Ay4leqfStuqc9dcyamK7lQk8PAsF4wv yrywNpgGbecDReHJPrOmc5nQw3AlhwcwceHHS7mqaS+SWj1md97saD8uqHK0O5vu PFlJUKiztQqR2PMPWiKw+Pjri+RAXHj4TCxjPt5Z0wSR+xP/YE1MymvegPUrZ7/7 rFWuqfHDVLh7IA16q+h1xU+FMnVdiPigEJ+Omn6dDfqHD9BBcKOUFYOJiXtG4TDc tX401kpG1Qm00kS3XtveQgGPF1OWNLyyDr1dDy8/B+77W1yli/VbzK6H4jwrVGy7 EAEzpfbwRJnSIIUczG8//1G6a5yrpcjohKhWY1uBrv56LJdq16OVN3aK5nacMKmQ p+YpPu/ZT5LVUOzt8I32Q8i1Tn9YZma7vEftvGCZKVcgqlVIpb3P7/7dyRXoMuFD bErDIDxScMvg82Vg2JF4NzaOp+CXRAYuXbel5anoFOt7FFfnO2w0/aLQpAT+jpze qcL37IGyCGxOloej7NkdQsX9eJJNIdy5oLjniJ8/d402A0zziPdfrqa0c3FpGukZ syWlWH0RCerDgVmq+i6l5zGbtx/tKPpLYcJkAetJ -----END CERTIFICATE----- - The hostname in the certificate matches 'ldap1'. - Peer's certificate is trusted - Version: TLS1.2 - Key Exchange: RSA - Cipher: AES-128-CBC - MAC: SHA1 - Compression: NULL - Handshake was completed - Simple Client Mode:
Создание сертификата для сервера LDAP2
Все действия - аналогичны LDAP1
Ключ
1012_private_key_for_ldap2.sh
pushd /root/CA openssl genrsa \ -out private/ldap2.key 4096 chmod 400 private/ldap2.key popd
Запрос на сертефикат
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
Создание и подписывание сертификата
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
HA Mode
Так как в дальнейшем нам понадобиться Единый сертификат - то генерируем его полностью аналогичным образом.
Причины, почему нужно использовать один сертификат на всех серверах реплики
- Запрос приходит на hostname = LDAP а не на hostname = LDAP1/LDAP2 соответственно в сертефикате должно быть указано "имя" кластера. Запросы к нодам кластера напрямую по их именам в этом случае требуют игнорирования ошибок TLS
- Так как репликация касается в том числе и имен файлов сертификатов лучше что бы они были одинаковы для всех серверов.
2012_private_key_for_ldap.sh
pushd /root/CA openssl genrsa \ -out private/ldap.key 4096 chmod 400 private/ldap.key popd
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
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
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