понедельник, августа 28, 2006

Настройка Samba 3 PDC LDAP FreeBSD 6.1

Когда то мною была написана эта статья. На нее до сих пор ссылаются поисковики. На сегодня она несколько устарела, поэтому я перевел и дополнил другую статью. Полностью рабочее и проверенное решение, читаем: Контроллер домена Samba с базой данных в LDAP


Пишу по мотивам Linux Samba-OpenLDAP Howto
Также использована статья Установка_Samba_3_PDC_плюс_LDAP_на_FreeBSD
Установка дисковых квот в FreeBSD www.opennet.ru/tips/info/446.shtml
Использование ACL в FreeBSD dreamcatcher.ru/docs/freebsd_acl.html

Из портов ставим
openldap-2.3.24
samba-3.0.23
nss_ldap-251
pam_ldap-182
smbldap-tools-0.9.2a

Копируем
cp /usr/local/share/examples/samba/LDAP/samba.schema /usr/local/etc/openldap/schema

содержимое файла
/usr/local/etc/openldap/slapd.conf (права доступа 0600 root)


include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/openldap.schema
include /usr/local/etc/openldap/schema/samba.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
#ssl
#TLSCipherSuite HIGH:MEDIUM:+SSLv2:+TLSv1
#TLSCertificateFile /usr/local/etc/openldap/ldap.csr
#TLSCertificateKeyFile /usr/local/etc/openldap/ldap.key
modulepath /usr/local/libexec/openldap
#moduleload back_bdb
moduleload back_ldap
moduleload back_ldbm
#moduleload back_passwd
#moduleload back_shell
#database bdb
database ldbm
suffix "dc=kristall,dc=local"
rootdn "cn=Manager,dc=kristall,dc=local"
#Создать хеш пароля #/usr/local/sbin/slappasswd
rootpw {SSHA}CuizlmpA5bH1MJ8qKJemPJdkgurnguitg
#loglevel 256
directory /var/db/openldap-data
index objectClass,uidNumber,gidNumber eq
index cn,sn,uid,displayName pres,sub,eq
index memberUid,mail,givenname eq,subinitial
index sambaSID,sambaPrimaryGroupSID,sambaDomainName eq
#any users can authenticate and change his password
access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPwdLastSet,sambaPwdMustChange
by dn="cn=Manager,dc=kristall,dc=local" write
by self write
by anonymous auth
by * none
#some attributes need to be readable anonymously so that 'id user' can answer correctly
access to attrs=objectClass,entry,homeDirectory,uid,uidNumber,gidNumber,memberUid
by dn="cn=Manager,dc=kristall,dc=local" write
by * read
#somme attributes can be writable by users themselves
access to attrs=description,telephoneNumber,roomNumber,homePhone,loginShell,gecos,cn,sn,givenname
by dn="cn=Manager,dc=kristall,dc=local" write
by self write
by * read
#some attributes need to be writable for samba
access to
attrs=cn,sambaLMPassword,sambaNTPassword,sambaPwdLastSet,sambaLogonTime,
sambaLogoffTime,sambaKickoffTime,sambaPwdCanChange,sambaPwdMustChange,
sambaAcctFlags,displayName,sambaHomePath,sambaHomeDrive,sambaLogonScript,
sambaProfilePath,description,sambaUserWorkstations,sambaPrimaryGroupSID,
sambaDomainName,sambaMungedDial,sambaBadPasswordCount,sambaBadPasswordTime,
sambaPasswordHistory,sambaLogonHours,sambaSID,sambaSIDList,sambaTrustFlags,
sambaGroupType,sambaNextRid,sambaNextGroupRid,sambaNextUserRid,sambaAlgorithmicRidBase,
sambaShareName,sambaOptionName,sambaBoolOption,sambaIntegerOption,sambaStringOption,sambaStringListoption
by dn="cn=Manager,dc=kristall,dc=local" write
by self read
by * none
#samba need to be able to create the samba domain account
access to dn.base="dc=kristall,dc=local"
by dn="cn=Manager,dc=kristall,dc=local" write
by * none
#samba need to be able to create new users accounts
access to dn="ou=Users,dc=kristall,dc=local"
by dn="cn=Manager,dc=kristall,dc=local" write
by * none
#samba need to be able to create new groups accounts
access to dn="ou=Groups,dc=kristall,dc=local"
by dn="cn=Manager,dc=kristall,dc=local" write
by * none
#samba need to be able to create new computers accounts
access to dn="ou=Computers,dc=kristall,dc=local"
by dn="cn=Manager,dc=kristall,dc=local" write
by * none
#this can be omitted but we let it stay because there could be other branches in the directory
access to *
by self read
By * none


добавим в файл /etc/rc.conf


slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/ ldaps://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"
samba_enable="YES"


файл /usr/local/etc/smb.conf


[global]
workgroup = KRISTALL
netbios name = FREEBSD
enable privileges = yes
interfaces = 192.168.100.1/24
# username map = /etc/samba/sbmusers
server string = SAMBA_LDAP PDC Server
security = user
encrypt passwords = Yes
obey pam restrictions = No
ldap passwd sync = Yes
log level = 0
syslog = 0
log file = /var/log/samba/log.%m
max log size = 100000
time server = Yes
socket options = TCP_NODELAY
mangling method = hash2
display charset = koi8-r
unix charset = koi8-r
dos charset = cp866
logon script = logon.bat
logon drive = H:
# logon home =
logon path =
domain logons = Yes
# os level = 255
preferred master = yes
domain master = yes
local master = yes
wins support = yes
# wins server = w.x.y.z
wins proxy = yes
dns proxy = no
name resolve order = lmhosts wins dns host bcast
passdb backend= ldapsam:ldap://127.0.0.1/
ldap admin dn= cn=Manager,dc=kristall,dc=local
ldap suffix= dc=kristall,dc=local
ldap user suffix= ou=Users
ldap group suffix= ou=Groups
ldap machine suffix= ou=Computers
ldap idmap suffix = ou=Users
ldap ssl= off
# ldap ssl= start tls
add user script = /usr/local/sbin/smbldap-useradd -m "%u"
ldap delete dn= Yes
delete user script = /usr/local/sbin/smbldap-userdel "%u"
add machine script = /usr/local/sbin/smbldap-useradd -w "%u"
add group script = /usr/local/sbin/smbldap-groupadd -p "%g"
delete group script = /usr/local/sbin/smbldap-groupdel "%g"
add user to group script = /usr/local/sbin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /usr/local/sbin/smbldap-groupmod -x "%u" "%g"
set primary group script = /usr/local/sbin/smbldap-usermod -g "%g" "%u"
load printers = no
# printcap name = cups
# disable spoolss = Yes
# show add printer wizard = No
# printing = cups

[homes]
comment = Home directories
browseable = No
writable = yes
public = no
valid users = %S
vfs object = recycle
recycle:repository = .Корзина
recycle:keeptree = Yes
recycle:touch = Yes
recycle:version = Yes
recycle:maxsize = 0
recycle:exclude = *.tmp|*.tbi|*.temp|~$*|*.~??

[netlogon]
comment = Network Logon Service
path = /home/samba/netlogon/
browseable = no
read only = yes

[Profiles]
path = /home/samba/profiles
read only = no
create mask = 0600
directory mask = 0700
browseable = No
guest ok = yes
profile acls = yes
csc policy = disable
force user = %U
valid users = %U @"Domain Admins"

[public]
comment = Общий ресурс
path = /home/samba/public
valid users = @"Domain Admins", @"Domain Users"
browseable = yes
guest ok = yes
read only = no
directory mask = 0777
create mask = 0666


Пароль к LDAP серверу для samba
#smbpasswd -w секретное_слово

Создаем шары самбы


mkdir /home/samba
mkdir /home/samba/netlogon
mkdir /home/samba/profiles
mkdir /home/samba/public
chmod 1777 /home/samba/profiles


В ms windows создаем файл logon.bat

net use i: \\freebsd\public /yes


кладем его в папку /home/samba/netlogon
chmod 1777 /home/samba/profiles

Тест файла конфигурации samba
#testparm

Настраиваем NSS
файл /etc/nsswitch.conf
(права доступа 0600 root)


group: files ldap
group_compat: nis
hosts: files dns
networks: files
passwd: files ldap
passwd_compat: nis
shells: files


файл /etc/pam.d/system


#
# $FreeBSD: src/etc/pam.d/system,v 1.1 2003/06/14 12:35:05 des Exp $
#
# System-wide defaults
#

# auth
auth sufficient pam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
#auth sufficient pam_krb5.so no_warn try_first_pass
#auth sufficient pam_ssh.so no_warn try_first_pass
#auth required pam_unix.so no_warn try_first_pass nullok
auth sufficient pam_unix.so no_warn try_first_pass nullok
auth required /usr/local/lib/pam_ldap.so use_first_pass

# account
#account required pam_krb5.so
account required pam_login_access.so
account required pam_unix.so


# session
#session optional pam_ssh.so
session required pam_lastlog.so no_fail


