Включение проверки подлинности Active Directory через SMB для клиентов Linux, обращаюющихся к Azure Files

Область применения: ✔️ общие папки SMB

Дополнительные сведения о поддерживаемых параметрах и рекомендациях см. в разделе Обзор параметров проверки подлинности Azure Files на основе удостоверений для доступа SMB.

Azure Files поддерживает проверку подлинности на основе удостоверений через блок сообщений сервера (SMB) для виртуальных машин Linux с помощью протокола проверки подлинности Kerberos с помощью следующих методов:

  • Локальные Windows Active Directory Domain Services (AD DS)
  • доменные службы Microsoft Entra

Чтобы использовать AD DS, необходимо синхронизировать AD DS с Microsoft Entra ID с помощью Microsoft Entra Connect Sync.

Примечание.

В этой статье используется Ubuntu для примера шагов. Аналогичные конфигурации работают для клиентов RHEL и SLES, которые позволяют монтировать общие файловые хранилища Azure, используя Active Directory.

Ограничения клиента SMB для Linux

Невозможно использовать проверку подлинности на основе удостоверений для подключения общих папок Azure на клиентах Linux во время загрузки с помощью записей fstab. Это связано с тем, что клиент не может получить билет Kerberos достаточно рано, чтобы подключиться во время загрузки. Можно использовать fstab запись и указать noauto параметр, чтобы пользователь мог подключить общую папку после входа с помощью простой команды подключения без всех параметров. Вы также можете использовать autofs, чтобы подключить общую папку в момент доступа.

Предварительные условия

Прежде чем включить проверку подлинности Active Directory через SMB для общих папок Azure, убедитесь, что выполнены следующие предварительные требования.

  • Виртуальная машина Linux под управлением Ubuntu 18.04+, или эквивалентная виртуальная машина RHEL или SLES. При запуске на Azure виртуальная машина должна иметь как минимум один сетевой интерфейс в виртуальной сети, содержащей Microsoft Entra Domain Services. При использовании локальной виртуальной машины ad DS необходимо синхронизировать с Microsoft Entra ID.
  • Учетные данные root или доступ пользователя к учетной записи локального пользователя с полными правами sudo (в этом руководстве — localadmin).
  • Виртуальная машина Linux еще не присоединена к другому домену AD. Если он уже является частью домена, он должен сначала оставить этот домен, прежде чем он сможет присоединиться к этому домену.
  • Клиент Microsoft Entra полностью настроен, с уже настроенным пользователем домена.

Установка пакета samba не является строго необходимой, но предоставляет некоторые полезные инструменты и автоматически предоставляет другие пакеты, например samba-common и smbclient. Выполните следующие команды, чтобы установить его. Если вы запрашиваете входные значения во время установки, оставьте их пустыми.

sudo apt update -y
sudo apt install samba winbind libpam-winbind libnss-winbind krb5-config krb5-user keyutils cifs-utils

Это wbinfo средство является частью набора samba и полезно для проверки подлинности и отладки, таких как проверка доступности контроллера домена, проверка того, к какому домену присоединен компьютер, и поиск сведений о пользователях.

Убедитесь, что хост Linux синхронизирует время с доменным сервером. Ознакомьтесь с документацией по дистрибутиву Linux. Для некоторых дистрибутивов это можно сделать с помощью systemd-timesyncd. Измените /etc/systemd/timesyncd.conf, чтобы включить в него следующее. Замените ntp.server одинаковым именем узла сервера NTP или IP-адресом, который использует сервер домена.

[Time]
NTP=ntp.server
FallbackNTP=ntp.ubuntu.com

Затем перезапустите службу:

sudo systemctl restart systemd-timesyncd.service

Включение проверки подлинности AD Kerberos

Выполните следующие действия, чтобы включить проверку подлинности AD Kerberos с помощью локальных служб AD DS или Microsoft Entra Domain Services. Эта документация по Samba может быть полезной в качестве ссылки.

Убедитесь, что доменный сервер доступен и доступен для обнаружения

