diff options
Diffstat (limited to 'documentation/content/ru/articles/ldap-auth')
-rw-r--r-- | documentation/content/ru/articles/ldap-auth/_index.adoc | 703 | ||||
-rw-r--r-- | documentation/content/ru/articles/ldap-auth/_index.po | 1887 |
2 files changed, 2590 insertions, 0 deletions
diff --git a/documentation/content/ru/articles/ldap-auth/_index.adoc b/documentation/content/ru/articles/ldap-auth/_index.adoc new file mode 100644 index 0000000000..0559e6f0ee --- /dev/null +++ b/documentation/content/ru/articles/ldap-auth/_index.adoc @@ -0,0 +1,703 @@ +--- +authors: + - + author: 'Toby Burress' + email: kurin@causa-sui.net +copyright: '2007-2008 The FreeBSD Documentation Project' +description: 'Руководство по настройке сервера LDAP для аутентификации в FreeBSD' +tags: ["LDAP", "Authentication", "OpenLDAP", "configuration", "guide", "tutorial", "FreeBSD"] +title: 'Аутентификация LDAP' +trademarks: ["freebsd", "general"] +--- + += Аутентификация LDAP +:doctype: article +:toc: macro +:toclevels: 1 +:icons: font +:sectnums: +:sectnumlevels: 6 +:source-highlighter: rouge +:experimental: +:images-path: articles/ldap-auth/ + +ifdef::env-beastie[] +ifdef::backend-html5[] +include::shared/authors.adoc[] +include::shared/mirrors.adoc[] +include::shared/releases.adoc[] +include::shared/attributes/attributes-{{% lang %}}.adoc[] +include::shared/{{% lang %}}/teams.adoc[] +include::shared/{{% lang %}}/mailing-lists.adoc[] +include::shared/{{% lang %}}/urls.adoc[] +:imagesdir: ../../../images/{images-path} +endif::[] +ifdef::backend-pdf,backend-epub3[] +include::../../../../shared/asciidoctor.adoc[] +endif::[] +endif::[] + +ifndef::env-beastie[] +include::../../../../../shared/asciidoctor.adoc[] +endif::[] + +[.abstract-title] +Аннотация + +Этот документ является руководством по настройке сервера LDAP (в основном сервера OpenLDAP) для аутентификации в FreeBSD. Это полезно в ситуациях, когда множество серверов требуют одинаковых учётных записей пользователей, например, в качестве замены NIS. + +''' + +toc::[] + +[[preface]] +== Предисловие + +Этот документ предназначен для того, чтобы дать читателю достаточно знаний о LDAP для настройки сервера LDAP. В документе будет предпринята попытка объяснить использование package:net/nss_ldap[] и package:security/pam_ldap[] для клиентских машин, работающих с сервером LDAP. + +По завершении читатель должен уметь настроить и развернуть сервер FreeBSD, способный размещать каталог LDAP, а также настроить и развернуть сервер FreeBSD, который может проходить аутентификацию с использованием каталога LDAP. + +Эта статья не претендует на исчерпывающее описание вопросов безопасности, надежности или лучших практик настройки LDAP и других обсуждаемых здесь сервисов. Хотя автор старается делать всё правильно, вопросы безопасности рассматриваются лишь в общих чертах. Данная статья должна рассматриваться только как теоретическая основа, а любая реальная реализация должна сопровождаться тщательным анализом требований. + +[[ldap]] +== Настройка LDAP + +LDAP означает "Lightweight Directory Access Protocol" (облегчённый протокол доступа к каталогам) и является подмножеством X.500 Directory Access Protocol. Последние спецификации можно найти в http://www.ietf.org/rfc/rfc4510.txt[RFC4510] и связанных документах. По сути, это база данных, которая предполагает более частые операции чтения, чем записи. + +В примерах в этом документе будет использоваться LDAP-сервер http://www.openldap.org/[OpenLDAP]; хотя принципы, изложенные здесь, должны быть применимы к различным серверам, большая часть конкретных административных действий специфична для OpenLDAP. В портах доступно несколько версий сервера, например package:net/openldap26-server[]. Клиентские серверы потребуют соответствующие библиотеки package:net/openldap26-client[]. + +Существуют (в основном) две области службы LDAP, которые требуют настройки. Первая — настройка сервера для правильного приёма соединений, а вторая — добавление записей в каталог сервера, чтобы инструменты FreeBSD знали, как с ним взаимодействовать. + +[[ldap-connect]] +=== Настройка сервера для подключений + +[NOTE] +==== +Этот раздел относится конкретно к OpenLDAP. Если вы используете другой сервер, вам необходимо обратиться к документации этого сервера. +==== + +[[ldap-connect-install]] +==== Установка OpenLDAP + +Сначала установите OpenLDAP: + +[[oldap-install]] +.Установка OpenLDAP +[example] +==== + +[source, shell] +.... +# cd /usr/ports/net/openldap26-server +# make install clean +.... + +==== + +Это устанавливает бинарные файлы `slapd` и `slurpd`, а также необходимые библиотеки OpenLDAP. + +[[ldap-connect-config]] +==== Настройка OpenLDAP + +Далее мы должны настроить OpenLDAP. + +Вам следует требовать шифрование соединений с сервером LDAP; в противном случае пароли ваших пользователей будут передаваться в открытом виде, что считается небезопасным. Инструменты, которые мы будем использовать, поддерживают два очень похожих типа шифрования: SSL и TLS. + +TLS означает "Transportation Layer Security". Службы, использующие TLS, обычно подключаются к тем же портам, что и аналогичные службы без TLS; таким образом, SMTP-сервер с поддержкой TLS будет ожидать подключений на порту 25, а LDAP-сервер — на порту 389. + +SSL означает «Secure Sockets Layer», и службы, реализующие SSL, _не_ работают на тех же портах, что и их аналоги без SSL. Таким образом, SMTPS использует порт 465 (а не 25), HTTPS — порт 443, а LDAPS — порт 636. + +Причина, по которой SSL использует другой порт, чем TLS, заключается в том, что соединение TLS начинается как обычный текст и переключается на зашифрованный трафик после директивы `STARTTLS`. Соединения SSL зашифрованы с самого начала. Кроме этого, существенных различий между ними нет. + +[NOTE] +==== +Мы настроим OpenLDAP для использования TLS, так как SSL считается устаревшим. +==== + +После установки OpenLDAP через порты следующие параметры конфигурации в [.filename]#/usr/local/etc/openldap/slapd.conf# включат TLS: + +[.programlisting] +.... +security ssf=128 + +TLSCertificateFile /path/to/your/cert.crt +TLSCertificateKeyFile /path/to/your/cert.key +TLSCACertificateFile /path/to/your/cacert.crt +.... + +В этом примере `ssf=128` указывает OpenLDAP требовать 128-битное шифрование для всех соединений, как для поиска, так и для обновления. Этот параметр может быть настроен в соответствии с требованиями безопасности вашего сайта, но ослаблять его требуется редко, так как большинство библиотек LDAP-клиентов поддерживают стойкое шифрование. + +Файлы [.filename]#cert.crt#, [.filename]#cert.key# и [.filename]#cacert.crt# необходимы для аутентификации клиентами _вас_ как действительного LDAP-сервера. Если вам просто нужен работающий сервер, вы можете создать самоподписанный сертификат с помощью OpenSSL: + +[[genrsa]] +.Генерация RSA-ключа +[example] +==== + +[source, shell] +.... +% openssl genrsa -out cert.key 1024 +Generating RSA private key, 1024 bit long modulus +....................++++++ +...++++++ +e is 65537 (0x10001) + +% openssl req -new -key cert.key -out cert.csr +.... + +==== + +На этом этапе вам будет предложено ввести некоторые значения. Вы можете ввести любые значения, какие пожелаете; однако важно, чтобы значение "Common Name" (Общее имя) было полным доменным именем сервера OpenLDAP. В нашем случае и в приведённых примерах сервер называется _server.example.org_. Неправильное указание этого значения может привести к сбоям при подключении клиентов. Это может стать причиной серьёзных проблем, поэтому внимательно следуйте этим шагам. + +Наконец, запрос на подпись сертификата должен быть подписан: + +[[self-sign]] +.Самостоятельная подпись сертификата +[example] +==== + +[source, shell] +.... +% openssl x509 -req -in cert.csr -days 365 -signkey cert.key -out cert.crt +Signature ok +subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd +Getting Private key +.... + +==== + +Это создаст самоподписанный сертификат, который можно использовать для директив в [.filename]#slapd.conf#, где [.filename]#cert.crt# и [.filename]#cacert.crt# представляют собой один и тот же файл. Если вы планируете использовать множество серверов OpenLDAP (для репликации через `slurpd`), рекомендуется ознакомиться с разделом crossref:ldap-auth[ssl-ca, Сертификаты OpenSSL для LDAP], чтобы сгенерировать ключ центра сертификации (CA) и использовать его для подписи индивидуальных сертификатов серверов. + +После этого добавьте следующее в [.filename]#/etc/rc.conf#: + +[.programlisting] +.... +slapd_enable="YES" +.... + +Затем выполните `/usr/local/etc/rc.d/slapd start`. Это должно запустить OpenLDAP. Убедитесь, что он слушает порт 389 с помощью + +[source, shell] +.... +% sockstat -4 -p 389 +ldap slapd 3261 7 tcp4 *:389 *:* +.... + +[[ldap-connect-client]] +==== Настройка клиента + +Установите порт package:net/openldap26-client[] для библиотек OpenLDAP. Клиентские машины всегда будут иметь библиотеки OpenLDAP, так как они содержатся в пакетах package:security/pam_ldap[] и package:net/nss_ldap[], по крайней мере, на данный момент. + +Файл конфигурации для библиотек OpenLDAP — это [.filename]#/usr/local/etc/openldap/ldap.conf#. Отредактируйте этот файл, указав следующие значения: + +[.programlisting] +.... +base dc=example,dc=org +uri ldap://server.example.org/ +ssl start_tls +tls_cacert /path/to/your/cacert.crt +.... + +[NOTE] +==== +Важно, чтобы у ваших клиентов был доступ к [.filename]#cacert.crt#, иначе они не смогут подключиться. +==== + +[NOTE] +==== +Существует два файла с именем [.filename]#ldap.conf#. Первый — это данный файл, предназначенный для библиотек OpenLDAP и определяющий, как взаимодействовать с сервером. Второй — [.filename]#/usr/local/etc/ldap.conf#, используется pam_ldap. +==== + +На этом этапе вы должны быть в состоянии выполнить `ldapsearch -Z` на клиентской машине; `-Z` означает "использовать TLS". Если вы столкнётесь с ошибкой, значит что-то настроено неправильно; скорее всего, проблема в ваших сертификатах. Используйте `s_client` и `s_server` из man:openssl[1], чтобы убедиться, что они правильно настроены и подписаны. + +[[ldap-database]] +=== Записи в базе данных + +Аутентификация в каталоге LDAP обычно выполняется путем попытки привязаться к каталогу как подключающийся пользователь. Это делается путем установки "простой" привязки к каталогу с предоставленным именем пользователя. Если существует запись с `uid`, равным имени пользователя, и атрибут `userPassword` этой записи совпадает с предоставленным паролем, то привязка проходит успешно. + +Первое, что нам нужно сделать, — это определить, где в каталоге будут находиться наши пользователи. + +Базовой записью для нашей базы данных является `dc=example,dc=org`. Стандартное расположение пользователей, которое ожидает большинство клиентов, выглядит примерно как `ou=people,_base_`, поэтому здесь будет использоваться именно это. Однако следует помнить, что это настраивается. + +Таким образом, запись ldif для организационного подразделения `people` будет выглядеть следующим образом: + +[.programlisting] +.... +dn: ou=people,dc=example,dc=org +objectClass: top +objectClass: organizationalUnit +ou: people +.... + +Все пользователи будут созданы как подразделы этой организационной единицы. + +Некоторые размышления стоит посвятить классу объектов, к которому будут принадлежать ваши пользователи. Большинство инструментов по умолчанию используют `people`, что подходит, если вам просто нужно предоставить записи для аутентификации. Однако, если вы также собираетесь хранить информацию о пользователях в базе данных LDAP, вам, вероятно, стоит использовать `inetOrgPerson`, который имеет множество полезных атрибутов. В любом случае, соответствующие схемы должны быть загружены в [.filename]#slapd.conf#. + +Для этого примера мы будем использовать класс объекта `person`. Если вы используете `inetOrgPerson`, шаги практически идентичны, за исключением того, что атрибут `sn` является обязательным. + +Чтобы добавить тестового пользователя с именем `tuser`, ldif-файл должен выглядеть так: + +[.programlisting] +.... +dn: uid=tuser,ou=people,dc=example,dc=org +objectClass: person +objectClass: posixAccount +objectClass: shadowAccount +objectClass: top +uidNumber: 10000 +gidNumber: 10000 +homeDirectory: /home/tuser +loginShell: /bin/csh +uid: tuser +cn: tuser +.... + +Я начинаю UID пользователей LDAP с 10000, чтобы избежать конфликтов с системными учётными записями; вы можете настроить любое число здесь, при условии что оно меньше 65536. + +Также необходимы записи групп. Они настраиваются так же, как записи пользователей, но мы будем использовать стандартные значения, приведённые ниже: + +[.programlisting] +.... +dn: ou=groups,dc=example,dc=org +objectClass: top +objectClass: organizationalUnit +ou: groups + +dn: cn=tuser,ou=groups,dc=example,dc=org +objectClass: posixGroup +objectClass: top +gidNumber: 10000 +cn: tuser +.... + +Чтобы добавить их в вашу базу данных, вы можете использовать `slapadd` или `ldapadd` для файла, содержащего эти записи. Альтернативно, вы можете использовать package:sysutils/ldapvi[]. + +Утилита `ldapsearch` на клиентской машине теперь должна возвращать эти записи. Если это так, ваша база данных правильно настроена для использования в качестве сервера аутентификации LDAP. + +[[client]] +== Конфигурация клиента + +Клиент уже должен иметь библиотеки OpenLDAP из crossref:ldap-auth[ldap-connect-client,Настройка клиента], но если вы устанавливаете несколько клиентских машин, вам потребуется установить package:net/openldap26-client[] на каждой из них. + +Для аутентификации на сервере LDAP в FreeBSD необходимо установить два порта: package:security/pam_ldap[] и package:net/nss_ldap[]. + +[[client-auth]] +=== Аутентификация + +package:security/pam_ldap[] настраивается через [.filename]#/usr/local/etc/ldap.conf#. + +[NOTE] +==== +Это _другой файл_, отличный от файла конфигурации библиотечных функций OpenLDAP, [.filename]#/usr/local/etc/openldap/ldap.conf#; однако он принимает многие из тех же параметров; фактически он является надмножеством этого файла. В оставшейся части этого раздела ссылки на [.filename]#ldap.conf# будут означать [.filename]#/usr/local/etc/ldap.conf#. +==== + +Таким образом, мы захотим скопировать все исходные параметры конфигурации из [.filename]#openldap/ldap.conf# в новый [.filename]#ldap.conf#. После этого нам нужно указать package:security/pam_ldap[], что искать на сервере каталогов. + +Мы идентифицируем наших пользователей с помощью атрибута `uid`. Чтобы настроить это (хотя это значение по умолчанию), укажите директиву `pam_login_attribute` в [.filename]#ldap.conf#: + +[[set-pam-login-attr]] +.Установка `pam_login_attribute` +[example] +==== + +[.programlisting] +.... +pam_login_attribute uid +.... + +==== + +С таким набором, package:security/pam_ldap[] будет искать во всей LDAP-директории под `base` значение `uid=_имя_пользователя_`. Если оно найдёт одну и только одну запись, будет предпринята попытка привязаться к этой записи с использованием предоставленного пароля. Если привязка произойдёт успешно, доступ будет разрешён. В противном случае доступ будет запрещён. + +Пользователи, чья оболочка не указана в [.filename]#/etc/shells#, не смогут войти в систему. Это особенно важно, когда Bash установлен как оболочка пользователя на сервере LDAP. Bash не входит в стандартную установку FreeBSD. При установке из пакета или порта, он располагается в [.filename]#/usr/local/bin/bash#. Убедитесь, что путь к оболочке на сервере указан правильно: + +[source, shell] +.... +% getent passwd username +.... + +Если в последнем столбце вывода указан `/bin/bash`, есть два варианта действий. Первый — изменить запись пользователя на сервере LDAP на [.filename]#/usr/local/bin/bash#. Второй вариант — создать символическую ссылку на клиентском компьютере LDAP, чтобы Bash находился в правильном месте: + +[source, shell] +.... +# ln -s /usr/local/bin/bash /bin/bash +.... + +Убедитесь, что файл [.filename]#/etc/shells# содержит записи для `/usr/local/bin/bash` и `/bin/bash`. После этого пользователь сможет входить в систему с Bash в качестве оболочки. + +[[client-auth-pam]] +==== PAM + +PAM, что означает "Pluggable Authentication Modules" (подключаемые модули аутентификации), является методом, с помощью которого FreeBSD аутентифицирует большинство своих сеансов. Чтобы указать FreeBSD, что мы хотим использовать LDAP-сервер, нам необходимо добавить строку в соответствующий файл PAM. + +В большинстве случаев подходящий файл PAM — это [.filename]#/etc/pam.d/sshd#, если вы хотите использовать SSH (не забудьте установить соответствующие параметры в [.filename]#/etc/ssh/sshd_config#, иначе SSH не будет использовать PAM). + +Чтобы использовать PAM для аутентификации, добавьте строку + +[.programlisting] +.... +auth sufficient /usr/local/lib/pam_ldap.so no_warn +.... + +Строгое место, где эта строка появляется в файле, и какие опции указаны в четвертом столбце, определяют точное поведение механизма аутентификации; см. man:pam[d] + +С такой конфигурацией вы сможете аутентифицировать пользователя в LDAP-каталоге. PAM выполнит привязку с вашими учетными данными, и в случае успеха сообщит SSH разрешить доступ. + +Однако разрешать _каждому_ пользователю в каталоге доступ к _каждой_ клиентской машине — не лучшая идея. При текущей конфигурации пользователю для входа на машину достаточно наличия записи в LDAP. К счастью, есть несколько способов ограничить доступ пользователей. + +[.filename]#ldap.conf# поддерживает директиву `pam_groupdn`; каждая учётная запись, подключающаяся к этой машине, должна быть членом группы, указанной здесь. Например, если у вас есть + +[.programlisting] +.... +pam_groupdn cn=servername,ou=accessgroups,dc=example,dc=org +.... + +в [.filename]#ldap.conf#, тогда только члены этой группы смогут войти в систему. Однако есть несколько моментов, которые следует учитывать. + +Участники этой группы указываются в одном или нескольких атрибутах `memberUid`, и каждый атрибут должен содержать полное отличающееся имя участника. Таким образом, `memberUid: someuser` не сработает; необходимо указать: + +[.programlisting] +.... +memberUid: uid=someuser,ou=people,dc=example,dc=org +.... + +Кроме того, эта директива не проверяется в PAM во время аутентификации, она проверяется во время управления учётными записями, поэтому вам понадобится вторая строка в ваших PAM-файлах в разделе `account`. Это, в свою очередь, потребует, чтобы _каждый_ пользователь был указан в группе, что не обязательно соответствует нашим желаниям. Чтобы избежать блокировки пользователей, не находящихся в LDAP, следует включить атрибут `ignore_unknown_user`. Наконец, следует установить опцию `ignore_authinfo_unavail`, чтобы не оказаться заблокированным на каждом компьютере при недоступности LDAP-сервера. + +Ваш файл [.filename]#pam.d/sshd# может в итоге выглядеть так: + +[[pam]] +.Пример [.filename]#pam.d/sshd# +[example] +==== + +[.programlisting] +.... +auth required pam_nologin.so no_warn +auth sufficient pam_opie.so no_warn no_fake_prompts +auth requisite pam_opieaccess.so no_warn allow_local +auth sufficient /usr/local/lib/pam_ldap.so no_warn +auth required pam_unix.so no_warn try_first_pass + +account required pam_login_access.so +account required /usr/local/lib/pam_ldap.so no_warn ignore_authinfo_unavail ignore_unknown_user +.... + +==== + +[NOTE] +==== +Поскольку мы добавляем эти строки конкретно в [.filename]#pam.d/sshd#, это повлияет только на SSH-сеансы. Пользователи LDAP не смогут войти через консоль. Чтобы изменить это поведение, изучите остальные файлы в [.filename]#/etc/pam.d# и измените их соответствующим образом. +==== + +[[client-nss]] +=== Name Service Switch + +NSS — это служба, которая сопоставляет атрибуты с именами. Например, если файл принадлежит пользователю `1001`, приложение запросит у NSS имя для `1001` и может получить `bob`, `ted` или любое другое имя пользователя. + +Теперь, когда информация о пользователях хранится в LDAP, необходимо указать NSS обращаться туда при запросах. + +Порт package:net/nss_ldap[] выполняет это. Он использует тот же конфигурационный файл, что и package:security/pam_ldap[], и после установки не должен требовать дополнительных параметров. Вместо этого остаётся просто отредактировать [.filename]#/etc/nsswitch.conf#, чтобы воспользоваться преимуществами каталога. Просто замените следующие строки: + +[.programlisting] +.... +group: compat +passwd: compat +.... + +строкой + +[.programlisting] +.... +group: files ldap +passwd: files ldap +.... + +Это позволит сопоставлять имена пользователей с UID и UID с именами пользователей. + +Поздравляем! Теперь у вас должна работать аутентификация через LDAP. + +[[caveats]] +=== Предостережения + +К сожалению, на момент написания этой документации FreeBSD не поддерживал изменение паролей пользователей с помощью man:passwd[1]. В результате большинству администраторов приходится самостоятельно реализовывать решение. Здесь я привожу несколько примеров. Обратите внимание, что если вы пишете собственный скрипт для смены пароля, вам следует учитывать некоторые проблемы безопасности; см. crossref:ldap-auth[security-passwd, Хранение паролей] + +[[chpw-shell]] +.Скрипт оболочки для изменения паролей +[example] +==== + +[.programlisting] +.... +#!/bin/sh + +stty -echo +read -p "Old Password: " oldp; echo +read -p "New Password: " np1; echo +read -p "Retype New Password: " np2; echo +stty echo + +if [ "$np1" != "$np2" ]; then + echo "Passwords do not match." + exit 1 +fi + +ldappasswd -D uid="$USER",ou=people,dc=example,dc=org \ + -w "$oldp" \ + -a "$oldp" \ + -s "$np1" +.... + +==== + +[CAUTION] +==== + +Этот скрипт почти не проверяет ошибки, что более важно, он очень беспечен в том, как хранит ваши пароли. Если вы делаете что-то подобное, по крайней мере измените значение sysctl `security.bsd.see_other_uids`: + +[source, shell] +.... +# sysctl security.bsd.see_other_uids=0 +.... + +==== + +Более гибкий (и, вероятно, более безопасный) подход может быть реализован путем написания собственной программы или даже веб-интерфейса. Ниже приведена часть библиотеки на Ruby, которая позволяет изменять пароли в LDAP. Она используется как в командной строке, так и в вебе. + +[[chpw-ruby]] +.Ruby-скрипт для изменения паролей +[example] +==== + +[.programlisting] +.... +require 'ldap' +require 'base64' +require 'digest' +require 'password' # ruby-password + +ldap_server = "ldap.example.org" +luser = "uid=#{ENV['USER']},ou=people,dc=example,dc=org" + +# get the new password, check it, and create a salted hash from it +def get_password + pwd1 = Password.get("New Password: ") + pwd2 = Password.get("Retype New Password: ") + + raise if pwd1 != pwd2 + pwd1.check # check password strength + + salt = rand.to_s.gsub(/0\./, '') + pass = pwd1.to_s + hash = "{SSHA}"+Base64.encode64(Digest::SHA1.digest("#{pass}#{salt}")+salt).chomp! + return hash +end + +oldp = Password.get("Old Password: ") +newp = get_password + +# We'll just replace it. That we can bind proves that we either know +# the old password or are an admin. + +replace = LDAP::Mod.new(LDAP::LDAP_MOD_REPLACE | LDAP::LDAP_MOD_BVALUES, + "userPassword", + [newp]) + +conn = LDAP::SSLConn.new(ldap_server, 389, true) +conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3) +conn.bind(luser, oldp) +conn.modify(luser, [replace]) +.... + +==== + +Хотя это не гарантирует отсутствия уязвимостей (например, пароль хранится в памяти), данный подход чище и гибче, чем простой скрипт на `sh`. + +[[secure]] +== Безопасность + +Теперь, когда ваши машины (и, возможно, другие службы) проходят аутентификацию через ваш LDAP-сервер, этот сервер необходимо защитить как минимум так же, как [.filename]#/etc/master.passwd# на обычном сервере, а возможно, и лучше, поскольку сломанный или взломанный LDAP-сервер нарушит работу всех клиентских служб. + +Помните, что этот раздел не является исчерпывающим. Вам следует постоянно пересматривать свою конфигурацию и процедуры для улучшений. + +[[secure-readonly]] +=== Установка атрибутов только для чтения + +Некоторые атрибуты в LDAP должны быть доступны только для чтения. Если оставить их доступными для записи пользователем, например, пользователь может изменить свой атрибут `uidNumber` на `0` и получить доступ `root`! + +Для начала атрибут `userPassword` не должен быть доступен для чтения всем. По умолчанию любой, кто может подключиться к LDAP-серверу, может читать этот атрибут. Чтобы отключить это, добавьте следующее в [.filename]#slapd.conf#: + +[[hide-userpass]] +.Скрыть пароли +[example] +==== + +[.programlisting] +.... +access to dn.subtree="ou=people,dc=example,dc=org" + attrs=userPassword + by self write + by anonymous auth + by * none + +access to * + by self write + by * read +.... + +==== + +Это запретит чтение атрибута `userPassword`, но позволит пользователям изменять свои собственные пароли. + +Кроме того, следует запретить пользователям изменять некоторые из своих атрибутов. По умолчанию пользователи могут изменять любые атрибуты (за исключением тех, которые сами схемы LDAP запрещают изменять), такие как `uidNumber`. Чтобы устранить эту уязвимость, измените приведённое выше на + +[[attrib-readonly]] +.Атрибуты только для чтения +[example] +==== + +[.programlisting] +.... +access to dn.subtree="ou=people,dc=example,dc=org" + attrs=userPassword + by self write + by anonymous auth + by * none + +access to attrs=homeDirectory,uidNumber,gidNumber + by * read + +access to * + by self write + by * read +.... + +==== + +Это предотвратит возможность пользователей маскироваться под других пользователей. + +[[secure-root]] +=== Определение учетной записи `root` + +Часто учетная запись `root` или администратора для службы LDAP будет определена в файле конфигурации. Например, OpenLDAP поддерживает это, и это работает, но может привести к проблемам, если файл [.filename]#slapd.conf# будет скомпрометирован. Возможно, лучше использовать это только для первоначальной настройки доступа к LDAP, а затем определить учетную запись `root` там. + +Еще лучше определить учетные записи с ограниченными правами и полностью исключить учетную запись `root`. Например, пользователи, которые могут добавлять или удалять учетные записи, добавляются в одну группу, но сами не могут изменять состав этой группы. Такая политика безопасности поможет снизить последствия утечки пароля. + +[[manager-acct]] +==== Создание группы управления + +Предположим, вы хотите, чтобы ваш IT-отдел мог изменять домашние каталоги пользователей, но не хотите, чтобы все они могли добавлять или удалять пользователей. Способ сделать это — добавить группу для этих администраторов: + +[[manager-acct-dn]] +.Создание группы управления +[example] +==== + +[.programlisting] +.... +dn: cn=homemanagement,dc=example,dc=org +objectClass: top +objectClass: posixGroup +cn: homemanagement +gidNumber: 121 # required for posixGroup +memberUid: uid=tuser,ou=people,dc=example,dc=org +memberUid: uid=user2,ou=people,dc=example,dc=org +.... + +==== + +И затем измените атрибуты прав в [.filename]#slapd.conf#: + +[[management-acct-acl]] +.ACL для группы управления домашним каталогом +[example] +==== + +[.programlisting] +.... +access to dn.subtree="ou=people,dc=example,dc=org" + attr=homeDirectory + by dn="cn=homemanagement,dc=example,dc=org" + dnattr=memberUid write +.... + +==== + +Теперь `tuser` и `user2` могут изменять домашние каталоги других пользователей. + +В этом примере мы предоставили подмножество административных полномочий определённым пользователям, не давая им власти в других областях. Идея заключается в том, чтобы вскоре ни одна учётная запись пользователя не обладала полномочиями учётной записи `root`, но каждое полномочие, которое имел root, было бы у хотя бы одного пользователя. Учётная запись `root` тогда становится ненужной и может быть удалена. + +[[security-passwd]] +=== Хранение паролей + +По умолчанию OpenLDAP сохраняет значение атрибута `userPassword` так же, как и любые другие данные: в открытом виде. В большинстве случаев оно кодируется в base64, что обеспечивает достаточную защиту, чтобы честный администратор не узнал ваш пароль, но не более того. + +Хорошей идеей является хранение паролей в более безопасном формате, таком как SSHA (солёный SHA). Это выполняется любой программой, которую вы используете для изменения паролей пользователей. + +:sectnums!: + +[appendix] +[[useful]] +== Полезные инструменты + +Вот несколько других программ, которые могут быть полезны, особенно если у вас много пользователей и вы не хотите настраивать всё вручную. + +package:security/pam_mkhomedir[] — это модуль PAM, который всегда завершается успешно; его назначение — создавать домашние каталоги для пользователей, у которых их нет. Если у вас есть десятки серверов-клиентов и сотни пользователей, гораздо удобнее использовать этот модуль и настроить скелетные каталоги, чем подготавливать каждый домашний каталог вручную. + +package:sysutils/ldapvi[] — это отличная утилита для редактирования значений LDAP в синтаксисе, подобном LDIF. Каталог (или его подраздел) отображается в редакторе, выбранном переменной окружения `EDITOR`. Это позволяет легко вносить масштабные изменения в каталог без необходимости написания собственного инструмента. + +package:security/openssh-portable[] обладает возможностью обращаться к серверу LDAP для проверки SSH-ключей. Это очень удобно, если у вас много серверов и вы не хотите копировать свои открытые ключи на все из них. + +:sectnums!: + +[appendix] +[[ssl-ca]] +== Сертификаты OpenSSL для LDAP + +Если вы размещаете два или более LDAP-серверов, вам, вероятно, не захочется использовать самоподписанные сертификаты, так как каждый клиент придется настраивать для работы с каждым сертификатом. Хотя это возможно, это не так просто, как создать собственный центр сертификации и подписать сертификаты ваших серверов с его помощью. + +Шаги здесь представлены как есть, без попыток объяснить происходящее — дополнительные пояснения можно найти в man:openssl[1] и связанных справочных страницах. + +Для создания центра сертификации нам просто нужны самоподписанный сертификат и ключ. Шаги для этого следующие + +[[make-cert]] +.Создание сертификата +[example] +==== + +[source, shell] +.... +% openssl genrsa -out root.key 1024 +% openssl req -new -key root.key -out root.csr +% openssl x509 -req -days 1024 -in root.csr -signkey root.key -out root.crt +.... + +==== + +Это будут корневой ключ и сертификат ЦС. Возможно, вы захотите зашифровать ключ и хранить его в прохладном, сухом месте; любой, кто получит к нему доступ, сможет выдавать себя за один из ваших LDAP-серверов. + +Затем, используя первые два шага, описанные выше, создайте ключ [.filename]#ldap-server-one.key# и запрос на подпись сертификата [.filename]#ldap-server-one.csr#. После подписания запроса с помощью [.filename]#root.key# вы сможете использовать [.filename]#ldap-server-one.*# на своих LDAP-серверах. + +[NOTE] +==== +Не забудьте использовать полное доменное имя для атрибута "common name" при создании запроса на подпись сертификата; в противном случае клиенты будут отклонять соединение с вами, и диагностика этой проблемы может быть очень сложной. +==== + +Для подписи ключа используйте `-CA` и `-CAkey` вместо `-signkey`: + +[[ca-sign]] +.Подписывать как Центр Сертификации +[example] +==== + +[source, shell] +.... +% openssl x509 -req -days 1024 \ +-in ldap-server-one.csr -CA root.crt -CAkey root.key \ +-out ldap-server-one.crt +.... + +==== + +Результирующий файл будет представлять собой сертификат, который можно использовать на ваших LDAP-серверах. + +Наконец, чтобы клиенты доверяли всем вашим серверам, распространите файл [.filename]#root.crt# (__сертификат__, а не ключ!) на каждом клиенте и укажите его в директиве `TLSCACertificateFile` в файле [.filename]#ldap.conf#. diff --git a/documentation/content/ru/articles/ldap-auth/_index.po b/documentation/content/ru/articles/ldap-auth/_index.po new file mode 100644 index 0000000000..e064db5f93 --- /dev/null +++ b/documentation/content/ru/articles/ldap-auth/_index.po @@ -0,0 +1,1887 @@ +# SOME DESCRIPTIVE TITLE +# Copyright (C) YEAR The FreeBSD Project +# This file is distributed under the same license as the FreeBSD Documentation package. +# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025. +msgid "" +msgstr "" +"Project-Id-Version: FreeBSD Documentation VERSION\n" +"POT-Creation-Date: 2025-09-23 19:02+0300\n" +"PO-Revision-Date: 2025-08-15 04:45+0000\n" +"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n" +"Language-Team: Russian <https://translate-dev.freebsd.org/projects/" +"documentation/articlesldap-auth_index/ru/>\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.17\n" + +#. type: Yaml Front Matter Hash Value: description +#: documentation/content/en/articles/ldap-auth/_index.adoc:1 +#, no-wrap +msgid "Guide for the configuration of an LDAP server for authentication on FreeBSD" +msgstr "Руководство по настройке сервера LDAP для аутентификации в FreeBSD" + +#. type: Title = +#: documentation/content/en/articles/ldap-auth/_index.adoc:1 +#: documentation/content/en/articles/ldap-auth/_index.adoc:12 +#, no-wrap +msgid "LDAP Authentication" +msgstr "Аутентификация LDAP" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:45 +msgid "Abstract" +msgstr "Аннотация" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:48 +msgid "" +"This document is intended as a guide for the configuration of an LDAP server " +"(principally an OpenLDAP server) for authentication on FreeBSD. This is " +"useful for situations where many servers need the same user accounts, for " +"example as a replacement for NIS." +msgstr "" +"Этот документ является руководством по настройке сервера LDAP (в основном " +"сервера OpenLDAP) для аутентификации в FreeBSD. Это полезно в ситуациях, " +"когда множество серверов требуют одинаковых учётных записей пользователей, " +"например, в качестве замены NIS." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:50 +msgid "'''" +msgstr "'''" + +#. type: Title == +#: documentation/content/en/articles/ldap-auth/_index.adoc:54 +#, no-wrap +msgid "Preface" +msgstr "Предисловие" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:58 +msgid "" +"This document is intended to give the reader enough of an understanding of " +"LDAP to configure an LDAP server. This document will attempt to provide an " +"explanation of package:net/nss_ldap[] and package:security/pam_ldap[] for " +"use with client machines services for use with the LDAP server." +msgstr "" +"Этот документ предназначен для того, чтобы дать читателю достаточно знаний о " +"LDAP для настройки сервера LDAP. В документе будет предпринята попытка " +"объяснить использование package:net/nss_ldap[] и package:security/pam_ldap[] " +"для клиентских машин, работающих с сервером LDAP." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:60 +msgid "" +"When finished, the reader should be able to configure and deploy a FreeBSD " +"server that can host an LDAP directory, and to configure and deploy a " +"FreeBSD server which can authenticate against an LDAP directory." +msgstr "" +"По завершении читатель должен уметь настроить и развернуть сервер FreeBSD, " +"способный размещать каталог LDAP, а также настроить и развернуть сервер " +"FreeBSD, который может проходить аутентификацию с использованием каталога " +"LDAP." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:64 +msgid "" +"This article is not intended to be an exhaustive account of the security, " +"robustness, or best practice considerations for configuring LDAP or the " +"other services discussed herein. While the author takes care to do " +"everything correctly, they do not address security issues beyond a general " +"scope. This article should be considered to lay the theoretical groundwork " +"only, and any actual implementation should be accompanied by careful " +"requirement analysis." +msgstr "" +"Эта статья не претендует на исчерпывающее описание вопросов безопасности, " +"надежности или лучших практик настройки LDAP и других обсуждаемых здесь " +"сервисов. Хотя автор старается делать всё правильно, вопросы безопасности " +"рассматриваются лишь в общих чертах. Данная статья должна рассматриваться " +"только как теоретическая основа, а любая реальная реализация должна " +"сопровождаться тщательным анализом требований." + +#. type: Title == +#: documentation/content/en/articles/ldap-auth/_index.adoc:66 +#, no-wrap +msgid "Configuring LDAP" +msgstr "Настройка LDAP" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:71 +msgid "" +"LDAP stands for \"Lightweight Directory Access Protocol\" and is a subset of " +"the X.500 Directory Access Protocol. Its most recent specifications are in " +"http://www.ietf.org/rfc/rfc4510.txt[RFC4510] and friends. Essentially it is " +"a database that expects to be read from more often than it is written to." +msgstr "" +"LDAP означает \"Lightweight Directory Access Protocol\" (облегчённый " +"протокол доступа к каталогам) и является подмножеством X.500 Directory " +"Access Protocol. Последние спецификации можно найти в http://www.ietf.org/" +"rfc/rfc4510.txt[RFC4510] и связанных документах. По сути, это база данных, " +"которая предполагает более частые операции чтения, чем записи." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:75 +msgid "" +"The LDAP server http://www.openldap.org/[OpenLDAP] will be used in the " +"examples in this document; while the principles here should be generally " +"applicable to many different servers, most of the concrete administration is " +"OpenLDAP-specific. There are several server versions in ports, for example " +"package:net/openldap26-server[]. Client servers will need the corresponding " +"package:net/openldap26-client[] libraries." +msgstr "" +"В примерах в этом документе будет использоваться LDAP-сервер http://" +"www.openldap.org/[OpenLDAP]; хотя принципы, изложенные здесь, должны быть " +"применимы к различным серверам, большая часть конкретных административных " +"действий специфична для OpenLDAP. В портах доступно несколько версий " +"сервера, например package:net/openldap26-server[]. Клиентские серверы " +"потребуют соответствующие библиотеки package:net/openldap26-client[]." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:78 +msgid "" +"There are (basically) two areas of the LDAP service which need " +"configuration. The first is setting up a server to receive connections " +"properly, and the second is adding entries to the server's directory so that " +"FreeBSD tools know how to interact with it." +msgstr "" +"Существуют (в основном) две области службы LDAP, которые требуют настройки. " +"Первая — настройка сервера для правильного приёма соединений, а вторая — " +"добавление записей в каталог сервера, чтобы инструменты FreeBSD знали, как с " +"ним взаимодействовать." + +#. type: Title === +#: documentation/content/en/articles/ldap-auth/_index.adoc:80 +#, no-wrap +msgid "Setting Up the Server for Connections" +msgstr "Настройка сервера для подключений" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:86 +msgid "" +"This section is specific to OpenLDAP. If you are using another server, you " +"will need to consult that server's documentation." +msgstr "" +"Этот раздел относится конкретно к OpenLDAP. Если вы используете другой " +"сервер, вам необходимо обратиться к документации этого сервера." + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:89 +#: documentation/content/en/articles/ldap-auth/_index.adoc:94 +#, no-wrap +msgid "Installing OpenLDAP" +msgstr "Установка OpenLDAP" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:92 +msgid "First, install OpenLDAP:" +msgstr "Сначала установите OpenLDAP:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:102 +#, no-wrap +msgid "" +"# cd /usr/ports/net/openldap26-server\n" +"# make install clean\n" +msgstr "" +"# cd /usr/ports/net/openldap26-server\n" +"# make install clean\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:107 +msgid "" +"This installs the `slapd` and `slurpd` binaries, along with the required " +"OpenLDAP libraries." +msgstr "" +"Это устанавливает бинарные файлы `slapd` и `slurpd`, а также необходимые " +"библиотеки OpenLDAP." + +#. type: Title ==== +#: documentation/content/en/articles/ldap-auth/_index.adoc:109 +#, no-wrap +msgid "Configuring OpenLDAP" +msgstr "Настройка OpenLDAP" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:112 +msgid "Next we must configure OpenLDAP." +msgstr "Далее мы должны настроить OpenLDAP." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:115 +msgid "" +"You will want to require encryption in your connections to the LDAP server; " +"otherwise your users' passwords will be transferred in plain text, which is " +"considered insecure. The tools we will be using support two very similar " +"kinds of encryption, SSL and TLS." +msgstr "" +"Вам следует требовать шифрование соединений с сервером LDAP; в противном " +"случае пароли ваших пользователей будут передаваться в открытом виде, что " +"считается небезопасным. Инструменты, которые мы будем использовать, " +"поддерживают два очень похожих типа шифрования: SSL и TLS." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:118 +msgid "" +"TLS stands for \"Transportation Layer Security\". Services that employ TLS " +"tend to connect on the _same_ ports as the same services without TLS; thus " +"an SMTP server which supports TLS will listen for connections on port 25, " +"and an LDAP server will listen on 389." +msgstr "" +"TLS означает \"Transportation Layer Security\". Службы, использующие TLS, " +"обычно подключаются к тем же портам, что и аналогичные службы без TLS; таким " +"образом, SMTP-сервер с поддержкой TLS будет ожидать подключений на порту 25, " +"а LDAP-сервер — на порту 389." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:121 +msgid "" +"SSL stands for \"Secure Sockets Layer\", and services that implement SSL do " +"_not_ listen on the same ports as their non-SSL counterparts. Thus SMTPS " +"listens on port 465 (not 25), HTTPS listens on 443, and LDAPS on 636." +msgstr "" +"SSL означает «Secure Sockets Layer», и службы, реализующие SSL, _не_ " +"работают на тех же портах, что и их аналоги без SSL. Таким образом, SMTPS " +"использует порт 465 (а не 25), HTTPS — порт 443, а LDAPS — порт 636." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:125 +msgid "" +"The reason SSL uses a different port than TLS is because a TLS connection " +"begins as plain text, and switches to encrypted traffic after the `STARTTLS` " +"directive. SSL connections are encrypted from the beginning. Other than " +"that there are no substantial differences between the two." +msgstr "" +"Причина, по которой SSL использует другой порт, чем TLS, заключается в том, " +"что соединение TLS начинается как обычный текст и переключается на " +"зашифрованный трафик после директивы `STARTTLS`. Соединения SSL зашифрованы " +"с самого начала. Кроме этого, существенных различий между ними нет." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:129 +msgid "We will adjust OpenLDAP to use TLS, as SSL is considered deprecated." +msgstr "" +"Мы настроим OpenLDAP для использования TLS, так как SSL считается устаревшим." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:132 +msgid "" +"Once OpenLDAP is installed via ports, the following configuration parameters " +"in [.filename]#/usr/local/etc/openldap/slapd.conf# will enable TLS:" +msgstr "" +"После установки OpenLDAP через порты следующие параметры конфигурации в " +"[.filename]#/usr/local/etc/openldap/slapd.conf# включат TLS:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:136 +#, no-wrap +msgid "security ssf=128\n" +msgstr "security ssf=128\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:140 +#, no-wrap +msgid "" +"TLSCertificateFile /path/to/your/cert.crt\n" +"TLSCertificateKeyFile /path/to/your/cert.key\n" +"TLSCACertificateFile /path/to/your/cacert.crt\n" +msgstr "" +"TLSCertificateFile /path/to/your/cert.crt\n" +"TLSCertificateKeyFile /path/to/your/cert.key\n" +"TLSCACertificateFile /path/to/your/cacert.crt\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:144 +msgid "" +"Here, `ssf=128` tells OpenLDAP to require 128-bit encryption for all " +"connections, both search and update. This parameter may be configured based " +"on the security needs of your site, but rarely you need to weaken it, as " +"most LDAP client libraries support strong encryption." +msgstr "" +"В этом примере `ssf=128` указывает OpenLDAP требовать 128-битное шифрование " +"для всех соединений, как для поиска, так и для обновления. Этот параметр " +"может быть настроен в соответствии с требованиями безопасности вашего сайта, " +"но ослаблять его требуется редко, так как большинство библиотек LDAP-" +"клиентов поддерживают стойкое шифрование." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:147 +msgid "" +"The [.filename]#cert.crt#, [.filename]#cert.key#, and " +"[.filename]#cacert.crt# files are necessary for clients to authenticate " +"_you_ as the valid LDAP server. If you simply want a server that runs, you " +"can create a self-signed certificate with OpenSSL:" +msgstr "" +"Файлы [.filename]#cert.crt#, [.filename]#cert.key# и [.filename]#cacert.crt# " +"необходимы для аутентификации клиентами _вас_ как действительного LDAP-" +"сервера. Если вам просто нужен работающий сервер, вы можете создать " +"самоподписанный сертификат с помощью OpenSSL:" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:149 +#, no-wrap +msgid "Generating an RSA Key" +msgstr "Генерация RSA-ключа" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:160 +#, no-wrap +msgid "" +"% openssl genrsa -out cert.key 1024\n" +"Generating RSA private key, 1024 bit long modulus\n" +"....................++++++\n" +"...++++++\n" +"e is 65537 (0x10001)\n" +msgstr "" +"% openssl genrsa -out cert.key 1024\n" +"Generating RSA private key, 1024 bit long modulus\n" +"....................++++++\n" +"...++++++\n" +"e is 65537 (0x10001)\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:162 +#, no-wrap +msgid "% openssl req -new -key cert.key -out cert.csr\n" +msgstr "% openssl req -new -key cert.key -out cert.csr\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:171 +msgid "" +"At this point you should be prompted for some values. You may enter " +"whatever values you like; however, it is important the \"Common Name\" value " +"be the fully qualified domain name of the OpenLDAP server. In our case, and " +"the examples here, the server is _server.example.org_. Incorrectly setting " +"this value will cause clients to fail when making connections. This can the " +"cause of great frustration, so ensure that you follow these steps closely." +msgstr "" +"На этом этапе вам будет предложено ввести некоторые значения. Вы можете " +"ввести любые значения, какие пожелаете; однако важно, чтобы значение " +"\"Common Name\" (Общее имя) было полным доменным именем сервера OpenLDAP. В " +"нашем случае и в приведённых примерах сервер называется " +"_server.example.org_. Неправильное указание этого значения может привести к " +"сбоям при подключении клиентов. Это может стать причиной серьёзных проблем, " +"поэтому внимательно следуйте этим шагам." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:173 +msgid "Finally, the certificate signing request needs to be signed:" +msgstr "Наконец, запрос на подпись сертификата должен быть подписан:" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:175 +#, no-wrap +msgid "Self-signing the Certificate" +msgstr "Самостоятельная подпись сертификата" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:185 +#, no-wrap +msgid "" +"% openssl x509 -req -in cert.csr -days 365 -signkey cert.key -out cert.crt\n" +"Signature ok\n" +"subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd\n" +"Getting Private key\n" +msgstr "" +"% openssl x509 -req -in cert.csr -days 365 -signkey cert.key -out cert.crt\n" +"Signature ok\n" +"subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd\n" +"Getting Private key\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:192 +msgid "" +"This will create a self-signed certificate that can be used for the " +"directives in [.filename]#slapd.conf#, where [.filename]#cert.crt# and " +"[.filename]#cacert.crt# are the same file. If you are going to use many " +"OpenLDAP servers (for replication via `slurpd`) you will want to see " +"crossref:ldap-auth[ssl-ca, OpenSSL Certificates for LDAP] to generate a CA " +"key and use it to sign individual server certificates." +msgstr "" +"Это создаст самоподписанный сертификат, который можно использовать для " +"директив в [.filename]#slapd.conf#, где [.filename]#cert.crt# и " +"[.filename]#cacert.crt# представляют собой один и тот же файл. Если вы " +"планируете использовать множество серверов OpenLDAP (для репликации через " +"`slurpd`), рекомендуется ознакомиться с разделом crossref:ldap-auth[ssl-ca, " +"Сертификаты OpenSSL для LDAP], чтобы сгенерировать ключ центра сертификации " +"(CA) и использовать его для подписи индивидуальных сертификатов серверов." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:194 +msgid "Once this is done, put the following in [.filename]#/etc/rc.conf#:" +msgstr "После этого добавьте следующее в [.filename]#/etc/rc.conf#:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:198 +#, no-wrap +msgid "slapd_enable=\"YES\"\n" +msgstr "slapd_enable=\"YES\"\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:203 +msgid "" +"Then run `/usr/local/etc/rc.d/slapd start`. This should start OpenLDAP. " +"Confirm that it is listening on 389 with" +msgstr "" +"Затем выполните `/usr/local/etc/rc.d/slapd start`. Это должно запустить " +"OpenLDAP. Убедитесь, что он слушает порт 389 с помощью" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:208 +#, no-wrap +msgid "" +"% sockstat -4 -p 389\n" +"ldap slapd 3261 7 tcp4 *:389 *:*\n" +msgstr "" +"% sockstat -4 -p 389\n" +"ldap slapd 3261 7 tcp4 *:389 *:*\n" + +#. type: Title ==== +#: documentation/content/en/articles/ldap-auth/_index.adoc:211 +#, no-wrap +msgid "Configuring the Client" +msgstr "Настройка клиента" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:215 +msgid "" +"Install the package:net/openldap26-client[] port for the OpenLDAP " +"libraries. The client machines will always have OpenLDAP libraries since " +"that is all package:security/pam_ldap[] and package:net/nss_ldap[] support, " +"at least for the moment." +msgstr "" +"Установите порт package:net/openldap26-client[] для библиотек OpenLDAP. " +"Клиентские машины всегда будут иметь библиотеки OpenLDAP, так как они " +"содержатся в пакетах package:security/pam_ldap[] и package:net/nss_ldap[], " +"по крайней мере, на данный момент." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:218 +msgid "" +"The configuration file for the OpenLDAP libraries is [.filename]#/usr/local/" +"etc/openldap/ldap.conf#. Edit this file to contain the following values:" +msgstr "" +"Файл конфигурации для библиотек OpenLDAP — это [.filename]#/usr/local/etc/" +"openldap/ldap.conf#. Отредактируйте этот файл, указав следующие значения:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:225 +#, no-wrap +msgid "" +"base dc=example,dc=org\n" +"uri ldap://server.example.org/\n" +"ssl start_tls\n" +"tls_cacert /path/to/your/cacert.crt\n" +msgstr "" +"base dc=example,dc=org\n" +"uri ldap://server.example.org/\n" +"ssl start_tls\n" +"tls_cacert /path/to/your/cacert.crt\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:230 +msgid "" +"It is important that your clients have access to [.filename]#cacert.crt#, " +"otherwise they will not be able to connect." +msgstr "" +"Важно, чтобы у ваших клиентов был доступ к [.filename]#cacert.crt#, иначе " +"они не смогут подключиться." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:237 +msgid "" +"There are two files called [.filename]#ldap.conf#. The first is this file, " +"which is for the OpenLDAP libraries and defines how to talk to the server. " +"The second is [.filename]#/usr/local/etc/ldap.conf#, and is for pam_ldap." +msgstr "" +"Существует два файла с именем [.filename]#ldap.conf#. Первый — это данный " +"файл, предназначенный для библиотек OpenLDAP и определяющий, как " +"взаимодействовать с сервером. Второй — [.filename]#/usr/local/etc/" +"ldap.conf#, используется pam_ldap." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:242 +msgid "" +"At this point you should be able to run `ldapsearch -Z` on the client " +"machine; `-Z` means \"use TLS\". If you encounter an error, then something " +"is configured wrong; most likely it is your certificates. Use " +"man:openssl[1]'s `s_client` and `s_server` to ensure you have them " +"configured and signed properly." +msgstr "" +"На этом этапе вы должны быть в состоянии выполнить `ldapsearch -Z` на " +"клиентской машине; `-Z` означает \"использовать TLS\". Если вы столкнётесь с " +"ошибкой, значит что-то настроено неправильно; скорее всего, проблема в ваших " +"сертификатах. Используйте `s_client` и `s_server` из man:openssl[1], чтобы " +"убедиться, что они правильно настроены и подписаны." + +#. type: Title === +#: documentation/content/en/articles/ldap-auth/_index.adoc:244 +#, no-wrap +msgid "Entries in the Database" +msgstr "Записи в базе данных" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:249 +msgid "" +"Authentication against an LDAP directory is generally accomplished by " +"attempting to bind to the directory as the connecting user. This is done by " +"establishing a \"simple\" bind on the directory with the user name " +"supplied. If there is an entry with the `uid` equal to the user name and " +"that entry's `userPassword` attribute matches the password supplied, then " +"the bind is successful." +msgstr "" +"Аутентификация в каталоге LDAP обычно выполняется путем попытки привязаться " +"к каталогу как подключающийся пользователь. Это делается путем установки " +"\"простой\" привязки к каталогу с предоставленным именем пользователя. Если " +"существует запись с `uid`, равным имени пользователя, и атрибут " +"`userPassword` этой записи совпадает с предоставленным паролем, то привязка " +"проходит успешно." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:251 +msgid "" +"The first thing we have to do is figure out is where in the directory our " +"users will live." +msgstr "" +"Первое, что нам нужно сделать, — это определить, где в каталоге будут " +"находиться наши пользователи." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:255 +msgid "" +"The base entry for our database is `dc=example,dc=org`. The default " +"location for users that most clients seem to expect is something like " +"`ou=people,_base_`, so that is what will be used here. However keep in mind " +"that this is configurable." +msgstr "" +"Базовой записью для нашей базы данных является `dc=example,dc=org`. " +"Стандартное расположение пользователей, которое ожидает большинство " +"клиентов, выглядит примерно как `ou=people,_base_`, поэтому здесь будет " +"использоваться именно это. Однако следует помнить, что это настраивается." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:257 +msgid "So the ldif entry for the `people` organizational unit will look like:" +msgstr "" +"Таким образом, запись ldif для организационного подразделения `people` будет " +"выглядеть следующим образом:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:264 +#, no-wrap +msgid "" +"dn: ou=people,dc=example,dc=org\n" +"objectClass: top\n" +"objectClass: organizationalUnit\n" +"ou: people\n" +msgstr "" +"dn: ou=people,dc=example,dc=org\n" +"objectClass: top\n" +"objectClass: organizationalUnit\n" +"ou: people\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:267 +msgid "All users will be created as subentries of this organizational unit." +msgstr "" +"Все пользователи будут созданы как подразделы этой организационной единицы." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:272 +msgid "" +"Some thought might be given to the object class your users will belong to. " +"Most tools by default will use `people`, which is fine if you simply want to " +"provide entries against which to authenticate. However, if you are going to " +"store user information in the LDAP database as well, you will probably want " +"to use `inetOrgPerson`, which has many useful attributes. In either case, " +"the relevant schemas need to be loaded in [.filename]#slapd.conf#." +msgstr "" +"Некоторые размышления стоит посвятить классу объектов, к которому будут " +"принадлежать ваши пользователи. Большинство инструментов по умолчанию " +"используют `people`, что подходит, если вам просто нужно предоставить записи " +"для аутентификации. Однако, если вы также собираетесь хранить информацию о " +"пользователях в базе данных LDAP, вам, вероятно, стоит использовать " +"`inetOrgPerson`, который имеет множество полезных атрибутов. В любом случае, " +"соответствующие схемы должны быть загружены в [.filename]#slapd.conf#." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:275 +msgid "" +"For this example we will use the `person` object class. If you are using " +"`inetOrgPerson`, the steps are basically identical, except that the `sn` " +"attribute is required." +msgstr "" +"Для этого примера мы будем использовать класс объекта `person`. Если вы " +"используете `inetOrgPerson`, шаги практически идентичны, за исключением " +"того, что атрибут `sn` является обязательным." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:277 +msgid "To add a test-user named `tuser`, the ldif would be:" +msgstr "" +"Чтобы добавить тестового пользователя с именем `tuser`, ldif-файл должен " +"выглядеть так:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:291 +#, no-wrap +msgid "" +"dn: uid=tuser,ou=people,dc=example,dc=org\n" +"objectClass: person\n" +"objectClass: posixAccount\n" +"objectClass: shadowAccount\n" +"objectClass: top\n" +"uidNumber: 10000\n" +"gidNumber: 10000\n" +"homeDirectory: /home/tuser\n" +"loginShell: /bin/csh\n" +"uid: tuser\n" +"cn: tuser\n" +msgstr "" +"dn: uid=tuser,ou=people,dc=example,dc=org\n" +"objectClass: person\n" +"objectClass: posixAccount\n" +"objectClass: shadowAccount\n" +"objectClass: top\n" +"uidNumber: 10000\n" +"gidNumber: 10000\n" +"homeDirectory: /home/tuser\n" +"loginShell: /bin/csh\n" +"uid: tuser\n" +"cn: tuser\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:294 +msgid "" +"I start my LDAP users' UIDs at 10000 to avoid collisions with system " +"accounts; you can configure whatever number you wish here, as long as it is " +"less than 65536." +msgstr "" +"Я начинаю UID пользователей LDAP с 10000, чтобы избежать конфликтов с " +"системными учётными записями; вы можете настроить любое число здесь, при " +"условии что оно меньше 65536." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:297 +msgid "" +"We also need group entries. They are as configurable as user entries, but " +"we will use the defaults below:" +msgstr "" +"Также необходимы записи групп. Они настраиваются так же, как записи " +"пользователей, но мы будем использовать стандартные значения, приведённые " +"ниже:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:304 +#, no-wrap +msgid "" +"dn: ou=groups,dc=example,dc=org\n" +"objectClass: top\n" +"objectClass: organizationalUnit\n" +"ou: groups\n" +msgstr "" +"dn: ou=groups,dc=example,dc=org\n" +"objectClass: top\n" +"objectClass: organizationalUnit\n" +"ou: groups\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:310 +#, no-wrap +msgid "" +"dn: cn=tuser,ou=groups,dc=example,dc=org\n" +"objectClass: posixGroup\n" +"objectClass: top\n" +"gidNumber: 10000\n" +"cn: tuser\n" +msgstr "" +"dn: cn=tuser,ou=groups,dc=example,dc=org\n" +"objectClass: posixGroup\n" +"objectClass: top\n" +"gidNumber: 10000\n" +"cn: tuser\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:314 +msgid "" +"To enter these into your database, you can use `slapadd` or `ldapadd` on a " +"file containing these entries. Alternatively, you can use package:sysutils/" +"ldapvi[]." +msgstr "" +"Чтобы добавить их в вашу базу данных, вы можете использовать `slapadd` или " +"`ldapadd` для файла, содержащего эти записи. Альтернативно, вы можете " +"использовать package:sysutils/ldapvi[]." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:317 +msgid "" +"The `ldapsearch` utility on the client machine should now return these " +"entries. If it does, your database is properly configured to be used as an " +"LDAP authentication server." +msgstr "" +"Утилита `ldapsearch` на клиентской машине теперь должна возвращать эти " +"записи. Если это так, ваша база данных правильно настроена для использования " +"в качестве сервера аутентификации LDAP." + +#. type: Title == +#: documentation/content/en/articles/ldap-auth/_index.adoc:319 +#, no-wrap +msgid "Client Configuration" +msgstr "Конфигурация клиента" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:323 +msgid "" +"The client should already have OpenLDAP libraries from crossref:ldap-" +"auth[ldap-connect-client,Configuring the Client], but if you are installing " +"several client machines you will need to install package:net/openldap26-" +"client[] on each of them." +msgstr "" +"Клиент уже должен иметь библиотеки OpenLDAP из crossref:ldap-auth[ldap-" +"connect-client,Настройка клиента], но если вы устанавливаете несколько " +"клиентских машин, вам потребуется установить package:net/openldap26-client[] " +"на каждой из них." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:325 +msgid "" +"FreeBSD requires two ports to be installed to authenticate against an LDAP " +"server, package:security/pam_ldap[] and package:net/nss_ldap[]." +msgstr "" +"Для аутентификации на сервере LDAP в FreeBSD необходимо установить два " +"порта: package:security/pam_ldap[] и package:net/nss_ldap[]." + +#. type: Title === +#: documentation/content/en/articles/ldap-auth/_index.adoc:327 +#, no-wrap +msgid "Authentication" +msgstr "Аутентификация" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:330 +msgid "" +"package:security/pam_ldap[] is configured via [.filename]#/usr/local/etc/" +"ldap.conf#." +msgstr "" +"package:security/pam_ldap[] настраивается через [.filename]#/usr/local/etc/" +"ldap.conf#." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:335 +msgid "" +"This is a _different file_ than the OpenLDAP library functions' " +"configuration file, [.filename]#/usr/local/etc/openldap/ldap.conf#; however, " +"it takes many of the same options; in fact it is a superset of that file. " +"For the rest of this section, references to [.filename]#ldap.conf# will mean " +"[.filename]#/usr/local/etc/ldap.conf#." +msgstr "" +"Это _другой файл_, отличный от файла конфигурации библиотечных функций " +"OpenLDAP, [.filename]#/usr/local/etc/openldap/ldap.conf#; однако он " +"принимает многие из тех же параметров; фактически он является надмножеством " +"этого файла. В оставшейся части этого раздела ссылки на " +"[.filename]#ldap.conf# будут означать [.filename]#/usr/local/etc/ldap.conf#." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:339 +msgid "" +"Thus, we will want to copy all of our original configuration parameters from " +"[.filename]#openldap/ldap.conf# to the new [.filename]#ldap.conf#. Once " +"this is done, we want to tell package:security/pam_ldap[] what to look for " +"on the directory server." +msgstr "" +"Таким образом, мы захотим скопировать все исходные параметры конфигурации из " +"[.filename]#openldap/ldap.conf# в новый [.filename]#ldap.conf#. После этого " +"нам нужно указать package:security/pam_ldap[], что искать на сервере " +"каталогов." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:342 +msgid "" +"We are identifying our users with the `uid` attribute. To configure this " +"(though it is the default), set the `pam_login_attribute` directive in " +"[.filename]#ldap.conf#:" +msgstr "" +"Мы идентифицируем наших пользователей с помощью атрибута `uid`. Чтобы " +"настроить это (хотя это значение по умолчанию), укажите директиву " +"`pam_login_attribute` в [.filename]#ldap.conf#:" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:344 +#, no-wrap +msgid "Setting `pam_login_attribute`" +msgstr "Установка `pam_login_attribute`" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:351 +#, no-wrap +msgid "pam_login_attribute uid\n" +msgstr "pam_login_attribute uid\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:359 +msgid "" +"With this set, package:security/pam_ldap[] will search the entire LDAP " +"directory under `base` for the value `uid=_username_`. If it finds one and " +"only one entry, it will attempt to bind as that user with the password it " +"was given. If it binds correctly, then it will allow access. Otherwise it " +"will fail." +msgstr "" +"С таким набором, package:security/pam_ldap[] будет искать во всей LDAP-" +"директории под `base` значение `uid=_имя_пользователя_`. Если оно найдёт " +"одну и только одну запись, будет предпринята попытка привязаться к этой " +"записи с использованием предоставленного пароля. Если привязка произойдёт " +"успешно, доступ будет разрешён. В противном случае доступ будет запрещён." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:365 +msgid "" +"Users whose shell is not in [.filename]#/etc/shells# will not be able to log " +"in. This is particularly important when Bash is set as the user shell on " +"the LDAP server. Bash is not included with a default installation of " +"FreeBSD. When installed from a package or port, it is located at " +"[.filename]#/usr/local/bin/bash#. Verify that the path to the shell on the " +"server is set correctly:" +msgstr "" +"Пользователи, чья оболочка не указана в [.filename]#/etc/shells#, не смогут " +"войти в систему. Это особенно важно, когда Bash установлен как оболочка " +"пользователя на сервере LDAP. Bash не входит в стандартную установку " +"FreeBSD. При установке из пакета или порта, он располагается в [.filename]#/" +"usr/local/bin/bash#. Убедитесь, что путь к оболочке на сервере указан " +"правильно:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:369 +#, no-wrap +msgid "% getent passwd username\n" +msgstr "% getent passwd username\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:374 +msgid "" +"There are two choices when the output shows `/bin/bash` in the last column. " +"The first is to change the user's entry on the LDAP server to [.filename]#/" +"usr/local/bin/bash#. The second option is to create a symlink on the LDAP " +"client computer so Bash is found at the correct location:" +msgstr "" +"Если в последнем столбце вывода указан `/bin/bash`, есть два варианта " +"действий. Первый — изменить запись пользователя на сервере LDAP на " +"[.filename]#/usr/local/bin/bash#. Второй вариант — создать символическую " +"ссылку на клиентском компьютере LDAP, чтобы Bash находился в правильном " +"месте:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:378 +#, no-wrap +msgid "# ln -s /usr/local/bin/bash /bin/bash\n" +msgstr "# ln -s /usr/local/bin/bash /bin/bash\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:382 +msgid "" +"Make sure that [.filename]#/etc/shells# contains entries for both `/usr/" +"local/bin/bash` and `/bin/bash`. The user will then be able to log in to " +"the system with Bash as their shell." +msgstr "" +"Убедитесь, что файл [.filename]#/etc/shells# содержит записи для `/usr/local/" +"bin/bash` и `/bin/bash`. После этого пользователь сможет входить в систему с " +"Bash в качестве оболочки." + +#. type: Title ==== +#: documentation/content/en/articles/ldap-auth/_index.adoc:384 +#, no-wrap +msgid "PAM" +msgstr "PAM" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:388 +msgid "" +"PAM, which stands for \"Pluggable Authentication Modules\", is the method by " +"which FreeBSD authenticates most of its sessions. To tell FreeBSD we wish " +"to use an LDAP server, we will have to add a line to the appropriate PAM " +"file." +msgstr "" +"PAM, что означает \"Pluggable Authentication Modules\" (подключаемые модули " +"аутентификации), является методом, с помощью которого FreeBSD " +"аутентифицирует большинство своих сеансов. Чтобы указать FreeBSD, что мы " +"хотим использовать LDAP-сервер, нам необходимо добавить строку в " +"соответствующий файл PAM." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:390 +msgid "" +"Most of the time the appropriate PAM file is [.filename]#/etc/pam.d/sshd#, " +"if you want to use SSH (remember to set the relevant options in [.filename]#/" +"etc/ssh/sshd_config#, otherwise SSH will not use PAM)." +msgstr "" +"В большинстве случаев подходящий файл PAM — это [.filename]#/etc/pam.d/" +"sshd#, если вы хотите использовать SSH (не забудьте установить " +"соответствующие параметры в [.filename]#/etc/ssh/sshd_config#, иначе SSH не " +"будет использовать PAM)." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:392 +msgid "To use PAM for authentication, add the line" +msgstr "Чтобы использовать PAM для аутентификации, добавьте строку" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:396 +#, no-wrap +msgid "auth sufficient /usr/local/lib/pam_ldap.so no_warn\n" +msgstr "auth sufficient /usr/local/lib/pam_ldap.so no_warn\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:399 +msgid "" +"Exactly where this line shows up in the file and which options appear in the " +"fourth column determine the exact behavior of the authentication mechanism; " +"see man:pam[d]" +msgstr "" +"Строгое место, где эта строка появляется в файле, и какие опции указаны в " +"четвертом столбце, определяют точное поведение механизма аутентификации; см. " +"man:pam[d]" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:402 +msgid "" +"With this configuration you should be able to authenticate a user against an " +"LDAP directory. PAM will perform a bind with your credentials, and if " +"successful will tell SSH to allow access." +msgstr "" +"С такой конфигурацией вы сможете аутентифицировать пользователя в LDAP-" +"каталоге. PAM выполнит привязку с вашими учетными данными, и в случае успеха " +"сообщит SSH разрешить доступ." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:406 +msgid "" +"However it is not a good idea to allow _every_ user in the directory into " +"_every_ client machine. With the current configuration, all that a user " +"needs to log into a machine is an LDAP entry. Fortunately there are a few " +"ways to restrict user access." +msgstr "" +"Однако разрешать _каждому_ пользователю в каталоге доступ к _каждой_ " +"клиентской машине — не лучшая идея. При текущей конфигурации пользователю " +"для входа на машину достаточно наличия записи в LDAP. К счастью, есть " +"несколько способов ограничить доступ пользователей." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:409 +msgid "" +"[.filename]#ldap.conf# supports a `pam_groupdn` directive; every account " +"that connects to this machine needs to be a member of the group specified " +"here. For example, if you have" +msgstr "" +"[.filename]#ldap.conf# поддерживает директиву `pam_groupdn`; каждая учётная " +"запись, подключающаяся к этой машине, должна быть членом группы, указанной " +"здесь. Например, если у вас есть" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:413 +#, no-wrap +msgid "pam_groupdn cn=servername,ou=accessgroups,dc=example,dc=org\n" +msgstr "pam_groupdn cn=servername,ou=accessgroups,dc=example,dc=org\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:417 +msgid "" +"in [.filename]#ldap.conf#, then only members of that group will be able to " +"log in. There are a few things to bear in mind, however." +msgstr "" +"в [.filename]#ldap.conf#, тогда только члены этой группы смогут войти в " +"систему. Однако есть несколько моментов, которые следует учитывать." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:420 +msgid "" +"Members of this group are specified in one or more `memberUid` attributes, " +"and each attribute must have the full distinguished name of the member. So " +"`memberUid: someuser` will not work; it must be:" +msgstr "" +"Участники этой группы указываются в одном или нескольких атрибутах " +"`memberUid`, и каждый атрибут должен содержать полное отличающееся имя " +"участника. Таким образом, `memberUid: someuser` не сработает; необходимо " +"указать:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:424 +#, no-wrap +msgid "memberUid: uid=someuser,ou=people,dc=example,dc=org\n" +msgstr "memberUid: uid=someuser,ou=people,dc=example,dc=org\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:430 +msgid "" +"Additionally, this directive is not checked in PAM during authentication, it " +"is checked during account management, so you will need a second line in your " +"PAM files under `account`. This will require, in turn, _every_ user to be " +"listed in the group, which is not necessarily what we want. To avoid " +"blocking users that are not in LDAP, you should enable the " +"`ignore_unknown_user` attribute. Finally, you should set the " +"`ignore_authinfo_unavail` option so that you are not locked out of every " +"computer when the LDAP server is unavailable." +msgstr "" +"Кроме того, эта директива не проверяется в PAM во время аутентификации, она " +"проверяется во время управления учётными записями, поэтому вам понадобится " +"вторая строка в ваших PAM-файлах в разделе `account`. Это, в свою очередь, " +"потребует, чтобы _каждый_ пользователь был указан в группе, что не " +"обязательно соответствует нашим желаниям. Чтобы избежать блокировки " +"пользователей, не находящихся в LDAP, следует включить атрибут " +"`ignore_unknown_user`. Наконец, следует установить опцию " +"`ignore_authinfo_unavail`, чтобы не оказаться заблокированным на каждом " +"компьютере при недоступности LDAP-сервера." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:432 +msgid "Your [.filename]#pam.d/sshd# might then end up looking like this:" +msgstr "Ваш файл [.filename]#pam.d/sshd# может в итоге выглядеть так:" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:434 +#, no-wrap +msgid "Sample [.filename]#pam.d/sshd#" +msgstr "Пример [.filename]#pam.d/sshd#" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:445 +#, no-wrap +msgid "" +"auth required pam_nologin.so no_warn\n" +"auth sufficient pam_opie.so no_warn no_fake_prompts\n" +"auth requisite pam_opieaccess.so no_warn allow_local\n" +"auth sufficient /usr/local/lib/pam_ldap.so no_warn\n" +"auth required pam_unix.so no_warn try_first_pass\n" +msgstr "" +"auth required pam_nologin.so no_warn\n" +"auth sufficient pam_opie.so no_warn no_fake_prompts\n" +"auth requisite pam_opieaccess.so no_warn allow_local\n" +"auth sufficient /usr/local/lib/pam_ldap.so no_warn\n" +"auth required pam_unix.so no_warn try_first_pass\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:448 +#, no-wrap +msgid "" +"account required pam_login_access.so\n" +"account required /usr/local/lib/pam_ldap.so no_warn ignore_authinfo_unavail ignore_unknown_user\n" +msgstr "" +"account required pam_login_access.so\n" +"account required /usr/local/lib/pam_ldap.so no_warn ignore_authinfo_unavail ignore_unknown_user\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:457 +msgid "" +"Since we are adding these lines specifically to [.filename]#pam.d/sshd#, " +"this will only have an effect on SSH sessions. LDAP users will be unable to " +"log in at the console. To change this behavior, examine the other files in " +"[.filename]#/etc/pam.d# and modify them accordingly." +msgstr "" +"Поскольку мы добавляем эти строки конкретно в [.filename]#pam.d/sshd#, это " +"повлияет только на SSH-сеансы. Пользователи LDAP не смогут войти через " +"консоль. Чтобы изменить это поведение, изучите остальные файлы в " +"[.filename]#/etc/pam.d# и измените их соответствующим образом." + +#. type: Title === +#: documentation/content/en/articles/ldap-auth/_index.adoc:460 +#, no-wrap +msgid "Name Service Switch" +msgstr "Name Service Switch" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:464 +msgid "" +"NSS is the service that maps attributes to names. So, for example, if a " +"file is owned by user `1001`, an application will query NSS for the name of " +"`1001`, and it might get `bob` or `ted` or whatever the user's name is." +msgstr "" +"NSS — это служба, которая сопоставляет атрибуты с именами. Например, если " +"файл принадлежит пользователю `1001`, приложение запросит у NSS имя для " +"`1001` и может получить `bob`, `ted` или любое другое имя пользователя." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:466 +msgid "" +"Now that our user information is kept in LDAP, we need to tell NSS to look " +"there when queried." +msgstr "" +"Теперь, когда информация о пользователях хранится в LDAP, необходимо указать " +"NSS обращаться туда при запросах." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:471 +msgid "" +"The package:net/nss_ldap[] port does this. It uses the same configuration " +"file as package:security/pam_ldap[], and should not need any extra " +"parameters once it is installed. Instead, what is left is simply to edit " +"[.filename]#/etc/nsswitch.conf# to take advantage of the directory. Simply " +"replace the following lines:" +msgstr "" +"Порт package:net/nss_ldap[] выполняет это. Он использует тот же " +"конфигурационный файл, что и package:security/pam_ldap[], и после установки " +"не должен требовать дополнительных параметров. Вместо этого остаётся просто " +"отредактировать [.filename]#/etc/nsswitch.conf#, чтобы воспользоваться " +"преимуществами каталога. Просто замените следующие строки:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:476 +#, no-wrap +msgid "" +"group: compat\n" +"passwd: compat\n" +msgstr "" +"group: compat\n" +"passwd: compat\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:479 +msgid "with" +msgstr "строкой" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:484 +#, no-wrap +msgid "" +"group: files ldap\n" +"passwd: files ldap\n" +msgstr "" +"group: files ldap\n" +"passwd: files ldap\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:487 +msgid "This will allow you to map usernames to UIDs and UIDs to usernames." +msgstr "" +"Это позволит сопоставлять имена пользователей с UID и UID с именами " +"пользователей." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:489 +msgid "Congratulations! You should now have working LDAP authentication." +msgstr "Поздравляем! Теперь у вас должна работать аутентификация через LDAP." + +#. type: Title === +#: documentation/content/en/articles/ldap-auth/_index.adoc:491 +#, no-wrap +msgid "Caveats" +msgstr "Предостережения" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:498 +msgid "" +"Unfortunately, as of the time this was written FreeBSD did not support " +"changing user passwords with man:passwd[1]. As a result of this, most " +"administrators are left to implement a solution themselves. I provide some " +"examples here. Note that if you write your own password change script, " +"there are some security issues you should be made aware of; see " +"crossref:ldap-auth[security-passwd, Password Storage]" +msgstr "" +"К сожалению, на момент написания этой документации FreeBSD не поддерживал " +"изменение паролей пользователей с помощью man:passwd[1]. В результате " +"большинству администраторов приходится самостоятельно реализовывать решение. " +"Здесь я привожу несколько примеров. Обратите внимание, что если вы пишете " +"собственный скрипт для смены пароля, вам следует учитывать некоторые " +"проблемы безопасности; см. crossref:ldap-auth[security-passwd, Хранение " +"паролей]" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:500 +#, no-wrap +msgid "Shell Script for Changing Passwords" +msgstr "Скрипт оболочки для изменения паролей" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:507 +#, no-wrap +msgid "#!/bin/sh\n" +msgstr "#!/bin/sh\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:513 +#, no-wrap +msgid "" +"stty -echo\n" +"read -p \"Old Password: \" oldp; echo\n" +"read -p \"New Password: \" np1; echo\n" +"read -p \"Retype New Password: \" np2; echo\n" +"stty echo\n" +msgstr "" +"stty -echo\n" +"read -p \"Old Password: \" oldp; echo\n" +"read -p \"New Password: \" np1; echo\n" +"read -p \"Retype New Password: \" np2; echo\n" +"stty echo\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:518 +#, no-wrap +msgid "" +"if [ \"$np1\" != \"$np2\" ]; then\n" +" echo \"Passwords do not match.\"\n" +" exit 1\n" +"fi\n" +msgstr "" +"if [ \"$np1\" != \"$np2\" ]; then\n" +" echo \"Passwords do not match.\"\n" +" exit 1\n" +"fi\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:523 +#, no-wrap +msgid "" +"ldappasswd -D uid=\"$USER\",ou=people,dc=example,dc=org \\\n" +" -w \"$oldp\" \\\n" +" -a \"$oldp\" \\\n" +" -s \"$np1\"\n" +msgstr "" +"ldappasswd -D uid=\"$USER\",ou=people,dc=example,dc=org \\\n" +" -w \"$oldp\" \\\n" +" -a \"$oldp\" \\\n" +" -s \"$np1\"\n" + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:532 +msgid "" +"This script does hardly any error checking, but more important it is very " +"cavalier about how it stores your passwords. If you do anything like this, " +"at least adjust the `security.bsd.see_other_uids` sysctl value:" +msgstr "" +"Этот скрипт почти не проверяет ошибки, что более важно, он очень беспечен в " +"том, как хранит ваши пароли. Если вы делаете что-то подобное, по крайней " +"мере измените значение sysctl `security.bsd.see_other_uids`:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:536 +#, no-wrap +msgid "# sysctl security.bsd.see_other_uids=0\n" +msgstr "# sysctl security.bsd.see_other_uids=0\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:543 +msgid "" +"A more flexible (and probably more secure) approach can be used by writing a " +"custom program, or even a web interface. The following is part of a Ruby " +"library that can change LDAP passwords. It sees use both on the command " +"line, and on the web." +msgstr "" +"Более гибкий (и, вероятно, более безопасный) подход может быть реализован " +"путем написания собственной программы или даже веб-интерфейса. Ниже " +"приведена часть библиотеки на Ruby, которая позволяет изменять пароли в " +"LDAP. Она используется как в командной строке, так и в вебе." + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:545 +#, no-wrap +msgid "Ruby Script for Changing Passwords" +msgstr "Ruby-скрипт для изменения паролей" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:555 +#, no-wrap +msgid "" +"require 'ldap'\n" +"require 'base64'\n" +"require 'digest'\n" +"require 'password' # ruby-password\n" +msgstr "" +"require 'ldap'\n" +"require 'base64'\n" +"require 'digest'\n" +"require 'password' # ruby-password\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:558 +#, no-wrap +msgid "" +"ldap_server = \"ldap.example.org\"\n" +"luser = \"uid=#{ENV['USER']},ou=people,dc=example,dc=org\"\n" +msgstr "" +"ldap_server = \"ldap.example.org\"\n" +"luser = \"uid=#{ENV['USER']},ou=people,dc=example,dc=org\"\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:563 +#, no-wrap +msgid "" +"# get the new password, check it, and create a salted hash from it\n" +"def get_password\n" +" pwd1 = Password.get(\"New Password: \")\n" +" pwd2 = Password.get(\"Retype New Password: \")\n" +msgstr "" +"# get the new password, check it, and create a salted hash from it\n" +"def get_password\n" +" pwd1 = Password.get(\"New Password: \")\n" +" pwd2 = Password.get(\"Retype New Password: \")\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:566 +#, no-wrap +msgid "" +" raise if pwd1 != pwd2\n" +" pwd1.check # check password strength\n" +msgstr "" +" raise if pwd1 != pwd2\n" +" pwd1.check # check password strength\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:572 +#, no-wrap +msgid "" +" salt = rand.to_s.gsub(/0\\./, '')\n" +" pass = pwd1.to_s\n" +" hash = \"{SSHA}\"+Base64.encode64(Digest::SHA1.digest(\"#{pass}#{salt}\")+salt).chomp!\n" +" return hash\n" +"end\n" +msgstr "" +" salt = rand.to_s.gsub(/0\\./, '')\n" +" pass = pwd1.to_s\n" +" hash = \"{SSHA}\"+Base64.encode64(Digest::SHA1.digest(\"#{pass}#{salt}\")+salt).chomp!\n" +" return hash\n" +"end\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:575 +#, no-wrap +msgid "" +"oldp = Password.get(\"Old Password: \")\n" +"newp = get_password\n" +msgstr "" +"oldp = Password.get(\"Old Password: \")\n" +"newp = get_password\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:578 +#, no-wrap +msgid "" +"# We'll just replace it. That we can bind proves that we either know\n" +"# the old password or are an admin.\n" +msgstr "" +"# We'll just replace it. That we can bind proves that we either know\n" +"# the old password or are an admin.\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:582 +#, no-wrap +msgid "" +"replace = LDAP::Mod.new(LDAP::LDAP_MOD_REPLACE | LDAP::LDAP_MOD_BVALUES,\n" +" \"userPassword\",\n" +" [newp])\n" +msgstr "" +"replace = LDAP::Mod.new(LDAP::LDAP_MOD_REPLACE | LDAP::LDAP_MOD_BVALUES,\n" +" \"userPassword\",\n" +" [newp])\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:587 +#, no-wrap +msgid "" +"conn = LDAP::SSLConn.new(ldap_server, 389, true)\n" +"conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)\n" +"conn.bind(luser, oldp)\n" +"conn.modify(luser, [replace])\n" +msgstr "" +"conn = LDAP::SSLConn.new(ldap_server, 389, true)\n" +"conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)\n" +"conn.bind(luser, oldp)\n" +"conn.modify(luser, [replace])\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:592 +msgid "" +"Although not guaranteed to be free of security holes (the password is kept " +"in memory, for example) this is cleaner and more flexible than a simple `sh` " +"script." +msgstr "" +"Хотя это не гарантирует отсутствия уязвимостей (например, пароль хранится в " +"памяти), данный подход чище и гибче, чем простой скрипт на `sh`." + +#. type: Title == +#: documentation/content/en/articles/ldap-auth/_index.adoc:594 +#, no-wrap +msgid "Security Considerations" +msgstr "Безопасность" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:597 +msgid "" +"Now that your machines (and possibly other services) are authenticating " +"against your LDAP server, this server needs to be protected at least as well " +"as [.filename]#/etc/master.passwd# would be on a regular server, and " +"possibly even more so since a broken or cracked LDAP server would break " +"every client service." +msgstr "" +"Теперь, когда ваши машины (и, возможно, другие службы) проходят " +"аутентификацию через ваш LDAP-сервер, этот сервер необходимо защитить как " +"минимум так же, как [.filename]#/etc/master.passwd# на обычном сервере, а " +"возможно, и лучше, поскольку сломанный или взломанный LDAP-сервер нарушит " +"работу всех клиентских служб." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:600 +msgid "" +"Remember, this section is not exhaustive. You should continually review " +"your configuration and procedures for improvements." +msgstr "" +"Помните, что этот раздел не является исчерпывающим. Вам следует постоянно " +"пересматривать свою конфигурацию и процедуры для улучшений." + +#. type: Title === +#: documentation/content/en/articles/ldap-auth/_index.adoc:602 +#, no-wrap +msgid "Setting Attributes Read-only" +msgstr "Установка атрибутов только для чтения" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:606 +msgid "" +"Several attributes in LDAP should be read-only. If left writable by the " +"user, for example, a user could change his `uidNumber` attribute to `0` and " +"get `root` access!" +msgstr "" +"Некоторые атрибуты в LDAP должны быть доступны только для чтения. Если " +"оставить их доступными для записи пользователем, например, пользователь " +"может изменить свой атрибут `uidNumber` на `0` и получить доступ `root`!" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:610 +msgid "" +"To begin with, the `userPassword` attribute should not be world-readable. " +"By default, anyone who can connect to the LDAP server can read this " +"attribute. To disable this, put the following in [.filename]#slapd.conf#:" +msgstr "" +"Для начала атрибут `userPassword` не должен быть доступен для чтения всем. " +"По умолчанию любой, кто может подключиться к LDAP-серверу, может читать этот " +"атрибут. Чтобы отключить это, добавьте следующее в [.filename]#slapd.conf#:" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:612 +#, no-wrap +msgid "Hide Passwords" +msgstr "Скрыть пароли" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:623 +#: documentation/content/en/articles/ldap-auth/_index.adoc:649 +#, no-wrap +msgid "" +"access to dn.subtree=\"ou=people,dc=example,dc=org\"\n" +" attrs=userPassword\n" +" by self write\n" +" by anonymous auth\n" +" by * none\n" +msgstr "" +"access to dn.subtree=\"ou=people,dc=example,dc=org\"\n" +" attrs=userPassword\n" +" by self write\n" +" by anonymous auth\n" +" by * none\n" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:627 +#: documentation/content/en/articles/ldap-auth/_index.adoc:656 +#, no-wrap +msgid "" +"access to *\n" +" by self write\n" +" by * read\n" +msgstr "" +"access to *\n" +" by self write\n" +" by * read\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:632 +msgid "" +"This will disallow reading of the `userPassword` attribute, while still " +"allowing users to change their own passwords." +msgstr "" +"Это запретит чтение атрибута `userPassword`, но позволит пользователям " +"изменять свои собственные пароли." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:636 +msgid "" +"Additionally, you'll want to keep users from changing some of their own " +"attributes. By default, users can change any attribute (except for those " +"which the LDAP schemas themselves deny changes), such as `uidNumber`. To " +"close this hole, modify the above to" +msgstr "" +"Кроме того, следует запретить пользователям изменять некоторые из своих " +"атрибутов. По умолчанию пользователи могут изменять любые атрибуты (за " +"исключением тех, которые сами схемы LDAP запрещают изменять), такие как " +"`uidNumber`. Чтобы устранить эту уязвимость, измените приведённое выше на" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:638 +#, no-wrap +msgid "Read-only Attributes" +msgstr "Атрибуты только для чтения" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:652 +#, no-wrap +msgid "" +"access to attrs=homeDirectory,uidNumber,gidNumber\n" +" by * read\n" +msgstr "" +"access to attrs=homeDirectory,uidNumber,gidNumber\n" +" by * read\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:661 +msgid "This will stop users from being able to masquerade as other users." +msgstr "" +"Это предотвратит возможность пользователей маскироваться под других " +"пользователей." + +#. type: Title === +#: documentation/content/en/articles/ldap-auth/_index.adoc:663 +#, no-wrap +msgid "`root` Account Definition" +msgstr "Определение учетной записи `root`" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:668 +msgid "" +"Often the `root` or manager account for the LDAP service will be defined in " +"the configuration file. OpenLDAP supports this, for example, and it works, " +"but it can lead to trouble if [.filename]#slapd.conf# is compromised. It " +"may be better to use this only to bootstrap yourself into LDAP, and then " +"define a `root` account there." +msgstr "" +"Часто учетная запись `root` или администратора для службы LDAP будет " +"определена в файле конфигурации. Например, OpenLDAP поддерживает это, и это " +"работает, но может привести к проблемам, если файл [.filename]#slapd.conf# " +"будет скомпрометирован. Возможно, лучше использовать это только для " +"первоначальной настройки доступа к LDAP, а затем определить учетную запись " +"`root` там." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:672 +msgid "" +"Even better is to define accounts that have limited permissions, and omit a " +"`root` account entirely. For example, users that can add or remove user " +"accounts are added to one group, but they cannot themselves change the " +"membership of this group. Such a security policy would help mitigate the " +"effects of a leaked password." +msgstr "" +"Еще лучше определить учетные записи с ограниченными правами и полностью " +"исключить учетную запись `root`. Например, пользователи, которые могут " +"добавлять или удалять учетные записи, добавляются в одну группу, но сами не " +"могут изменять состав этой группы. Такая политика безопасности поможет " +"снизить последствия утечки пароля." + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:674 +#: documentation/content/en/articles/ldap-auth/_index.adoc:680 +#, no-wrap +msgid "Creating a Management Group" +msgstr "Создание группы управления" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:678 +msgid "" +"Say you want your IT department to be able to change home directories for " +"users, but you do not want all of them to be able to add or remove users. " +"The way to do this is to add a group for these admins:" +msgstr "" +"Предположим, вы хотите, чтобы ваш IT-отдел мог изменять домашние каталоги " +"пользователей, но не хотите, чтобы все они могли добавлять или удалять " +"пользователей. Способ сделать это — добавить группу для этих администраторов:" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:693 +#, no-wrap +msgid "" +"dn: cn=homemanagement,dc=example,dc=org\n" +"objectClass: top\n" +"objectClass: posixGroup\n" +"cn: homemanagement\n" +"gidNumber: 121 # required for posixGroup\n" +"memberUid: uid=tuser,ou=people,dc=example,dc=org\n" +"memberUid: uid=user2,ou=people,dc=example,dc=org\n" +msgstr "" +"dn: cn=homemanagement,dc=example,dc=org\n" +"objectClass: top\n" +"objectClass: posixGroup\n" +"cn: homemanagement\n" +"gidNumber: 121 # required for posixGroup\n" +"memberUid: uid=tuser,ou=people,dc=example,dc=org\n" +"memberUid: uid=user2,ou=people,dc=example,dc=org\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:698 +msgid "And then change the permissions attributes in [.filename]#slapd.conf#:" +msgstr "И затем измените атрибуты прав в [.filename]#slapd.conf#:" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:700 +#, no-wrap +msgid "ACLs for a Home Directory Management Group" +msgstr "ACL для группы управления домашним каталогом" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:710 +#, no-wrap +msgid "" +"access to dn.subtree=\"ou=people,dc=example,dc=org\"\n" +" attr=homeDirectory\n" +" by dn=\"cn=homemanagement,dc=example,dc=org\"\n" +" dnattr=memberUid write\n" +msgstr "" +"access to dn.subtree=\"ou=people,dc=example,dc=org\"\n" +" attr=homeDirectory\n" +" by dn=\"cn=homemanagement,dc=example,dc=org\"\n" +" dnattr=memberUid write\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:715 +msgid "Now `tuser` and `user2` can change other users' home directories." +msgstr "" +"Теперь `tuser` и `user2` могут изменять домашние каталоги других " +"пользователей." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:719 +msgid "" +"In this example we have given a subset of administrative power to certain " +"users without giving them power in other domains. The idea is that soon no " +"single user account has the power of a `root` account, but every power root " +"had is had by at least one user. The `root` account then becomes " +"unnecessary and can be removed." +msgstr "" +"В этом примере мы предоставили подмножество административных полномочий " +"определённым пользователям, не давая им власти в других областях. Идея " +"заключается в том, чтобы вскоре ни одна учётная запись пользователя не " +"обладала полномочиями учётной записи `root`, но каждое полномочие, которое " +"имел root, было бы у хотя бы одного пользователя. Учётная запись `root` " +"тогда становится ненужной и может быть удалена." + +#. type: Title === +#: documentation/content/en/articles/ldap-auth/_index.adoc:721 +#, no-wrap +msgid "Password Storage" +msgstr "Хранение паролей" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:725 +msgid "" +"By default OpenLDAP will store the value of the `userPassword` attribute as " +"it stores any other data: in the clear. Most of the time it is base 64 " +"encoded, which provides enough protection to keep an honest administrator " +"from knowing your password, but little else." +msgstr "" +"По умолчанию OpenLDAP сохраняет значение атрибута `userPassword` так же, как " +"и любые другие данные: в открытом виде. В большинстве случаев оно кодируется " +"в base64, что обеспечивает достаточную защиту, чтобы честный администратор " +"не узнал ваш пароль, но не более того." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:728 +msgid "" +"It is a good idea, then, to store passwords in a more secure format, such as " +"SSHA (salted SHA). This is done by whatever program you use to change " +"users' passwords." +msgstr "" +"Хорошей идеей является хранение паролей в более безопасном формате, таком " +"как SSHA (солёный SHA). Это выполняется любой программой, которую вы " +"используете для изменения паролей пользователей." + +#. type: Title == +#: documentation/content/en/articles/ldap-auth/_index.adoc:733 +#, no-wrap +msgid "Useful Aids" +msgstr "Полезные инструменты" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:736 +msgid "" +"There are a few other programs that might be useful, particularly if you " +"have many users and do not want to configure everything manually." +msgstr "" +"Вот несколько других программ, которые могут быть полезны, особенно если у " +"вас много пользователей и вы не хотите настраивать всё вручную." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:739 +msgid "" +"package:security/pam_mkhomedir[] is a PAM module that always succeeds; its " +"purpose is to create home directories for users which do not have them. If " +"you have dozens of client servers and hundreds of users, it is much easier " +"to use this and set up skeleton directories than to prepare every home " +"directory." +msgstr "" +"package:security/pam_mkhomedir[] — это модуль PAM, который всегда " +"завершается успешно; его назначение — создавать домашние каталоги для " +"пользователей, у которых их нет. Если у вас есть десятки серверов-клиентов и " +"сотни пользователей, гораздо удобнее использовать этот модуль и настроить " +"скелетные каталоги, чем подготавливать каждый домашний каталог вручную." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:743 +msgid "" +"package:sysutils/ldapvi[] is a great utility for editing LDAP values in an " +"LDIF-like syntax. The directory (or subsection of the directory) is " +"presented in the editor chosen by the `EDITOR` environment variable. This " +"makes it easy to enable large-scale changes in the directory without having " +"to write a custom tool." +msgstr "" +"package:sysutils/ldapvi[] — это отличная утилита для редактирования значений " +"LDAP в синтаксисе, подобном LDIF. Каталог (или его подраздел) отображается в " +"редакторе, выбранном переменной окружения `EDITOR`. Это позволяет легко " +"вносить масштабные изменения в каталог без необходимости написания " +"собственного инструмента." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:746 +msgid "" +"package:security/openssh-portable[] has the ability to contact an LDAP " +"server to verify SSH keys. This is extremely nice if you have many servers " +"and do not want to copy your public keys across all of them." +msgstr "" +"package:security/openssh-portable[] обладает возможностью обращаться к " +"серверу LDAP для проверки SSH-ключей. Это очень удобно, если у вас много " +"серверов и вы не хотите копировать свои открытые ключи на все из них." + +#. type: Title == +#: documentation/content/en/articles/ldap-auth/_index.adoc:751 +#, no-wrap +msgid "OpenSSL Certificates for LDAP" +msgstr "Сертификаты OpenSSL для LDAP" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:755 +msgid "" +"If you are hosting two or more LDAP servers, you will probably not want to " +"use self-signed certificates, since each client will have to be configured " +"to work with each certificate. While this is possible, it is not nearly as " +"simple as creating your own certificate authority, and signing your servers' " +"certificates with that." +msgstr "" +"Если вы размещаете два или более LDAP-серверов, вам, вероятно, не захочется " +"использовать самоподписанные сертификаты, так как каждый клиент придется " +"настраивать для работы с каждым сертификатом. Хотя это возможно, это не так " +"просто, как создать собственный центр сертификации и подписать сертификаты " +"ваших серверов с его помощью." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:757 +msgid "" +"The steps here are presented as they are with very little attempt at " +"explaining what is going on-further explanation can be found in " +"man:openssl[1] and its friends." +msgstr "" +"Шаги здесь представлены как есть, без попыток объяснить происходящее — " +"дополнительные пояснения можно найти в man:openssl[1] и связанных справочных " +"страницах." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:760 +msgid "" +"To create a certificate authority, we simply need a self-signed certificate " +"and key. The steps for this again are" +msgstr "" +"Для создания центра сертификации нам просто нужны самоподписанный сертификат " +"и ключ. Шаги для этого следующие" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:762 +#, no-wrap +msgid "Creating a Certificate" +msgstr "Создание сертификата" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:771 +#, no-wrap +msgid "" +"% openssl genrsa -out root.key 1024\n" +"% openssl req -new -key root.key -out root.csr\n" +"% openssl x509 -req -days 1024 -in root.csr -signkey root.key -out root.crt\n" +msgstr "" +"% openssl genrsa -out root.key 1024\n" +"% openssl req -new -key root.key -out root.csr\n" +"% openssl x509 -req -days 1024 -in root.csr -signkey root.key -out root.crt\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:777 +msgid "" +"These will be your root CA key and certificate. You will probably want to " +"encrypt the key and store it in a cool, dry place; anyone with access to it " +"can masquerade as one of your LDAP servers." +msgstr "" +"Это будут корневой ключ и сертификат ЦС. Возможно, вы захотите зашифровать " +"ключ и хранить его в прохладном, сухом месте; любой, кто получит к нему " +"доступ, сможет выдавать себя за один из ваших LDAP-серверов." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:780 +msgid "" +"Next, using the first two steps above create a key [.filename]#ldap-server-" +"one.key# and certificate signing request [.filename]#ldap-server-one.csr#. " +"Once you sign the signing request with [.filename]#root.key#, you will be " +"able to use [.filename]#ldap-server-one.*# on your LDAP servers." +msgstr "" +"Затем, используя первые два шага, описанные выше, создайте ключ " +"[.filename]#ldap-server-one.key# и запрос на подпись сертификата " +"[.filename]#ldap-server-one.csr#. После подписания запроса с помощью " +"[.filename]#root.key# вы сможете использовать [.filename]#ldap-server-one.*# " +"на своих LDAP-серверах." + +#. type: Plain text +#: documentation/content/en/articles/ldap-auth/_index.adoc:784 +msgid "" +"Do not forget to use the fully qualified domain name for the \"common name\" " +"attribute when generating the certificate signing request; otherwise clients " +"will reject a connection with you, and it can be very tricky to diagnose." +msgstr "" +"Не забудьте использовать полное доменное имя для атрибута \"common name\" " +"при создании запроса на подпись сертификата; в противном случае клиенты " +"будут отклонять соединение с вами, и диагностика этой проблемы может быть " +"очень сложной." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:787 +msgid "To sign the key, use `-CA` and `-CAkey` instead of `-signkey`:" +msgstr "Для подписи ключа используйте `-CA` и `-CAkey` вместо `-signkey`:" + +#. type: Block title +#: documentation/content/en/articles/ldap-auth/_index.adoc:789 +#, no-wrap +msgid "Signing as a Certificate Authority" +msgstr "Подписывать как Центр Сертификации" + +#. type: delimited block . 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:798 +#, no-wrap +msgid "" +"% openssl x509 -req -days 1024 \\\n" +"-in ldap-server-one.csr -CA root.crt -CAkey root.key \\\n" +"-out ldap-server-one.crt\n" +msgstr "" +"% openssl x509 -req -days 1024 \\\n" +"-in ldap-server-one.csr -CA root.crt -CAkey root.key \\\n" +"-out ldap-server-one.crt\n" + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:803 +msgid "" +"The resulting file will be the certificate that you can use on your LDAP " +"servers." +msgstr "" +"Результирующий файл будет представлять собой сертификат, который можно " +"использовать на ваших LDAP-серверах." + +#. type: delimited block = 4 +#: documentation/content/en/articles/ldap-auth/_index.adoc:804 +msgid "" +"Finally, for clients to trust all your servers, distribute " +"[.filename]#root.crt# (the __certificate__, not the key!) to each client, " +"and specify it in the `TLSCACertificateFile` directive in " +"[.filename]#ldap.conf#." +msgstr "" +"Наконец, чтобы клиенты доверяли всем вашим серверам, распространите файл " +"[.filename]#root.crt# (__сертификат__, а не ключ!) на каждом клиенте и " +"укажите его в директиве `TLSCACertificateFile` в файле " +"[.filename]#ldap.conf#." |