Мне понадобилось настроить авторизацию доменный учетных записей Active Directory по ssh на linux сервер. В моем случае это будет система CentOS 7. Данная возможность будет очень удобна для организаций с внедренной доменной структурой Windows. С помощью групп доступа в AD вы сможете централизованно управлять доступом к linux серверам.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Реклама ИП Скоромнов Д.А. ИНН 331403723315
Содержание:
Подготовка сервера
Если у вас еще нет готового сервера, то можете воспользоваться моими материалами на эту тему - установка и настройка centos 7. Так же рекомендую настроить iptables для корректной работы сервера с доменом windows. Далее я не буду каcаться этого вопроса, мы просто отключим фаерволл, потому что его настройка не тема этой статьи.
| xs.local | название домена |
| 10.1.3.4 | ip адрес контроллера домена |
| xs-winsrv.xs.local | полное имя контроллера домена |
| xs-centos7-test | имя сервера centos, который вводим в домен |
| administrator | учетная запись администратора домена |
| gr_linux_adm | группа в AD, для которой разрешено подключение к серверам по ssh |
| lin-user | учетная запись в AD для проверки подключений по ssh |
Выключаем firewalld:
# systemctl stop firewalld && systemctl disable firewalld
Настроим синхронизацию времени с контроллером домена. Это важно, у вас должно быть одинаковое время с контроллером домена. Проверьте его и убедитесь, что стоят одинаковые часовые пояса.
Устанавливаем утилиту для синхронизации времени chrony:
# yum install chrony
Добавляем в конфиг /etc/chrony.conf адрес контроллера домена. И делаем его единственным сервером для синхронизации, остальные удаляем.
server xs-winsrv.xs.local iburst
Сохраняем конфиг, запускаем chrony и добавляем в автозагрузку.
# systemctl start chronyd && systemctl enable chronyd
Проверим, что с синхронизацией.
# cat /var/log/messages | grep chronyd Jul 12 17:58:38 xs-centos7-test chronyd[10620]: chronyd version 2.1.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +DEBUG +ASYNCDNS +IPV6 +SECHASH) Jul 12 17:58:38 xs-centos7-test chronyd[10620]: Frequency 0.000 +/- 1000000.000 ppm read from /var/lib/chrony/drift Jul 12 17:02:54 xs-centos7-test chronyd[10620]: Selected source 10.1.3.4 Jul 12 17:02:54 xs-centos7-test chronyd[10620]: System clock wrong by -3348.457170 seconds, adjustment started Jul 12 17:02:54 xs-centos7-test chronyd[10620]: System clock was stepped by -3348.457170 seconds
Все в порядке. Синхронизировали время с контроллером домена. По логу видно, что время на сервере убежало вперед на 56 минут, но мы это исправили.
Подключение CentOS 7 к домену
Устанавливаем софт, который нам понадобится, для корректного ввода centos в домен windows.
# yum install realmd sssd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools
Вводим Centos 7 в домен:
# realm discover XS.LOCAL xs.local type: kerberos realm-name: XS.LOCAL domain-name: xs.local configured: no server-software: active-directory client-software: sssd required-package: oddjob required-package: oddjob-mkhomedir required-package: sssd required-package: adcli required-package: samba-common-tools
# realm join -U administrator XS.LOCAL Password for administrator:
Если не получили никакой ошибки, значит все прошло нормально. Можно зайти на контроллер домена и проверить, появился ли наш linux сервер в домене.

Изменим немного конфиг sssd для того, чтобы не нужно было вводить полное имя домена при логине, а только username.
# mcedit /etc/sssd/sssd.conf
use_fully_qualified_names = False
Разрешаем доменным пользователям создавать домашние директории:
# authconfig --enablemkhomedir --enablesssdauth --updateall
Запускаем службу sssd и добавляем в автозагрузку:
# systemctl enable sssd.service && systemctl restart sssd
Проверяем авторизацию по ssh, подключившись по любой доменной учетной записи.

Для пользователя будет создана домашняя директория /home/lin-user@xs.local.
Ограничение доступа ssh по группам и пользователям домена
На текущий момент подключиться к серверу может любой пользователь домена. Исправим это и разрешим подключаться только пользователям из группы gr_linux_adm. Для этого правим конфиг /etc/sssd/sssd.conf, добавляя туда новые параметры.
# mcedit /etc/sssd/sssd.conf
access_provider = simple simple_allow_users = user55@xs.local simple_allow_groups = gr_linux_adm@xs.local
Обращаю внимание, что параметр access_provider у вас уже будет установлен в другое значение. Надо это изменить. Вы можете добавить разрешение как для конкретного пользователя, так и для целых групп. Сохраняйте конфиг и перезапускайте sssd.
# systemctl restart sssd
Теперь подключиться по ssh к серверу сможет только пользователь домена user55 и все члены группы gr_linux_adm.
Для разбора полетов и решения проблем нужно использовать лог файл - /var/log/secure. Вот пример успешного подключения:
Jul 12 18:10:44 xs-centos7-test sshd[4163]: pam_sss(sshd:auth): authentication success; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.1.3.221 user=lin-user Jul 12 18:10:44 xs-centos7-test sshd[4163]: Accepted password for lin-user from 10.1.3.221 port 51063 ssh2 Jul 12 18:10:45 xs-centos7-test sshd[4163]: pam_unix(sshd:session): session opened for user lin-user by (uid=0)
А вот кусок лога подключения доменного пользователя, для которого доступ по ssh закрыт.
Jul 12 18:08:28 xs-centos7-test sshd[4059]: pam_sss(sshd:auth): authentication success; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.1.3.221 user=vzap Jul 12 18:08:28 xs-centos7-test sshd[4059]: pam_sss(sshd:account): Access denied for user vzap: 6 (Permission denied) Jul 12 18:08:28 xs-centos7-test sshd[4059]: Failed password for vzap from 10.1.3.221 port 51057 ssh2 Jul 12 18:08:28 xs-centos7-test sshd[4059]: fatal: Access denied for user vzap by PAM account configuration [preauth]
Здесь видно, что идентификация пользователя прошла корректно, но доступ к серверу запрещен.
Ограничение доступа к sudo по доменным группам
Ограничение доступа к ssh по группам и пользователям настроили, теперь надо разрешить доменным учетным записям получать права суперпользователя в системе. Сейчас у них нет такой возможности.
[sudo] password for lin-user: lin-user is not in the sudoers file. This incident will be reported.
Создаем новый файл в директории /etc/sudoers.d.
# mcedit /etc/sudoers.d/xs
%gr_linux_adm@xs.local ALL=(ALL) ALL
Выставляем минимальные права на файл:
# chmod 0440 /etc/sudoers.d/xs
Теперь вы можете зайти в систему доменной учетной записью из группы gr_linux_adm и получить полные права в системе.
Реализовать то же самое можно было через настройки sssd. В его конфиге можно было указать группы, которым разрешен доступ к sudo. Но в целом это не принципиально. Так, как сделал я, мне показалось проще. Не нужно использовать полные имена объектов в AD, в которых легко запутаться, особенно тем, кто не очень в этом ориентируется. Мне же понадобились только конечные имена групп. Более подробно об этом можно почитать в руководстве redhat. Ссылку приведу в конце.
Заключение
На этом все. Я рассмотрел наиболее типовую ситуацию, которая может быть полезной при использовании структуры AD совместно с linux серверами. При написании статьи использовал официальные руководства:
- Deployment, Configuration and Administration of Red Hat Enterprise Linux 6
- sssd.conf - Linux man page
Почему-то из руководства по RHEL 7 раздел, посвещенный SSSD убрали, хотя в 5 и 6 есть. Может просто я не заметил, так как структура сильно поменялась. Люблю я CentOS в первую очередь за отличную документацию Redhat. Там есть подробное описание практически всего, с чем приходилось сталкиваться. Надо только не лениться в английском языке разбираться.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Реклама ИП Скоромнов Д.А. ИНН 331403723315
Server Admin Авторский блог системного администратора