В следующем разделе предполагается, что у вас есть локальные доменные службы AD DS. Если вы используете Microsoft Entra Domain Services, пропустите этот раздел и перейдите к Подключению к Entra Domain Services и убедитесь, что службы могут быть обнаружены.

  1. Убедитесь, что DNS-серверы, которые вы вводите, содержат IP-адреса сервера домена.

    systemd-resolve --status
    
    Global 
              DNSSEC NTA: 10.in-addr.arpa
                          16.172.in-addr.arpa
                          168.192.in-addr.arpa
                          17.172.in-addr.arpa
                          18.172.in-addr.arpa
                          19.172.in-addr.arpa
                          20.172.in-addr.arpa
                          21.172.in-addr.arpa
                          22.172.in-addr.arpa
                          23.172.in-addr.arpa
                          24.172.in-addr.arpa
                          25.172.in-addr.arpa
                          26.172.in-addr.arpa
                          27.172.in-addr.arpa
                          28.172.in-addr.arpa
                          29.172.in-addr.arpa
                          30.172.in-addr.arpa
                          31.172.in-addr.arpa
                          corp
                          d.f.ip6.arpa
                          home
                          internal
                          intranet
                          lan
                          local
                          private
                          test 
    
    Link 2 (eth0) 
          Current Scopes: DNS
           LLMNR setting: yes
    MulticastDNS setting: no
          DNSSEC setting: no
        DNSSEC supported: no
             DNS Servers: 10.0.2.5
                          10.0.2.4
                          10.0.0.41
              DNS Domain: domain1.contoso.com
    
  2. Если команда работает, пропустите следующие шаги и перейдите к следующему разделу.

  3. Если команда не работает, убедитесь, что вы можете отправить ping на адреса сервера домена.

    ping 10.0.2.5
    
    PING 10.0.2.5 (10.0.2.5) 56(84) bytes of data.
    64 bytes from 10.0.2.5: icmp_seq=1 ttl=128 time=0.898 ms
    64 bytes from 10.0.2.5: icmp_seq=2 ttl=128 time=0.946 ms
    
    ^C 
    
    --- 10.0.2.5 ping statistics --- 
    2 packets transmitted, 2 received, 0% packet loss, time 1002ms
    rtt min/avg/max/mdev = 0.898/0.922/0.946/0.024 ms
    
  4. Если пинг не работает, вернитесь к предварительным требованиям и убедитесь, что ваша виртуальная машина входит в виртуальную сеть, которая имеет доступ к арендатору Entra.

  5. Если IP-адреса отвечают на ping, но DNS-серверы не обнаруживаются автоматически, можно добавить DNS-серверы вручную. Измените /etc/netplan/50-cloud-init.yaml с помощью вашего любимого текстового редактора.

    # This file is generated from information provided by the datasource.  Changes
    # to it will not persist across an instance reboot.  To disable cloud-init's
    # network configuration capabilities, write a file
    # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
    # network: {config: disabled}
    network:
        ethernets:
            eth0:
                dhcp4: true
                dhcp4-overrides:
                    route-metric: 100
                dhcp6: false
                match:
                    macaddress: 00:22:48:03:6b:c5
                set-name: eth0
                nameservers:
                    addresses: [10.0.2.5, 10.0.2.4]
        version: 2
    

    Затем примените изменения:

    sudo netplan --debug apply 
    
  6. Winbind предполагает, что DHCP-сервер сохраняет записи DNS домена в актуальном состоянии. Однако это предположение не верно для Azure DHCP. Чтобы настроить клиент для обновления DDNS, используйте это руководство для создания сетевого скрипта. Ниже приведен пример скрипта, который находится в /etc/dhcp/dhclient-exit-hooks.d/ddns-update.

    #!/bin/sh 
    
    # only execute on the primary nic
    if [ "$interface" != "eth0" ]
    then
        return
    fi 
    
    # When you have a new IP, perform nsupdate
    if [ "$reason" = BOUND ] || [ "$reason" = RENEW ] ||
       [ "$reason" = REBIND ] || [ "$reason" = REBOOT ]
    then
       host=`hostname -f`
       nsupdatecmds=/var/tmp/nsupdatecmds
         echo "update delete $host a" > $nsupdatecmds
         echo "update add $host 3600 a $new_ip_address" >> $nsupdatecmds
         echo "send" >> $nsupdatecmds
    
         nsupdate $nsupdatecmds
    fi 
    

Перейдите к настройке имени узла и полного доменного имени.

Подключитесь к доменным службам Microsoft Entra и убедитесь, что службы доступны для обнаружения.

Если вы используете AD DS, а не Microsoft Entra Domain Services, можно пропустить этот раздел и перейти к настройке имени узла и полного доменного имени.

Убедитесь, что вы можете проверить связь с доменным сервером по имени домена.