# password
#password sufficient pam_krb5.so no_warn try_first_pass
password required pam_unix.so no_warn try_first_pass


файл /usr/local/etc/ldap.conf


host 127.0.0.1
base dc=kristall,dc=local
uri ldapi://%2fvar%2frun%2fopenldap%2fldapi/
rootbinddn cn=Manager,dc=kristall,dc=local
scope sub
nss_base_passwd ou=Users,dc=kristall,dc=local?one
nss_base_passwd ou=Computers,dc=kristall,dc=local?one
nss_base_group ou=Groups,dc=kristall,dc=local?one
ssl no
# Если ставлю pam_password SSHA то unix пользователя не пускает
# В файл \usr\local\etc\smbldap-tools\smbldap.conf
# также ставим CPYPT
pam_password CRYPT
# Обратите внимание без следующих двух строчек LDAP сервер
# нормально не стартует
bind_timelimit 10
bind_policy soft


файл /usr/local/etc/ldap.secret(права доступа 0600 root)


секретное_слово


Создаем символические ссылки

#ln -s /usr/local/etc/ldap.conf /usr/local/etc/openldap/ldap.conf
#ln -s /usr/local/etc/ldap.secret /usr/local/etc/openldap/ldap.secret
#ln -s /usr/local/etc/ldap.conf /usr/local/etc/nss_ldap.conf
#ln -s /usr/local/etc/ldap.secret /usr/local/etc/nss_ldap.secret

Настройка smbldap-tools

usr\local\etc\smbldap-tools\smbldap.conf
usr\local\etc\smbldap-tools\smbldap_bind.conf

Для настройки необходимо #net getlocalsid
Полученный SID вбиваем в файл smbldap.conf

файл smbldap.conf


SID="S-1-5-21-407154694-2210106921-3152988260"
sambaDomain="KRISTALL"
slaveLDAP="127.0.0.1"
slavePort="389"
masterLDAP="127.0.0.1"
masterPort="389"
ldapTLS="0"
suffix="dc=kristall,dc=local"
usersdn="ou=Users,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
scope="sub"
# Если ставлю hash_encrypt="SSHA" то unix пользователя не пускает
hash_encrypt="CRYPT"
crypt_salt_format="%s"
userLoginShell="/sbin/nologin"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/usr/share/skel"
defaultMaxPasswordAge="45"
userSmbHome="\\freebsd\%U"
userHomeDrive="H:"
userScript="logon.bat"
mailDomain=""
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="1"
slappasswd="/usr/local/sbin/slappasswd"


файл smbldap_bind.conf


slaveDN="cn=Manager,dc=kristall,dc=local"
slavePw="секретное_слово"
masterDN="cn=Manager,dc=kristall,dc=local"
masterPw="секретное_слово"


проверяем работу LDAP
#netstat -a | grep LISTEN | grep ldap
tcp4 0 0 *.ldaps *.* LISTEN
tcp4 0 0 *.ldap *.* LISTEN

Наполняем базу LDAP данными
#smbldap-populate -a Administrator

Посмотреть и исправить содержимое под ms windows можно программой
Ldap administrator (адрес проекта www.openldap.org)

Проверка
Добавим unix пользователя
#smbldap-useradd -m testuser1
#smbldap-passwd testuser1

Пробуем залогиниться в систему.
Логинится, но пользователя не понимает, в командной строке
[I have no name!@freebsd~]$ (Скорее всего не хватает прав.)

Командой id проверяем принадлежность пользователя uid, gid
#id testuser1
uid=1000(testuser1) gid=100(users) groupes=100(users)

Удаляем тестового пользователя
#smbldap-userdel -r testuser1

После всех этих телодвижений пользователь Administrator
имеет все права в нашем домене.

Добавлять и удалять пользователей можно при помощи утилит
User manager for domains и Server manager for domains.
Они доступны по адресу ftp://ftp.microsoft.com/Softlib/MSLFILES/SRVTOOLS.EXE

Для добавления админских привилегий в домене группе Domain Admins:
- в файл smb.conf, секцию [global] добавить
enable privileges = yes
- командой

