ALTDC: различия между версиями
Vovan (обсуждение | вклад) (→Добавляем параметры в конфиг самбы и перезапускаем сервис) |
м (Добавил лайфхак) |
||
(не показано 59 промежуточных версий 1 участника) | |||
Строка 47: | Строка 47: | ||
<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 | ||
Строка 56: | Строка 56: | ||
Перед выполнением команды создания домена нужно удалить конфигурационный файл: | Перед выполнением команды создания домена нужно удалить конфигурационный файл: | ||
− | /bin/rm - | + | /bin/rm -rf /etc/samba/smb.conf /var/lib/samba /var/cache/samba |
+ | mkdir -p /var/lib/samba/sysvol | ||
Для домена | Для домена | ||
Строка 167: | Строка 168: | ||
chown 3000023:100 /home/DOMAIN.ALT/ivanov_ivan -R | 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== | ||
Строка 237: | Строка 289: | ||
system-auth write ad domain.alt host-arm01 domain 'administrator' '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 | ||
==Вывод компьютера из домена== | ==Вывод компьютера из домена== | ||
Строка 266: | Строка 325: | ||
systemctl restart samba | systemctl restart samba | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==На клиентском компьютере, введённом в домен== | ==На клиентском компьютере, введённом в домен== | ||
Строка 302: | Строка 331: | ||
===Устанавливаем необходимые пакеты=== | ===Устанавливаем необходимые пакеты=== | ||
− | apt-get install -y pam_mount cifs-utils systemd-settings-enable-kill-user-processes | + | 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=== | ===Конфигурируем PAM=== | ||
Строка 320: | Строка 349: | ||
auth substack system-auth-local-only | auth substack system-auth-local-only | ||
auth substack system-auth-common | 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=4 perm_denied=ignore default=die] pam_localuser.so |
− | account [success=1 default=bad]pam_succeed_if.so uid >= 500 quiet | + | account [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet |
account [default=1] pam_permit.so | account [default=1] pam_permit.so | ||
account substack system-auth-sss-only | account substack system-auth-sss-only | ||
Строка 340: | Строка 370: | ||
session [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet | session [success=1 default=bad] pam_succeed_if.so uid >= 500 quiet | ||
session [default=1] pam_permit.so | session [default=1] pam_permit.so | ||
− | session optional pam_mount.so | + | session required pam_mkhomedir.so silent |
+ | session optional pam_mount.so disable_interactive | ||
session substack system-auth-sss-only | session substack system-auth-sss-only | ||
session [default=1] pam_permit.so | session [default=1] pam_permit.so | ||
session substack system-auth-local-only | session substack system-auth-local-only | ||
session substack system-auth-common | 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 | EOF | ||
</pre> | </pre> | ||
+ | |||
+ | ===Разрешаем для всех доступ к fuse под root=== | ||
+ | |||
+ | control fusermount public | ||
===Проверка доступности ресурсов для пользователя=== | ===Проверка доступности ресурсов для пользователя=== | ||
Строка 359: | Строка 417: | ||
В приведённой ниже команде проверяются монтирование ресурса вручную для пользователя ivanov_ivan: | В приведённой ниже команде проверяются монтирование ресурса вручную для пользователя ivanov_ivan: | ||
− | mount.cifs //dc.domain.alt/ | + | mount.cifs //dc.domain.alt/share ~/share -o vers=2.0,user=ivanov_ivan |
Под вошедшим в ведённый в домен компьютер пользователем ivanov_ivan команда должна монтировать ресурс без запроса пароля! | Под вошедшим в ведённый в домен компьютер пользователем ivanov_ivan команда должна монтировать ресурс без запроса пароля! | ||
Строка 375: | Строка 433: | ||
<pre> | <pre> | ||
cat << 'EOF' > /etc/security/pam_mount.conf.xml | cat << 'EOF' > /etc/security/pam_mount.conf.xml | ||
− | |||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | ||
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd"> | <!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 | EOF | ||
</pre> | </pre> | ||
− | |||
===Основной принцип работы=== | ===Основной принцип работы=== | ||
Строка 422: | Строка 477: | ||
пользователю ivanov_ivan будут доступны те же файлы, с которыми он работал на машине A. | пользователю 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> | ||
− | + | =Источники= | |
− | |||
− | + | В разном порядке использовались следующие источники | |
− | + | [https://docs.altlinux.org/ru-RU/alt-kworkstation/10.0/html/alt-kworkstation/ch52s07.html] | |
− | + | [https://docs.altlinux.org/ru-RU/alt-workstation/10.0/html/alt-workstation/ch44s06s02.html] | |
− | + | [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] | ||
− | + | [https://www.altlinux.org/Fileserver_start] | |
− | |||
− | + | [https://www.altlinux.org/ActiveDirectory/DC#Troubleshooting] | |
− | + | [https://docs.altlinux.org/ru-RU/domain/10.2/html/samba/ch07s09s02.html] | |
− | + | [https://www.altlinux.org/ActiveDirectory/Login/DC] |
Текущая версия на 17:03, 4 сентября 2024
Содержание
- 1 Порядок развёртывания на Альт Стартеркит MATE
- 1.1 Подготовка и установка необходимых пакетов
- 1.2 Подготовка конфигурационных файлов ситемы
- 1.3 Создание домена одной командой
- 1.4 Включение сервиса и проверка работы домена
- 1.5 Настройка Kerberos
- 1.6 Управление пользователями из командной строки
- 1.6.1 Создать пользователя с паролем
- 1.6.2 Удалить пользователя
- 1.6.3 Отключить пользователя
- 1.6.4 Включить пользователя
- 1.6.5 Изменить пароль пользователя
- 1.6.6 Просмотреть доступных пользователей
- 1.6.7 Просмотр информации о пользователе
- 1.6.8 Создание домашнего каталога для пользователя
- 1.6.9 Создание домашнего каталога для пользователя при первом входе
- 1.7 Запуск ADMC
- 2 Порядок ввода в домен компьютера под управлением ОС Альт Стартеркит MATE
- 3 Монтирование каталогов по SAMBA
- 4 Готовые конфиги для клиента и сервера, в контексте задачи, описанной в данной статье
- 5 Пакетное добавление пользователей
- 6 Лайфхаки
- 7 Источники
Порядок развёртывания на Альт Стартеркит 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>
#!/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
Источники
В разном порядке использовались следующие источники