ALTDC: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Подготовка и установка необходимых пакетов)
м (Добавил лайфхак)
 
(не показано 128 промежуточных версий 1 участника)
Строка 5: Строка 5:
 
После обновления системы и ядра...
 
После обновления системы и ядра...
  
 +
Выставляем часовой пояс и синхронизируем время
 +
 +
timedatectl set-timezone Europe/Moscow
 +
ntpdate pool.ntp.org
 +
 +
Отключаем сервисы и устанавливаем необходимые пакеты
  
 
<pre>
 
<pre>
Строка 13: Строка 19:
 
==Подготовка конфигурационных файлов ситемы==
 
==Подготовка конфигурационных файлов ситемы==
  
  echo 'dc.domain.alt' > /etc/hostname
+
Задаём имя хоста
  /bin/rm -f /etc/samba/smb.conf
+
 
 +
  hostnamectl set-hostname dc.domain.alt
 +
 
 +
Также проверить и при необходимости поправить имя хоста в файле
 +
 
 +
  /etc/sysconfig/network
 +
 
 +
Перезагрузиться для проверки
 +
 
 +
reboot
 +
 
 +
Далее настраиваем 127.0.0.1 в качестве DNS сервера системы (далее в команде создания домена мы добавим возможность для этого DNS сервера делать запросы к внешним DNS серверам)
  
 
<pre>
 
<pre>
Строка 25: Строка 42:
 
EOF
 
EOF
 
</pre>
 
</pre>
 +
 +
Здесь приведена команда конфигурирования файла /etc/hosts, исходя из того, что у настраиваемого сервера локальный IP-адрес: 192.168.0.249
  
 
<pre>
 
<pre>
 
cat << EOF > /etc/hosts
 
cat << EOF > /etc/hosts
192.168.0.249 domain.alt
+
192.168.0.249 dc.domain.alt domain.alt
127.0.0.1 localhost
+
127.0.0.1 localhost
 
EOF
 
EOF
 
</pre>
 
</pre>
Строка 35: Строка 54:
 
==Создание домена одной командой==
 
==Создание домена одной командой==
  
Домен:
+
Перед выполнением команды создания домена нужно удалить конфигурационный файл:
 +
 
 +
/bin/rm -rf /etc/samba/smb.conf /var/lib/samba /var/cache/samba
 +
mkdir -p /var/lib/samba/sysvol
 +
 
 +
Для домена
  
 
  domain.alt
 
  domain.alt
  
Пароль:
+
с паролем
  
 
  Pa$$word
 
  Pa$$word
  
Адрес внешнего DNS сервера:
+
и адресом внешнего DNS сервера
  
 
  8.8.8.8
 
  8.8.8.8
  
Тогда команда будет:
+
команда создания домена будет такой:
  
 
  samba-tool domain provision --realm=domain.alt --domain domain --adminpass='Pa$$word' --dns-backend=SAMBA_INTERNAL --server-role=dc --option="dns forwarder=8.8.8.8"
 
  samba-tool domain provision --realm=domain.alt --domain domain --adminpass='Pa$$word' --dns-backend=SAMBA_INTERNAL --server-role=dc --option="dns forwarder=8.8.8.8"
Строка 77: Строка 101:
 
  /bin/cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
 
  /bin/cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
  
=Черновик=
 
Устанавливаем нужные пакеты task-samba-dc admc
 
  
Для создания домена Active Directory (далее -  AD), настраиваем на сервере статический ip-address и выставляем ДНС сервером себя 127.0.0.1. Далее в центре управления системой (https://localhost:8080) в разделе домен указываем "Имя домена" и выбираем "Тип домена" заполняем поля в дополнительных параметрах, нажимаем "применить".
+
==Управление пользователями из командной строки==
 +
 
 +
===Создать пользователя с паролем===
 +
 
 +
Например, создаём пользователя ivanov_ivan
 +
 
 +
samba-tool user create ivanov_ivan
 +
 
 +
Устанавливаем срок действия пароля
 +
 
 +
samba-tool user setexpiry ivanov_ivan
 +
 
 +
Создаём пользователя с указанием полного имени, адреса электронной почты и пароль будет действовать всегда
 +
 
 +
samba-tool user create ivanov_ivan --given-name='Иванов Иван' --mail-address='ivanovi@mail.ru'
 +
samba-tool user setexpiry ivanov_ivan --noexpiry
 +
 
 +
===Удалить пользователя===
 +
 
 +
samba-tool user delete ivanov_ivan
 +
 
 +
===Отключить пользователя===
 +
 
 +
samba-tool user disable ivanov_ivan
 +
 
 +
===Включить пользователя===
 +
 
 +
samba-tool user enable ivanov_ivan
 +
 
 +
===Изменить пароль пользователя===
 +
 
 +
samba-tool user setpassword ivanov_ivan
 +
 
 +
===Просмотреть доступных пользователей===
 +
 
 +
samba-tool user list
 +
 
 +
===Просмотр информации о пользователе===
 +
 
 +
samba-tool user show ivanov_ivan
 +
 
 +
или, чтобы узнать UID и GID (например, для установки владельца на каталог samba)
 +
 
 +
wbinfo -i ivanov_ivan
 +
 
 +
в ответ должно прийти что-то типа
 +
 
 +
DOMAIN\ivanov_ivan:*:3000023:100::/home/DOMAIN.ALT/ivanov_ivan:/bin/bash
 +
 
 +
где UID это 3000023 а GID это 100
 +
 
 +
===Создание домашнего каталога для пользователя===
 +
 
 +
Пока вручную. Ведётся работа над интеграцией соответствующего скрипта в процесс добавления пользователя в SAMBA
 +
 
 +
Перед выполнением команд добавления домашнего каталога на основе /etc/skel конкретно в контексте этой статьи нужно добавить в /etc/skel каталог, который позже буде монтироваться каждому пользователю посредством pam_mount. Для этого нужно выполнить команду
 +
 
 +
mkdir /etc/skel/share
 +
 
 +
далее на базе скелетона создаём каталог
 +
 
 +
cp -rp /etc/skel /home/DOMAIN.ALT/ivanov_ivan
 +
 
 +
потом меняем пользователя владельца и группу владельца на этот каталог на базе информации из wbinfo (пример команды -- выше)
  
При правильном заполнении полей, а также при наличии всех нужных пакетов, "Текущее состояние" - будет заполнено. После этого можно перезагрузить сервер.
+
chown 3000023:100 /home/DOMAIN.ALT/ivanov_ivan -R
  
 +
===Создание домашнего каталога для пользователя при первом входе===
 +
 +
В контексте этой статьи это решается запуском скрипта через параметр
 +
 +
root preexec = /usr/local/samba/bin/create_homedir %U
 +
 +
, добавленный к ресурсу
 +
 +
[share]
 +
 +
Задача, которую решает этот скрипт -- создание домашних каталогов для доменных пользователей на основе скелетона /etc/skel. В будущем это будет нужно для монтирования каталогов на клиентских машинах посредством pam_mount.
 +
 +
Полный конфиг ресурса
 +
 +
<pre>
 +
[share]
 +
        path = /home/DOMAIN.ALT/%U/share
 +
        root preexec = /usr/local/samba/bin/create_homedir %U
 +
        read only = No
 +
        browseable = yes
 +
        writable = yes
 +
        valid users = "@DOMAIN\Domain Users" "@DOMAIN\Domain Admins"
 +
</pre>
 +
 +
Параметр указывает на выполнение скрипта, параметром в который прилетает имя пользователя. Создаём скрипт
 +
 +
mkdir -p /usr/local/samba/bin/
 +
 +
<pre>
 +
cat << 'EOF' > /usr/local/samba/bin/create_homedir
 +
#!/bin/bash
 +
[ -z ${1} ] && echo "Try: $0 <username>" && exit 1
 +
user="${1}"
 +
homepath="/home/DOMAIN.ALT/${user}"
 +
[ -d ${homepath} ] || /bin/cp -rp /etc/skel ${homepath}
 +
[ -d ${homepath} ] && /bin/chown `wbinfo -i ${user} | awk -F ':' {'print $3 ":" $4'}` ${homepath} -R
 +
exit 0
 +
EOF
 +
</pre>
 +
 +
chmod +x /usr/local/samba/bin/create_homedir
 +
 +
mkdir /home/DOMAIN.ALT
 +
 +
Теперь при обращении пользователя к ресурсу [share] от суперпользователя будет запускаться скрипт, который:
 +
 +
1. Создаёт домашний каталог на основе /etc/skel (создаёт, только, если каталога несуществует)
 +
 +
2. Обновляет пользователя-владельца и группу-владельца для созданного каталога. UID пользователя-владельца и GID группы-владельца скрипт получает из команды (обновляет, только если каталог существует)
 +
wbinfo -i ${user} | awk -F ':' {'print $3 ":" $4'}
 +
 +
==Запуск ADMC==
 +
 +
Для корректной работы приложения ADMC необходимо получить билет Kerberos командой
 +
 +
kinit Administrator
 +
 +
В ответ необходимо ввести пароль от доменного администратора
 +
 +
 +
Чтобы это автоматизировать, можно, например, сделать скрипт автоматического запуска admc
 +
 +
<pre>
 +
cat << 'EOF' > /opt/admc.sh
 +
#!/bin/bash
 +
echo 'Pa$$word' | kinit Administrator
 +
admc
 +
EOF
 +
 +
chmod +x /opt/admc.sh
 +
</pre>
 +
 +
 +
Если необходимо, то:
 +
 +
ln -s /opt/admc.sh /home/administrator/Рабочий\ стол/
 +
 +
=Порядок ввода в домен компьютера под управлением ОС Альт Стартеркит MATE=
 +
 +
==Подготовка==
 +
 +
Устанавливаем пакеты
 +
 +
apt-get install alterator-auth sssd-ad samba-common-tools realmd
 +
 +
Выставляем часовой пояс и синхронизируем время
 +
 +
timedatectl set-timezone Europe/Moscow
 +
ntpdate pool.ntp.org
 +
 +
Задаём имя хоста
 +
 +
hostnamectl set-hostname host-arm01
 +
 +
Также проверить и при необходимости поправить имя хоста в файле
 +
 +
/etc/sysconfig/network
 +
 +
Перезагрузиться для проверки
 +
 +
reboot
 +
 +
==Ввод компьютера в домен одной командой==
 +
 +
 +
Команда ввода компьютера с именем хоста
 +
 +
host-arm01
 +
 +
в домен
 +
 +
domain.alt
 +
 +
с паролем
 +
 +
Pa$$word
 +
 +
будет такой:
 +
 +
system-auth write ad domain.alt host-arm01 domain 'administrator' 'Pa$$word'
 +
 +
 +
==Включить применение групповых политик==
 +
 +
apt-get install -y gpupdate alterator-auth alterator-gpupdate
 +
 +
gpupdate-setup write enable workstation
 +
 +
==Вывод компьютера из домена==
 +
 +
В контексте этой статьи компьютер из домена выводится командой, вводимой на самом компьютере (не на сервере):
 +
 +
realm leave domain.alt Administrator
 +
 +
Проверка текущего типа аутентификации
 +
 +
control system-auth
 +
 +
=Монтирование каталогов по SAMBA=
 +
 +
==На сервере==
 +
 +
===Добавляем параметры в конфиг самбы и перезапускаем сервис===
 +
 +
<pre>
 +
cat << 'EOF' >> /etc/samba/smb.conf
 +
[share]
 +
path = /home/DOMAIN.ALT/%U/share
 +
read only = No
 +
browseable = yes
 +
writable = yes
 +
valid users = "@DOMAIN\Domain Users" "@DOMAIN\Domain Admins"
 +
EOF
 +
</pre>
 +
 +
systemctl restart samba
 +
 +
==На клиентском компьютере, введённом в домен==
 +
 +
 +
===Устанавливаем необходимые пакеты===
 +
 +
apt-get install -y pam_mount cifs-utils systemd-settings-enable-kill-user-processes pam_script mate-file-manager-extensions fuse-smb gvfs-backend-smb
 +
 +
===Конфигурируем PAM===
 +
 +
Готовая команда для создания рабочего конфига
 +
 +
<pre>
 +
cat << 'EOF' > /etc/pam.d/system-auth-sss
 +
#%PAM-1.0
 +
 +
auth [success=5 perm_denied=ignore default=die] pam_localuser.so
 +
auth [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
 +
auth [default=1] pam_permit.so
 +
auth optional pam_mount.so
 +
auth substack system-auth-sss-only
 +
auth [default=1] pam_permit.so
 +
auth substack system-auth-local-only
 +
auth substack system-auth-common
 +
#auth optional pam_exec.so expose_authtok /opt/pam_exec_hook_auth
 +
 +
account [success=4 perm_denied=ignore default=die] pam_localuser.so
 +
account [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
 +
account [default=1] pam_permit.so
 +
account substack system-auth-sss-only
 +
account [default=1] pam_permit.so
 +
account substack system-auth-local-only
 +
account substack system-auth-common
 +
 +
password [success=4 perm_denied=ignore default=die] pam_localuser.so
 +
password [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
 +
password [default=1] pam_permit.so
 +
password substack system-auth-sss-only
 +
password [default=1] pam_permit.so
 +
password substack system-auth-local-only
 +
password substack system-auth-common
 +
 +
session [success=5 perm_denied=ignore default=die] pam_localuser.so
 +
session [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
 +
session [default=1] pam_permit.so
 +
session required pam_mkhomedir.so silent
 +
session optional pam_mount.so disable_interactive
 +
session substack system-auth-sss-only
 +
session [default=1] pam_permit.so
 +
session substack system-auth-local-only
 +
session substack system-auth-common
 +
session optional pam_script.so
 +
#session optional pam_exec.so /opt/pam_exec_hook_session
 +
EOF
 +
</pre>
 +
 +
Если этого конфига недостаточно чтобы заработало монтирование через pam_mount, то добавить эти две строчки
 +
 +
session        [success=1 default=ignore] pam_succeed_if.so  service = systemd-user
 +
session        optional        pam_mount.so disable_interactive
 +
 +
в конец файла
 +
 +
/etc/pam.d/system-auth
 +
 +
====Добавляем скрипт в pam_script====
 +
 +
Практика показала, что при завершении пользователем сеанса НЕ происходит отмонтирования сетевого каталога share. Поэтому пришлось дополнительно использовать pam_script и настроить для завершения сессии вот такой скрипт, который выполняет команду отмонтирования при завершении сессии (который, в отличии от <cifsumount></cifsumount> секции в конфиге pam_mount, работает корректно!).
 +
 +
Готовая команда для создания скрипта
 +
<pre>
 +
cat << 'EOF' > /etc/pam-script/pam-script.d/umount_share_if_ses_close
 +
#!/bin/bash
 +
systemd-mount -u /home/DOMAIN.ALT/${PAM_USER}/share
 +
exit 0
 +
EOF
 +
</pre>
 +
 +
===Разрешаем для всех доступ к fuse под root===
 +
 +
control fusermount public
 +
 +
===Проверка доступности ресурсов для пользователя===
 +
 +
В приведённой ниже команде проверяются ресурсы пользователя ivanov_ivan:
 +
 +
smbclient -L dc.domain.alt -U ivanov_ivan -m SMB2
 +
 +
===Монтирование ресурса вручную===
 +
 +
В приведённой ниже команде проверяются монтирование ресурса вручную для пользователя ivanov_ivan:
 +
 +
mount.cifs //dc.domain.alt/share ~/share -o vers=2.0,user=ivanov_ivan
 +
 +
Под вошедшим в ведённый в домен компьютер пользователем ivanov_ivan команда должна монтировать ресурс без запроса пароля!
 +
 +
Если проверка и монтирование вручную работает корректно, то можно настраивать pam_mount
 +
 +
====Конфигурируем pam_mount====
 +
 +
Делаем бэкап
 +
 +
cp /etc/security/pam_mount.conf.xml /etc/security/pam_mount.conf.xml.orig
 +
 +
Создаём сразу готовый файл конфигурации:
 +
 +
<pre>
 +
cat << 'EOF' > /etc/security/pam_mount.conf.xml
 +
<?xml version="1.0" encoding="utf-8" ?>
 +
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
 +
<pam_mount>
 +
    <debug enable="0" />
 +
    <volume uid="10000-2000200000" fstype="cifs" server="dc.domain.alt" path="share" mountpoint="~/share" options="sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775" />
 +
    <cifsmount>/sbin/mount.cifs //%(SERVER)/%(VOLUME) %(MNTPT) -o %(OPTIONS)</cifsmount>
 +
    <mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,sec" />
 +
    <mntoptions require="nosuid,nodev" />
 +
    <logout wait="0" hup="no" term="no" kill="no" />
 +
    <mkmountpoint enable="1" remove="true" />
 +
</pam_mount>
 +
EOF
 +
</pre>
 +
 +
===Основной принцип работы===
 +
 +
В контексте данной статьи сервер и pam_mount на клиентской машине настроены таким образом, чтобы при входе доменного пользователя в систему в домашний каталог этого пользователя автоматически подключался ресурс, который на компьютере пользователя будет находиться в каталоге
 +
 +
/home/DOMAIN.ALT/ivanov_ivan/share
 +
 +
и будет смонтирован в каталог на сервере с точно таким же расположением, т.е.
 +
 +
/home/DOMAIN.ALT/ivanov_ivan/share
 +
 +
Следовательно, локально пользователь ivanov_ivan будет работать на конкретной машине, введённой в домен в локальном каталоге
 +
 +
/home/DOMAIN.ALT/ivanov_ivan
 +
 +
и результат работы будет сохраняться только на локальной машине.
 +
 +
Но файлы, с которыми пользователь ivanov_ivan работает на локальной машине A именно в каталоге
 +
 +
/home/DOMAIN.ALT/ivanov_ivan/share
 +
 +
, будут фактически сохраняться в каталоге
 +
 +
/home/DOMAIN.ALT/ivanov_ivan/share
 +
 +
файлового сервера на машине контроллера домена (и не будут сохраняться в таком же каталоге локальной машины) и в случае, когда пользователь ivanov_ivan будет работать на машине B, введённой в этот же домен, то в каталоге
 +
 +
/home/DOMAIN.ALT/ivanov_ivan/share
 +
 +
пользователю ivanov_ivan будут доступны те же файлы, с которыми он работал на машине A.
 +
 +
=Готовые конфиги для клиента и сервера, в контексте задачи, описанной в данной статье=
 +
 +
==Для сервера==
 +
 +
===Файл /etc/samba/smb.conf===
 +
 +
<pre>
 +
# Global parameters
 +
[global]
 +
dns forwarder = 8.8.8.8
 +
netbios name = DC
 +
realm = DOMAIN.ALT
 +
server role = active directory domain controller
 +
workgroup = DOMAIN
 +
 +
[sysvol]
 +
path = /var/lib/samba/sysvol
 +
read only = No
 +
 +
[netlogon]
 +
path = /var/lib/samba/sysvol/domain.alt/scripts
 +
read only = No
 +
 +
[share]
 +
path = /home/DOMAIN.ALT/%U/share
 +
root preexec = /usr/local/samba/bin/create_homedir %U
 +
read only = No
 +
browseable = yes
 +
writable = yes
 +
valid users = "@DOMAIN\Domain Users" "@DOMAIN\Domain Admins"
 +
</pre>
 +
 +
===Вывод команды testparm===
 +
<pre>
 +
Load smb config files from /etc/samba/smb.conf
 +
Loaded services file OK.
 +
Weak crypto is allowed
 +
 +
Server role: ROLE_ACTIVE_DIRECTORY_DC
 +
 +
Press enter to see a dump of your service definitions
 +
 +
# Global parameters
 +
[global]
 +
dns forwarder = 8.8.8.8
 +
passdb backend = samba_dsdb
 +
realm = DOMAIN.ALT
 +
server role = active directory domain controller
 +
workgroup = DOMAIN
 +
rpc_server:tcpip = no
 +
rpc_daemon:spoolssd = embedded
 +
rpc_server:spoolss = embedded
 +
rpc_server:winreg = embedded
 +
rpc_server:ntsvcs = embedded
 +
rpc_server:eventlog = embedded
 +
rpc_server:srvsvc = embedded
 +
rpc_server:svcctl = embedded
 +
rpc_server:default = external
 +
winbindd:use external pipes = true
 +
idmap config * : backend = tdb
 +
map archive = No
 +
vfs objects = dfs_samba4 acl_xattr
 +
 +
 +
[sysvol]
 +
path = /var/lib/samba/sysvol
 +
read only = No
 +
 +
 +
[netlogon]
 +
path = /var/lib/samba/sysvol/domain.alt/scripts
 +
read only = No
 +
 +
 +
[share]
 +
path = /home/DOMAIN.ALT/%U/share
 +
read only = No
 +
root preexec = /usr/local/samba/bin/create_homedir %U
 +
valid users = "@DOMAIN\Domain Users" "@DOMAIN\Domain Admins"
 +
</pre>
 +
 +
===Файл /usr/local/samba/bin/create_homedir===
 +
<pre>
 +
#!/bin/bash
 +
[ -z ${1} ] && echo "Try: $0 <username>" && exit 1
 +
user="${1}"
 +
homepath="/home/DOMAIN.ALT/${user}"
 +
[ -d ${homepath} ] || /bin/cp -rp /etc/skel ${homepath}
 +
[ -d ${homepath} ] && /bin/chown `wbinfo -i ${user} | awk -F ':' {'print $3 ":" $4'}` ${homepath} -R
 +
exit 0
 +
</pre>
 +
 +
===Файл /etc/krb5.conf===
 +
<pre>
 +
[libdefaults]
 +
default_realm = DOMAIN.ALT
 +
dns_lookup_realm = false
 +
dns_lookup_kdc = true
 +
 +
[realms]
 +
DOMAIN.ALT = {
 +
default_domain = domain.alt
 +
}
 +
 +
[domain_realm]
 +
dc = DOMAIN.ALT
 +
</pre>
 +
 +
===Файл /etc/sysconfig/network===
 +
<pre>
 +
# When set to no, this may cause most daemons' initscripts skip starting.
 +
NETWORKING=yes
 +
 +
# Used by hotplug/pcmcia/ifplugd scripts to detect current network config
 +
# subsystem.
 +
CONFMETHOD=etcnet
 +
 +
# Used by rc.sysinit to setup system hostname at boot.
 +
HOSTNAME=dc.alt
 +
 +
# This is used by ALTLinux ppp-common to decide if we want to install
 +
# nameserver lines into /etc/resolv.conf or not.
 +
RESOLV_MODS=yes
 +
</pre>
 +
 +
===Файл /etc/resolv.conf===
 +
<pre>
 +
# Generated by resolvconf
 +
# Do not edit manually, use
 +
# /etc/net/ifaces/<interface>/resolv.conf instead.
 +
search domain.alt
 +
nameserver 127.0.0.1
 +
</pre>
 +
 +
===Файл /etc/hosts===
 +
<pre>
 +
192.168.0.249 dc.domain.alt domain.alt
 +
127.0.0.1 localhost
 +
</pre>
 +
 +
===Файл /etc/hostname===
 +
 +
dc.domain.alt
 +
 +
===Файл /opt/admc.sh===
 +
 +
Файл не обязательный. Просто синтаксический сахар для запуска admc без необходимости выполнять вручную kinit Administrator и вводить пароль.
 +
 +
<pre>
 +
#!/bin/bash
 +
echo 'Pa$$word' | kinit Administrator
 +
admc
 +
</pre>
 +
 +
Разместить симлинк на этот файл можно, например, так
 +
 +
ln -s /opt/admc.sh /home/administrator/Рабочий\ стол/
 +
 +
==Для клиента==
 +
 +
===Файл /etc/resolv.conf===
 +
 +
В этом примере файла адрес DNS сервера должен быть адресом домена, в который необходимо вводить клиента. Выше описана процедура развёртывания домена и сделан акцент на том, что домен через себя должен пропускать работу DNS сервера. Если DNS сервер не будет узнавать контроллер домена по имени, процедура ввода завершится с ошибкой.
 +
 +
<pre>
 +
/etc/resolv.conf
 +
# Generated by resolvconf
 +
# Do not edit manually, use
 +
# /etc/net/ifaces/<interface>/resolv.conf instead.
 +
search domain.alt
 +
nameserver 192.168.0.249
 +
</pre>
 +
 +
===Файл /etc/hosts===
 +
<pre>
 +
127.0.0.1 localhost.localdomain localhost
 +
</pre>
 +
 +
===Файл /etc/hostname===
 +
 +
host-arm01.domain.alt
 +
 +
===Файл /etc/sysconfig/network===
 +
<pre>
 +
# When set to no, this may cause most daemons' initscripts skip starting.
 +
NETWORKING=yes
 +
 +
# Used by hotplug/pcmcia/ifplugd scripts to detect current network config
 +
# subsystem.
 +
CONFMETHOD=etcnet
 +
 +
# Used by rc.sysinit to setup system hostname at boot.
 +
HOSTNAME=host-arm01.domain.alt
 +
 +
# This is used by ALTLinux ppp-common to decide if we want to install
 +
# nameserver lines into /etc/resolv.conf or not.
 +
RESOLV_MODS=yes
 +
</pre>
 +
 +
===Файл /etc/pam.d/system-auth-sss===
 +
<pre>
 +
#%PAM-1.0
 +
 +
auth [success=5 perm_denied=ignore default=die] pam_localuser.so
 +
auth [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
 +
auth [default=1] pam_permit.so
 +
auth optional pam_mount.so
 +
auth substack system-auth-sss-only
 +
auth [default=1] pam_permit.so
 +
auth substack system-auth-local-only
 +
auth substack system-auth-common
 +
 +
account [success=4 perm_denied=ignore default=die] pam_localuser.so
 +
account [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
 +
account [default=1] pam_permit.so
 +
account substack system-auth-sss-only
 +
account [default=1] pam_permit.so
 +
account substack system-auth-local-only
 +
account substack system-auth-common
 +
 +
password [success=4 perm_denied=ignore default=die] pam_localuser.so
 +
password [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
 +
password [default=1] pam_permit.so
 +
password substack system-auth-sss-only
 +
password [default=1] pam_permit.so
 +
password substack system-auth-local-only
 +
password substack system-auth-common
 +
 +
session [success=5 perm_denied=ignore default=die] pam_localuser.so
 +
session [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
 +
session [default=1] pam_permit.so
 +
session required pam_mkhomedir.so silent
 +
session optional pam_mount.so disable_interactive
 +
session substack system-auth-sss-only
 +
session [default=1] pam_permit.so
 +
session substack system-auth-local-only
 +
session substack system-auth-common
 +
session optional pam_script.so
 +
</pre>
 +
 +
===Файл /etc/security/pam_mount.conf.xml===
 +
<pre>
 +
<?xml version="1.0" encoding="utf-8" ?>
 +
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
 +
<pam_mount>
 +
    <debug enable="0" />
 +
    <volume uid="10000-2000200000" fstype="cifs" server="dc.domain.alt" path="share" mountpoint="~/share" options="sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775" />
 +
    <cifsmount>/sbin/mount.cifs //%(SERVER)/%(VOLUME) %(MNTPT) -o %(OPTIONS)</cifsmount>
 +
    <mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,sec" />
 +
    <mntoptions require="nosuid,nodev" />
 +
    <logout wait="0" hup="no" term="no" kill="no" />
 +
    <mkmountpoint enable="1" remove="true" />
 +
</pam_mount>
 +
</pre>
 +
 +
===Файл /etc/pam-script/pam-script.d/umount_share_if_ses_close===
 +
<pre>
 +
#!/bin/bash
 +
systemd-mount -u /home/DOMAIN.ALT/${PAM_USER}/share
 +
exit 0
 +
</pre>
 +
 +
=Пакетное добавление пользователей=
 +
 +
==Формат файла для импорта==
 +
 +
На примере файла с тремя пользователями...
 +
 +
Такой файл можно получить, например, на основе электронной таблицы .ods или .xls(x)
 +
 +
Формат и порядок столбцов данных следующий:
 +
 +
<pre>
 +
фамилия,имя,отчество,логин,емэйл,пароль
 +
</pre>
 +
 +
Файл демонстрирует то, что импортируемые пользователи могут не содержать имени или отчества, но на месте фамилии обязательно должен присутствовать какой-либо текст, должен быть обязательно логин, емэйл и пароль
 +
 +
<pre>
 +
cat << 'EOF' > /opt/users.csv
 +
Петрова,Мария,Ивановна,petrova_mi,petrova_mi@mail.ru,Qwe123!@#
 +
Сидоров,Иван,,sidorov_i,sidorov_i@mail.ru,Qwe123!@#
 +
Вася,,,vasya,vasya@mail.ru,Qwe123!@#
 +
EOF
 +
</pre>
 +
 +
==Скрипт для пакетного импорта==
 +
 +
<pre>
 +
cat << 'EOF' > /opt/batch_create_dc_users.sh
 +
#!/bin/bash
 +
 +
while read -r line;
 +
do
 +
f=`echo $line | awk -F ',' {'print $1'}`
 +
i=`echo $line | awk -F ',' {'print $2'}`
 +
o=`echo $line | awk -F ',' {'print $3'}`
 +
login=`echo $line | awk -F ',' {'print $4'}`
 +
email=`echo $line | awk -F ',' {'print $5'}`
 +
password=`echo $line | awk -F ',' {'print $6'}`
 +
 +
if [ -z $i ] && [ -z $o ]; then
 +
samba-tool user create "${login}" "${password}" --surname="${f}" --mail-address="${email}"
 +
else
 +
 +
given_name=''
 +
if [ -z $o ]; then
 +
given_name="${i}"
 +
else
 +
given_name="${i} ${o}"
 +
fi
 +
 +
samba-tool user create "${login}" "${password}" --surname="${f}" --given-name="${given_name}" --mail-address="${email}"
 +
fi
 +
 +
samba-tool user setexpiry "${login}" --noexpiry
 +
done < /opt/users.csv
 +
EOF
 +
</pre>
 +
 +
==Запуск скрипта==
 +
 +
chmod +x /opt/batch_create_dc_users.sh
 +
 +
/opt/batch_create_dc_users.sh
 +
 +
=Лайфхаки=
 +
 +
Отключаем требование сложного пароля:
 +
 +
<pre>
 +
# samba-tool domain passwordsettings set --complexity=off
 +
</pre>
  
Для того что бы пользоваться ADMC нужно произвести авторизацию в Kerberos командой kinit <имя пользователя> по умолчанию пользователь "Administrator"
+
=Источники=
Если возникает ошибка - Откройте от имени суперпользователя файл /etc/krb5.conf.
 
  
Проверяем что установлено значение false в строке "dns_lookup_realm = false".
+
В разном порядке использовались следующие источники
  
Раскомментируйте строку в [libdefaults] "default realm" и введите название области заглавными буквами.
+
[https://docs.altlinux.org/ru-RU/alt-kworkstation/10.0/html/alt-kworkstation/ch52s07.html]
  
Ниже, под строкой [realms] вместо EXAMPLE.COM введите название области, а вместо example.com в "default domain" введите IP-адрес сервера.
+
[https://docs.altlinux.org/ru-RU/alt-workstation/10.0/html/alt-workstation/ch44s06s02.html]
  
Под строкой [domain_realm] example.com и EXAMPLE.COM замените на ваш домен сохраняя регистр.
+
[https://docs.altlinux.org/ru-RU/alt-kworkstation/10.0/html/alt-kworkstation/system-management--sambadc--chapter.html]
  
 +
[https://docs.altlinux.org/ru-RU/domain/10.2/html/samba/index.html]
  
На клиенте устанавливаем пакет для наследования групповых политик alterator-gpudate
+
[https://www.altlinux.org/Fileserver_start]
Ставим статику и прописываем DNS - адрес сервера AD
 
  
Ввод в домен можно осуществить в разделе Аутентификация
+
[https://www.altlinux.org/ActiveDirectory/DC#Troubleshooting]
  
Выбрать пункт «Домен Active Directory», заполнить поля и нажать кнопку «Применить»
+
[https://docs.altlinux.org/ru-RU/domain/10.2/html/samba/ch07s09s02.html]
  
В открывшемся окне необходимо ввести имя пользователя, имеющего право вводить машины в домен, и его пароль и нажать кнопку «ОК»
+
[https://www.altlinux.org/ActiveDirectory/Login/DC]

Текущая версия на 17:03, 4 сентября 2024

Содержание

Порядок развёртывания на Альт Стартеркит MATE

Подготовка и установка необходимых пакетов

После обновления системы и ядра...

Выставляем часовой пояс и синхронизируем время

timedatectl set-timezone Europe/Moscow
ntpdate pool.ntp.org

Отключаем сервисы и устанавливаем необходимые пакеты

for service in smb nmb; do systemctl disable $service; systemctl stop $service; done
apt-get install -y task-samba-dc admc

Подготовка конфигурационных файлов ситемы

Задаём имя хоста

hostnamectl set-hostname dc.domain.alt

Также проверить и при необходимости поправить имя хоста в файле

/etc/sysconfig/network

Перезагрузиться для проверки

reboot

Далее настраиваем 127.0.0.1 в качестве DNS сервера системы (далее в команде создания домена мы добавим возможность для этого DNS сервера делать запросы к внешним DNS серверам)

cat << EOF > /etc/resolv.conf
# Generated by resolvconf
# Do not edit manually, use
# /etc/net/ifaces/<interface>/resolv.conf instead.
search alt
nameserver 127.0.0.1
EOF

Здесь приведена команда конфигурирования файла /etc/hosts, исходя из того, что у настраиваемого сервера локальный IP-адрес: 192.168.0.249

cat << EOF > /etc/hosts
192.168.0.249 dc.domain.alt domain.alt
127.0.0.1 localhost
EOF

Создание домена одной командой

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

/bin/rm -rf /etc/samba/smb.conf /var/lib/samba /var/cache/samba
mkdir -p /var/lib/samba/sysvol

Для домена

domain.alt

с паролем

Pa$$word

и адресом внешнего DNS сервера

8.8.8.8

команда создания домена будет такой:

samba-tool domain provision --realm=domain.alt --domain domain --adminpass='Pa$$word' --dns-backend=SAMBA_INTERNAL --server-role=dc --option="dns forwarder=8.8.8.8"

Включение сервиса и проверка работы домена

Включение

systemctl enable --now samba

Проверка

samba-tool domain info 127.0.0.1

В ответ должно прилететь что-то типа этого:

Forest           : domain.alt
Domain           : domain.alt
Netbios domain   : DOMAIN
DC name          : dc.domain.alt
DC netbios name  : DC
Server site      : Default-First-Site-Name
Client site      : Default-First-Site-Name

Настройка Kerberos

/bin/cp /var/lib/samba/private/krb5.conf /etc/krb5.conf


Управление пользователями из командной строки

Создать пользователя с паролем

Например, создаём пользователя ivanov_ivan

samba-tool user create ivanov_ivan

Устанавливаем срок действия пароля

samba-tool user setexpiry ivanov_ivan

Создаём пользователя с указанием полного имени, адреса электронной почты и пароль будет действовать всегда

samba-tool user create ivanov_ivan --given-name='Иванов Иван' --mail-address='ivanovi@mail.ru'
samba-tool user setexpiry ivanov_ivan --noexpiry

Удалить пользователя

samba-tool user delete ivanov_ivan

Отключить пользователя

samba-tool user disable ivanov_ivan

Включить пользователя

samba-tool user enable ivanov_ivan

Изменить пароль пользователя

samba-tool user setpassword ivanov_ivan

Просмотреть доступных пользователей

samba-tool user list

Просмотр информации о пользователе

samba-tool user show ivanov_ivan

или, чтобы узнать UID и GID (например, для установки владельца на каталог samba)

wbinfo -i ivanov_ivan

в ответ должно прийти что-то типа

DOMAIN\ivanov_ivan:*:3000023:100::/home/DOMAIN.ALT/ivanov_ivan:/bin/bash

где UID это 3000023 а GID это 100

Создание домашнего каталога для пользователя

Пока вручную. Ведётся работа над интеграцией соответствующего скрипта в процесс добавления пользователя в SAMBA

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

mkdir /etc/skel/share

далее на базе скелетона создаём каталог

cp -rp /etc/skel /home/DOMAIN.ALT/ivanov_ivan

потом меняем пользователя владельца и группу владельца на этот каталог на базе информации из wbinfo (пример команды -- выше)

chown 3000023:100 /home/DOMAIN.ALT/ivanov_ivan -R

Создание домашнего каталога для пользователя при первом входе

В контексте этой статьи это решается запуском скрипта через параметр

root preexec = /usr/local/samba/bin/create_homedir %U

, добавленный к ресурсу

[share]

Задача, которую решает этот скрипт -- создание домашних каталогов для доменных пользователей на основе скелетона /etc/skel. В будущем это будет нужно для монтирования каталогов на клиентских машинах посредством pam_mount.

Полный конфиг ресурса

[share]
        path = /home/DOMAIN.ALT/%U/share
        root preexec = /usr/local/samba/bin/create_homedir %U
        read only = No
        browseable = yes
        writable = yes
        valid users = "@DOMAIN\Domain Users" "@DOMAIN\Domain Admins"

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

mkdir -p /usr/local/samba/bin/
cat << 'EOF' > /usr/local/samba/bin/create_homedir 
#!/bin/bash
[ -z ${1} ] && echo "Try: $0 <username>" && exit 1
user="${1}"
homepath="/home/DOMAIN.ALT/${user}"
[ -d ${homepath} ] || /bin/cp -rp /etc/skel ${homepath}
[ -d ${homepath} ] && /bin/chown `wbinfo -i ${user} | awk -F ':' {'print $3 ":" $4'}` ${homepath} -R
exit 0
EOF
chmod +x /usr/local/samba/bin/create_homedir
mkdir /home/DOMAIN.ALT

Теперь при обращении пользователя к ресурсу [share] от суперпользователя будет запускаться скрипт, который:

1. Создаёт домашний каталог на основе /etc/skel (создаёт, только, если каталога несуществует)

2. Обновляет пользователя-владельца и группу-владельца для созданного каталога. UID пользователя-владельца и GID группы-владельца скрипт получает из команды (обновляет, только если каталог существует)

wbinfo -i ${user} | awk -F ':' {'print $3 ":" $4'}

Запуск ADMC

Для корректной работы приложения ADMC необходимо получить билет Kerberos командой
kinit Administrator

В ответ необходимо ввести пароль от доменного администратора


Чтобы это автоматизировать, можно, например, сделать скрипт автоматического запуска admc

cat << 'EOF' > /opt/admc.sh
#!/bin/bash
echo 'Pa$$word' | kinit Administrator
admc
EOF

chmod +x /opt/admc.sh


Если необходимо, то:

ln -s /opt/admc.sh /home/administrator/Рабочий\ стол/

Порядок ввода в домен компьютера под управлением ОС Альт Стартеркит MATE

Подготовка

Устанавливаем пакеты

apt-get install alterator-auth sssd-ad samba-common-tools realmd

Выставляем часовой пояс и синхронизируем время

timedatectl set-timezone Europe/Moscow
ntpdate pool.ntp.org

Задаём имя хоста

hostnamectl set-hostname host-arm01

Также проверить и при необходимости поправить имя хоста в файле

/etc/sysconfig/network

Перезагрузиться для проверки

reboot

Ввод компьютера в домен одной командой

Команда ввода компьютера с именем хоста

host-arm01

в домен

domain.alt

с паролем

Pa$$word

будет такой:

system-auth write ad domain.alt host-arm01 domain 'administrator' 'Pa$$word'


Включить применение групповых политик

apt-get install -y gpupdate alterator-auth alterator-gpupdate
gpupdate-setup write enable workstation

Вывод компьютера из домена

В контексте этой статьи компьютер из домена выводится командой, вводимой на самом компьютере (не на сервере):

realm leave domain.alt Administrator

Проверка текущего типа аутентификации

control system-auth

Монтирование каталогов по SAMBA

На сервере

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

cat << 'EOF' >> /etc/samba/smb.conf
[share]
	path = /home/DOMAIN.ALT/%U/share
	read only = No
	browseable = yes
	writable = yes
	valid users = "@DOMAIN\Domain Users" "@DOMAIN\Domain Admins"
EOF
systemctl restart samba

На клиентском компьютере, введённом в домен

Устанавливаем необходимые пакеты

apt-get install -y pam_mount cifs-utils systemd-settings-enable-kill-user-processes pam_script mate-file-manager-extensions fuse-smb gvfs-backend-smb

Конфигурируем PAM

Готовая команда для создания рабочего конфига

cat << 'EOF' > /etc/pam.d/system-auth-sss
#%PAM-1.0

auth [success=5 perm_denied=ignore default=die] pam_localuser.so
auth [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
auth [default=1] pam_permit.so
auth optional pam_mount.so
auth substack system-auth-sss-only
auth [default=1] pam_permit.so
auth substack system-auth-local-only
auth substack system-auth-common
#auth optional pam_exec.so expose_authtok /opt/pam_exec_hook_auth

account [success=4 perm_denied=ignore default=die] pam_localuser.so
account [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
account [default=1] pam_permit.so
account substack system-auth-sss-only
account [default=1] pam_permit.so
account substack system-auth-local-only
account substack system-auth-common

password [success=4 perm_denied=ignore default=die] pam_localuser.so
password [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
password [default=1] pam_permit.so
password substack system-auth-sss-only
password [default=1] pam_permit.so
password substack system-auth-local-only
password substack system-auth-common

session [success=5 perm_denied=ignore default=die] pam_localuser.so
session [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
session [default=1] pam_permit.so
session required pam_mkhomedir.so silent
session optional pam_mount.so disable_interactive
session substack system-auth-sss-only
session [default=1] pam_permit.so
session substack system-auth-local-only
session substack system-auth-common
session optional pam_script.so
#session optional pam_exec.so /opt/pam_exec_hook_session
EOF

Если этого конфига недостаточно чтобы заработало монтирование через pam_mount, то добавить эти две строчки

session         [success=1 default=ignore] pam_succeed_if.so  service = systemd-user
session         optional        pam_mount.so disable_interactive

в конец файла

/etc/pam.d/system-auth

Добавляем скрипт в pam_script

Практика показала, что при завершении пользователем сеанса НЕ происходит отмонтирования сетевого каталога share. Поэтому пришлось дополнительно использовать pam_script и настроить для завершения сессии вот такой скрипт, который выполняет команду отмонтирования при завершении сессии (который, в отличии от <cifsumount></cifsumount> секции в конфиге pam_mount, работает корректно!).

Готовая команда для создания скрипта

cat << 'EOF' > /etc/pam-script/pam-script.d/umount_share_if_ses_close
#!/bin/bash
systemd-mount -u /home/DOMAIN.ALT/${PAM_USER}/share
exit 0
EOF

Разрешаем для всех доступ к fuse под root

control fusermount public

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

В приведённой ниже команде проверяются ресурсы пользователя ivanov_ivan:

smbclient -L dc.domain.alt -U ivanov_ivan -m SMB2

Монтирование ресурса вручную

В приведённой ниже команде проверяются монтирование ресурса вручную для пользователя ivanov_ivan:

mount.cifs //dc.domain.alt/share ~/share -o vers=2.0,user=ivanov_ivan

Под вошедшим в ведённый в домен компьютер пользователем ivanov_ivan команда должна монтировать ресурс без запроса пароля!

Если проверка и монтирование вручную работает корректно, то можно настраивать pam_mount

Конфигурируем pam_mount

Делаем бэкап

cp /etc/security/pam_mount.conf.xml /etc/security/pam_mount.conf.xml.orig

Создаём сразу готовый файл конфигурации:

cat << 'EOF' > /etc/security/pam_mount.conf.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<pam_mount>
    <debug enable="0" />
    <volume uid="10000-2000200000" fstype="cifs" server="dc.domain.alt" path="share" mountpoint="~/share" options="sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775" />
    <cifsmount>/sbin/mount.cifs //%(SERVER)/%(VOLUME) %(MNTPT) -o %(OPTIONS)</cifsmount>
    <mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,sec" />
    <mntoptions require="nosuid,nodev" />
    <logout wait="0" hup="no" term="no" kill="no" />
    <mkmountpoint enable="1" remove="true" />
</pam_mount>
EOF

Основной принцип работы

В контексте данной статьи сервер и pam_mount на клиентской машине настроены таким образом, чтобы при входе доменного пользователя в систему в домашний каталог этого пользователя автоматически подключался ресурс, который на компьютере пользователя будет находиться в каталоге

/home/DOMAIN.ALT/ivanov_ivan/share

и будет смонтирован в каталог на сервере с точно таким же расположением, т.е.

/home/DOMAIN.ALT/ivanov_ivan/share

Следовательно, локально пользователь ivanov_ivan будет работать на конкретной машине, введённой в домен в локальном каталоге

/home/DOMAIN.ALT/ivanov_ivan

и результат работы будет сохраняться только на локальной машине.

Но файлы, с которыми пользователь ivanov_ivan работает на локальной машине A именно в каталоге

/home/DOMAIN.ALT/ivanov_ivan/share

, будут фактически сохраняться в каталоге

/home/DOMAIN.ALT/ivanov_ivan/share

файлового сервера на машине контроллера домена (и не будут сохраняться в таком же каталоге локальной машины) и в случае, когда пользователь ivanov_ivan будет работать на машине B, введённой в этот же домен, то в каталоге

/home/DOMAIN.ALT/ivanov_ivan/share

пользователю ivanov_ivan будут доступны те же файлы, с которыми он работал на машине A.

Готовые конфиги для клиента и сервера, в контексте задачи, описанной в данной статье

Для сервера

Файл /etc/samba/smb.conf

# Global parameters
[global]
	dns forwarder = 8.8.8.8
	netbios name = DC
	realm = DOMAIN.ALT
	server role = active directory domain controller
	workgroup = DOMAIN

[sysvol]
	path = /var/lib/samba/sysvol
	read only = No

[netlogon]
	path = /var/lib/samba/sysvol/domain.alt/scripts
	read only = No

[share]
	path = /home/DOMAIN.ALT/%U/share
	root preexec = /usr/local/samba/bin/create_homedir %U
	read only = No
	browseable = yes
	writable = yes
	valid users = "@DOMAIN\Domain Users" "@DOMAIN\Domain Admins"

Вывод команды testparm

Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed

Server role: ROLE_ACTIVE_DIRECTORY_DC

Press enter to see a dump of your service definitions

# Global parameters
[global]
	dns forwarder = 8.8.8.8
	passdb backend = samba_dsdb
	realm = DOMAIN.ALT
	server role = active directory domain controller
	workgroup = DOMAIN
	rpc_server:tcpip = no
	rpc_daemon:spoolssd = embedded
	rpc_server:spoolss = embedded
	rpc_server:winreg = embedded
	rpc_server:ntsvcs = embedded
	rpc_server:eventlog = embedded
	rpc_server:srvsvc = embedded
	rpc_server:svcctl = embedded
	rpc_server:default = external
	winbindd:use external pipes = true
	idmap config * : backend = tdb
	map archive = No
	vfs objects = dfs_samba4 acl_xattr


[sysvol]
	path = /var/lib/samba/sysvol
	read only = No


[netlogon]
	path = /var/lib/samba/sysvol/domain.alt/scripts
	read only = No


[share]
	path = /home/DOMAIN.ALT/%U/share
	read only = No
	root preexec = /usr/local/samba/bin/create_homedir %U
	valid users = "@DOMAIN\Domain Users" "@DOMAIN\Domain Admins"

Файл /usr/local/samba/bin/create_homedir

#!/bin/bash
[ -z ${1} ] && echo "Try: $0 <username>" && exit 1
user="${1}"
homepath="/home/DOMAIN.ALT/${user}"
[ -d ${homepath} ] || /bin/cp -rp /etc/skel ${homepath}
[ -d ${homepath} ] && /bin/chown `wbinfo -i ${user} | awk -F ':' {'print $3 ":" $4'}` ${homepath} -R
exit 0

Файл /etc/krb5.conf

[libdefaults]
	default_realm = DOMAIN.ALT
	dns_lookup_realm = false
	dns_lookup_kdc = true

[realms]
DOMAIN.ALT = {
	default_domain = domain.alt
}

[domain_realm]
	dc = DOMAIN.ALT

Файл /etc/sysconfig/network

# When set to no, this may cause most daemons' initscripts skip starting.
NETWORKING=yes

# Used by hotplug/pcmcia/ifplugd scripts to detect current network config
# subsystem.
CONFMETHOD=etcnet

# Used by rc.sysinit to setup system hostname at boot.
HOSTNAME=dc.alt

# This is used by ALTLinux ppp-common to decide if we want to install
# nameserver lines into /etc/resolv.conf or not.
RESOLV_MODS=yes

Файл /etc/resolv.conf

# Generated by resolvconf
# Do not edit manually, use
# /etc/net/ifaces/<interface>/resolv.conf instead.
search domain.alt
nameserver 127.0.0.1

Файл /etc/hosts

192.168.0.249 dc.domain.alt domain.alt
127.0.0.1	localhost

Файл /etc/hostname

dc.domain.alt

Файл /opt/admc.sh

Файл не обязательный. Просто синтаксический сахар для запуска admc без необходимости выполнять вручную kinit Administrator и вводить пароль.

#!/bin/bash
echo 'Pa$$word' | kinit Administrator
admc

Разместить симлинк на этот файл можно, например, так

ln -s /opt/admc.sh /home/administrator/Рабочий\ стол/

Для клиента

Файл /etc/resolv.conf

В этом примере файла адрес DNS сервера должен быть адресом домена, в который необходимо вводить клиента. Выше описана процедура развёртывания домена и сделан акцент на том, что домен через себя должен пропускать работу DNS сервера. Если DNS сервер не будет узнавать контроллер домена по имени, процедура ввода завершится с ошибкой.

/etc/resolv.conf
# Generated by resolvconf
# Do not edit manually, use
# /etc/net/ifaces/<interface>/resolv.conf instead.
search domain.alt
nameserver 192.168.0.249

Файл /etc/hosts

127.0.0.1	localhost.localdomain localhost

Файл /etc/hostname

host-arm01.domain.alt

Файл /etc/sysconfig/network

# When set to no, this may cause most daemons' initscripts skip starting.
NETWORKING=yes

# Used by hotplug/pcmcia/ifplugd scripts to detect current network config
# subsystem.
CONFMETHOD=etcnet

# Used by rc.sysinit to setup system hostname at boot.
HOSTNAME=host-arm01.domain.alt

# This is used by ALTLinux ppp-common to decide if we want to install
# nameserver lines into /etc/resolv.conf or not.
RESOLV_MODS=yes

Файл /etc/pam.d/system-auth-sss

#%PAM-1.0

auth [success=5 perm_denied=ignore default=die] pam_localuser.so
auth [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
auth [default=1] pam_permit.so
auth optional pam_mount.so
auth substack system-auth-sss-only
auth [default=1] pam_permit.so
auth substack system-auth-local-only
auth substack system-auth-common

account [success=4 perm_denied=ignore default=die] pam_localuser.so
account [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
account [default=1] pam_permit.so
account substack system-auth-sss-only
account [default=1] pam_permit.so
account substack system-auth-local-only
account substack system-auth-common

password [success=4 perm_denied=ignore default=die] pam_localuser.so
password [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
password [default=1] pam_permit.so
password substack system-auth-sss-only
password [default=1] pam_permit.so
password substack system-auth-local-only
password substack system-auth-common

session [success=5 perm_denied=ignore default=die] pam_localuser.so
session [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet
session [default=1] pam_permit.so
session required pam_mkhomedir.so silent
session optional pam_mount.so disable_interactive
session substack system-auth-sss-only
session [default=1] pam_permit.so
session substack system-auth-local-only
session substack system-auth-common
session optional pam_script.so

Файл /etc/security/pam_mount.conf.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<pam_mount>
    <debug enable="0" />
    <volume uid="10000-2000200000" fstype="cifs" server="dc.domain.alt" path="share" mountpoint="~/share" options="sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775" />
    <cifsmount>/sbin/mount.cifs //%(SERVER)/%(VOLUME) %(MNTPT) -o %(OPTIONS)</cifsmount>
    <mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,sec" />
    <mntoptions require="nosuid,nodev" />
    <logout wait="0" hup="no" term="no" kill="no" />
    <mkmountpoint enable="1" remove="true" />
</pam_mount>

Файл /etc/pam-script/pam-script.d/umount_share_if_ses_close

#!/bin/bash
systemd-mount -u /home/DOMAIN.ALT/${PAM_USER}/share
exit 0

Пакетное добавление пользователей

Формат файла для импорта

На примере файла с тремя пользователями...

Такой файл можно получить, например, на основе электронной таблицы .ods или .xls(x)

Формат и порядок столбцов данных следующий:

фамилия,имя,отчество,логин,емэйл,пароль

Файл демонстрирует то, что импортируемые пользователи могут не содержать имени или отчества, но на месте фамилии обязательно должен присутствовать какой-либо текст, должен быть обязательно логин, емэйл и пароль

cat << 'EOF' > /opt/users.csv 
Петрова,Мария,Ивановна,petrova_mi,petrova_mi@mail.ru,Qwe123!@#
Сидоров,Иван,,sidorov_i,sidorov_i@mail.ru,Qwe123!@#
Вася,,,vasya,vasya@mail.ru,Qwe123!@#
EOF

Скрипт для пакетного импорта

cat << 'EOF' > /opt/batch_create_dc_users.sh 
#!/bin/bash

while read -r line;
do
f=`echo $line | awk -F ',' {'print $1'}`
i=`echo $line | awk -F ',' {'print $2'}`
o=`echo $line | awk -F ',' {'print $3'}`
login=`echo $line | awk -F ',' {'print $4'}`
email=`echo $line | awk -F ',' {'print $5'}`
password=`echo $line | awk -F ',' {'print $6'}`

if [ -z $i ] && [ -z $o ]; then
samba-tool user create "${login}" "${password}" --surname="${f}" --mail-address="${email}"
else

given_name=''
if [ -z $o ]; then
given_name="${i}"
else
given_name="${i} ${o}"
fi

samba-tool user create "${login}" "${password}" --surname="${f}" --given-name="${given_name}" --mail-address="${email}"
fi

samba-tool user setexpiry "${login}" --noexpiry
done < /opt/users.csv
EOF

Запуск скрипта

chmod +x /opt/batch_create_dc_users.sh
/opt/batch_create_dc_users.sh

Лайфхаки

Отключаем требование сложного пароля:

# samba-tool domain passwordsettings set --complexity=off

Источники

В разном порядке использовались следующие источники

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]