#net rpc rights grant -U Administrator%секретное_слово 'KRISTALL\Domain Admins' SeAddUsersPrivilege
#net rpc rights grant -U Administrator%секретное_слово 'KRISTALL\Domain Admins' SeMachineAccountPrivilege
#net rpc rights grant -U Administrator%секретное_слово 'KRISTALL\Domain Admins' SeTakeOwnershipPrivilege
#net rpc rights grant -U Administrator%секретное_слово 'KRISTALL\Domain Admins' SeBackupPrivilege
#net rpc rights grant -U Administrator%секретное_слово 'KRISTALL\Domain Admins' SeRestorePrivilege
#net rpc rights grant -U Administrator%секретное_слово 'KRISTALL\Domain Admins' SeRemoteShutdownPrivilege
#net rpc rights grant -U Administrator%секретное_слово 'KRISTALL\Domain Admins' SePrintOperatorPrivilege
#net rpc rights grant -U Administrator%секретное_слово 'KRISTALL\Domain Admins' SeDiskOperatorPrivilege

Посмотреть назначенные привилегии
net rpc rights list accounts -U Administrator%секретное_слово

Добавим квоты на разделы

- в конфигурации ядра включаем "options QUOTA" и пересобираем ядро.

cd /usr/src/sys/i386/conf
config FREEBSD
cd /usr/src/sys/i386/compile/FREEBSD
make depend
make all
make install

- в /etc/rc.conf прописываем enable_quotas="YES" и check_quotas="YES"
- указываем в /etc/fstab файловые системы, для которых будет включаться
поддержка квот, например:
/dev/da0s1e /home ufs rw,userquota,groupquota 2 2
- устанавливаем квоты для пользователей при помощи edquota, напр. "edquota user1"
- если нужно установить одинаковые квоты для нескольких пользователей как у user1:
edquota -p user1 startuid-enduid (квоты на диапазон uid)
пример: edquota -p user1 1001-1999
Посмотреть квоты у всех: repquota -a (из под root)

Использование ACL с Samba

Конфигурируем ACL для каталога /usr(Команда df -> /dev/ad0s1a)

Переводим систему в однопользовательский режим

# shutdown now
Enter full pathname of shell or RETURN for /bin/sh:

# /sbin/umount /usr
# /sbin/tunefs -a enable /dev/ad0s1f
tunefs: ACLs set
# /sbin/mount /usr

Используйте свое имя устройства, которое вы посмотрели в выводе команды df.

Теперь давайте проверим, как это работает:

# /sbin/mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1e on /tmp (ufs, local, soft-updates)
/dev/ad0s1f on /usr (ufs, local, soft-updates, acls)
/dev/ad0s1d on /var (ufs, local, soft-updates)

И вернемся в многопользовательский режим:
# exit
Система готова к использованию ACL в Samba

P.S. Более подробно смотрим ресурс Все о Samba

37 комментариев:

Анонимный комментирует...

Спасибо!

Анонимный комментирует...

Огромное спасибо за статью. Делал всё как Вы описали и в итоге всё заработало ) В довершение хотелось бы добавить, что есть хороший веб интерфейс для управления SAMBA аккаунтами в LDAP (чтобы не использовать win* утилиты) - LAM. Установился и работает без проблем, надо было только немного подправить конфиг. Пользователи FreeBSD могут использовать порт LAM

Рамиль комментирует...

Для просмотра и редактирования LDAP я использую phpldapadmin098.
Спасибо за добрые слова.

Unknown комментирует...

Огромной спасибо. Всё работает, но есть одно но. Хотелось бы чтобы доменные UID не пересекались с системными.

Рамиль комментирует...

А вы используете эту машину для чего-то еще, кроме самбы?
Небезопасно.

Рамиль комментирует...

"Хотелось бы чтобы доменные UID не пересекались с системными."
Не совсем понял вопрос. Но если понял правильно, то
smbldap-populate -a Administrator -u 5000 -g 5000
(где -u uidNumber first uidNumber)

Unknown комментирует...

ключ -u я нашёл. Но хотелось бы чтобы uid выдавались из определённого диапазона.

Рамиль комментирует...

Думается мне этим ключем мы и устанавливаем в LDAP стартовый uid,
а если и нет, то можно в самом LDAP
поправить. :)

Unknown комментирует...

Не совсем в LDAP. Пришлось лезть в исходники smbtools и править зашитые там константы "1000" вручную.

Александр Кулишов комментирует...

rrv.jino-net.ru/Samba3.htm не сохранилась ли у вас локально эта статья! прошу прощения за оффтоп.

Рамиль комментирует...

не сохранилась

Анонимный комментирует...

В мемориз однозначно

Князь комментирует...
Этот комментарий был удален автором.
Анонимный комментирует...

Все делал как Вы описали, остановился на
Настройках smbldap-tools;
# net getlocalsid
[2008/01/31 23:54:44, 0] lib/smbldap.c:smbldap_connect_system(977)
failed to bind to server ldap://127.0.0.1/ with dn="cn=Manager,dc=Example,dc=local" Error: Can't contact LDAP server
(unknown)
SID for domain FREEBSD is: S-1-5-21-1772924772-1580370677-442909514
куда копать, плз?

