aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/ru/articles/ldap-auth
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/content/ru/articles/ldap-auth')
-rw-r--r--documentation/content/ru/articles/ldap-auth/_index.adoc703
-rw-r--r--documentation/content/ru/articles/ldap-auth/_index.po1887
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#."