Xgu.ru теперь в Контакте  — приходите и подключайтесь.
Пока мы работаем над следующими видео, вы можете подключиться в Контакте. Познакомимся и обсудим новые страницы и ролики.

Vk-big.pngYoutube-big.jpeg

Ubuntu 12.04 OpenLDAP Samba3

Материал из Xgu.ru

Перейти к: навигация, поиск

Данная статья рассчитана на начинающих, она позволит «с нуля» настроить OpenLDAP и интегрировать с ним Samba 3. Является объединением знаний из статей Домен на Samba и OpenLDAP в Ubuntu 12.04 (с ошибками в статье, о которых автору написали в комментариях, но он их так и не исправил) и Samba and LDAP, в которой до сих пор не исправили ошибку.

Необходимо умение работы с терминалом, например по этой статье.

Команды в статье начинаются с символа «$» ­— его вводить не надо, это приветствие терминала, нужно чтобы в статье отличить вводимую команду от вывода.

Содержание

[править] editor

В статье везде для редактирования используется команда editor — она является ссылкой на ваш любимый консольный редактор. Поменять его можно командой:

$sudo update-alternatives --config editor

[править] Перед установкой

Обязательно обновляем информацию о пакетах в репозитории:

$sudo apt-get update

[править] Выбор FQDN

Необходимо, чтобы у сервера с OpenLDAP было FQDN — полностью определённое имя, т.е. в частном случае, имя сервера + имя домена. В качестве примера, здесь будет использован домен example.com и имя сервера dc1, то есть получается полное имя: dc1.example.com.

  • Не рекомендуется использовать .local, т.к. это имя зарезервировано, и могут возникнуть проблемы с некоторыми службами ([1]).
  • Если вы не знаете, какое выбрать имя домена, оставьте example.com.

Редактируем файл hosts:

$sudo editor /etc/hosts

Добавляем (или заменяем) строку:

127.0.1.1	dc1.example.com	dc1

Убедимся, что настройка применилась:

$hostname -f

должно выдать полное имя — в данном примере, dc1.example.com

[править] slapd

Установим OpenLDAP и утилиты для него:

$sudo apt-get install slapd ldap-utils

На запрос при установке, вводим новый пароль администратора. Далее в статье, заменяем «MYSECRETPASSWORD» на введённый здесь пароль.

Для проверки работоспособности OpenLDAP, добавим индексы (можно будет сделать позже вместе с Samba):

$editor uid_index.ldif

Заполняем следующими данными:

dn: olcDatabase={1}hdb,cn=config
add: olcDbIndex
olcDbIndex: uid eq,pres,sub

Вносим:

$sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f uid_index.ldif

Проверяем:

$sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(olcDatabase={1}hdb)' olcDbIndex
dn: olcDatabase={1}hdb,cn=config
olcDbIndex: objectClass eq
olcDbIndex: uid eq,pres,sub

[править] ACL

По-умолчанию, slapd в Ubuntu заполняется минимально необходимыми правилами. Проверим их:

$sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(olcDatabase={1}hdb)' olcAccess
dn: olcDatabase={1}hdb,cn=config
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=example,dc=com" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=example,dc=com" write by * read

[править] Samba

$sudo apt-get install samba samba-doc smbldap-tools
$sudo cp -p /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz /etc/ldap/schema
$sudo gzip -d /etc/ldap/schema/samba.schema.gz
$zcat /usr/share/doc/samba/examples/LDAP/samba.ldif.gz > samba.ldif

Вносим в LDAP:

$sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// -f samba.ldif
adding new entry "cn=samba,cn=schema,cn=config"

Проверяем:

$sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config 'cn=*samba*'

Создаём индексы, чтобы Samba быстрее забирала данные из LDAP:

$editor samba_indices.ldif

Записываем в файл:

dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uidNumber eq
olcDbIndex: gidNumber eq
olcDbIndex: loginShell eq
###olcDbIndex: uid eq,pres,sub
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: uniqueMember eq,pres
olcDbIndex: sambaSID eq
olcDbIndex: sambaPrimaryGroupSID eq
olcDbIndex: sambaGroupType eq
olcDbIndex: sambaSIDList eq
olcDbIndex: sambaDomainName eq
olcDbIndex: default sub