Рамиль комментирует...

Сид же получен, вбивайте его куда надо и дальше по статье.

Рамиль комментирует...

а вообще статью переписывать пора

Анонимный комментирует...

Извините, за настойчивость, но опять остановился.
Ведь чтобы проверить работу LDAP,
#netstat -a | grep LISTEN | grep ldap,
ее надо сначала как то запустить. А как?
Перезагрузка - ничего не дала,
в /var/log/messages:
Feb 27 15:20:00 Example cron[1070]: nss_ldap: could not search LDAP server - Server is unavailable.

Рамиль комментирует...

добавим в файл /etc/rc.conf

slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/ ldaps://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"

запустить сервис командой
/usr/local/etc/rc.d/slapd start
или перезагрузить компьютер
Если не запускается возможно в фаерволе запрещено соединяться с 127.0.0.1

Анонимный комментирует...

И, как я понял, что программа LDAP Adminstrator переехала на http://www.ldapadministrator.com и стала платной.

Рамиль комментирует...

Под windows используйте http://ldapadmin.sourceforge.net
Программа бесплатна.

Анонимный комментирует...

Я тут пытаюсь понять, и не понимаю.

samba требует, чтобы аккаунты в LDAP имели тип sambasamaccount; smbldap-tools прописывает этот тип аккаунта только для trusted workstation.

Я чего-то принуипиального не понимаю или у меня smbldap-tools не той системы?

Рамиль комментирует...

"samba требует, чтобы аккаунты в LDAP имели тип sambasamaccount" Так и есть.
-Остановите ldap сервер
-Удалите из него все данные.
-В slapd.conf включите все схемы.
-Запустите ldap сервер.
-Проверьте запустился ли.
-Потом smbldap-populate -a Administrator
P.S. Интересно ваше мнение, есть ли смысл создать форум в поддержку статей.

Анонимный комментирует...

... так все и сделал. Проблема в том, что smbldap-populate создает все правильно, а smbldap-adduser - неправильно :(

Рамиль комментирует...

smbldap-useradd -a -m "имя пользователя"

Анонимный комментирует...

от ить.... а где бы найти описание sambaAcctFlags?...

Анонимный комментирует...

... нашел. То есть, стандартные примеры smbldap-tools не годятся все дружно? Добавление машины - не

/usr/local/sbin/smbldap-useradd -w '%u'

а

/usr/local/sbin/smbldap-useradd -a -H '[W]' -w '%u'

?

Рамиль комментирует...

То что прописано в smb.conf используется самбой для добавления машин в домен например, создания пользователей тулзами MS, возможности пользователям самим менять себе пароли и т.д.

Анонимный комментирует...

так вот, команда, не создающая smbsamaccount - нефункциональна...

Рамиль комментирует...

отсюда поподробнее, может и мне пригодится

stavr комментирует...

Здравствуйте.
Сделал все по вашей статье. Сервер заработал... В смысле запустился нормально. При попытке добавить машну с windows в домен - после ввода логина и пароля Administrator выдается сообщение -не найден сетевой путь. Такую конфигурацию samba делал первый раз. На виртуалке сделал сервер. Конфиг одни в один с Вашим.

Рамиль комментирует...

Не совсем понял что за сообщение не найден сетевой путь, поподробнее пожалуйста и давайте в форум http://admins.arg.su

Анонимный комментирует...

ушел на форум :)

Анонимный комментирует...

Форум не работает - я не нашел кнопку "ответить".

Пишу здесь.

Команды, приведенные в статье (для smbldaptools) не создают smbsamaccount. Поэтому, компьютеры нужно допрописывать руками.

Кроме того, лично у меня есть еще одна проблема. Я перевожу домен с AD на Samba, в профилях нужно где-то что-то поправить, чтобы они перенеслись. Но где там лежит SID и как его править?...

Рамиль комментирует...

Давайте все же в форум, должен работать сейчас, вопросы то одни и те же.

Анонимный комментирует...

>smilealex комментирует...

>rrv.jino-net.ru/Samba3.htm не
>сохранилась ли у вас локально эта статья!
>прошу прощения за оффтоп.

Статья переехала сюда http://rrv.nsk.ru/wiki/index.php/Установка_Samba_3_PDC_плюс_LDAP_на_FreeBSD

Рамиль комментирует...

спасибо исправил в статье

Анонимный комментирует...

Сообщите, когда заработает форум!!!