Samba + LDAP (PDC)

Эта статья является доработкой предыдущей статьи, в которой учтены недостатки и реализованы новые идеи. В этой статье будет рассмотрена настройка самбы в качестве главного контроллера домена с хранением всей служебной информации в LDAP.

Итак, приступим... ОС, на которой будут производиться все операции - FreeBSD 7.3. Предполагается, что система чистая, а если нет, то удалите старые пакеты :). Обновляем порты. Далее устанавливаем сервер LDAP, в качестве такого я выбрал OpenLDAP.

# cd /usr/ports/net/openldap24-server
# make install clean

Из предложенных опций я выбрал следующие:

  • FETCH
  • TCP_WRAPPERS
  • SEQMOD
  • SYNCPROV
  • DYNAMIC_BACKENDS

Поддержку Berkley DB я убрал, так как народу у меня немного, соответственно хранить все можно в текстовых файлах. Если планируется много пользователей, то лучше использовать Berkley DB, ибо это хранилище быстрее работает.

После установки лезем править конфиг /usr/local/etc/openldap/slapd.conf. У меня он выглядит так:

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
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/nis.schema
#include         /usr/local/etc/openldap/schema/samba.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral       ldap://root.openldap.org

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

# Подгружаем нужный модуль:
modulepath      /usr/local/libexec/openldap
# moduleload    back_bdb
# moduleload    back_hdb
moduleload      back_ldap

# Sample security restrictions
#       Require integrity protection (prevent hijacking)
#       Require 112-bit (3DES or better) encryption for updates
#       Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

# Sample access control policy:
#       Root DSE: allow anyone to read it
#       Subschema (sub)entry DSE: allow anyone to read it
#       Other DSEs:
#               Allow self write access
#               Allow authenticated users read access
#               Allow anonymous users to authenticate
#       Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read

# Указываем права доступа к данным
access to attrs=userPassword
               by self write
               by anonymous auth
               by * none

access to *
               by self write
               by users read
               by anonymous read
               by * none

#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

#######################################################################
# BDB database definitions
#######################################################################

# В этой опции указываем хранилище
database        ldif
suffix          "dc=srv-home,dc=local"
rootdn          "cn=root,dc=srv-home,dc=local"
# Пароль для главного пользователя.
# Генерируется командой slappasswd, вывод команды просто скопировать сюда.
# Дополнительно за информацией обращайтесь в ман - slappasswd(8) и slapd.conf(5).
rootpw          {SSHA}XguytGYPdcylFxV60TD7DwhRy9AXML95
# Здесь указываем папку, где будет располагаться база данных.
# Она должна быть создана перед запуском slapd.
# Рекомендуется установить на нее следующие права доступа - 700.
directory       /var/db/openldap-data

# Настройка ведения логов
logfile         /var/log/openldap.log
loglevel        256

Где взять файл samba.schema будет сказано далее в статье. Теперь добавим демон slapd в автозагрузку и попробуем запустить:

# echo 'slapd_enable="YES"' >> /etc/rc.conf
# echo "slapd_flags='-h \"ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://127.0.0.1/ ldap://192.168.7.250/\"'" >> /etc/rc.conf
# service slapd start

Если все прошло нормально, то у вас должно быть примерно следующее:

# sockstat -l | grep slapd
ldap     slapd      36521 6  stream /var/run/openldap/ldapi
ldap     slapd      36521 7  tcp4   127.0.0.1:389         *:*
ldap     slapd      36521 8  tcp4   192.168.7.250:389     *:*

Наполним лдап базовой информацией. Для этого нужно создать отдельный файл, внести в него нужную информацию и добавить командой ldapadd.

dn: dc=srv-home,dc=local
objectClass: dcObject
objectClass: organization
objectClass: top
dc: srv-home
o: srv-home

dn: cn=root,dc=srv-home,dc=local
objectClass: organizationalRole
cn: root

dn: ou=users,dc=srv-home,dc=local
objectClass: top
objectClass: organizationalUnit
ou: users

