16. Использование TLS
Клиенты и серверы OpenLDAP способны использовать технологию
Примечание: О том, как генерировать сертификаты, смотрите http://www.openldap.org/faq/data/cache/185.html
16.1. Сертификаты TLS
Для представления идентификационных сущностей клиента и сервера TLS использует сертификаты
16.1.1. Сертификаты сервера
16.1.2. Сертификаты клиента
DN сертификата клиента можно напрямую использовать в качестве аутентификационного DN. Поскольку X.509 - часть стандарта
16.2. Настройка TLS
После получения необходимых сертификатов, и на клиенте и на сервере нужно произвести некоторое количество настроек, чтобы включить TLS и задействовать эти сертификаты. Как минимум, на клиентах должно быть настроено имя файла, содержащего все сертификаты
Обычно сертификат сервера и все доверенные сертификаты клиентов будут изданы одним CA, таким образом, серверу требуется доверять только этому единственному CA. Однако, клиент может соединятся с несколькими защищёнными серверами, управляемыми разными организациями и имеющими сертификаты серверов, сгенерированные многими разными CA. В таком случае, при конфигурации клиента понадобится список многих разных доверенных CA.
16.2.1. Конфигурация сервера
Директивы конфигурации slapd для настройки TLS располагаются в секции глобальных директив slapd.conf(5).
16.2.1.1. TLSCACertificateFile <имя файла>
Данная директива указывает файл в формате
16.2.1.2. TLSCACertificatePath <путь>
Данная директива указывает путь к директории, содержащей индивидуальные сертификаты
При использовании Mozilla NSS, данная директива указывает путь к директории, содержащей сертификат NSS и файлы базы данных ключей. Для добавления сертификата
certutil -d <путь> -A -n "имя сертификата CA" -t CT,, -a -i /path/to/cacertfile.pem
-
Эта команда добавит сертификат CA, хранящийся в файле /path/to/cacertfile.pem в формате PEM (ASCII).
-t CT,, означает, что этот сертификат является доверенным CA для выдачи сертификатов,
которые будут использоваться клиентами и серверами при работе с TLS.
16.2.1.3. TLSCertificateFile <имя файла>
Данная директива указывает файл, содержащий сертификат сервера slapd. Обычно сертификаты являются открытой информацией и не требуют специальной защиты.
При использовании Mozilla NSS, в случае применения базы данных сертификатов/ключей (задаваемой с помощью TLSCACertificatePath), данная директива указывает имя сертификата, который нужно использовать:
TLSCertificateFile Server-Cert
-
При использовании маркера (token), отличного от встроенного, сначала укажите имя маркера и двоеточие:
TLSCertificateFile my hardware device:Server-Cert
-
Для того, чтобы узнать имена сертификатов, используйте certutil -L:
certutil -d /path/to/certdbdir -L
16.2.1.4. TLSCertificateKeyFile <имя файла>
Данная директива указывает файл, содержащий закрытый ключ, соответствующий сертификату, хранящемуся в файле TLSCertificateFile. Закрытые ключи сами по себе являются информацией ограниченного распространения и обычно шифруются с помощью пароля в целях защиты. Однако, текущая реализация не поддерживает зашифрованных ключей, поэтому ключи должны быть незашифрованы, а сами файлы тщательно защищены.
При использовании Mozilla NSS данная директива указывает имя файла, содержащего пароль для ключа сертификата, заданного в TLSCertificateFile. Команда modutil может быть использована для отключения парольной защиты базы данных сертификатов/ключей. Например, если в TLSCACertificatePath в качестве расположения базы данных сертификатов/ключей задана /etc/openldap/certdb, используйте такую команду modutil, чтобы поменять пароль на пустую строку:
modutil -dbdir /etc/openldap/certdb -changepw 'NSS Certificate DB'
-
Вы должны знать предыдущий пароль, если он задавался. Проигнорируйте ПРЕДУПРЕЖДЕНИЕ о запуске браузера.
Нажмите 'Enter' на приглашение ввести новый пароль.
16.2.1.5. TLSCipherSuite <cipher-suite-spec>
Данная директива настраивает то, какие шифры будут приниматься и порядок их предпочтения. <cipher-suite-spec> - спецификации шифров для OpenSSL. С помощью команды
openssl ciphers -v ALL
можно посмотреть подробный список доступных спецификаций шифров.
Кроме отдельных названий шифров, можно применять спецификаторы HIGH, MEDIUM, LOW, EXPORT и EXPORT40, наряду с TLSv1, SSLv3 и SSLv2.
Чтобы посмотреть список шифров в GnuTLS, выполните:
gnutls-cli -l
При использовании Mozilla NSS применяется набор спецификаций шифров OpenSSL, который переводится во внутренний формат Mozilla NSS. Простого пути посмотреть список шифров из командной строки не существует. Официальный список находится в исходном коде Mozilla NSS в файле sslinfo.c в структуре
static const SSLCipherSuiteInfo suiteInfo[]
16.2.1.6. TLSRandFile <имя файла>
Данная директива указывает файл, из которого можно получить случайную последовательность бит, когда /dev/urandom недоступен. Если система предоставляет /dev/urandom, то данная директива не нужна, в противном случае необходимо сконфигурировать источник случайных данных. Некоторые системы (например, Linux) предоставляют /dev/urandom по умолчанию, на других (например, Solaris) для этого требуется инсталляция патча, а третьи могут вообще его не поддерживать. В последнем случае нужно установить EGD или PRNGD и задать данную директиву для указания имени сокета EGD/PRNGD. Переменная окружения RANDFILE также может использоваться для указания имени этого файла. Кроме того, при отсутствии этих вариантов, может быть использован файл .rnd в домашней директории пользователя slapd, если таковой существует. Чтобы использовать файл .rnd, просто создайте его и скопируйте туда несколько сотен байт произвольных данных. Этот файл используется только для предоставления начальной последовательности для генератора псевдо-случайных чисел и ему не нужно очень много данных, чтобы работать.
При использовании GnuTLS и Mozilla NSS эта директива игнорируется.
16.2.1.7. TLSDHParamFile <имя файла>
Данная директива указывает файл, содержащий параметры для обмена ключами по алгоритму Диффи-Хеллмана (Diffie-Hellman ephemeral key exchange). Это требуется при использовании основанных на DHE шифров, с том числе всех шифров, основанных на DSA (то есть TLSCertificateKeyFile указывает на ключ DSA), а также шифров RSA, когда в сертификате не указан вариант использования ключа "шифрование ключа" ("key encipherment"). Параметры могут быть сгенерированы с помощью следующей команды:
openssl dhparam [-dsaparam] -out <filename> <numbits> или certtool --generate-dh-params --bits <numbits> --outfile <filename>
При использовании Mozilla NSS эта директива игнорируется.
16.2.1.8. TLSVerifyClient { never | allow | try | demand }
Эта директива определяет, какие проверки будут выполняться над клиентскими сертификатами во входящих сессиях TLS, если вообще будут выполняться какие-либо. По умолчанию эта директива установлена в never, в этом случае сервер никогда не запрашивает сертификат у клиента. При установке в allow сервер будет запрашивать сертификат у клиента; если запрашиваемый сертификат не будет предоставлен, сессия будет нормально обработана. Если сертификат предоставлен, но сервер не может его проверить, сертификат будет проигнорирован, и сессия будет обработана нормально, как и в случае, если сертификат не был предоставлен. При установке в try сертификат будет запрошен, и если он не будет предоставлен, сессия будет нормально обработана. Если сертификат предоставлен и не может быть проверен, сессия немедленно завершается. При установке в demand сертификат будет запрошен и действительный сертификат должен быть предоставлен, в противном случае сессия немедленно завершается.
Примечание: Сервер должен запрашивать сертификат клиента при использовании механизма аутентификации EXTERNAL SASL с сессией TLS. Таким образом, перед тем, как пытаться использовать аутентификацию SASL EXTERNAL, должны быть настроены отличные от значения по умолчанию установки TLSVerifyClient. Кроме того, аутентификация с помощью механизма EXTERNAL SASL будет предоставляться лишь тем клиентам, от которых получены действительные клиентские сертификаты.
16.2.2. Конфигурация клиента
Директивы конфигурации клиента в основном соответвуют директивам конфигурации сервера. Названия этих директив различаются и они указываются в ldap.conf(5) вместо slapd.conf(5), но их функциональность практически не отличается. Кроме того, хотя большинство этих параметров могут быть настроены на уровне системы в целом, все они могут быть переопределены отдельными пользователями в своих файлах .ldaprc.
Операция LDAP Start TLS используется в LDAP для инициации переговоров TLS. Все инструменты командной строки OpenLDAP поддерживают флаги -Z и -ZZ, указывающие, что требуется выполнить операцию Start TLS. Последний флаг указывает, что инструмент должен завершить работу, если сессия TLS не может быть установлена, в то время как первый флаг позволяет продолжить выполнение команды.
В среде LDAPv2 TLS, как правило, стартовал при использовании схемы LDAP Secure URI (ldaps://) вместо нормальной схемы LDAP URI (ldap://). Инструменты командной строки OpenLDAP позволяют использовать обе схемы с флагом -H и в опции URI файла ldap.conf(5).
16.2.2.1. TLS_CACERT <имя файла>
Это эквивалент серверной директивы TLSCACertificateFile. Как отмечалось в подразделе Настройка TLS, клиенту обычно требуется знать о большем количестве CA, нежели серверу, но в остальном применимы аналогичные соображения.
16.2.2.2. TLS_CACERTDIR <путь>
Это эквивалент серверной директивы TLSCACertificatePath. Указанная директория также должна управляться с помощью утилиты OpenSSL c_rehash. При использовании Mozilla NSS директория, указанная в параметре <путь>, может содержать базу данных сертификатов/ключей.
16.2.2.3. TLS_CERT <имя файла>
Данная директива указывает файл, содержащий сертификат клиента. Поскольку этот сертификат у каждого пользователя свой, данная директива может быть указана только в пользовательском файле .ldaprc.
При использовании Mozilla NSS, в случае применения базы данных сертификатов/ключей (указанной в TLS_CACERTDIR), данная директива определяет имя сертификата, который нужно использовать:
TLS_CERT Certificate for Sam Carter
-
При использовании маркера (token), отличного от встроенного, сначала укажите имя маркера и двоеточие:
TLS_CERT my hardware device:Certificate for Sam Carter
-
Для того, чтобы узнать имена сертификатов, используйте certutil -L:
certutil -d /path/to/certdbdir -L
16.2.2.4. TLS_KEY <имя файла>
Эта директива указывает файл, содержащий закрытый ключ, соответствующий сертификату, который хранится в файле TLS_CERT. Здесь применимы те же соображения, что и для серверной директивы TLSCertificateKeyFile. Данная директива также определяется отдельно для каждого пользователя.
16.2.2.5. TLS_RANDFILE <filename>
Данная директива аналогична серверной директиве TLSRandFile.
16.2.2.6. TLS_REQCERT { never | allow | try | demand }
Данная директива эквивалентна серверной директиве TLSVerifyClient. Однако, значение по умолчанию для клиентов - demand, и обычно нет оснований, чтобы изменять эту настройку.