SAMBA 4 как DC AD на FreeBSD с ZFS

 Цель

Поднять нечто напоминающее AD DC, но свободное от вирусов и с преимуществами ZFS. Имена пользователей AD должны регистрироваться в Unix.

Существует две стратегии управления AD в Samba4: Это с помощью средств управления AD в Windows, и с помощью богатейшего набора консольных утилит Samba4 в Unix. Сервер должен обеспечить прилипание к AD рабочих станций, и регистрацию их в DNS и DHCP. И вот тут всплывает явная недоделка Самбы! С одной стороны самба позволит управлять DNS с помощью средств Windows. Но управлять DHCP без кастылей и грубого напильника пока нельзя. Тут надо ждать интеграции DHCP в Samba4, если это вообще когда либо произойдет.

Потому, мы плюём на управление в Маздае, и сосредотачиваемся на скриптах.

Приступим:

Подготовка

portmaster net/ntp

ZFS

Создадим в ZFS нужные пулы:

zfs create -o aclmode=passthrough storage/Profiles
zfs create -o aclmode=passthrough storage/Users
zfs create -o aclmode=passthrough storage/acronis zfs create -o aclmode=passthrough storage/backup
zfs set compression=gzip-9 storage/backup
zfs create -o aclmode=passthrough storage/base
zfs create -o aclmode=passthrough storage/bookkeepers

zfs set aclinherit=passthrough storage/disk-z
zfs set aclmode=passthrough storage/disk-z

DNS

 

Существует несколько схем взаимодействия с DNS: SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE

По умолчанию, скрипт настройки самбы предлагает сделать себя саму DNS сервером. Но заталкивать все зоны в Самбу я не захотел. Потому выбрал BIND9_DLZ. Правда реализовано это все равно криво, так как ldab будет НЕ на привычном нам openldap, а встроенный в Самбу. Ну, да пёс ним.

На данном этапе, надо убрать (закомментировать) в named.conf вашу локальную зону, включая обратную если имеется, ибо она будет генериться динамически.

В /etc/resolv.conf обязательно укажите свой домен и ваш DNS.

cat << EOF > /etc/resolv.conf
search LOCAL.NET
domain local.net
nameserver 172.16.5.8
EOF

 

Установка SAMBA4

Вот тут есть важная деталь! На момент написания этой статьи в ходу имеется FreeBSD 10.0-RELEASE и FreeBSD 10.1-RELEASE

Если вы используете  FreeBSD 10.0-RELEASE, то не обновляйтесь до 10.1!!! Иначе появится глюк в виде дублирования имен папок и файлов в расшаренных ресурсах!

Если вы всеже обновились, то откатитесь обратно!!!

freebsd-update rollback

После того, как вы убедитесь, что у вас нечто подобное

uname -r
10.0-RELEASE-p18

Приступим к установке SAMBA4

pkg search samba4
samba4-4.0.26
samba41-4.1.18
samba42-4.2.2_1

Не ставьте samba42-4.2.2_1 !!! Иначе появится другой глюк в виде потери содержимого расшаренных ресурсов во время копирования или других операций. (сами файлы при этом не исчезают).

Потому ставим samba41-4.1.18.

portsnap fetch extract && portsnap fetch update
cd /usr/ports/net/samba41/
make config install

Снимок экрана от 2015-07-27 15:37:51

Настройка AD

Ldap

Настройка LDAP не является обязательной.
Можно на всякий случай

vi /usr/local/etc/openldap/ldap.conf
uri ldap://172.16.5.8
base DC=local,DC=net

ОБЯЗАТЕЛЬНО!

vi /etc/sysctl.conf
kern.maxfiles=25600
kern.maxfilesperproc=16384
net.inet.tcp.sendspace=65536
net.inet.tcp.recvspace=65536
sysctl kern.maxfiles=25600
sysctl kern.maxfilesperproc=16384
sysctl net.inet.tcp.sendspace=65536
sysctl net.inet.tcp.recvspace=65536

Настройка Самбы

Внимание! Если вы в качестве файловой системы используете ZFS, то добавьте параметр —use-ntvfs! Для обычной файловой системы не забудьте в fstab включить ACL.

Для ZFS

Перед настройкой, если конфигурили ранее и накосячии:

cp /usr/local/etc/smb4.conf /usr/local/etc/smb4.conf-backup
rm /usr/local/etc/smb4.conf
rm -rf /var/lib/samba/private/

