Файловый сервер Samba в домене Windows

samba_fsРассмотрим настройку Samba 4 в роли файлового сервера, являющегося членом домена. Файловый сервер будет настроен с поддержкой Windows ACLs, что позволит администратору производить настройку прав доступа из операционной системы Windows. В качестве платформы будет использоваться Ubuntu Server 16.04.

Подготовка системы

После установки Ubuntu Server 16.04 сменим имя сервера на file

# hostnamectl set-hostname file

Добавим имя сервера в файл hosts

# nano /etc/hosts

127.0.0.1       localhost
127.0.1.1	file.4skill.loc file
. . .

Настроим конфигурацию сети

# nano /etc/network/interfaces

. . .
# The primary network interface
auto ens32
iface ens32 inet static
        address 192.168.1.28
        netmask 255.255.255.0
        gateway 192.168.1.1
        dns-nameservers 192.168.1.21 192.168.1.22
        dns-search 4skill.loc

В dns-nameservers нужно указать IP адреса доменных DNS серверов. В dns-search нужно указать название домена. Подробнее о настройке сети можно почитать в статье Ubuntu Server настройка сети.

Перезагрузим систему

# reboot

Обновим индексы пакетов и систему

# apt update
# apt upgrade

Более подробно об обновлении Ubuntu Server можно прочитать в статье Обновление Ubuntu Server.

Настройка синхронизации времени

Для синхронизации времени с контроллерами домена установим пакет NTP

# apt install ntp

В /etc/ntp.conf нужно закоментировать все строки, начинающиеся со слова pool, и добавить информацию о контроллерах домена

# nano /etc/ntp.conf

. . .
# 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.
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu's ntp server as a fallback.
#pool ntp.ubuntu.com

# Domain Controllers
pool 4skill.loc
. . .

4skill.loc — нужно заменить на название своего домена.

Перезапустим ntp сервис и проверим статус синхронизации времени

# service ntp restart
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 4skill.loc      .POOL.          16 p    -   64    0    0.000    0.000   0.000
 dc2.4skill.loc  192.168.1.21     3 u   27   64    1    0.286  -74.963   0.000
 dc1.4skill.loc  192.36.143.130   2 u   27   64    1    0.385    7.133   0.000

Настройка протокола Kerberos

Для поддержки протокола Kerberos установим следующий пакет

# apt install krb5-user

Отредактируем конфигурационный файл Kerberos

# nano /etc/krb5.conf

[libdefaults]
        default_realm = 4SKILL.LOC
        dns_lookup_realm = false
        dns_lookup_kdc = true

В default_realm нужно указать название своего домена.

Попробуем получить билет Kerberos для доменного пользователя administrator

# kinit administrator
Password for administrator@4SKILL.LOC:
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@4SKILL.LOC

Valid starting       Expires              Service principal
11.04.2017 12:27:20  11.04.2017 22:27:20  krbtgt/4SKILL.LOC@4SKILL.LOC
        renew until 12.04.2017 12:27:17
# kdestroy

Установка и настройка Samba и Winbind

Установим пакеты Samba и Winbind

# apt install samba winbind

Отредактируем конфигурационный файл Samba

# nano /etc/samba/smb.conf

[global]
       security = ADS
       workgroup = 4SKILL
       realm = 4SKILL.LOC

       # Default idmap config for local BUILTIN accounts and groups
       idmap config * : backend = tdb
       idmap config * : range = 3000-7999

       # idmap config for the 4SKILL domain
       idmap config 4SKILL : backend = rid
       idmap config 4SKILL : range = 10000-999999
       
       winbind use default domain = yes

В «workgroup» и «realm» нужно указать название своего домена. Параметр «winbind use default domain = yes» не является обязательным. Он позволяет использовать имена доменных пользователей и групп без указания доменной части.

Введем сервер в домен

# net ads join -U Administrator osName='Ubuntu Server GNU/Linux' osVer='16.04 LTS'
Enter Administrator's password:
Using short domain name -- 4SKILL
Joined 'FILE' to dns domain '4skill.loc'