(строка закомментирована знаками «###», т.к. выше в статье уже добавлялись эти индексы)

$sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f samba_indices.ldif
modifying entry "olcDatabase={1}hdb,cn=config"

Проверяем, что индексы добавились:

$sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcDatabase={1}hdb olcDbIndex

[править] smbldap-tools

Смотрим уникальный номер созданного вами домена — SID (сохраняем его куда-нибудь в блокнот):

$net getlocalsid
SID for domain DC1 is: S-1-5-21-1267572584-417879462-430437081

Примеры конфигураций можно распаковать, можно просто скопировать прямо из статьи.

$sudo -s
#zcat /usr/share/doc/smbldap-tools/examples/smbldap.conf.gz > /etc/smbldap-tools/smbldap.conf
#cp -p /usr/share/doc/smbldap-tools/examples/smbldap_bind.conf /etc/smbldap-tools/smbldap_bind.conf
#exit
$sudo editor /etc/smbldap-tools/smbldap.conf

Приводим файл к такому виду (SID вводим тот, который запомнили ранее):

SID="S-1-5-21-1267572584-417879462-430437081"
sambaDomain="DC1"
masterLDAP="dc1.example.com"
masterPort="389"
ldapTLS="0"
ldapSSL="0"
verify="none"
cafile="/etc/smbldap-tools/ca.pem"
clientcert="/etc/smbldap-tools/smbldap-tools.example.com.pem"
clientkey="/etc/smbldap-tools/smbldap-tools.example.com.key"
suffix="dc=example,dc=com"
usersdn="ou=Users,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
scope="sub"
password_hash="SSHA"
password_crypt_salt_format="%s"
userLoginShell="/bin/bash"
userHome="/home/%U"
userHomeDirectoryMode="750"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
shadowAccount="1"
defaultMaxPasswordAge="45"
userSmbHome="\\DC1\%U"
userProfile="\\DC1\profiles\%U"
userHomeDrive="H:"
userScript="logon.bat"
mailDomain="example.com"
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"
$sudo editor /etc/smbldap-tools/smbldap_bind.conf

Добавляем в него пароль администратора домена:

masterDN="cn=admin,dc=example,dc=com"
masterPw="MYSECRETPASSWORD"

Исправляем ошибку «Use of qw(...) as parentheses is deprecated at /usr/share/perl5/smbldap_tools.pm line 1423, <DATA> line 522»:

$sudo editor /usr/share/perl5/smbldap_tools.pm

заменяем (строка 1423)

$sig_name qw(ALRM INT HUP QUIT TERM TSTP TTIN TTOU) {

на

$sig_name (qw(ALRM INT HUP QUIT TERM TSTP TTIN TTOU)) {

Можно сразу заполнить LDAP данными для Samba:

$sudo smbldap-populate -a admin

а можно создать ldif-файл, отредактировать и внести его. Параметр -a позволяет указать local administrator login name (default: root).

$sudo smbldap-populate -a admin -e samba.ldif

Можно отредактировать samba.ldif, чтобы задать uidNumber и gidNumber для пользователя admin, заодно завести такого же в linux (он нам понадобится позже для команды net rpc join -U admin):

$addgroup --gid 10000 admin
$adduser --uid 10000 --gid 10000 --gecos "Samba admin" admin
$sudo smbldap-populate -a admin -i samba.ldif
Populating LDAP directory for domain DC1 (S-1-5-21-1267572584-417879462-430437081)
entry dc=example,dc=com already exist. 
adding new entry: ou=Users,dc=example,dc=com
adding new entry: ou=Groups,dc=example,dc=com
adding new entry: ou=Computers,dc=example,dc=com
adding new entry: ou=Idmap,dc=example,dc=com
adding new entry: sambaDomainName=DC1,dc=example,dc=com
adding new entry: uid=admin,ou=Users,dc=example,dc=com
adding new entry: uid=nobody,ou=Users,dc=example,dc=com
adding new entry: cn=Domain Admins,ou=Groups,dc=example,dc=com
adding new entry: cn=Domain Users,ou=Groups,dc=example,dc=com
adding new entry: cn=Domain Guests,ou=Groups,dc=example,dc=com
adding new entry: cn=Domain Computers,ou=Groups,dc=example,dc=com
adding new entry: cn=Administrators,ou=Groups,dc=example,dc=com
adding new entry: cn=Account Operators,ou=Groups,dc=example,dc=com
adding new entry: cn=Print Operators,ou=Groups,dc=example,dc=com
adding new entry: cn=Backup Operators,ou=Groups,dc=example,dc=com
adding new entry: cn=Replicators,ou=Groups,dc=example,dc=com

Please provide a password for the domain admin: 
Changing UNIX and samba passwords for admin
New password: 
Retype new password: 

Настраиваем Samba:

$sudo mkdir /var/log/samba/workstations
$sudo editor /etc/samba/smb.conf

Заполняем конфигурацию:

[global]
server string =
workgroup = MAIN
netbios name = dc1
 
passdb backend = ldapsam:ldap://dc1.example.com
obey pam restrictions = no
security = user
encrypt passwords = yes
unix extensions = no
 
local master = yes
os level = 255
domain master = yes
preferred master = yes
time server = yes
admin users = admin
 
log level = 1
log file = /var/log/samba/workstations/%m.log
max log size = 50
 
getwd cache = yes
read raw = yes
write raw = yes
max xmit = 65536
wins support = yes
dns proxy = no
name resolve order = wins hosts bcast lmhosts
wide links = yes
hosts allow = 192.168. 127.0.0.1 127.0.1.1
 
ldap suffix = dc=example,dc=com
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap idmap suffix = ou=Idmap
ldap admin dn = cn=admin,dc=example,dc=com
ldap ssl = off
ldap passwd sync = yes
ldap delete dn = no
add machine script = sudo /usr/sbin/smbldap-useradd -t 0 -w "%u"
passwd program = /usr/sbin/smbldap-passwd %u
passwd chat = *New*password* %n\n *Retype*new*password* %n\n *all*authentication*tokens*updated*
 
domain logons = yes
load printers = no
logon script = startup.bat
logon path =
 
[netlogon]
path = /home/samba/netlogon
read only = yes
browseable = no

Исправляем ошибку «Failed to execute: /usr/sbin/smbldap-passwd.cmd: No such file or directory at /usr/sbin/smbldap-useradd line 668»:

$sudo ln -s /usr/sbin/smbldap-passwd /usr/sbin/smbldap-passwd.cmd

Применяем новую конфигурацию перезапуском процессов Samba:

$sudo restart smbd
$sudo restart nmbd

Отдаём samba пароль LDAP-администратора (rootDN)?

$sudo smbpasswd -w MYSECRETPASSWORD
Setting stored password for "cn=admin,dc=example,dc=com" in secrets.tdb

(TODO: лучше наверно так, чтобы не светить пароль: sudo smbpasswd admin — но не работает, выдаёт ldap_connect_system: Failed to retrieve password from secrets.tdb)

Добавим нового пользователя:

$sudo smbldap-useradd -a -P user1
$sudo smbldap-useradd -a -P user2

[править] Интеграция с ОС

Такие действия проводим как на сервере, так и на клиентах (на них будет ldap://dc1.example.com/)

$sudo apt-get install libnss-ldap

Отвечаем на вопросы:

  • LDAP server Uniform Resource Identifier: ldap://127.0.0.1/ (или оставить ldapi:/// для работы через локальный сокет?)
  • Distinguished name of the search base: dc=example,dc=com
  • LDAP version to use: 3
  • Make local root Database admin: Yes
  • Does the LDAP database require login? No
  • LDAP account for root: cn=admin,dc=example,dc=com
  • LDAP root account password:

Эти изменения будут сохранены в /etc/ldap.conf (в Debian — в /etc/libnss-ldap.conf)

Пароль к rootbinddn сохраняется в сыром виде в /etc/ldap.secret

Если ошиблись, настраиваем заново с помощью команды sudo dpkg-reconfigure ldap-auth-config

$sudo auth-client-config -t nss -p lac_ldap
$sudo pam-auth-update

Активируемые профили PAM: Unix authentication, LDAP Authentication

Проверяем: команда

$getent passwd

должна выдать и системных пользователей, и пользователей user1 и user2 из LDAP.

Здесь, возможно, понадобится перезагрузка — надо перепроверить и поправить статью (TODO).

Вводим в домен:

$sudo net rpc join -U admin
Enter admin's password:
Joined domain MAIN.

Если перед этим не создать системного пользователя admin, то получим ошибку smbd: Failed to find a Unix account for admin User admin in passdb, but getpwnam() fails!

Делаем группу «Domain Admins» настоящими администраторами:

$sudo net rpc rights grant "Domain Admins" SeMachineAccountPrivilege SeTakeOwnershipPrivilege SeBackupPrivilege SeRestorePrivilege SeRemoteShutdownPrivilege SePrintOperatorPrivilege SeAddUsersPrivilege SeDiskOperatorPrivilege -Uadmin
Enter admin's password:
Successfully granted rights.

[править] Автоматическое создание домашних директорий

Создаём файл /usr/share/pam-configs/my_mkhomedir:

Name: Create home directory during login
Default: yes
Priority: 900
Session-Type: Additional
Session:
	required	pam_mkhomedir.so umask=0022 skel=/etc/skel

(файл не нужно будет создавать, когда закроют «пожелание» #568577)

Применяем:

$sudo pam-auth-update

[править] Версии ПО

Если используется не Ubuntu 12.04, то данная статья была проверена для следующих версий программ:

  • slapd 2.4.28;
  • samba 3.6.3;
  • ldap-utils 2.4.28;
  • smbldap-tools 0.9.7.

[править] TODO

[править] Лицензия на текст

Текст доступен на условиях лицензии Creative Commons Attribution/Share-Alike Cc-by-sa.png

[править] Материалы по LDAP на xgu.ru

Серверы LDAP:

[править] Материалы по Samba на xgu.ru