ping contosodomain.contoso.com
PING contosodomain.contoso.com (10.0.2.4) 56(84) bytes of data.
64 bytes from pwe-oqarc11l568.internal.cloudapp.net (10.0.2.4): icmp_seq=1 ttl=128 time=1.41 ms
64 bytes from pwe-oqarc11l568.internal.cloudapp.net (10.0.2.4): icmp_seq=2 ttl=128 time=1.02 ms
64 bytes from pwe-oqarc11l568.internal.cloudapp.net (10.0.2.4): icmp_seq=3 ttl=128 time=0.740 ms
64 bytes from pwe-oqarc11l568.internal.cloudapp.net (10.0.2.4): icmp_seq=4 ttl=128 time=0.925 ms 

^C 

--- contosodomain.contoso.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3016ms
rtt min/avg/max/mdev = 0.740/1.026/1.419/0.248 ms 

Убедитесь, что вы можете обнаружить службы Entra в сети.

nslookup
> set type=SRV
> _ldap._tcp.contosodomain.contoso.com.
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer: 

_ldap._tcp.contosodomain.contoso.com service = 0 100 389 pwe-oqarc11l568.contosodomain.contoso.com.
_ldap._tcp.contosodomain.contoso.com service = 0 100 389 hxt4yo--jb9q529.contosodomain.contoso.com. 

Настройка имени узла и полностью квалифицированного доменного имени (FQDN)

С помощью текстового редактора обновите /etc/hosts файл с окончательным полным доменным именем (после присоединения к домену) и псевдонимом хоста. IP-адрес сейчас не имеет значения, так как эта строка в основном используется для перевода короткого имени узла в полное доменное имя. Дополнительные сведения см. в разделе "Настройка Samba в качестве члена домена".

127.0.0.1       contosovm.contosodomain.contoso.com contosovm
#cmd=sudo vim /etc/hosts   
#then enter this value instead of localhost "ubuntuvm.contosodomain.contoso.com UbuntuVM" 

Теперь имя узла должно разрешаться. Вы можете пока проигнорировать IP-адрес, к которому он разрешается. Короткое имя хоста должно разрешаться в FQDN.

getent hosts contosovm
127.0.0.1       contosovm.contosodomain.contoso.com contosovm
dnsdomainname
contosodomain.contoso.com
hostname -f
contosovm.contosodomain.contoso.com 

Примечание.

Для того чтобы hostnamectl обновлялся на некоторых дистрибутивах Linux, необходимо выполнить команду hostname -f:

hostnamectl set-hostname contosovm.contosodomain.contoso.com

Настройка krb5.conf

Настройте /etc/krb5.conf, чтобы можно было связаться для проверки подлинности с центром распространения ключей Kerberos (KDC) на сервере домена. Дополнительные сведения см. в документации по MIT Kerberos. Ниже приведен пример /etc/krb5.conf файла.

[libdefaults]
        default_realm = CONTOSODOMAIN.CONTOSO.COM
        dns_lookup_realm = false
        dns_lookup_kdc = true

Настройка smb.conf

Определите путь к smb.conf.

sudo smbd -b | grep "CONFIGFILE"
   CONFIGFILE: /etc/samba/smb.conf

Измените конфигурацию SMB, чтобы она действовала в качестве члена домена. Дополнительные сведения см. в разделе "Настройка samba в качестве члена домена". Ниже приведен пример smb.conf файла.

Примечание.

Этот пример предназначен для доменных служб Microsoft Entra, для которых при настройке idmap рекомендуется использование backend = rid. Локальные пользователи AD DS могут предпочесть выбрать другой бэкенд для idmap.

[global]
   workgroup = CONTOSODOMAIN
   security = ADS
   realm = CONTOSODOMAIN.CONTOSO.COM

   winbind refresh tickets = Yes
   vfs objects = acl_xattr
   map acl inherit = Yes
   store dos attributes = Yes

   dedicated keytab file = /etc/krb5.keytab
   kerberos method = secrets and keytab

   winbind use default domain = Yes 

   load printers = No
   printing = bsd
   printcap name = /dev/null
   disable spoolss = Yes

   log file = /var/log/samba/log.%m
   log level = 1

   idmap config * : backend = tdb
   idmap config * : range = 3000-7999

   idmap config CONTOSODOMAIN : backend = rid
   idmap config CONTOSODOMAIN : range = 10000-999999

   template shell = /bin/bash
   template homedir = /home/%U 

Вызвать принудительную перезагрузку измененного файла конфигурации.

sudo smbcontrol all reload-config

Присоединение к домену.

net ads join Используйте команду для присоединения узла к домену. Если команда возвращает ошибку, см. раздел "Устранение неполадок членов домена samba ", чтобы устранить проблему.

sudo net ads join -U contososmbadmin    # user  - garead

Enter contososmbadmin's password:
Using short domain name -- CONTOSODOMAIN
Joined 'CONTOSOVM' to dns domain 'contosodomain.contoso.com' 

Убедитесь, что запись DNS существует для этого узла на сервере домена.

nslookup contosovm.contosodomain.contoso.com 10.0.2.5
Server:         10.0.2.5
Address:        10.0.2.5#53

Name:   contosovm.contosodomain.contoso.com
Address: 10.0.0.8

Настройка nsswitch.conf

Если вы планируете пользователям активно войти на клиентские компьютеры и получить доступ к общим папкам Azure, необходимо настроить nsswitch.conf. Если запланированный доступ ограничен приложениями, представленными учетной записью пользователя или учетной записью компьютера, требующей проверки подлинности Kerberos для доступа к общей папке, можно пропустить этот шаг.

После присоединения узла к домену добавьте библиотеки winbind в пути поиска пользователей и групп. Используйте текстовый редактор для редактирования /etc/nsswitch.conf и добавления следующих записей:

passwd:         compat systemd winbind
group:          compat systemd winbind

Включите службу winbind для автоматического запуска при перезагрузке.

sudo systemctl enable winbind
Synchronizing state of winbind.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable winbind

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