Administrator — учетная запись администратора домена.

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

# service winbind restart
# wbinfo --ping-dc
checking the NETLOGON for domain[4SKILL] dc connection to "DC1.4skill.loc" succeeded

Так же для диагностики можно использовать команды

# wbinfo -u
# wbinfo -g

Эти команды выводят список всех доменных пользователей и групп соответственно.

Настройка диспетчера службы имен NSS (Name Services Switch)

Чтобы использовать доменных пользователей в локальной системе, нужно установить необходимую библиотеку

# apt install libnss-winbind

и добавить поддержку Winbind в конфигурационный файл nsswitch.conf

# nano /etc/nsswitch.conf
. . .
passwd:         compat  winbind
group:          compat  winbind
. . .

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

# getent passwd administrator
administrator:*:10500:10513:Administrator:/home/administrator:/bin/bash

# getent group "пользователи домена"
пользователи домена:x:10513:

Включение поддержки Windows ACLs и добавление общего ресурса

Создадим папку для совместного использования и изменим ее владельца и группу

# mkdir -p /srv/samba/public
# chown "администраторы домена":"пользователи домена" /srv/samba/public

Добавим в конфигурационный файл Samba строки, обеспечивающие поддержку Windows ACLs и секцию Public, описывающую название и параметры общего ресурса

# nano /etc/samba/smb.conf

[global]
. . .
       # Windows ACLs Support
       vfs objects = acl_xattr
       map acl inherit = yes
       store dos attributes = yes

[Public]
       path = /srv/samba/public/
       read only = no

Только пользователи и группы, имеющие привилегию  SeDiskOperatorPrivilege, могут настраивать разрешения для общего ресурса. Перезапустим службы Samba и добавим данную привилегию группе администраторы домена

# service smbd restart && service nmbd restart
# net rpc rights grant "4SKILL\администраторы домена" SeDiskOperatorPrivilege -U "4SKILL\administrator"
Enter 4SKILL\administrator's password:
Successfully granted rights.

Проверим все ли вышло

# net rpc rights list privileges SeDiskOperatorPrivilege -U "4SKILL\administrator"
Enter 4SKILL\administrator's password:
SeDiskOperatorPrivilege:
  BUILTIN\Administrators
  4SKILL\администраторы домена

Для управления разрешениями общего ресурса, из под пользователя, являющегося членом группы администраторы домена, нужно запустить оснастку управления компьютером. Нажать правой кнопкой мыши по «Управление компьютером», выбрать «Подключиться к другому компьютеру…» ввести имя Linux сервера. Выбрать «Служебные программы» > «Общие папки» > «Общие ресурсы». Нажать правой кнопкой мыши по общему ресурсу и выбрать «Свойства».

ctrl_comp

В открывшемся окне выбираем вкладку  «Разрешения для общего ресурса». Разрешения файловой системы настраиваются во вкладке «Безопасность».

pub_perm

Включение корзины

В Samba есть возможность сохранять удаленные файлы и папки из общего ресурса. За эту возможность отвечает модуль samba-vfs-modules. Проверим установлен ли он в системе

# dpkg -l |grep samba-vfs-modules
ii  samba-vfs-modules                  2:4.3.11+dfsg-0ubuntu0.16.04.6             amd64        Samba Virtual FileSystem plugins

Если модуль отсутствует, его можно установить командой

# apt install samba-vfs-modules

Добавим поддержку корзины для общего ресурса Public

# nano /etc/samba/smb.conf

. . .
[Public]
       path = /srv/samba/public/
       read only = no

       vfs object = recycle
       recycle: repository = .recycle/%U
       recycle: touch = yes
       recycle: keeptree = yes
       recycle: versions = yes

«vfs object = recycle» – включение корзины для общего ресурса;
«recycle: repository = .recycle/%U» – папка, куда будут перемещаться удаленные файлы;
«recycle: touch = yes» – обновлять дату при перемещении файла в корзину;
«recycle: keeptree = yes» – сохранять структуру каталогов удаленного файла;
«recycle: versions = yes» – при перемещении в корзину файла с существующим именем, добавлять к началу имени файла префикс «Copy #».

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