dn: ou=groups,dc=srv-home,dc=local
objectClass: top
objectClass: organizationalUnit
ou: groups

dn: ou=computers,dc=srv-home,dc=local
objectClass: top
objectClass: organizationalUnit
ou: computers

Сохраните этот текст например в файле main.ldif и добавляем данные:

# ldapadd -x -D "cn=root,dc=srv-home,dc=local" -W -f main.ldif
Successfully added...

С настройкой OpenLDAP пока закончили. Сейчас надо установить скрипты, которые облегчат управление пользователями в лдапе и NSS модуль, который будет сопоставлять имя пользователя и идентификатор.
Со скриптами все просто, идем сюда - /usr/ports/net/ldapscripts и устанавливаем. А теперь надо подправить чуток конфиг /usr/local/etc/ldapscripts/ldapscripts.conf.

# LDAP Configuration
SERVER="ldap://localhost"
BINDDN="cn=root,dc=srv-home,dc=local"
# The following file contains the raw password of the binddn
# Create it with something like : echo -n 'secret' > $BINDPWDFILE
# WARNING !!!! Be careful not to make this file world-readable
#BINDPWDFILE="/usr/local/etc/ldapscripts/ldapscripts.passwd"
# For older versions of OpenLDAP, it is still possible to use
# unsecure command-line passwords by defining the following option
# AND commenting the previous one (BINDPWDFILE takes precedence)
BINDPWD="*****"

SUFFIX="dc=srv-home,dc=local" # Global suffix
GSUFFIX="ou=groups"        # Groups ou (just under $SUFFIX)
USUFFIX="ou=users"         # Users ou (just under $SUFFIX)
MSUFFIX="ou=computers"      # Machines ou (just under $SUFFIX)

# Start with these IDs *if no entry found in LDAP*
GIDSTART="20000" # Group ID
UIDSTART="20000" # User ID
MIDSTART="30000" # Machine ID

# User properties
USHELL="/usr/sbin/nologin"
UHOMES="/mnt/media/home/%u"     # You may use %u for username here
CREATEHOMES="no"      # Create home directories and set rights ?
#HOMESKEL="/etc/skel"  # Directory where the skeleton files are located. Ignored if undefined or nonexistant.
HOMEPERMS="700"       # Default permissions for home directories

# User passwords generation
# Command-line used to generate a password for added users (you may use %u for username here)
# WARNING !!!! This is evaluated, everything specified here will be run !
# Special value "<ask />" will ask for a password interactively
#PASSWORDGEN="cat /dev/random | LC_ALL=C tr -dc 'a-zA-Z0-9' | head -c8"
PASSWORDGEN="head -c8 /dev/random | uuencode -m - | sed -n '2s|=*$||;2p' | sed -e 's|+||g' -e 's|/||g'"
#PASSWORDGEN="pwgen"
#PASSWORDGEN="echo changeme"
#PASSWORDGEN="echo %u"
#PASSWORDGEN="<ask />"

# User passwords recording
# you can keep trace of generated passwords setting PASSWORDFILE and RECORDPASSWORDS
# (useful when performing a massive creation / net rpc vampire)
# WARNING !!!! DO NOT FORGET TO DELETE THE GENERATED FILE WHEN DONE !
# WARNING !!!! DO NOT FORGET TO TURN OFF RECORDING WHEN DONE !
RECORDPASSWORDS="no"
PASSWORDFILE="/var/log/ldapscripts_passwd.log"

# Where to log
LOGFILE="/var/log/ldapscripts.log"

# Temporary folder
TMPDIR="/tmp"

# Various binaries used within the scripts
# Warning : they also use uuencode, date, grep, sed, cut, expr, which...
# Please check they are installed before using these scripts
# Note that many of them should come with your OS

# OpenLDAP client commands
LDAPSEARCHBIN="/usr/local/bin/ldapsearch"
LDAPADDBIN="/usr/local/bin/ldapadd"
LDAPDELETEBIN="/usr/local/bin/ldapdelete"
LDAPMODIFYBIN="/usr/local/bin/ldapmodify"
LDAPMODRDNBIN="/usr/local/bin/ldapmodrdn"
LDAPPASSWDBIN="/usr/local/bin/ldappasswd"

# Character set conversion : $ICONVCHAR  UTF-8
# Comment ICONVBIN to disable UTF-8 conversion
ICONVBIN="/usr/local/bin/iconv"
ICONVCHAR="KOI8-R"

# Base64 decoding
# Comment UUDECODEBIN to disable Base64 decoding
UUDECODEBIN="/usr/bin/uudecode"

# Getent command to use - choose the ones used
# on your system. Leave blank or comment for auto-guess.
# GNU/Linux
#GETENTPWCMD="getent passwd"
#GETENTGRCMD="getent group"
# FreeBSD
GETENTPWCMD="pw usershow"
GETENTGRCMD="pw groupshow"
# Auto
#GETENTPWCMD=""
#GETENTGRCMD=""

# You can specify custom LDIF templates here
# Leave empty to use default templates
# See *.template.sample for default templates
#GTEMPLATE="/path/to/ldapaddgroup.template"
#UTEMPLATE="/path/to/ldapadduser.template"
#MTEMPLATE="/path/to/ldapaddmachine.template"
GTEMPLATE=""
UTEMPLATE=""
MTEMPLATE=""

Теперь нужно установить NSS модуль, который будет сопоставлять имя пользователя и идентификатор.

# cd /usr/ports/net/nss_ldap
# make install clean

И снова правим конфиг.

# Your LDAP server. Must be resolvable without using LDAP.
# Multiple hosts may be specified, each separated by a
# space. How long nss_ldap takes to failover depends on
# whether your LDAP client library supports configurable
# network or connect timeouts (see bind_timelimit).
host 127.0.0.1

# The distinguished name of the search base.
base dc=srv-home,dc=local

# The LDAP version to use (defaults to 3
# if supported by client library)
ldap_version 3

# The port.
# Optional: default is 389.
port 389

# The search scope.
#scope sub
scope one
#scope base

# Reconnect policy:
#  hard_open: reconnect to DSA with exponential backoff if
#             opening connection failed
#  hard_init: reconnect to DSA with exponential backoff if
#             initializing connection failed
#  hard:      alias for hard_open
#  soft:      return immediately on server failure
bind_policy soft

# Connection policy:
#  persist:   DSA connections are kept open (default)
#  oneshot:   DSA connections destroyed after request
nss_connect_policy persist

# Use paged rseults
nss_paged_results yes

# RFC2307bis naming contexts
nss_base_passwd ou=users,dc=srv-home,dc=local?one
nss_base_passwd ou=computers,dc=srv-home,dc=local?one
nss_base_shadow ou=users,dc=srv-home,dc=local?one
nss_base_group          ou=groups,dc=srv-home,dc=local?one

После настройки модуля нужно сказать системе, что информацию о идентификаторах можно получать еще через него. Для этого правим файл - /etc/nsswitch.conf, точнее всего две строчки в нем.

group: files ldap
passwd: files ldap

Проверим работоспособность настроенной связки:

# ldapaddgroup testgroup
Successfully added group testgroup to LDAP
# ldapadduser testuser testgroup
Successfully added user testuser to LDAP
Successfully set password for user testuser
# lsldap
...
dn: cn=testgroup,ou=groups,dc=srv-home,dc=local
objectClass: posixGroup
cn: testgroup
gidNumber: 20016
description: Group account

dn: uid=testuser,ou=users,dc=srv-home,dc=local
objectClass: account
objectClass: posixAccount
cn: testuser
uid: testuser
uidNumber: 20004
gidNumber: 20016
homeDirectory: /mnt/media/home/testuser
loginShell: /usr/sbin/nologin
gecos: testuser
description: User account
userPassword:: e1NTSEF9RzVTakJBZjMyM1d6b2ZycWpUZ0hIRXhnak0vdnlTWCs=
...
# id testuser
uid=20004(testuser) gid=20016(testgroup) groups=20016(testgroup)

Если у вас в выводе команд наблюдается, что-то подобное, то все работает нормально. Удалить пользователя и группу можно командами - ldapdeleteuser и ldapdeletegroup.

Приступаем к установке и настройке самбы.

# cd /usr/ports/net/samba34
# make install clean

Опции, которые я выбрал:

  • LDAP
  • ACL_SUPPORT
  • QUOTAS
  • POPT

После завершения установки надо скопировать схему samba.schema в папку схем openldap:

# cp /usr/local/share/examples/samba34/LDAP/samba.schema /usr/local/etc/openldap/schema

Теперь раскомментируем строку в файле slapd.conf, где подключается только что скопированная схема и перезапускаем демон slapd. Ну и идем править конфиг самбы.

#======================= Global Settings =====================================
[global]
  workgroup = HOME
  server string = Documents
  netbios name = srv-home.local

  security = user
  hosts allow = 192.168.7. 127.
  load printers = no
  printing = bsd
  #guest account = nobody
  #log file = /var/log/samba34/log.%m
  log file = /dev/null
  log level = 0
  max log size = 5000
  encrypt passwords = yes
  #passdb backend = tdbsam
  passdb backend = ldapsam:ldap://localhost/
  ldap suffix = dc=srv-home,dc=local
  ldap user suffix = ou=users
  ldap group suffix = ou=groups
  ldap machine suffix = ou=computers
  ldap admin dn = "cn=root,dc=srv-home,dc=local"
  ldap delete dn = no
  ldap ssl = no

  ;include = /usr/local/etc/smb.conf.%m

  read raw = yes
  write raw = yes
  use sendfile = yes
  socket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=32768 SO_RCVBUF=32768 SO_KEEPALIVE

  interfaces = 192.168.7.250/24 127.0.0.1/8
  bind interfaces only = yes
  local master = yes
  domain master = yes
  preferred master = yes

  os level = 65
  domain logons = yes
  wins support = yes
  time server = yes

  admin users = nekit
  logon path = \\%L\profiles\%U
  logon drive = H:
  logon home = \\%L\%U
  logon script = logon.cmd

  display charset = koi8-r
  unix charset = koi8-r
  dos charset = cp866

  case sensitive = no

  store dos attributes = yes

# Скрипт, для добавления машин
  add machine script = /usr/local/sbin/ldapaddmachine '%u' smb_pdc_computers
  add user script = /usr/local/sbin/ldapadduser '%u' smb_pdc_users
  add group script = /usr/local/sbin/ldapaddgroup '%g'
  add user to group script = /usr/local/sbin/ldapaddusertogroup '%u' '%g'
  delete user script = /usr/local/sbin/ldapdeleteuser '%u'
  delete group script = /usr/local/sbin/ldapdeletegroup '%g'
  delete user from group script = /usr/local/sbin/ldapdeleteuserfromgroup '%u' '%g'
  set primary group script = /usr/local/sbin/ldapsetprimarygroup '%u' '%g'
  rename user script = /usr/local/sbin/ldaprenameuser '%uold' '%unew'

#============================ Share Definitions ==============================
[netlogon]
  comment = Netlogon Service
  path = /mnt/media/samba/netlogon
  read only = yes
  browseable = no
  public = no

[profiles]
  comment = User profiles
  path = /mnt/media/samba/profiles
  writeable = yes
  browseable = no
  public = no
  csc policy = disable
  create mask = 0600
  directory mask = 0700

[homes]
  comment = Home Directories
  browseable = no
  writable = yes
  force create mode = 0640
  force directory mode = 0750

# NOTE: If you have a BSD-style print system there is no need to
# specifically define each individual printer
[printers]
  comment = All Printers
  path = /var/spool/samba
  browseable = no
# Set public = yes to allow user 'guest account' to print
  guest ok = no
  writable = no
  printable = yes

[Video]
  comment = Video
  path = /mnt/media/samba/video
  browseable = yes
  public = no
  writable = yes
  force create mode  = 0640
  force directory mode = 0750
  create mask = 0640
  directory mask = 0750
  force user = root
  force group = wheel
  valid users = @smb_video_read, @smb_video_write
  write list = @smb_video_write
  read list = @smb_video_read, @smb_video_write

[Music]
  comment = Music
  path = /mnt/media/samba/music
  browseable = yes
  public = no
  writable = yes
  force create mode = 0640
  force directory mode = 0750
  create mask = 0640
  directory mask = 0750
  force user = root
  force group = wheel
  valid users = @smb_music_read, @smb_music_write
  write list = @smb_music_write
  read list = @smb_music_read, @smb_music_write

[Distrib]
  comment = Distrib
  path = /mnt/media/samba/distrib
  browseable = yes
  public = no
  writable = yes
  force create mode = 0640
  force directory mode = 0750
  create mask = 0640
  directory mask = 0750
  force user = root
  force group = wheel
  valid users = @smb_distrib_read, @smb_distrib_write
  write list = @smb_distrib_write
  read list = @smb_distrib_read, @smb_distrib_write

[Wallpapers]
  comment = Wallpapers
  path = /mnt/media/samba/wallpapers
  browseable = yes
  public = no
  writable = yes
  force create mode = 0640
  force directory mode = 0750
  create mask = 0640
  directory mask = 0750
  force user = root
  force group = wheel
  valid users = @smb_wallpapers_read, @smb_wallpapers_write
  write list = @smb_wallpapers_write
  read list = @smb_wallpapers_read, @smb_wallpapers_write

Теперь нужно сказать пароль самбе от главного пользователя лдапа:

# smbpasswd -W
Enter password: ***
Retype enter password: ***

Добавляем самбу в автозагрузку и запускаем.

# echo 'smbd_enable="YES"' >> /etc/rc.conf
# echo 'nmbd_enable="YES"' >> /etc/rc.conf
# service samba start

Проверим, запустилась ли samba:

# sockstat | grep -E "smbd|nmbd"
root     smbd       18247 10 tcp4   192.168.7.250:139     192.168.7.101:2386
root     smbd       18247 21 tcp4   127.0.0.1:61042       127.0.0.1:389
root     smbd       18247 25 tcp4   127.0.0.1:62217       127.0.0.1:389
root     smbd       92555 21 tcp4   127.0.0.1:63357       127.0.0.1:389
root     smbd       92553 21 tcp4   127.0.0.1:63357       127.0.0.1:389
root     smbd       92553 22 tcp4   127.0.0.1:445         *:*
root     smbd       92553 23 tcp4   127.0.0.1:139         *:*
root     smbd       92553 24 tcp4   192.168.7.250:445     *:*
root     smbd       92553 25 tcp4   192.168.7.250:139     *:*
root     nmbd       92548 11 udp4   *:137                 *:*
root     nmbd       92548 12 udp4   *:138                 *:*
root     nmbd       92548 13 udp4   192.168.7.250:137     *:*
root     nmbd       92548 14 udp4   192.168.7.250:138     *:*

Если на экране вы видите что-то подобное, то запуск самбы прошел успешно.
Создаем группы в системе, которым будут сопоставляться группы Windows.

# ldapaddgroup smb_pdc_admins
# ldapaddgroup smb_pdc_users
# ldapaddgroup smb_pdc_computers
# ldapaddgroup smb_pdc_guests

Далее нужно сопоставить группы винды группам системы:

# net groupmap add rid=512 unixgroup=smb_pdc_admins type=d ntgroup="Domain Admins"
# net groupmap add rid=513 unixgroup=smb_pdc_users type=domain ntgroup="Domain Users"
# net groupmap add rid=514 unixgroup=smb_pdc_guests type=domain ntgroup="Domain Guests"
# net groupmap add rid=515 unixgroup=smb_pdc_computers type=domain ntgroup="Domain Computers"

Посмотрим, что получилось:

# net groupmap list
Domain Admins (S-1-5-21-2073026716-1291088168-25512215-512) -> smb_pdc_admins
Domain Users (S-1-5-21-2073026716-1291088168-25512215-513) -> smb_pdc_users
Domain Computers (S-1-5-21-2073026716-1291088168-25512215-515) -> smb_pdc_computers
Domain Guests (S-1-5-21-2073026716-1291088168-25512215-514) -> smb_pdc_guests

Для разграничения прав к шарам я указал группы, которым разрешены либо чтение, либо запись. Их тоже нужно создать и сопоставить им виндовые группы:

# ldapaddgroup smb_video_read
# ldapaddgroup smb_video_write
# ldapaddgroup smb_music_read
# ldapaddgroup smb_music_write
# ldapaddgroup smb_distrib_read
# ldapaddgroup smb_distrib_write
# ldapaddgroup smb_wallpapers_read
# ldapaddgroup smb_wallpapers_write

# net groupmap add unixgroup=smb_video_read type=local ntgroup="Video Share Read"
# net groupmap add unixgroup=smb_video_write type=local ntgroup="Video Share Write"
# net groupmap add unixgroup=smb_music_read type=local ntgroup="Music Share Read"
# net groupmap add unixgroup=smb_music_write type=local ntgroup="Music Share Write"
# net groupmap add unixgroup=smb_distrib_read type=local ntgroup="Distrib Share Read"
# net groupmap add unixgroup=smb_distrib_write type=local ntgroup="Distrib Share Write"
# net groupmap add unixgroup=smb_wallpapers_read type=local ntgroup="Wallpapers Share Read"
# net groupmap add unixgroup=smb_wallpapers_write type=local ntgroup="Wallpapers Share Write"

Создаем администратора домена:

# ldapadduser nekit smb_pdc_admins
# smbpasswd -a nekit
New password: ***
Retype password: ***

Еще нужно дать группе или пользователю права на включение машин в домен и другие:

# net rpc rights grant "Domain Admins" SeMachineAccountPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeTakeOwnershipPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeBackupPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeRestorePrivilege -U nekit
# net rpc rights grant "Domain Admins" SeRemoteShutdownPrivilege -U nekit
# net rpc rights grant "Domain Admins" SePrintOperatorPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeAddUsersPrivilege -U nekit
# net rpc rights grant "Domain Admins" SeDiskOperatorPrivilege -U nekit

В принципе настройка контроллера домена закончена и можно включать компы в него. Для удобства администрирования пользователями и компами в домене NT4 есть утилиты от мелкософта srvtools. Так же если вы будете назначать групповые политики через файл NTconfig.pol, то понадобится тулза poledit и шаблоны для определенной версии винды (Windows 2000, Windows XP). Все утилиты были взяты из дистра винды NT4, а шаблоны берутся из серверной винды. На этом все, пользуемся...

Андрей А (не проверено)

Не будет у вас ничего работать, если сделаете по этой статье. В slapd.conf есть строчка "database        ldif". Т.е. подразумевается, что должна быть база, но автор не написал- на каком этапе она создается. Т.е. Лдап у вас просто не запустится, а значит, толку от статьи- ноль.

Дело в том, что вы видимо не понимаете как работает лдап. В статье указано как и чем наполняется свежеустановленный лдап сервер. Директива database используется для определения формата базы данных, а не пути расположения наполненной базы. Читайте внимательнее статью и документацию.

Может быть. Но вот я дошел до заполнения базы, ввожу ldapadd -x -D "cn=root,dc=srv-home,dc=local" -W -f main.ldif , ввожу пароль рута и мне пишет: ldap_bind: Invalid credentials (49) . Значит, все-таки где-то ошибка..

Данная ошибка говорит о том, что указан неверный логин или пароль. Перепроверьте этап задания пароля, может опечатались или неправильно его задали.

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Яндекс.Метрика