Запускаем скрипт конфигурации Самбы:

samba-tool domain provision --use-rfc2307 --interactive --use-ntvfs

Внимание! Пароль админа вводите параноидальный! Разные регистры символов, цифры, и много букв! В противном случае скрипт остановится, и выругается на слабый пароль. Дурость какая то…

В Realm введите свой DNS-суффикс только заглавными буквами.
В DNS backend Выбираем «BIND9_DLZ»

Realm: LOCAL.NET
 Domain [LOCAL]: 
 Server Role (dc, member, standalone) [dc]: 
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: BIND9_DLZ
...

Как было выше сказано, политика паролей параноидальная. Посмотрим:

samba-tool domain passwordsettings show

Иногда от излишнего старания дети уродами рождаются 🙂
Для приведение ее в удобное для жизни состояние:

samba-tool domain passwordsettings set --complexity=off
samba-tool domain passwordsettings set --min-pwd-length=0

Теперь админу можно назначить пароль типа «1» 🙂

Ставим «нормальный» пароль админу:

smbpasswd administrator

Если во время установки не установилось или сборки не собралось:

cd /usr/ports/dns/samba-nsupdate
make install clean

Немного поправим конфиг и расшарим нужный ресурс

vi /usr/local/etc/smb4.conf
...
 idmap_ldb:use rfc2307 = yes 

 allow dns updates = nonsecure
 template shell = /bin/tcsh
 template homedir = /storage/Users/%ACCOUNTNAME%
 obey pam restrictions = yes 
 nsupdate command = /usr/local/bin/samba-nsupdate -g
 allow dns updates = nonsecure


[homes]
 path = /storage/Users
 read only = no

[profiles]
 path = /storage/Profiles
 read only = no

[netlogon]
 path = /var/db/samba4/sysvol/local.net/scripts
 read only = No

[sysvol]
 path = /var/db/samba4/sysvol
 read only = No

[disk-i]
 path = /storage/disk-i
 read only = No

...

[disk-z]
 path = /storage/disk-z
 read only = No

Окончательная настройка DNS

Добавьте в конце named.conf:

При настройке, Samba4 организует свой named.conf. Его лучше продгрузить в основной named.conf

vi /usr/local/etc/namedb/named.conf
include "/var/db/samba4/private/named.conf";

Теперь обязательно надо поправить /var/db/samba4/private/named.conf

По умолчанию там будет BIND 9.8.x. Но мы то скомпилили 9.9.x!!!

vi /var/db/samba4/private/named.conf
dlz "AD DNS Zone" {
    # For BIND 9.8.x
    # database "dlopen /usr/local/lib/shared-modules/bind9/dlz_bind9.so";

    # For BIND 9.9.x
    database "dlopen /usr/local/lib/shared-modules/bind9/dlz_bind9_9.so";

    # For BIND 9.10.x
    # database "dlopen /usr/local/lib/shared-modules/bind9/dlz_bind9_10.so";
};
service named restart
 vi /etc/nsswitch.conf

#group: compat
group_compat: nis
hosts: files dns
networks: files
#passwd: compat
passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files


passwd: files winbind
group: files winbin

 

Настройка Кербероса

Самба создаст конфиг тут: /usr/local/share/samba4..../setup/krb5.conf

В зависимости от версии Фрюхи, самба его ищет либо в /usr/local/etc/, либо в /etc. Ненавижу новаторов!

ln -s /usr/local/share/samba41/setup/krb5.conf /etc/
ln -s /usr/local/share/samba41/setup/krb5.conf /usr/local/etc/

vi /usr/local/etc/krb5.conf
[libdefaults]
        default_realm = LOCAL.NET

[realms]
        LOCAL.NET = { 
        kdc = 172.16.5.20
        }

[domain_realms]
        .local.net = LOCAL.NET

Проверка

samba -i -d3

В другом окне:

kinit Administrator@LOCAL.NET

Вводим пароль. В ответ должна быть тишина.

klist

Смотрим тикеты

Credentials cache: FILE:/tmp/krb5cc_0
Principal: Administrator@LOCAL.NET
Issued Expires Principal
Sep 10 19:07:50 2014 Sep 11 05:07:50 2014 krbtgt/LOCAL.NET@LOCAL.NET

Далее тестируем

samba_dnsupdate --verbose --all-names
host -t SRV _ldap._tcp.local.net.
_ldap._tcp.local.net has SRV record 0 100 389 bereg.local.net.
host -t SRV _kerberos._udp.local.net.
_kerberos._udp.local.net has SRV record 0 100 88 bereg.local.net.
host -t A bereg.local.net.

bereg.local.net has address 172.16.5.8

Добавление прав на дисковые операции

net rpc rights grant 'LOCAL\Domain Admins' SeDiskOperatorPrivilege -U'LOCAL\administrator' -I bereg.local.net

Посмотреть права:

net rpc rights list accounts -U'LOCAL\administrator' -I bereg.local.net

Настройка PAM

Это всё необходимо для того, чтобы пользователи из AD могли логиниться в Unix.

ln -s /usr/local/lib/pam_winbind.so /usr/lib/

Проверим

ldapsearch -D "cn=administrator,cn=Users,dc=local,dc=net" -W -x -b "cn=Users,dc=local,dc=net"

 

По умолчанию в качестве оболочки будет пустышка: /bin/false, что не позволит даже залогиниться.

Надо в smb4.conf добавить:

template shell = /bin/tcsh

Если пути для домашних каталогов не /home, то

template homedir = /storage/Users/%ACCOUNTNAME%
vi /usr/local/etc/smb4.conf

Добавить в [global]

vi /usr/local/etc/smb4.conf
template shell    = /bin/tcsh
template homedir  = /storage/Users/%ACCOUNTNAME%

Добавить строки pam_winbind.so

cd /etc/pam.d/
vi other
#
# $FreeBSD: release/10.0.0/etc/pam.d/other 197769 2009-10-05 09:28:54Z des $
#
# PAM configuration for the "other" service
#


# 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

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

# session
#session optional pam_ssh.so want_agent
session required pam_permit.so
session required /usr/local/lib/pam_mkhomedir.so skel=/etc/skel umask=0077

# password
password required pam_permit.so
vi sshd
#
# $FreeBSD: release/10.0.0/etc/pam.d/other 197769 2009-10-05 09:28:54Z des $
#
# PAM configuration for the "other" service
#


# 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

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

# session
#session optional pam_ssh.so want_agent
session required pam_permit.so
session required /usr/local/lib/pam_mkhomedir.so skel=/etc/skel umask=0077

# password
password required pam_permit.so

vi imap
#
# $FreeBSD: releng/10.1/etc/pam.d/imap 170771 2007-06-15 11:33:13Z yar $
#
# PAM configuration for the "imap" service
#

# auth
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


# account
#account	required	pam_nologin.so
account		required	pam_unix.so


account		sufficient	pam_krb5.so		no_warn try_first_pass
cat imap > pop3

Полезные комманды

Проверка работы:

sockstat | grep ":53"
sockstat -4
net ads info
wbinfo -p
wbinfo -g | sort
wbinfo -u | sort
wbinfo -i sergey
getent passwd
getent group
id sergey
/usr/local/bin/smbclient //bereg/homes -U Administrator -P -c 'ls'
kinit Administrator@LOCAL.NET
klist

samba-tool dns zonecreate <server> 16.172.in-addr.arpa

Пользователи

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

pdbedit -v -a -u dedulin -f "Дедюлин Пердюлин" -I "LOCAL" -D "U" -h "\\bereg\homes\dedulin" -p "\\bereg\profiles\dedulin" -S "it.bat"
mkdir /storage/Users/dedulin
chown dedulin:wheel /storage/Users/dedulin/

DNS

samba-tool dns zonecreate bereg 16.172.in-addr.arpa -UAdministrator%'1'
samba-tool dns add bereg local.net dedulin A 172.16.5.30 -UAdministrator%'1'
samba-tool dns add bereg local.net bereg MX 'mail.local.net 10' -UAdministrator%'1'
samba-tool dns add bereg local.net perdulin CNAME dedulin -UAdministrator%'1'
samba-tool dns add bereg 16.172.in-addr.arpa 30.5 PTR dedulin.local.net -UAdministrator%'1'

Запрос списка зон:

samba-tool dns zonelist 127.0.0.1 -U Administrator  -UAdministrator%'1'

Запрос информации о DNS зоне:

samba-tool dns zoneinfo 127.0.0.1 local.net -U Administrator -UAdministrator%'1'

Запрос всех DNS записей:

samba-tool dns query 127.0.0.1 local.net @ ALL -U Administrator

Запрос имени хоста (A)

samba-tool dns query bereg local.net tux A -U Administrator

Запрос имени хоста (PTR)

 samba-tool dns query bereg 16.172.in-addr.arpa 30.5 PTR -U Administrator%'1'
  Name=, Records=1, Children=0


1. Запрос списка зон:

samba-tool dns zonelist 127.0.0.1 -U Administrator

2. Запрос информации о DNS зоне:

samba-tool dns zoneinfo 127.0.0.1 local.acisi.ru -U Administrator

3. Запрос всех DNS записей:

samba-tool dns query 127.0.0.1 local.acisi.ru @ ALL -U Administrator

4. Смена типа DNS сервера (Встроенный/Bind9)

samba_upgradedns --dns-backend=[BIND9_DLZ|SAMBA_INTERNAL]

5. SOA запросы:

dig _msdcs.local.acisi.ru @127.0.0.1 SOA

 

Миграция пользователей:

На машине с созданными в Linux юзерами

 

 

ls /home >~/users.txt
scp ~/users.txt user@<сервер с samba4>:~/

На сервере с Samba4

pkg install python3
#!/usr/bin/env python3

import sys
import os


def ADD(username, fullname):
    cmd="""pdbedit -v -a -u {0} \
-f '{1}' \
-I 'LOCAL' \
-D 'U:' \
-h '\\\\BEREG\\homes\\{0}' \
-p '\\\\BEREG\\profiles\\{0}' \
-S 'manager.bat' \
-c '[X ]' \

mkdir /storage/Users/{0}

chown {0}:"Domain Users" /storage/Users/{0}
""".format(username, fullname)
    os.system(cmd)
    # print(cmd)

def INPUT():
    username = input('UserName: ')
    fullname = input('FullName: ')
    ADD(username, fullname)


if __name__ == '__main__':
    if len(sys.argv) > 1:
        if sys.argv[1] in ['-h', 'h', '--help']:
            print('smbrmuser.py username \'FullName\'')
            exit()
        else:
            username = sys.argv[1]
        if not sys.argv[2]:
            fullname = ""
        else:
            fullname = sys.argv[2]
            ADD(username, fullname)
    else:
        INPUT()

\\\\BEREG\ — Исправьте это на свои параметры, или если вы ни используете перемещаемый профиль, то оставьте одни кавычки.

/storage/Users/ — Это домики юзверей, обычно это «/home»

chmod +x smbadduser.py

.

tcsh
foreach x ( `cat ~/users.txt` )
printf "%s\n%s\n" pas pas | smbadduser.py $x $x && sleep 1
end

Тут в качестве пароля слово ‘pas’, учитывая, что юзвери сами могут изменить себе пароль. Ну, или поправьте скрипт для добавления пользователя, где пароль запрещен, и вы его выдадите сами. С виду немного сложно, наверно проще было бы использовать обычные утилиты для Samba4, но smbadduser.py можно использовать как диалоговый скрипт для добавления пользователей, или в строчку, и мне лениво было разбираться с подстановкой переменных в csh или bash:

smbadduser.py username 'Фамилия Имя Отчество'

 

 

.

 

 

 

.

Запись опубликована в рубрике FreeBSD с метками , , . Добавьте в закладки постоянную ссылку.

4 комментария на «SAMBA 4 как DC AD на FreeBSD с ZFS»

  1. олег55 говорит:

    зашел ради строчки «свободное от вирусов», т.к на фряхе 10.2 не могу поднять samba-virusfilter: самбу 4.3 собрал из портов, фильтер тоже из портов, а он не хочет работать (пишет undefined symbol). с гитхаба не могу поставить его, т.к. при установке ему нужны сорцы самбы, когда я ему вручную через ./configure —with-samba-source=/usr/ports/net/samba43/work/samba-4.3.3 прописываю путь в портах, то он его не ест: configure: error: Samba source has not been configured: ….work/samba-4.3.3/source3
    думал у вас найти инструкцию по установке вирусфильтра, но не нашел:(

    • Александр говорит:

      cd /usr/ports/net/samba43
      make configure
      и потом ставить samba-virusfilter из исходников

  2. Алексей говорит:

    Здесь написано в Настройка PAM —
    Добавить строки pam_winbind.so
    — но ни в один из трех файлов эта строка не добавлена. И зачем править файл —
    /etc/pam.d/imap

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Анти-спам: выполните заданиеWordPress CAPTCHA