Перезапустим службу smbd

# service smbd restart

Теперь все удаленные файлы и папки будут перемещаться в скрытую папку .recycle, расположенную в корне общего ресурса Public.

Важно! На момент написания статьи использовался пакет Samba 4.3. При подключении модуля корзины (vfs object = recycle), было невозможно изменить ACL корневого общего ресурса (в данном случае Public). Также, при создании нового каталога, по умолчанию отключалось наследование прав.

Аутентификация доменных пользователей с использованием PAM

PAM — это набор динамически подключаемых модулей, используемых системой, для аутентификации пользователей. По умолчанию выполнить вход в систему могут только локальные пользователи. Для предоставления права входа доменным пользователям, определим в конфигурационном файле Samba расположение домашних каталогов и SHELL

# nano /etc/samba/smb.conf

[global]
. . .
       # Template settings for login shell and home directory
       template shell = /bin/bash
       template homedir = /home/%U

       winbind offline logon = yes
. . .

Параметр «winbind offline logon = yes» не является обязательным. Он включает буферизацию личных данных от успешных логинов. Что позволяет выполнить вход в случае недоступности контроллера домена.

Для применения изменений перезапустим службу Winbind

# service winbind restart

Для связи Winbind с PAM нужно установить следующую библиотеку

# apt install libpam-winbind

Настройка PAM модуля осуществляется командой

# pam-auth-update
    [*] Unix authentication                                                                                                                                                                                                        
    [*] Winbind NT/Active Directory authentication                                                                                                                                                                                 
    [*] Register user sessions in the systemd control group hierarchy                                                                                                                                                              
    [*] Create home directory on login

Теперь любой доменный пользователь может выполнить локальных вход на Linux сервер, либо подключиться удаленно через SSH.

Если аутентификация происходит на контроллере домена с WIndows Server 2012, при входе может появиться ошибка

groups: невозможно определить имя группы для ID 3000

По каким-то причинам пользователи домена добавляются в несуществующую группу с выше указанным ID. Чтобы избавиться от этой ошибки, можно добавить группу с таким ID в файл /etc/group

# echo "3000:x:3000:" >> /etc/group

Разрешим локальный вход на сервер только членам группы администраторы домена. Сначала нужно узнать SID этой группы

# wbinfo -n "администраторы домена"
S-1-5-21-3326307574-2095712778-3165998985-512 SID_DOM_GROUP (2)

Внесем изменения в /etc/pam.d/common-auth

# nano /etc/pam.d/common-auth

. . .
auth    [success=1 default=ignore]      pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass require_membership_of=S-1-5-21-3326307574-2095712778-3165998985-512
. . .

В require_membership_of указан SID группы администраторы домена.

Разрешим группе администраторы домена получать root привилегии в sudo

# visudo

. . .
%администраторы\ домена ALL=(ALL) ALL

OpenSSH Single sign-on (SSO)

Технология единого входа (англ. Single Sign-On) — технология, при использовании которой пользователь переходит из одного раздела портала в другой без повторной аутентификации.

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

Для поддержки SSO в OpenSSH нужно внести изменения в sshd_config

# nano /etc/ssh/sshd_config

. . .
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
. . .

и перезапустить службу SSH

# service ssh restart

В конфигурационный файл Samba нужно добавить следующие строки

# nano /etc/samba/smb.conf

[global]
. . .
       # Single sign-on Support
       kerberos method = secrets and keytab
       winbind refresh tickets = yes
. . .

Заключительным действием является создания keytab файла для Linux хоста

# net ads keytab create -U administrator

administrator — администратор домена.

По умолчанию keytab файл создается в /etc/krb5.keytab.

Посмотреть cодержимое созданного keytab файла можно командой

# net ads keytab list

Все готово для подключения. На Windows хосте выполним вход в систему и откроем SSH клиент, например Putty.