sudo systemctl restart winbind
sudo systemctl status winbind
winbind.service - Samba Winbind Daemon
   Loaded: loaded (/lib/systemd/system/winbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-04-24 09:34:31 UTC; 10s ago
     Docs: man:winbindd(8)
           man:samba(7)
           man:smb.conf(5)
 Main PID: 27349 (winbindd)
   Status: "winbindd: ready to serve connections..."
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/winbind.service
           ├─27349 /usr/sbin/winbindd --foreground --no-process-group
           └─27351 /usr/sbin/winbindd --foreground --no-process-group

Apr 24 09:34:31 contosovm systemd[1]: Starting Samba Winbind Daemon...
Apr 24 09:34:31 contosovm winbindd[27349]: [2020/04/24 09:34:31.724211,  0] ../source3/winbindd/winbindd_cache.c:3170(initialize_winbindd_cache)
Apr 24 09:34:31 contosovm winbindd[27349]:   initialize_winbindd_cache: clearing cache and re-creating with version number 2
Apr 24 09:34:31 contosovm winbindd[27349]: [2020/04/24 09:34:31.725486,  0] ../lib/util/become_daemon.c:124(daemon_ready)
Apr 24 09:34:31 contosovm systemd[1]: Started Samba Winbind Daemon.
Apr 24 09:34:31 contosovm winbindd[27349]:   STATUS=daemon 'winbindd' finished starting up and ready to serve connections 

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

getent passwd contososmbadmin
contososmbadmin:*:12604:10513::/home/contososmbadmin:/bin/bash
getent group 'domain users'
domain users:x:10513: 

Если предыдущие шаги не работают, проверьте, доступен ли контроллер домена с помощью wbinfo средства:

wbinfo --ping-dc

Настройка PAM для winbind

Если вы планируете, чтобы пользователи активно входить на клиентские компьютеры и получать доступ к общим папкам Azure, необходимо настроить PAM для winbind. Если запланированный доступ ограничен приложениями, представленными учетной записью пользователя или учетной записью компьютера, требующей проверки подлинности Kerberos для доступа к общей папке, можно пропустить этот шаг.

Поместите winbind в стек проверки подлинности, чтобы пользователи домена прошли проверку подлинности через winbind, настроив PAM (подключаемый модуль проверки подлинности) для winbind. Вторая команда гарантирует, что система создает домашний каталог для пользователя домена при первом входе.

sudo pam-auth-update --enable winbind
sudo pam-auth-update --enable mkhomedir 

Убедитесь, что в конфигурации проверки подлинности PAM есть следующие аргументы /etc/pam.d/common-auth:

grep pam_winbind.so /etc/pam.d/common-auth
auth    [success=1 default=ignore]      pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass 

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

su - contososmbadmin
Password:
Creating directory '/home/contososmbadmin'.
contososmbadmin@contosovm:~$ pwd
/home/contososmbadmin
contososmbadmin@contosovm:~$ id
uid=12604(contososmbadmin) gid=10513(domain users) groups=10513(domain users),10520(group policy creator owners),10572(denied rodc password replication group),11102(dnsadmins),11104(aad dc administrators),11164(group-readwrite),11165(fileshareallaccess),12604(contososmbadmin) 

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

Чтобы убедиться, что клиентский компьютер присоединен к домену, найдите полное доменное имя клиента на контроллере домена и найдите запись DNS, указанную для этого конкретного клиента. Во многих случаях <dnsserver> совпадает с доменным именем, к которому присоединяется клиент.

nslookup <clientname> <dnsserver>

Затем используйте klist команду для просмотра билетов в кэше Kerberos. Должна быть запись, начинающаяся с krbtgt, которая выглядит примерно так:

krbtgt/CONTOSODOMAIN.CONTOSO.COM@CONTOSODOMAIN.CONTOSO.COM

Если вы не настроили PAM для winbind, klist может не отобразить запись билета. В этом случае можно вручную пройти проверку подлинности пользователя, чтобы получить билеты:

wbinfo -K contososmbadmin

Вы также можете выполнить команду в рамках скрипта:

wbinfo -K 'contososmbadmin%SUPERSECRETPASSWORD'

Подключение общей папки

После включения проверки подлинности Kerberos и присоединения к домену виртуальной машины Linux вы можете подключить общую папку.

Используйте следующий параметр подключения со всеми моделями управления доступом, чтобы включить безопасность Kerberos: sec=krb5 При использовании sec=krb5не укажите имя пользователя и пароль. Рассмотрим пример.

sudo mount -t cifs $SMB_PATH $MNT_PATH -o sec=krb5,cruid=$UID,serverino,nosharesock,actimeo=30,mfsymlinks

Примечание.

Эта функция поддерживает только серверную модель управления доступом, которая использует NT ACL без битов режима. Средств Linux для обновления списков управления доступом NT мало, поэтому обновление проводите через Windows. В настоящее время не поддерживаются модели управления доступом, управляемые клиентом (modefromsid,idsfromsid), и модели управления доступом, преобразованные клиентом (cifsacl).

Другие параметры монтирования

Монопользовательское подключение и подключение для нескольких пользователей

В случае использования подключения с одним пользователем один пользователь в домене AD обращается к точке подключения и не предоставляет общий доступ другим пользователям в домене. Каждый доступ к файлам происходит в контексте пользователя, учетные данные krb5 которого используются для подключения общей папки. Любой пользователь локальной системы, обращающийся к точке монтирования, выступает от имени этого пользователя.

В случае использования с несколькими пользователями по-прежнему существует одна точка подключения, но несколько пользователей AD могут получить доступ к той же точке подключения. В сценариях, когда несколько пользователей на одном клиенте обращаются к одной и той же общей папке и система настроена для Kerberos и подключена с параметром sec=krb5, рассмотрите возможность использования параметра multiuser для подключения.

Разрешения для файла

Разрешения файлов имеют значение, особенно если клиенты Linux и Windows получают доступ к общей папке. Чтобы преобразовать разрешения файлов в DACL на файлах, используйте параметр подключения по умолчанию, например file_mode=<>,dir_mode=<>. Клиент применяет только разрешения файлов, указанные как file_mode и dir_mode. Сервер применяет управление доступом на основе дескриптора безопасности файла или каталога.

Владение файлом

Владение файлами имеет значение, особенно если клиенты Linux и Windows получают доступ к общей папке. Выберите один из следующих параметров монтирования, чтобы преобразовать UID/GID владения файла в SID владельца/группы на DACL файла.

  • Используйте значение по умолчанию, например uid=<>,gid=<>
  • Настройте сопоставление UID/GID с помощью RFC2307 и Active Directory (nss_winbind или nss_sssd)

Согласованность кэша атрибутов файлов

Производительность важна, даже если атрибуты файла не всегда точны. Значение по умолчанию для actimeo равно 1 (секунда), что означает, что атрибуты файла запрашиваются снова с сервера, если кэшированные атрибуты старше 1 секунды. Увеличение значения до 60 означает, что атрибуты кэшируются не менее одной минуты. Для большинства вариантов использования используйте значение 30 для этого параметра (actimeo=30).

Для новых ядер рассмотрите возможность более детальной настройки функций actimeo . Вы можете использовать acdirmax для кэширования переоценки записей каталога и acregmax для кэширования метаданных файла, например, acdirmax=60,acregmax=5.

Следующий шаг

Чтобы узнать, как подключить общую папку SMB в Linux, см.: