понедельник, 12 мая 2008 г.

Зачем нужен ActiveDirectory когда есть Samba & OpenLDAP?

Задача - сетевое хранилище корпоративных данных и управление доступом.
Пока линукс на все машины ставить ставить не позволили, стоит WinXP.

Решение - Samba в режиме контроллера домена, OpenLDAP для управления пользователями.

Решение в деталях:
1) ставим систему (я работал с Gentoo отличия в других дистрибутивах только в путях и установке пакетов), лишние пользователи не нужны, есть только root

2) ставил следующие пакеты (гентушники: USE="ldap acl ldapsam pam gdbm samba ssl tcpd winbind"):
samba openldap acl nss_ldap pam_ldap smbldap-tools

3) придумываем имя домена, в моем случае это "taxi.local". Придумываем системный пароль домена

4) редактируем
/etc/openldap/slapd.conf (а тут приколы: в части дистрибутивов папка /etc/openldap на самом деле /etc/ldap, это важно для настроек. Второй прикол в том что надо соблюдать в параметрах "acces to" разделители, это похоже на форматирование в питоне. Они просто не показывались в тексте но перед каждым by в начале строки стоит пробел или табуляция):
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/samba.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
database ldbm
suffix "dc=taxi,dc=local"
rootdn "cn=Manager,dc=taxi,dc=local"
rootpw <а здесь вводиться системный пароль домена>
directory /var/lib/openldap-data
lastmod on
access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPwdLastSet,sambaPwdMustChange
by dn="cn=Manager,dc=taxi,dc=local" write
by self write
by anonymous auth
by * none
access to attrs=objectClass,entry,homeDirectory,uid,uidNumber,gidNumber,memberUid
by dn="cn=Manager,dc=taxi,dc=local" write
by * read
access to attrs=description,telephoneNumber,roomNumber,homePhone,loginShell,gecos,cn,sn,givenname
by dn="cn=Manager,dc=taxi,dc=local" write
by self write
by * read
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=taxi,dc=local" write
by self read
by * none
access to dn.base="dc=taxi,dc=local"
by dn="cn=Manager,dc=taxi,dc=local" write
by * none
access to dn="ou=Users,dc=taxi,dc=local"
by dn="cn=Manager,dc=taxi,dc=local" write
by * none
access to dn="ou=Groups,dc=taxi,dc=local"
by dn="cn=Manager,dc=taxi,dc=local" write
by * none
access to dn="ou=Computers,dc=taxi,dc=local"
by dn="cn=Manager,dc=taxi,dc=local" write
by * none
access to *
by self read
by * none
access to *
by dn="ou=Domain Admins,dc=taxi,dc=local" write
by * read

5) редактируем
/etc/openldap/ldap.conf:
HOST 127.0.0.1
BASE dc=taxi,dc=local

6) Проверяем права доступа:
storage home # ls -lda /var/lib/openldap-*
drwx------ 2 ldap ldap 4096 Apr 27 13:58 /var/lib/openldap-data
drwx------ 2 ldap ldap 4096 Apr 17 19:48 /var/lib/openldap-ldbm
drwx------ 2 ldap ldap 4096 Apr 17 19:48 /var/lib/openldap-slurp

7) проверяем настройки OpenLdap:
storage home # slaptest

8) настраиваем сервер OpenLdap, в Gentoo это файл
/etc/conf.d/slapd:
OPTS="-h 'ldap://127.0.0.1'"

9) запускаем OpenLdap:
storage home # /etc/init.d/slapd start

10) настраиваем Samba (/etc/samba/smb.conf) (примечание - конфиг "живой" так что его придеться править под свои нужды):
[global]
workgroup = taxi
netbios name = domain
realm = taxi.local
nt acl support = yes
acl compatibility = win2k
map acl inherit = yes
server string = Samba Server %v
interfaces = eth0
bind interfaces only = yes
hosts allow = 192.168.0. 127.
log file = /var/log/samba/log.%m
debug level = 9
max log size = 500
socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
security = user
os level = 250
passdb backend = ldapsam:"ldap://127.0.0.1/"
enable privileges = yes
passwd program = /usr/sbin/smbldap-passwd "%u"
passwd chat = *new*password* %n\n *new*password* %n\n *successfully*
passdb expand explicit = no
unix password sync = no
ldap passwd sync = no
ldap suffix = dc=taxi,dc=local
ldap admin dn = cn=Manager,dc=taxi,dc=local
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Users
ldap idmap suffix = ou=Idmap
idmap backend = ldapsam:ldap://127.0.0.1/
idmap uid = 10000-20000
idmap gid = 10000-20000
ldap delete dn = Yes
ldap ssl = no
add user script = /usr/sbin/smbldap-useradd -n -a "%u"
delete user script = /usr/sbin/smbldap-userdel "%u"
add group script = /usr/sbin/smbldap-groupadd -p "%g"
delete group script = /usr/sbin/smbldap-userdel "%g"
add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g"
set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u"
add machine script = /usr/sbin/smbldap-useradd -i -w "%u"
domain master = yes
preferred master = yes
domain logons = Yes
logon script = logon.bat
logon path = \%L\%U\.profile
logon drive = U:
logon home = \\%L\%U
restrict anonymous = 1

[netlogon]
comment = Network Logon Service
path = /home/netlogon
browseable = yes
guest ok = yes
writable = no
share modes = no

[homes]
comment = Home Directories
browseable = no
read only = no

[public]
path = /home/global
guest ok = yes
read only = no

[users]
path = /home/users
writable = yes
printable = no

11) даем системный пароль домена самбе:
storage ~ # smbpasswd -w <системный пароль домена>

12) создаем все небходимае папки и файлы описанные в smb.conf, папке netlogon и public полные права на всех, создаем автоотключение темы в винде и монтирование сетевыйх папок, для новых пользователей создаем хранилище профайла:
storage ~ # echo -e "net use w: \\domain\public /yes\nnet stop themes" > /home/netlogon/logon.bat
storage ~ # chmod 777 /home/global /home/netlogon
storage ~ # rm -rfv
/etc/skel/*
storage ~ # mkdir /etc/skel/.profile

13) настраиваем систему на работу в домене (надо для прав на папки и входа в систему), редактируем
/etc/ldap.conf
host 127.0.0.1
base dc=taxi,dc=local
rootbinddn cn=Manager,dc=taxi,dc=local
scope sub
nss_base_passwd ou=Users,dc=taxi,dc=local?one
nss_base_passwd ou=Computers,dc=taxi,dc=local?one
nss_base_group ou=Groups,dc=taxi,dc=local?one
ssl no
pam_password MD5
bind_timelimit 10
bind_policy soft

14) говорим системный пароль домена
storage ~ # echo <системный пароль домена> >
/etc/ldap.secret

15) Установим права на критические файлы для системы:
storage ~ # chmod 600 /etc/ldap.secret
storage ~ # chown root:wheel /etc/ldap.secret

16) Настроим pam, редактируем /etc/pam.d/system-auth:
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account sufficient pam_ldap.so
account required pam_unix.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password sufficient pam_unix.so nullok md5 shadow use_authtok
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=077
session optional pam_ldap.so

17) теперь редактируем /etc/nsswitch.conf:
passwd: files ldap
shadow: files ldap
group: files ldap
hosts: files dns
networks: files dns
services: db files
protocols: db files
rpc: ldap [NOTFOUND=return] db files
ethers: ldap [NOTFOUND=return] db files
netmasks: files
netgroup: ldap [NOTFOUND=return] files
bootparams: files
automount: files
aliases: files

19) запускаем самбу:
storage ~ # /etc/init.d/samba start

19) пришла очередь забить структуру домена, сначала заполним данные для работы с openldap (/etc/smbldap-tools/smbldap.conf, SID получить командой net getlocalsid)
SID="S-1-5-21-677320241-3780724581-4281765528"
sambaDomain="DOMAIN"
slaveLDAP="127.0.0.1"
slavePort="389"
masterLDAP="127.0.0.1"
masterPort="389"
ldapTLS="1"
verify="require"
cafile="/etc/smbldap-tools/ca.pem"
clientcert="/etc/smbldap-tools/smbldap-tools.pem"
clientkey="/etc/smbldap-tools/smbldap-tools.key"
suffix="dc=taxi,dc=local"
usersdn="ou=Users,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=DOMAIN,${suffix}"
scope="sub"
hash_encrypt="MD5"
crypt_salt_format="%s"
userLoginShell="/bin/bash"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
defaultMaxPasswordAge="45"
userSmbHome="\\DOMAIN\%U"
userProfile="\\DOMAIN\%U\.profile"
userHomeDrive="Z:"
userScript="logon.bat"
mailDomain="taxi.local"
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

20) редактируем /etc/smbldap-tools/smbldap_bind.conf:
slaveDN="cn=Manager,dc=taxi,dc=local"
slavePw="<системный пароль домена>"
masterDN="cn=Manager,dc=taxi,dc=local"
masterPw="<
системный пароль домена>"

21) записываем структуру домена
storage ~ # smbldap-populate

22) собственно все, работу с входом в систему делайте через smbldap-*, добавление машины в домен по логину рута, профайл лежит в домешней папке, если при входе нет домешней папки она создаеться. Еще есть замечательный пакет phpldapadmin :)

P.S. писалось все в не самом лучшем настроении от проблем в личной жизни - многое упустил и не описывал. Надеюсь что Вы сами не поленитесь почитать документацию. Также не могу вспомнить решение проблемы с отказом запуска самбы (не видит пользователя nobody или nologin) до заполнения базовой структуры домена (надо для SID), возможное решение - прописывание отсутсвия проверки на наличие пользователей и последующие ее включение. Так что гугл вам в помощь.
Источники: гугл, мэн, руководство из gentoo-wiki, документация от Айзятуллен Рамиля, неизвестное найденое гуглом (за нее отдельное человеческое спасибо)

2 комментария:

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

Мягко говоря всем этим не очень удобно обращаться.
Присматриваюсь к Fedora Directiry Server

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

Почему не удобно обращаться? Настраивать - да. Но потом отлично работаеться через phpldapadmin