Укажем имя сервера для подключения

sso_sn

Используем текущее имя пользователя

sso_n

Разрешим использование GSS-API интерфейса

sso_key

Итоговый файл /etc/samba/smb.conf

[global]
       security = ADS
       workgroup = 4SKILL
       realm = 4SKILL.LOC

       # Default idmap config for local BUILTIN accounts and groups
       idmap config * : backend = tdb
       idmap config * : range = 3000-7999

       # idmap config for the 4SKILL domain
       idmap config 4SKILL : backend = rid
       idmap config 4SKILL : range = 10000-999999

       winbind use default domain = yes

       # Windows ACLs Support
       vfs objects = acl_xattr
       map acl inherit = yes
       store dos attributes = yes

       # Template settings for login shell and home directory
       template shell = /bin/bash
       template homedir = /home/%U

       winbind offline logon = yes

       # Single sign-on Support
       kerberos method = secrets and keytab
       winbind refresh tickets = yes

[Public]
       path = /srv/samba/public/
       read only = no

       vfs object = recycle
       recycle: repository = .recycle/%U
       recycle: touch = yes
       recycle: keeptree = yes
       recycle: versions = yes

Дополнительную информацию можно найти на страницах официального руководства в разделах:

Setting up Samba as a Domain Member
Setting up a Share Using Windows ACLs
Authenticating Domain Users Using PAM
PAM Offline Authentication
OpenSSH Single sign-on

Файловый сервер Samba в домене Windows: 4 комментария

  1. Михаил

    Здравствуйте.
    Спасибо за статью, все прошло без проблем. Но есть вопрос: как переименовать самба-сервер на Ubuntu, который уже является членом домена?

    1. Андрей Автор записи

      Здравствуйте!
      1. Переименовать Ubuntu сервер командой hostnamectl set-hostname «новое имя сервера».
      2. Изменить имя Ubuntu сервера в файле /etc/hosts на новое.
      3. Загнать Ubuntu сервер в домен командой net ads join -U Администратор osName=’Ubuntu Server GNU/Linux’ osVer=’16.04 LTS’
      4. На контроллере домена открыть оснастку «Пользователи и компьютеры» и из контейнера Computers удалить объект компьютер, имеющий старое имя Ubuntu сервера.
      5. На контроллере домена открыть оснастку «DNS» и удалить записи типа A и PTR, связанные со старым именем Ubuntu сервера.

  2. Имя

    Удивительное дело, все сразу получилось. Самая лучшая инструкция в сети.
    Консультант сервер на лине с доступом только определенным доменным группам к нему готов.
    Все до включения корзины выполнил. Остальное вроде как не нужно.
    Но что про keytab? Для чего это нужно? На сервак пускает и без него.
    Вводить свой комп в домен особого смысла не вижу. Запомню пароль доменного юзера для общих папок в бумажнике, а хомяк шифруется все равно.

    1. Андрей Автор записи

      В доменной реализации от Microsoft (AD DS) основным протоколом аутентификации является Kerberos 5.
      Kerberos использует механизм взаимной аутентификации клиента и сервера перед установлением связи между ними.
      Иными словами клиент удостоверяет себя серверу, а сервер удостоверяет себя клиенту.
      Для удостоверения используется, так называемый, билет Kerberos. Пользователь его получает от контроллера домена, когда вводит свой логин и пароль, при входе в систему.
      В свою очередь сервер, использует keytab файл, для получения билета Kerberos. Грубо говоря, keytab файл хранит в себе логин и пароль от учетной записи хоста. Реализация работы данного механизма на linux сервере, позволяет производить аутентификацию без ввода логина и пароля. Как пример, при подключении по ssh, пользователь сразу попадает в свой домашний каталог, без ввода логина и пароля.
      В небольшой организации, когда используется малое количество оснасток, возможно и не напрягает постоянно и везде вводить свой логин и пароль, но когда
      количество сервисов резко возрастает, это занимает много времени…

Добавить комментарий для Михаил Отменить ответ

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