а с помощью этого способа заработает доменная авторизация для сервера 1с установленного на этом же centos?
Скорее всего нет. С 1С решать вопрос нужно будет отдельно. Я не знаю как, не занимался никогда.
К разделу "Ограничение доступа ssh по группам и пользователям домена".
Не получилось настроить так, как описывает автор. Однако, почитав
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/sssd-configure-additional-provider-options
оставил
access_provider = ad
а ограничил доступ группами ADDS, используя фильтр
ad_access_filter = (|(memberOf=cn=sudoers,ou=IT DEP,dc=example,dc=com)(memberOf=cn=sshers,ou=IT DEP,dc=example,dc=com))
где sudoers и sshers - имена групп, "IT DEP" - контейнер, в котором эти группы размещены. В общем, это полные distinguishedName этих групп, перечисленные через "или" - символ "|" сразу за первой скобкой.
Мне помогла когда загонял в другой домен и сломалась база.
systemctl stop sssd
# rm -f /var/lib/sss/db/*
# rm -f /var/lib/sss/mc/*
# systemctl start sssd
Добрый день. Добавил в домен веб-сервер.
Его учетка, httpd, пытается аутентифицироваться в домене, в домене нет такой учетки.
Как можно запретить доменную аутентификацию для учетной записи веб-сервера?
Я не помню точно подробностей, но есть настройка на тему того, где проверять учетные записи. Сначала там должны быть указаны локальные учетки, потом все остальные. Кажется в /etc/nsswitch.conf.
>Создаем новый файл в директории /etc/sudoers.d.
># mcedit /etc/sudoers.d/xs
Почему тут используется не полное название домена, а просто xs?
Не помню уже, но у меня работало с такими настройками.
Имя файла значения не имеет. Это просто файл. Как я понял, демон просто просматривает все файлы в директории, и считывает их. А имена - по боку.
С чем может быть связана эта ошибка сразу после realm join ?
[root@localhost ~]# journalctl REALMD_OPERATION=r2487182.19481
-- Logs begin at Tue 2018-11-13 15:15:08 MSK, end at Wed 2018-12-12 10:08:07 MSK. --
Dec 12 10:08:03 dev.domain.ru realmd[19484]: * Resolving: _ldap._tcp.domain.ru
Dec 12 10:08:03 dev.domain.ru realmd[19484]: * Performing LDAP DSE lookup on: 10.193.21.11
Dec 12 10:08:03 dev.domain.ru realmd[19484]: * Performing LDAP DSE lookup on: 10.7.21.11
Dec 12 10:08:03 dev.domain.ru realmd[19484]: * Performing LDAP DSE lookup on: 10.7.21.13
Dec 12 10:08:03 dev.domain.ru realmd[19484]: * Successfully discovered: domain.ru
Dec 12 10:08:07 dev.domain.ru realmd[19484]: * Required files: /usr/sbin/oddjobd, /usr/libexec/oddjob/mkhomedir, /usr/sbin/sssd, /usr/bin/net
Dec 12 10:08:07 dev.domain.ru realmd[19484]: * LANG=C LOGNAME=root /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.U5L0TZ -U user.user ads join domain.ru
Dec 12 10:08:07 dev.domain.ru realmd[19484]: Enter user.user's password:
Dec 12 10:08:07 dev.domain.ru realmd[19484]: Failed to join domain: failed to join domain 'domain.ru' over rpc: Insufficient quota exists to complete the operation.
Dec 12 10:08:07 dev.domain.ru realmd[19484]: ! Joining the domain domain.ru failed
Помогло добавление вручную этого компьютера в AD.
После этого realm join сработал.
Сорри, а где описана установка параметра hostname на сервере?
Не совсем понятно, в каком виде должен быть хостнейм на момент, когда сервер требуется ввести в домен
Он должен быть вида "name" или "name.domain" ?
name
Вы не можете включить в домен хост, который уже принадлежит домену.
Нашел единственную статью на эту тему (http://www.pivpav.com/post/166), но там все довольно скомкано, человек рассказывает явно для более опытных пользователей CentOS 7. У Вас же все расписанно более подробно, для новичков. Может быть удасться получить более развернутую инструкцию от Вас, если идея понравится.
Прочитал. В целом, в статье ничего сложного нет. Если удалось настроить по этой статье, то и по той тоже получится. По сути надо только сделать скрипт на ruby, проверить его работоспособность и добавить его в конфиг sshd, как указано у автора. Схема, судя по всему, рабочая получается, но реально костыльная. Я не знаю, насколько это все оправданно. Лично я не считаю авторизацию по сертификатам удобнее и безопаснее хороших паролей. Реально безопасно, это когда сертификат и пароль. А когда что-то одно из этого, то разницы принципиальной не вижу. Вопрос удобства. Лично я предпочитаю пароли.
К сожалению, я не смог найти второй пакет для установки, ruby-ldap , ruby и ruby-net-ldap ставятся, второй же не находится, пробовал добавлять репозитории, все по Вашим статьям, спасибо огромное, но этот пакет почему то не находит для установки. А скрипт у меня не работает, причина может быть в том, что не доставились нужные компоненты.
Да, тут уже разбираться надо более детально. Скорее всего пакет стал называться немного по-другому, или под текущую версию ruby его нет.
Подскажите, а как бы Вы реализовали подобную задачу? Соотнося с Вашей статьей по вводу CentoS 7 в AD?
Я пытался использовать его скрипт на Ваше подключение, но не работает, ключ не возвращается при запросе, видимо дело в разных переменных которые указаны в sssd.config у него и при добавление по Вашей инструкции... адаптировать же его скрипт у меня так и не получилось =( Вести пк в домен по его инструкции так же не вышло, куда не кинь, везде клин =(
Я бы так делать в принципе не стал. Пересекать linux и windows без крайней необходимости не стоит. Мне хватает того, что файловые сервера с samba периодически после обновления выпадают из домена или появляются проблемы с доступом и правами. Это все очень усложняет сопровождение.
А если вам все же это надо, то придется разбираться, причем именно самому от и до, чтобы потом получалось решать возникающие проблемы.
Добрый день!
Эксперемент завершился удачно, удалось настроить авторизацию по ssh ключам модернизировав скрип из той статьи.
Правда я чуть красивее сделал, добавил новый атрибут пользователям в AD назвал его sshPublicKeys, что б не городить огород с вкаладкой notes и прочее.
К сожалению, не от меня зависело, была задача, надо сделать, пришлось крутиться =)
Спасибо Вам большое! =)
P:S прошу прощения, случайно отправил в общую ленту еще... так получилось, если мешается, удалите, пожалуйста.
Можете свой скрипт привести? Это может быть полезно остальным.
Да, конечно. Хотя он не сильно отличается, вместо атрибута info указан атрибут sshPublicKeys и в config убрана папка, скрипт ищет по всему AD
#!/usr/bin/ruby
require 'rubygems'
require 'net/ldap'
exit 0 if ARGV == []
username = ARGV[0]
config = {
:host => "domain.com",
:port => 389,
:username => "administrator@domain.com",
:password => "password administrator",
:base => "DC=domain,DC=com",
}
ldap = Net::LDAP.new :host => config[:host],
:port => config[:port],
:auth => {
:method => :simple,
:username => config[:username],
:password => config[:password],
}
filter = Net::LDAP::Filter.eq "sAMAccountName", username
attributes = ["sshPublicKeys"]
ldap.search(:base => config[:base], :filter => filter, :attributes => attributes ) do |entry|
puts entry[:sshPublicKeys].first
end
И ф файле /etc/ssd/sshd_config раскоментим строки
AuthorizedKeysCommand /usr/bin/you_script
AuthorizedKeysCommandUser nobody
На контроллере домена, пользователям нужно добавить артибут sshPublicKeys и внести туда открытую часть ключа, ну или если не хочется мучиться с добавлением, можно указать ключ в поле Notes вкладки Telefones и в скрипте указать вместо sshPublicKeys атрибут info
Как то так =)
А есть возможность еще расширить функционал? Хранить в домене ключи ssh и сделать авторизацию по ним?
Добрый день!
Подскажите как перезавести ПК на Linux в домен еще раз, в том случае если удалил его из UA в домене?
Просто ввести его еще раз, точно так же, как и первый раз. На самой системе ничего делать не надо.
[root@localhost ~]# realm discover domain
realm: Couldn't connect to realm service: Error calling StartServiceByName for org.freedesktop.realmd: Timeout was reached
realm discover XXX-XXXXXX.RU
realm: Couldn't connect to realm service: Ошибка вызова StartServiceByName для org.freedesktop.realmd: GDBus.Error:org.freedesktop.DBus.Error.TimedOut: Activation of org.freedesktop.realmd timed out
Что может послужить проблемой?
Мне помогло перезагрузить систему, ну так на сайте RedHad написали ...
И снова здравствуйте, нужен совет, после внедрения ПК в домен возникла потребность выполнения скрипта, который при авторизации доменного пользователя в его директорию /home/(domain)/(user)/mounfolder монтировал определенную шару допустим \\NFS\(SomeGroup_folder). Просто для Виндовых юзеров есть NETLOGON\disk.bat в котором указано кому и какую шару подключать, а вот в Linux мне не особо понятно как это сделать. На просторах ближе всего подходит метод с библиотекой libpam-moun, но вопрос решит ли она мне эту проблему?
Точно не знаю. В винде это решается на уровне групповых политик домена windows. Соответственно, тут тоже должен быть какой-то инструмент, аналог этих политик, для выполнения каких-то действий при логине. Но если речь конкретно про подключение диска, которое можно описать простым sh скриптом, то можно попробовать реализовать запуск скрипта при логоне с помощью .bash_login или .bashrc, если используется оболочка bash. Если другая, то уже ее средствами.
вопрос решился прям сам по себе, так сказать сам задал вопрос и в нем было решение, помогла библиотека libpam-mount, в настройка pam_mount.conf.xml указал каким группам что подключать и все заработало, теперь в зависимости от того кто вошел в систему монтируются нужные ему ресурсы. Так я это дело вписал в скрипт, который вводит комп в домен - ставит нужные либы, спрашивает имя и айпи домена, настраивает скрим монтирования шар. теперь ввод *.nix ПК в домен занимает три минуты)))
Круто, можешь поделиться ссылкой, где это описано и рассказано? Посмотрю для общего образования.
Сборная солянка с головы и интернета, есть скрипт вот его текст, там я думаю разберешя
#!/bin/bash #Скрипт позволяет ввести ПК в домен #author: kachnu #email: ya.kachnu@gmail.com #Основой для скрипта послужил ресурс http://zubarev.me/domainjoin DIALOG=whiptail if [ ! -x "`which "$DIALOG"`" ] then DIALOG=dialog fi case $LANG in uk*|ru*|be*) #UA RU BE locales MAIN_LABEL="Ввод ПК в домен" MAIN_TEXT="Выберите действие:" RUN_ROOT_TEXT="Запуск скрипта $0 с правами администратора" MENU1="Установка пакетов для домена" MENU2="Настройка и ввод в домен" MENU3="Проверка входа в домен" MENU4="Бекап настроек" MENU5="Настройка аутентификации PAM" MENU6="Справка" MENU2_1="Имя ПК (mycorp-pc)" MENU2_2="Рабочая группа (MYGROUP)" MENU2_3="Имя домена (domain.com.ua)" MENU2_4="IP контроллера домена (192.168.205.1)" MENU2_5="Имя контроллера домена (main-dc1)" MENU2_6="Имя сервера точного времени NTP" MENU2_7="IP контроллера домена №2 (192.168.205.2)" MENU2_8="Имя контроллера домена №2 (main-dc2)" MENU2_9="ПРИМЕНИТЬ НАСТРОЙКИ И ЗАРЕГИСТРИРОВАТЬСЯ В ДОМЕНЕ" MENU3_1="Восстановить настройки из *.bak" MENU3_2="Сохранить текущие настройки *.bak" INFO_START_ADD=" ********** Сейчас будет произведена проверка, не втянут ли уже компьютер в какой-нибудь домен. Внимание! Если вылезет страшная ошибка, не пугайтесь. Все так, как должно быть. Просто продолжайте процедуру введения в домен. ********** Если на этом этапе процесс завис и нет никакой реакции, просто нажмите Enter " TEXT_ADD=" ********** Сейчас будет предложено авторизовать данный компьютер в домене. Пожалуйста, введите полное имя домена в верхнем регистре (DOMAIN.COM.UA), затем доменного пользователя с правами администратора, а затем его пароль. ********** " TEXT_NAME_DOMAIN="Имя домена в верхнем регистре (DOMAIN.COM.UA): " TEXT_NAME_USER="Имя доменного пользователя (администратора): " TEXT_OK_ADD="Компьютер успешно введен в домен! Резервные копии ваших оригинальных файлов имеют расширение *.bak и находятся в соответствующих папках. Осталось только перезагрузить компьютер. " TEXT_ERROR_ADD="В процессе присоединения к домену возникли ошибки. Смотрите подробнее листинг консоли." EXIT_TEXT=" Нажмите Enter для перехода в главное меню" ATTENTION="ВНИМАНИЕ!" ERROR_VARIABLE1="Не указано значение -" ERROR_VARIABLE2="Повторить ввод данных?" TEXT_LDM_UBUNTU=" ********** Обнаружена система Ubuntu. Отключен гостевой вход и активирована форма ручного ввода логина на экране приветствия. Смотреть файл /usr/share/lightdm/lightdm.conf.d/59-ubuntu.conf ********** " TEXT_LDM_DEBIAN=" ********** Обнаружена система Debian. Отключен говстевой вход и активирована форма ручного ввода логина на экране приветствия. Смотреть файл /usr/share/lightdm/lightdm.conf.d/09_debian.conf ********** " HELP="Справка ____________________________ Скрипт $0 предназначен для ввода компьютера в домен. 1. $MENU1 - выполняется установка пакетов, в сборке эти пакеты будут находиться в /var/cache/apt/domain_packages , если данной папки нет, будет выполнена установка из интернета. Для работы скрипта требуются следующие пакеты: krb5-user samba winbind ntp libpam-krb5 libpam-winbind libnss-winbind libpam-ccreds libpam-mount cifs-utils cups-bsp nscd nss-updatedb libnss-db 2. $MENU2 - выполняется резервное копирование файлов настроек, настройка и сохранение в файлах параметров входа в домен, а также выполнение фдола в домен. Пункты настройки входа в домен отмеченные * обязательны для заполнения. 3. $MENU3 - проводится проверка соединения с доменом, при удачном подключении выводится сообщение - \"Join is OK.\" 4. $MENU4 - возможность восстановить файлы в исходное состояние или сделать бекам уже настроенной конфигурации 5. $MENU5 - настройка способов аутентификации. Поумолчанию (до установки пакетов для домена) активированы пункты: [*] Unix authentication [*] Register user sessions in the systemd control group hierarchy [*] GNOME Keyring Daemon - Login keyring management Поэтому чтобы вернуться к \"стандартной\" аутентификации необходимо отключать лишние пункты. ____________________________" ;; *) #All locales MAIN_LABEL="Enter the PC domain" MAIN_TEXT="Select an action:" RUN_ROOT_TEXT="Run the script $0 administrator" MENU1="Installation packages for domain" MENU2="Setup and enter the domain" MENU3="Check domain logon" MENU4="Backup settings" MENU5="Authentication configuration" MENU6="Help" MENU2_1="PC name(mycorp-pc)" MENU2_2="Working group (MYGROUP)" MENU2_3="Domain Name (domain.com.ua)" MENU2_4="IP domain controller (192.168.205.1)" MENU2_5="Name domain controller (main-dc1)" MENU2_6="Name the time server NTP" MENU2_7="IP domain controller 2 (192.168.205.2)" MENU2_8="Name domain controller 2 (main-dc2)" MENU2_9="Apply settings and registered in the domain" MENU3_1="Restore from *.bak" MENU3_2="Save the current settings *.bak" INFO_START_ADD=" ********** Who will check not drawn if the computer is already in some domain. Attention! If you come out a terrible mistake, do not panic. All is as it should be . Just continue with the introduction of the domain. ********** If at this stage of the process depends, and there is no reaction, just click Enter " TEXT_ADD=" ********** СWho will be asked to authorize this computer to the domain. Please enter the full domain name in uppercase (DOMAIN.COM.UA), then the domain admin user and then the password. ********** " TEXT_NAME_DOMAIN="The domain name in uppercase (DOMAIN.COM.UA): " TEXT_NAME_USER="The name of the domain user: " TEXT_OK_ADD="The computer was successfully introduced in the domain! Backup copies of your original files have the extension * .bak and contained in appropriate folders. It remains only to restart the computer. " TEXT_ERROR_ADD="In the process of joining a domain errors occur . See more listing the console." EXIT_TEXT=" Press Enter to go to the main menu" ATTENTION="ATTENTION!" ERROR_VARIABLE1="Not Specified value -" ERROR_VARIABLE2="Repeat data entry?" TEXT_LDM_UBUNTU=" ********** Detected system Ubuntu. Disabled govstevoy input and activated manually entering the login form on the welcome screen. See file /usr/share/lightdm/lightdm.conf.d/59-ubuntu.conf ********** " TEXT_LDM_DEBIAN=" ********** Detected system Debian. Disabled govstevoy input and activated manually entering the login form on the welcome screen. See file /usr/share/lightdm/lightdm.conf.d/09_debian.conf ********** " HELP="Help ____________________________ Script $0 for input into the computer domain. 1. $MENU1 - installs a package to assemble these packages will be in /var/cache/apt/domain_packages , if this folder does not exist , the installation will be carried out from the Internet For the script requires the following packages: krb5-user samba winbind ntp libpam-krb5 libpam-winbind libnss-winbind libpam-ccreds nscd nss-updatedb libnss-db 2. $MENU2 - backed up configuration files , configuration files and save the login domain , and performing fdola domain . Setting Items domain logon marked * are required. 3. $MENU3 - the connection is checked with a domain with a successful connection message is displayed - \"Join is OK.\" 4. $MENU4 - configuration files to restore to its original state or make beks already customized configuration 5. $MENU5 - configure authentication methods . Defaul ( to install packages for the domain ) activated items: [*] Unix authentication [*] Register user sessions in the systemd control group hierarchy [*] GNOME Keyring Daemon - Login keyring management So to return to the \"default\" authentication, you must disable the extra items . ____________________________" ;; esac if [ "$(whoami)" != 'root' ]; then echo $RUN_ROOT_TEXT; sudo $0 exit 0 fi ############################# GetVariables () #Получение переменных из файлов настроек { NAME_PC=$(cat /etc/hostname) NAME_WGROUP=$(cat /etc/samba/smb.conf | grep ^workgroup |awk '{print $3}') name_group=$(cat /etc/resolvconf/resolv.conf.d/head | grep ^domain | awk '{print $2}') IP_C1_DOMEN=$(cat /etc/resolvconf/resolv.conf.d/head | grep -m1 ^nameserver | awk '{print $2}') NAME_C1_DOMEN=$(cat /etc/hosts | grep -m1 ^$IP_C1_DOMEN | awk '{print $3}') NAME_NTP=$(cat /etc/ntp.conf | grep -m1 ^server | awk '{print $2}' | sed "s/.${name_group}//g" | sed "s/0.debian.pool.ntp.org//g") IP_C2_DOMEN=$(cat /etc/resolvconf/resolv.conf.d/head | grep -m2 ^nameserver | awk 'FNR==2 {print $2}') NAME_C2_DOMEN=$(cat /etc/hosts | grep -m1 ^$IP_C2_DOMEN | awk '{print $3}') } ############################# InstallPackages () #Установка пакетов для входа в Домен { DOMAIN_PACKAGES="/var/cache/apt/domain_packages" cd /etc/ && tar czpf pam.d.tar.gz pam.d if [ -d "$DOMAIN_PACKAGES" ] then dpkg -i $DOMAIN_PACKAGES/*.deb || apt-get update && apt-get install -f else apt-get update apt-get install -y krb5-user samba winbind ntp libpam-krb5 libpam-winbind libnss-winbind libpam-mount cifs-utils cups-bsd libpam-ccreds nscd nss-updatedb libnss-db fi } ############################# BackupSettings () #Резервирование настроек { if ! [ -f /etc/resolvconf/resolv.conf.d/head.bak ] ; then cp /etc/resolvconf/resolv.conf.d/head /etc/resolvconf/resolv.conf.d/head.bak fi if ! [ -f /etc/hostname.bak ] ; then cp /etc/hostname /etc/hostname.bak fi if ! [ -f /etc/hosts.bak ] ; then cp /etc/hosts /etc/hosts.bak fi if ! [ -f /etc/ntp.conf.bak ] ; then cp /etc/ntp.conf /etc/ntp.conf.bak fi if ! [ -f /etc/krb5.conf.bak ] ; then cp /etc/krb5.conf /etc/krb5.conf.bak fi if ! [ -f /etc/samba/smb.conf.bak ] ; then cp /etc/samba/smb.conf /etc/samba/smb.conf.bak fi if ! [ -f /etc/security/limits.conf.bak ] ; then cp /etc/security/limits.conf /etc/security/limits.conf.bak fi if ! [ -f /etc/nsswitch.conf.bak ] ; then cp /etc/nsswitch.conf /etc/nsswitch.conf.bak fi if ! [ -f /etc/pam.d/common-session.bak ] ; then cp /etc/pam.d/common-session /etc/pam.d/common-session.bak fi if ! [ -f /etc/security/pam_mount.conf.xml.bak ] ; then cat > /etc/security/pam_mount.conf.xml <<EOF <!-- --> <!-- --> umount -l %(MNTPT) EOF fi } ############################# ForseBackupSettings () { if [ -f /etc/resolvconf/resolv.conf.d/head ] ; then cp /etc/resolvconf/resolv.conf.d/head /etc/resolvconf/resolv.conf.d/head.bak fi if [ -f /etc/hostname ] ; then cp /etc/hostname /etc/hostname.bak fi if [ -f /etc/hosts ] ; then cp /etc/hosts /etc/hosts.bak fi if [ -f /etc/ntp.conf ] ; then cp /etc/ntp.conf /etc/ntp.conf.bak fi if [ -f /etc/krb5.conf ] ; then cp /etc/krb5.conf /etc/krb5.conf.bak fi if [ -f /etc/samba/smb.conf ] ; then cp /etc/samba/smb.conf /etc/samba/smb.conf.bak fi if [ -f /etc/security/limits.conf ] ; then cp /etc/security/limits.conf /etc/security/limits.conf.bak fi if [ -f /etc/nsswitch.conf ] ; then cp /etc/nsswitch.conf /etc/nsswitch.conf.bak fi if [ -f /etc/pam.d/common-session ] ; then cp /etc/pam.d/common-session /etc/pam.d/common-session.bak fi if ! [ -f /etc/security/pam_mount.conf.xml.bak ] ; then cat > /etc/security/pam_mount.conf.xml << EOF <!-- --> <!-- --> umount -l %(MNTPT) EOF fi } ############################# UnBackupSettings () #Возвращение настроек из бекапа { if [ -f /etc/resolvconf/resolv.conf.d/head.bak ] ; then mv /etc/resolvconf/resolv.conf.d/head.bak /etc/resolvconf/resolv.conf.d/head fi if [ -f /etc/hostname.bak ] ; then mv /etc/hostname.bak /etc/hostname fi if [ -f /etc/hosts.bak ] ; then mv /etc/hosts.bak /etc/hosts fi if [ -f /etc/ntp.conf.bak ] ; then mv /etc/ntp.conf.bak /etc/ntp.conf fi if [ -f /etc/krb5.conf.bak ] ; then mv /etc/krb5.conf.bak /etc/krb5.conf fi if [ -f /etc/samba/smb.conf.bak ] ; then mv /etc/samba/smb.conf.bak /etc/samba/smb.conf fi if [ -f /etc/security/limits.conf.bak ] ; then mv /etc/security/limits.conf.bak /etc/security/limits.conf fi if [ -f /etc/nsswitch.conf.bak ] ; then mv /etc/nsswitch.conf.bak /etc/nsswitch.conf fi if [ -f /etc/pam.d/common-session.bak ] ; then mv /etc/pam.d/common-session.bak /etc/pam.d/common-session fi if [ -f /etc/security/pam_mount.conf.xml.bak ] ; then cp /etc/security/pam_mount.conf.xml.bak /etc/pam.d/pam_mount.conf.xml fi } ############################# ChangeSettings () #Редактирование файлов настроек в зависимости от переменных { NAME_GROUP=$(echo $name_group | sed 's/[[:lower:]]/\u&/g') if ! [ -d /etc/resolvconf/resolv.conf.d ] then mkdir /etc/resolvconf/resolv.conf.d fi echo "# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN domain $name_group search $name_group nameserver $IP_C1_DOMEN #nameserver $IP_C2_DOMEN" > /etc/resolvconf/resolv.conf.d/head if [[ $IP_C2_DOMEN != '' ]] && [[ $NAME_C2_DOMEN != '' ]] then sed -i "s/#nameserver ${IP_C2_DOMEN}/nameserver ${IP_C2_DOMEN}/g" /etc/resolvconf/resolv.conf.d/head fi echo "$NAME_PC" > /etc/hostname echo "127.0.0.1 localhost 127.0.1.1 $NAME_PC.$name_group $NAME_PC $IP_C1_DOMEN $NAME_C1_DOMEN.$name_group $NAME_C1_DOMEN #$IP_C2_DOMEN $NAME_C2_DOMEN.$name_group $NAME_C2_DOMEN # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters" > /etc/hosts if [[ $IP_C2_DOMEN != '' ]] && [[ $NAME_C2_DOMEN != '' ]] then sed -i "s/#${IP_C2_DOMEN}/${IP_C2_DOMEN}/g" /etc/hosts fi echo "# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help driftfile /var/lib/ntp/ntp.drift # Enable this if you want statistics to be logged. #statsdir /var/log/ntpstats/ statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable # Specify one or more NTP servers. # Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board # on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for # more information. #server $NAME_NTP.$name_group server 0.debian.pool.ntp.org iburst server 1.debian.pool.ntp.org iburst server 2.debian.pool.ntp.org iburst server 3.debian.pool.ntp.org iburst # Use Ubuntu's ntp server as a fallback. server ntp.ubuntu.com # Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for # details. The web page # might also be helpful. # # Note that \"restrict\" applies to both servers and clients, so a configuration # that might be intended to block requests from certain clients could also end # up blocking replies from your own upstream servers. # By default, exchange time with everybody, but don't allow configuration. restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 restrict ::1 # Clients from this (example!) subnet have unlimited access, but only if # cryptographically authenticated. #restrict 192.168.123.0 mask 255.255.255.0 notrust # If you want to provide time to your local subnet, change the next line. # (Again, the address is an example only.) #broadcast 192.168.123.255 # If you want to listen to time broadcasts on your local subnet, de-comment the # next lines. Please do this only if you trust everybody on the network! #disable auth #broadcastclient " > /etc/ntp.conf if [[ $NAME_NTP != '' ]] then sed -i "s/#server ${NAME_NTP}/server ${NAME_NTP}/g" /etc/ntp.conf fi echo "[libdefaults] default_realm = $NAME_GROUP kdc_timesync = 1 ccache_type = 4 forwardable = true proxiable = true v4_instance_resolve = false v4_name_convert = { host = { rcmd = host ftp = ftp } plain = { something = something-else } } fcc-mit-ticketflags = true [realms] $NAME_GROUP = { kdc = $NAME_C1_DOMEN.$name_group #kdc = $NAME_C2_DOMEN.$name_group admin_server = $NAME_C1_DOMEN.$name_group default_domain = $NAME_GROUP } [domain_realm] .$name_group = $NAME_GROUP $name_group = $NAME_GROUP [login] krb4_convert = false krb4_get_tickets = false" > /etc/krb5.conf if [[ $IP_C2_DOMEN != '' ]] && [[ $NAME_C2_DOMEN != '' ]] then sed -i "s/#kdc = ${NAME_C2_DOMEN}/kdc = ${NAME_C2_DOMEN}/g" /etc/krb5.conf fi echo "[global] workgroup = $NAME_WGROUP realm = $NAME_GROUP security = ADS encrypt passwords = true dns proxy = no socket options = TCP_NODELAY domain master = no local master = no preferred master = no os level = 0 domain logons = no idmap config * : range = 10000-20000 idmap config * : backend = rid idmap config * : base_rid = 0 winbind enum groups = yes winbind enum users = yes winbind use default domain = yes template shell = /bin/bash winbind refresh tickets = yes winbind offline logon = yes winbind cache time = 300 usershare allow guests = yes usershare owner only = false [printers] comment = All Printers browseable = no path = /var/spool/samba printable = yes guest ok = no read only = yes create mask = 0700 # Windows clients look for this share name as a source of downloadable # printer drivers [print$] comment = Printer Drivers path = /var/lib/samba/printers browseable = yes read only = yes guest ok = no" > /etc/samba/smb.conf echo "# /etc/security/limits.conf # #Each line describes a limit for a user in the form: # # # #Where: # can be: # - a user name # - a group name, with @group syntax # - the wildcard *, for default entry # - the wildcard %, can be also used with %group syntax, # for maxlogin limit # - NOTE: group and wildcard limits are not applied to root. # To apply a limit to the root user, must be # the literal username root. # # can have the two values: # - \"soft\" for enforcing the soft limits # - \"hard\" for enforcing hard limits # # can be one of the following: # - core - limits the core file size (KB) # - data - max data size (KB) # - fsize - maximum filesize (KB) # - memlock - max locked-in-memory address space (KB) # - nofile - max number of open files # - rss - max resident set size (KB) # - stack - max stack size (KB) # - cpu - max CPU time (MIN) # - nproc - max number of processes # - as - address space limit (KB) # - maxlogins - max number of logins for this user # - maxsyslogins - max number of logins on the system # - priority - the priority to run user process with # - locks - max number of file locks the user can hold # - sigpending - max number of pending signals # - msgqueue - max memory used by POSIX message queues (bytes) # - nice - max nice priority allowed to raise to values: [-20, 19] # - rtprio - max realtime priority # - chroot - change root to directory (Debian-specific) # # # #* soft core 0 #root hard core 100000 #* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #ftp - chroot /ftp #@student - maxlogins 4 # End of file * - nofile 16384 root - nofile 16384" > /etc/security/limits.conf echo "# /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # If you have the \`glibc-doc-reference' and \`info' packages installed, try: # \`info libc \"Name Service Switch\"' for information about this file. passwd: compat winbind group: compat winbind shadow: compat hosts: dns mdns4_minimal [NOTFOUND=return] mdns4 files networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis " > /etc/nsswitch.conf echo "# # /etc/pam.d/common-session - session-related modules common to all services # # This file is included from other service-specific PAM config files, # and should contain a list of modules that define tasks to be performed # at the start and end of sessions of *any* kind (both interactive and # non-interactive). # # As of pam 1.0.1-6, this file is managed by pam-auth-update by default. # To take advantage of this, it is recommended that you configure any # local modules either before or after the default block, and use # pam-auth-update to manage selection of other modules. See # pam-auth-update(8) for details. # here are the per-package modules (the \"Primary\" block) session [default=1] pam_permit.so # here's the fallback if no module succeeds session requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; # this avoids us returning an error just because nothing sets a success code # since the modules above will each just jump around session required pam_permit.so # The pam_umask module will set the umask according to the system default in # /etc/login.defs and user settings, solving the problem of different # umask settings with different shells, display managers, remote sessions etc. # See \"man pam_umask\". session optional pam_umask.so # and here are more per-package modules (the \"Additional\" block) session optional pam_krb5.so minimum_uid=1000 session required pam_unix.so session optional pam_winbind.so session optional pam_mount.so session optional pam_systemd.so session optional pam_mkhomedir.so skel=/etc/skel/ umask=0077 # end of pam-auth-update config" > /etc/pam.d/common-session } ############################# RestartNetDemon () #Перезапуск сетевых служб { /etc/init.d/networking restart /etc/init.d/ntp restart /etc/init.d/winbind stop smbd restart /etc/init.d/winbind start } ############################# AddToDomain () #Вход в домен { echo "$INFO_START_ADD" if [ "$(net ads testjoin)" != "Join is OK" ]; then echo "$TEXT_ADD" echo -n "$TEXT_NAME_DOMAIN" read DOMAINNAME echo -n "$TEXT_NAME_USER" read DOMAINUSER net ads join -U $DOMAINUSER -D $DOMAINNAME fi if [ "$(lsb_release -si)" = "Ubuntu" ]; then if [ -f /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf ]; then if ! [ -f /usr/share/lightdm/lightdm.conf.d/59-ubuntu.conf ]; then cp /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf /usr/share/lightdm/lightdm.conf.d/59-ubuntu.conf echo "greeter-show-manual-login=true" >> /usr/share/lightdm/lightdm.conf.d/59-ubuntu.conf echo "allow-guest=false" >> /usr/share/lightdm/lightdm.conf.d/59-ubuntu.conf echo "" >> /usr/share/lightdm/lightdm.conf.d/59-ubuntu.conf echo "$TEXT_LDM_UBUNTU" fi fi fi if [ "$(lsb_release -si)" = "Debian" ]; then if [ -f /usr/share/lightdm/lightdm.conf.d/01_debian.conf ]; then if ! [ -f /usr/share/lightdm/lightdm.conf.d/09_debian.conf ]; then cp /usr/share/lightdm/lightdm.conf.d/01_debian.conf /usr/share/lightdm/lightdm.conf.d/09_debian.conf echo "greeter-show-manual-login=true" >> /usr/share/lightdm/lightdm.conf.d/09_debian.conf echo "allow-guest=false" >> /usr/share/lightdm/lightdm.conf.d/09_debian.conf echo "" >> /usr/share/lightdm/lightdm.conf.d/09_debian.conf echo "$TEXT_LDM_DEBIAN" fi fi fi echo "" if [ "$(net ads testjoin)" = "Join is OK" ]; then echo "$TEXT_OK_ADD" else echo "$TEXT_ERROR_ADD" fi } ############################# Help () #Справка { clear echo "$HELP" } ############################# CheckVariables () #Функция проверки данных { if [[ $(echo $1) == '' ]] then $DIALOG --title "$ATTENTION" --yesno "$ERROR_VARIABLE1 \"$2\"\\n\\n$ERROR_VARIABLE2" 10 60 if [ $? == 0 ] then SettingForm else MainForm fi fi } ############################# SettingForm () #Форма настроек { ANSWER=$($DIALOG --cancel-button "Exit" --title "$MAIN_LABEL" --menu \ "$MAIN_TEXT" 16 62\ 9\ 1 "* $MENU2_1: $NAME_PC"\ 2 "* $MENU2_2: $NAME_WGROUP"\ 3 "* $MENU2_3: $name_group"\ 4 "* $MENU2_4: $IP_C1_DOMEN"\ 5 "* $MENU2_5: $NAME_C1_DOMEN"\ 6 "$MENU2_6: $NAME_NTP"\ 7 "$MENU2_7: $IP_C2_DOMEN"\ 8 "$MENU2_8: $NAME_C2_DOMEN"\ 9 "$MENU2_9" 3>&1 1>&2 2>&3) if [ $? != 0 ] then echo Exit ; MainForm fi case $ANSWER in 1 ) NAME_PC=$($DIALOG --title "$MENU2_1" --inputbox "" 10 60 $NAME_PC 3>&1 1>&2 2>&3 | sed "s/[^a-zA-Z0-9.-]//g") if [ $? != 0 ] then NAME_PC=$(cat /etc/hostname); fi SettingForm;; 2 ) NAME_WGROUP=$($DIALOG --title "$MENU2_2" --inputbox "" 10 60 $NAME_WGROUP 3>&1 1>&2 2>&3 | sed "s/[^a-zA-Z0-9.-]//g") if [ $? != 0 ] then NAME_WGROUP=$(cat /etc/samba/smb.conf | grep ^workgroup |awk '{print $3}'); fi SettingForm;; 3 ) name_group=$($DIALOG --title "$MENU2_3" --inputbox "" 10 60 $name_group 3>&1 1>&2 2>&3 | sed "s/[^a-zA-Z0-9.-]//g") if [ $? != 0 ] then name_group=$(cat /etc/resolvconf/resolv.conf.d/head | grep ^domain | awk '{print $2}'); fi SettingForm;; 4 ) IP_C1_DOMEN=$($DIALOG --title "$MENU2_4" --inputbox "" 10 60 $IP_C1_DOMEN 3>&1 1>&2 2>&3 | sed "s/[^0-9.]//g") if [ $? != 0 ] then IP_C1_DOMEN=$(cat /etc/resolvconf/resolv.conf.d/head | grep -m1 ^nameserver | awk '{print $2}'); fi SettingForm;; 5 ) NAME_C1_DOMEN=$($DIALOG --title "$MENU2_5" --inputbox "" 10 60 $NAME_C1_DOMEN 3>&1 1>&2 2>&3 | sed "s/[^a-zA-Z0-9.-]//g") if [ $? != 0 ] then IP_C1_DOMEN=$(cat /etc/resolvconf/resolv.conf.d/head | grep -m1 ^nameserver | awk '{print $2}'); NAME_C1_DOMEN=$(cat /etc/hosts | grep -m1 ^$IP_C1_DOMEN | awk '{print $3}') fi SettingForm;; 6 ) NAME_NTP=$($DIALOG --title "$MENU2_6" --inputbox "" 10 60 $NAME_NTP 3>&1 1>&2 2>&3 | sed "s/[^a-zA-Z0-9.-]//g") if [ $? != 0 ] then NAME_NTP=$(cat /etc/ntp.conf | grep -m1 ^server | awk '{print $2}' | sed "s/.${name_group}//g" | sed "s/0.debian.pool.ntp.org//g") fi SettingForm;; 7 ) IP_C2_DOMEN=$($DIALOG --title "$MENU2_7" --inputbox "" 10 60 $IP_C2_DOMEN 3>&1 1>&2 2>&3 | sed "s/[^0-9.]//g") if [ $? != 0 ] then IP_C2_DOMEN=$(cat /etc/resolvconf/resolv.conf.d/head | grep -m2 ^nameserver | awk 'FNR==2 {print $2}'); fi SettingForm;; 8 ) NAME_C2_DOMEN=$($DIALOG --title "$MENU2_8" --inputbox "" 10 60 $NAME_C2_DOMEN 3>&1 1>&2 2>&3 | sed "s/[^a-zA-Z0-9.-]//g") if [ $? != 0 ] then IP_C2_DOMEN=$(cat /etc/resolvconf/resolv.conf.d/head | grep -m2 ^nameserver | awk 'FNR==2 {print $2}'); NAME_C2_DOMEN=$(cat /etc/hosts | grep -m2 ^$IP_C2_DOMEN | awk 'FNR==2 {print $3}') fi SettingForm;; 9 ) #Проверка введеных значений CheckVariables "$NAME_PC" "$MENU2_1" CheckVariables "$NAME_WGROUP" "$MENU2_2" CheckVariables "$name_group" "$MENU2_3" CheckVariables "$IP_C1_DOMEN" "$MENU2_4" CheckVariables "$NAME_C1_DOMEN" "$MENU2_5" #Применение настроек и ввод ПК в домен BackupSettings ChangeSettings RestartNetDemon AddToDomain;; * ) echo oops! - $ANSWER ;; esac echo "$EXIT_TEXT" read input MainForm } ############################# BackupForm () #Форма бекапа настроек { ANSWER=$($DIALOG --cancel-button "Exit" --title "$MAIN_LABEL" --menu \ "$MAIN_TEXT" 13 50\ 3\ 1 "$MENU3_1"\ 2 "$MENU3_2" 3>&1 1>&2 2>&3) if [ $? != 0 ] then echo Exit ; MainForm fi case $ANSWER in 1 ) UnBackupSettings;; 2 ) ForseBackupSettings;; * ) echo oops! - $ANSWER ;; esac echo "$EXIT_TEXT" read input MainForm } ############################# CheckState () { if [ "$(net ads testjoin)" = "Join is OK" ]; then STATE_DOMAIN="- Domain ON" else STATE_DOMAIN="- Domain OFF" fi } ############################# MainForm () #Главная форма { #CheckState ANSWER=$($DIALOG --cancel-button "Exit" --title "$MAIN_LABEL $STATE_DOMAIN" --menu \ "$MAIN_TEXT" 13 50\ 6\ 1 "$MENU1"\ 2 "$MENU2"\ 3 "$MENU3"\ 4 "$MENU4"\ 5 "$MENU5"\ 6 "$MENU6" 3>&1 1>&2 2>&3) if [ $? != 0 ] then echo Exit ; exit 0 fi case $ANSWER in 1 ) InstallPackages ;; 2 ) GetVariables; SettingForm ;; 3 ) echo "**********" net ads testjoin ;; 4 ) BackupForm ;; 5 ) pam-auth-update --force;; 6 ) Help;; * ) echo oops! - $ANSWER ;; esac echo "$EXIT_TEXT" read input MainForm } MainForm exit 0Удали тот пост выше, там криво вставилось вот
https://drive.google.com/open?id=0BzrWXN0Dsp4qUWxTY1UtdGFESVE
yum -y install realmd sssd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools sssd-libwbclient samba
Вводим centos в домен с юзером admin-of-ad в домен example.com:
realm join -U admin-of-ad example.com
Правим /etc/samba/smb.conf
[global]
workgroup = example
security = ads
kerberos method = system keytab
realm = example.com
[share]
comment = My shared folder
path = /data/share
public = yes
writeable = yes
browseable = yes
guest ok = yes
valid users = @"depit@example.com"
directory mask = 0775
create mask = 0664
vfs objects = acl_xattr
inherit permissions = yes
inherit acls = yes
map acl inherit = yes
store dos attributes = yes
Если шарится папка на ext*, то в параметры монтирования /etc/fstab надо дописать атрибуты acl и user_xattr. Должно хватить и acl, но мы же нанотехнологичные чуваки. Для XFS ничё не надо, всё «искоробки»:
UUID=dabdd229-52dc-49d6-add2-a10f9f582bf5 / ext4 defaults,acl,user_xattr 0 0
Разрешаем полный доступ на уровне ugo. Локально всё равно только по ssh можно цепляться (ну только если у вас не проходной двор), а демон самбы сам разрулит кому можно, а кто идёт пасти бобров.
chmod 777 /data/share
Конкретно в CentOS самба после установки сама не запускается. И ей даже не разрешено это делать. Так что разрешаем запускаться:
systemctl enable smb.service
Разрешаем firewalld пускать самбу в сеть:
firewall-cmd --permanent --zone=public --add-service=samba
Применить правила без разрыва соединений:
firewall-cmd --reload
Через виндовые параметры безопасности права нормально выставляются? С этим часто бывают проблемы. Вообще, я много заводил файловых серверов под линуксом в виндовый домен. Мне не нравится, как это работает. Не очень стабильно, бывают глюки, иногда права через консоль приходится выставлять. Иногда были ситуации, когда права полностью или частично слетали. Я бы не рекомендовал такое решение, если есть возможность поставить файловый сервер под виндой.
Да соглашусь, недавно ввел в линукс файлсерве в домен, в определенный момент UID GID перемешались, а в некоторых случаях вообще слетели у определенных пользователях, но поднимать виндовый серв, который жрет в два раза больше оперативи на виртуалке не охота.
Да, да, именно такие проблемы у меня иногда бывают. Я не понимаю, из-за чего это происходит, но права в итоге слетают. Я много разбирался с этой ситуацией. У меня уже готов черновик статьи, где я настраиваю самбу в домене. Пытался настроить все через sssd, вместо winbind, но ничего не получилось. Пришлось вернуться к winbind. Буквально на днях будет статья, она уже фактически готова, но только проблемы, которые возникают, победить не получилось. Я не могу их сам спровоцировать, чтобы понять, в какой момент и из-за чего они слетают.
Есть мнение что это все из за тог что в настройках самбы есть параметр (winbind offline logon = yes) который препятствует срабатыванию обновления (getent passwd), так как параметр (winbind cache time = 300) игнорируется, но тут вопрос - ради эксперимента в домене добавил юзера "тест", по команде wbinfo -u он появился , но вот getent paswd не отработал. Получается что pam.d не передал данные, короче непонятно голова вспухла уже))))).
Только что снова вылетел баг, групы на шаре обновились и UID GID тупо напрочь обновились - стали другими, в следствии на шарах права стали в виде gid=10011, а не название группы, может в крон положить скрипт который будет обновлять раз в час или в сутки типа chown -R root:"domain admins" /srv/work, та и забить про эту проблему?
Добрый день!
Подскажите вы можете, дописать статью как создать папки smb с авторизации по AD?
Заранее благодарен.
Давно собираюсь, но все времени не хватает. Там уже winbind надо будет настраивать а не sssd.
Ввожу команду:
# realm discover LOCAL.DOMAIN.RU
local.domain.ru
type: kerberos
realm-name: LOCAL.DOMAIN.RU
domain-name: local.domain.ru
configured: no
server-software: active-directory
client-software: sssd
required-package: oddjob
required-package: oddjob-mkhomedir
required-package: sssd
required-package: adcli
required-package: samba-common-tools
Пробую:
# realm join -U administrator LOCAL.DOMAIN.RU
See: journalctl REALMD_OPERATION=r5497964.10339
realm: Couldn't join realm: Joining the domain local.domain.ru failed
Пробую с логами (-v):
# realm join -v -U administrator LOCAL.DOMAIN.RU
* Resolving: _ldap._tcp.local.domain.ru
* Performing LDAP DSE lookup on: 192.168.102.8
* Successfully discovered: local.domain.ru
Password for administrator:
* Required files: /usr/sbin/oddjobd, /usr/libexec/oddjob/mkhomedir, /usr/sbin/sssd, /usr/bin/net
* LANG=C LOGNAME=root /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.KAEP3Y -U administrator ads join local.domain.ru
Enter administrator's password:
Failed to join domain: failed to lookup DC info for domain 'local.domain.ru' over rpc: {Device Timeout} The specified I/O operation on %hs was not completed before the time-out period expired.
! Joining the domain local.domain.ru failed
realm: Couldn't join realm: Joining the domain local.domain.ru failed
Проверял resolve:
[root@siteadmin ~]# getent hosts local.domain.ru | awk '{ print $1 }'
192.168.106.5
192.168.101.4
Ping к слову не идёт, но в компании говорят, что отключили возможность пингования со стороны сервера (но меня всё равно это смущает).
Мой вопрос:
- Команда "realm discover LOCAL.DOMAIN.RU" не говорит ли о том что доступ есть?
- Если команда "realm discover" видит сервер, то почему появляется ошибка "failed to lookup DC"?
И правильнее будет - доменная АУТЕНТИФИКАЦИЯ.
https://interface31.ru/tech_it/2015/03/autentifikaciya-v-sistemah-windows-chast-1-ntlm.html
"Аутентификация - происходит от английского слова authentication, которое можно перевести как идентификация или проверка подлинности. Это полностью отражает суть процесса - проверка подлинности пользователя, т.е. мы должны удостовериться, что пользователь, пытающийся получить доступ к системе именно тот, за кого себя выдает.
Авторизация - перевод слова authorization означает разрешение, т.е. проверка прав доступа к какому-либо объекту. Процесс авторизации может быть применен только к аутентифицированному пользователю, так как перед тем, как проверять права доступа, мы должны выяснить личность объекта, которому мы собираемся предоставить какие-либо права."
Как запомнить? Легко. Аутентификация - КТО ТЫ, авторизация - МОЖНО ЛИ.
Доброе.
Firewalld отключили, а про SELinux - ни слова. Или он в этом случае "не мешает" ?
Специально не проверял. Статья писалась с отключенным selinux. Я в начале статьи привел ссылку на настройку centos, там я отключаю selinux. Вообще, у меня во всех статьях он отключен. Вопрос настройки selinux я нигде не рассматриваю.
Если задача только в авторизации по ssh, то samba, группы в AD - лишнее. Достаточно модуля pam_krb5. Проще и надёжнее.
Да тут вроде тоже ничего сложного. Все очень быстро и просто делается. Это с winbind ковыряться долго, а sssd достаточно просто заводит в домен и все системные конфиги сам правит.