Ввод CentOS 7 в домен Active Directory и авторизация по SSH доменных пользователей

Мне понадобилось настроить авторизацию доменный учетных записей Active Directory по ssh на linux сервер. В моем случае это будет система CentOS 7. Данная возможность будет очень удобна для организаций с внедренной доменной структурой Windows. С помощью групп доступа в AD вы сможете централизованно управлять доступом к linux серверам.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Подготовка сервера

Если у вас еще нет готового сервера, то можете воспользоваться моими материалами на эту тему - установка и настройка 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
Перед дальнейшей настройкой, убедитесь, что с вашего сервера centos вы без проблем пингуете и резолвите контроллер домена по полному имени. Если есть какие-то проблемы, исправьте это либо указанием нужного dns сервера, либо правкой файла hosts.

Настроим синхронизацию времени с контроллером домена. Это важно, у вас должно быть одинаковое время с контроллером домена. Проверьте его и убедитесь, что стоят одинаковые часовые пояса.

Устанавливаем утилиту для синхронизации времени 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 сервер в домене.
Ввод centos 7 в домен AD
Изменим немного конфиг 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, подключившись по любой доменной учетной записи.
Вход доменным пользователем по 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
Обращаю внимание, что имя данного файла не должно содержать точки. Я сначала не знал об этом и сделал файл с именем xs.local и долго не мог понять, почему не работает. Когда изменил имя файла, все заработало.

Выставляем минимальные права на файл:

# chmod 0440 /etc/sudoers.d/xs

Теперь вы можете зайти в систему доменной учетной записью из группы gr_linux_adm и получить полные права в системе.

Реализовать то же самое можно было через настройки sssd. В его конфиге можно было указать группы, которым разрешен доступ к sudo. Но в целом это не принципиально. Так, как сделал я, мне показалось проще. Не нужно использовать полные имена объектов в AD, в которых легко запутаться, особенно тем, кто не очень в этом ориентируется. Мне же понадобились только конечные имена групп. Более подробно об этом можно почитать в руководстве redhat. Ссылку приведу в конце.

Заключение

На этом все. Я рассмотрел наиболее типовую ситуацию, которая может быть полезной при использовании структуры AD совместно с linux серверами. При написании статьи использовал официальные руководства:

Почему-то из руководства по RHEL 7 раздел, посвещенный SSSD убрали, хотя в 5 и 6 есть. Может просто я не заметил, так как структура сильно поменялась. Люблю я CentOS в первую очередь за отличную документацию Redhat. Там есть подробное описание практически всего, с чем приходилось сталкиваться. Надо только не лениться в английском языке разбираться.

Углубленный онлайн-курс по MikroTik.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

48 комментариев

  1. Никита

    а с помощью этого способа заработает доменная авторизация для сервера 1с установленного на этом же centos?

    • Скорее всего нет. С 1С решать вопрос нужно будет отдельно. Я не знаю как, не занимался никогда.

  2. К разделу "Ограничение доступа 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 этих групп, перечисленные через "или" - символ "|" сразу за первой скобкой.

  3. Мне помогла когда загонял в другой домен и сломалась база.
    systemctl stop sssd
    # rm -f /var/lib/sss/db/*
    # rm -f /var/lib/sss/mc/*
    # systemctl start sssd

  4. Сергей

    Добрый день. Добавил в домен веб-сервер.
    Его учетка, httpd, пытается аутентифицироваться в домене, в домене нет такой учетки.
    Как можно запретить доменную аутентификацию для учетной записи веб-сервера?

    • Я не помню точно подробностей, но есть настройка на тему того, где проверять учетные записи. Сначала там должны быть указаны локальные учетки, потом все остальные. Кажется в /etc/nsswitch.conf.

  5. Аврил Лавин

    >Создаем новый файл в директории /etc/sudoers.d.
    ># mcedit /etc/sudoers.d/xs

    Почему тут используется не полное название домена, а просто xs?

    • Не помню уже, но у меня работало с такими настройками.

    • Имя файла значения не имеет. Это просто файл. Как я понял, демон просто просматривает все файлы в директории, и считывает их. А имена - по боку.

  6. Аврил Лавин

    С чем может быть связана эта ошибка сразу после 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 сработал.

  7. Аврил Лавин

    Сорри, а где описана установка параметра hostname на сервере?
    Не совсем понятно, в каком виде должен быть хостнейм на момент, когда сервер требуется ввести в домен
    Он должен быть вида "name" или "name.domain" ?

  8. Владимир

    Нашел единственную статью на эту тему (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

                    Как то так =)

  9. Владимир

    А есть возможность еще расширить функционал? Хранить в домене ключи ssh и сделать авторизацию по ним?

  10. Сергей

    Добрый день!

    Подскажите как перезавести ПК на Linux в домен еще раз, в том случае если удалил его из UA в домене?

    • Просто ввести его еще раз, точно так же, как и первый раз. На самой системе ничего делать не надо.

  11. [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

      Что может послужить проблемой?

  12. Андрей

    И снова здравствуйте, нужен совет, после внедрения ПК в домен возникла потребность выполнения скрипта, который при авторизации доменного пользователя в его директорию /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

  13. 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, та и забить про эту проблему?

  14. Добрый день!

    Подскажите вы можете, дописать статью как создать папки smb с авторизации по AD?
    Заранее благодарен.

    • Давно собираюсь, но все времени не хватает. Там уже winbind надо будет настраивать а не sssd.

  15. Максим

    Ввожу команду:
    # 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"?

  16. Аноним

    И правильнее будет - доменная АУТЕНТИФИКАЦИЯ.
    https://interface31.ru/tech_it/2015/03/autentifikaciya-v-sistemah-windows-chast-1-ntlm.html

    "Аутентификация - происходит от английского слова authentication, которое можно перевести как идентификация или проверка подлинности. Это полностью отражает суть процесса - проверка подлинности пользователя, т.е. мы должны удостовериться, что пользователь, пытающийся получить доступ к системе именно тот, за кого себя выдает.

    Авторизация - перевод слова authorization означает разрешение, т.е. проверка прав доступа к какому-либо объекту. Процесс авторизации может быть применен только к аутентифицированному пользователю, так как перед тем, как проверять права доступа, мы должны выяснить личность объекта, которому мы собираемся предоставить какие-либо права."

    Как запомнить? Легко. Аутентификация - КТО ТЫ, авторизация - МОЖНО ЛИ.

  17. Доброе.
    Firewalld отключили, а про SELinux - ни слова. Или он в этом случае "не мешает" ?

    • Специально не проверял. Статья писалась с отключенным selinux. Я в начале статьи привел ссылку на настройку centos, там я отключаю selinux. Вообще, у меня во всех статьях он отключен. Вопрос настройки selinux я нигде не рассматриваю.

  18. Михаил

    Если задача только в авторизации по ssh, то samba, группы в AD - лишнее. Достаточно модуля pam_krb5. Проще и надёжнее.

    • Да тут вроде тоже ничего сложного. Все очень быстро и просто делается. Это с winbind ковыряться долго, а sssd достаточно просто заводит в домен и все системные конфиги сам правит.

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

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

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar