Azure Files에 액세스하는 Linux 클라이언트의 SMB를 통해 Azure Active Directory 인증 사용

지원되는 옵션 및 고려 사항에 대한 자세한 내용은 SMB 액세스에 대한 Azure Files ID 기반 인증 옵션 개요를 참조하세요.

Azure Files는 다음 방법을 통해 Kerberos 인증 프로토콜을 사용하여 Linux VM(가상 머신)용 SMB(서버 메시지 블록)를 통한 ID 기반 인증을 지원합니다.

  • 온-프레미스 Windows AD DS(Active Directory Domain Services)
  • Microsoft Entra Domain Services

첫 번째 옵션(AD DS)을 사용하려면 Microsoft Entra Connect를 사용하여 AD DS를 Microsoft Entra ID에 동기화해야 합니다.

참고 항목

이 문서에서는 예제 단계에 Ubuntu를 사용합니다. RHEL 및 SLES 머신에서도 유사한 구성이 작동하므로 Active Directory를 사용하여 Azure 파일 공유를 탑재할 수 있습니다.

적용 대상

파일 공유 유형 SMB NFS
표준 파일 공유(GPv2), LRS/ZRS Yes, this article applies to standard SMB Azure file shares LRS/ZRS. No, this article doesn't apply to NFS Azure file shares.
표준 파일 공유(GPv2), GRS/GZRS Yes, this article applies to standard SMB Azure file shares GRS/GZRS. No this article doesn't apply to NFS Azure file shares.
프리미엄 파일 공유(FileStorage), LRS/ZRS Yes, this article applies to premium SMB Azure file shares. No, this article doesn't apply to premium NFS Azure file shares.

Linux SMB 클라이언트 제한 사항

클라이언트가 부팅 시 탑재할 수 있을 만큼 일찍 Kerberos 티켓을 얻을 수 없으므로 fstab 항목을 사용하여 부팅 시 Linux 클라이언트에 Azure File 공유를 탑재하는 데 ID 기반 인증을 사용할 수 없습니다. 그러나 fstab 항목을 사용하고 noauto 옵션을 지정할 수 있습니다. 이렇게 하면 부팅 시 공유를 탑재하지는 않지만 사용자가 모든 매개 변수 없이 간단한 탑재 명령을 사용하여 로그인한 후 파일 공유를 편리하게 탑재할 수 있습니다. 액세스 시 autofs를 사용하여 공유를 탑재할 수도 있습니다.

필수 조건

Azure 파일 공유에 SMB를 통해 AD 인증을 사용하도록 설정하기 전에 다음 사전 요구 사항을 완료했는지 확인합니다.

  • Azure에서 실행되는 Linux VM(Ubuntu 18.04 이상 또는 이에 상응하는 RHEL 또는 SLES VM)입니다. VM에는 Microsoft Entra Domain Services를 포함하는 VNET에 하나 이상의 네트워크 인터페이스 또는 AD DS가 Microsoft Entra ID와 동기화된 온-프레미스 Linux VM이 있어야 합니다.
  • 전체 sudo 권한이 있는 로컬 사용자 계정에 대한 루트 사용자 또는 사용자 자격 증명(이 가이드의 경우 localadmin)입니다.
  • Linux VM이 어떤 AD 도메인에도 가입되어 있지 않아야 합니다. 이미 도메인의 일부인 경우 이 도메인에 가입하려면 먼저 해당 도메인에서 탈퇴해야 합니다.
  • 도메인 사용자가 이미 설정되어 있는 Microsoft Entra 테넌트가 완전히 구성되어 있습니다.

samba 패키지를 설치할 필요는 없지만 이 패키지를 설치하면 몇 가지 유용한 도구와 samba-commonsmbclient와 같은 다른 패키지를 자동으로 제공합니다. 다음 명령을 실행하여 설치합니다. 설치하는 동안 입력 값을 묻는 메시지가 표시되면 공백으로 비워 둡니다.

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를 편집하여 다음을 포함합니다.

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

그런 다음, 서비스를 다시 시작합니다.

sudo systemctl restart systemd-timesyncd.service

AD Kerberos 인증 사용

다음 단계에 따라 AD Kerberos 인증을 사용할 수 있습니다. 이 Samba 설명서는 참조로 유용할 수 있습니다.

도메인 서버에 연결할 수 있고 검색이 가능한지 확인합니다.

  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 
  1. 명령이 작동하면 다음 단계를 건너뛰고 다음 섹션으로 진행합니다.

  2. 작동하지 않으면 도메인 서버 IP 주소가 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
  1. ping이 작동하지 않는 경우 필수 조건으로 돌아가서 VM이 Microsoft Entra 테넌트에 액세스할 수 있는 VNET에 있는지 확인합니다.

  2. 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 
  1. 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 Domain Services에 연결하고 서비스를 검색할 수 있는지 확인합니다.

  1. 도메인 이름으로 도메인 서버를 ping할 수 있는지 확인합니다.
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 
  1. 네트워크에서 Microsoft 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(정규화된 도메인 이름) 설정

  1. 텍스트 편집기를 사용하여 /etc/hosts 파일을 최종 FQDN(도메인에 가입한 후)과 호스트의 별칭으로 업데이트합니다. 이 줄은 주로 짧은 호스트 이름을 FQDN으로 변환하는 데 사용되므로 IP 주소는 현재 중요하지 않습니다. 자세한 내용은 Samba를 도메인 구성원으로 설정을 참조하세요.
127.0.0.1       contosovm.contosodomain.contoso.com contosovm
#cmd=sudo vim /etc/hosts   
#then enter this value instead of localhost "ubuntvm.contosodomain.contoso.com UbuntuVM" 
  1. 이제 호스트 이름이 확인되어야 합니다. 지금은 확인된 IP 주소를 무시할 수 있습니다. 짧은 호스트 이름은 FQDN으로 확인되어야 합니다.
getent hosts contosovm
127.0.0.1       contosovm.contosodomain.contoso.com contosovm
dnsdomainname
contosodomain.contoso.com
hostname -f
contosovm.contosodomain.contoso.com 

참고 항목

일부 배포판에서는 호스트 이름 -f를 업데이트하기 위해 hostnamectl 명령을 실행해야 합니다.

hostnamectl set-hostname contosovm.contosodomain.contoso.com

krb5.conf 설정

  1. 인증을 위해 도메인 서버가 있는 Kerberos KDC(키 배포 센터)에 연결할 수 있도록 /etc/krb5.conf를 구성합니다. 자세한 내용은 설명서를 참조하세요. 다음은 샘플 /etc/krb5.conf 파일입니다.
[libdefaults]
        default_realm = CONTOSODOMAIN.CONTOSO.COM
        dns_lookup_realm = false
        dns_lookup_kdc = true

smb.conf 설정

  1. smb.conf에 대한 경로를 식별합니다.
sudo smbd -b | grep "CONFIGFILE"
   CONFIGFILE: /etc/samba/smb.conf
  1. 도메인 구성원 역할을 하도록 SMB 구성을 변경합니다. 자세한 내용은 Samba를 도메인 구성원으로 설정을 참조하세요. 다음은 샘플 smb.conf 파일입니다.

참고 항목

이 예제는 Microsoft Entra Domain Services에 대한 것으로, 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 
  1. winbind가 강제로 실행하여 변경된 구성 파일을 다시 로드합니다.
sudo smbcontrol all reload-config

도메인 가입

  1. net ads join 명령을 사용하여 호스트를 Microsoft Entra Domain Services 도메인에 조인합니다. 명령에서 오류가 발생하는 경우 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' 
  1. 도메인 서버에 이 호스트에 대한 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

사용자가 클라이언트 머신 또는 VM에 적극적으로 로그인하고 Azure 파일 공유에 액세스하는 경우 nsswitch.conf 설정winbind용 PAM 구성을 수행해야 합니다. 파일 공유에 액세스하기 위해 Kerberos 인증이 필요한 사용자 계정 또는 컴퓨터 계정으로 표시되는 애플리케이션에 대한 액세스가 제한되는 경우 다음 단계를 건너뛸 수 있습니다.

nsswitch.conf 설정

  1. 이제 호스트가 도메인에 가입되었으므로 사용자 및 그룹을 찾을 때 찾을 위치에 winbind 라이브러리를 배치해야 합니다. 이 작업을 수행하려면 nsswitch.conf에서 암호 및 그룹 항목을 업데이트합니다. 텍스트 편집기를 사용하여 /etc/nsswitch.conf를 편집하고 다음 항목을 추가합니다.
passwd:         compat systemd winbind
group:          compat systemd winbind
  1. 다시 부팅 시 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
  1. 그런 다음, 서비스를 다시 시작합니다.
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 
  1. 도메인 사용자 및 그룹이 검색되었는지 확인합니다.
getent passwd contososmbadmin
contososmbadmin:*:12604:10513::/home/contososmbadmin:/bin/bash
getent group 'domain users'
domain users:x:10513: 

위의 작업이 작동하지 않으면 wbinfo 도구를 사용하여 도메인 컨트롤러에 연결할 수 있는지 확인합니다.

wbinfo --ping-dc

winbind의 PAM 구성

  1. winbind의 PAM(Pluggable Authentication Module)을 구성하여 도메인 사용자가 winbind를 통해 인증되도록 인증 스택에 winbind를 배치해야 합니다. 두 번째 명령은 이 시스템에 처음 로그인할 때 도메인 사용자를 위해 homedir을 만들도록 합니다.
sudo pam-auth-update --enable winbind
sudo pam-auth-update --enable mkhomedir 
  1. 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 
  1. 이제 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) 

구성 확인

클라이언트 머신이 도메인에 가입되어 있는지 확인하려면 도메인 컨트롤러에서 클라이언트의 FQDN을 조회하고 이 특정 클라이언트에 대해 나열된 DNS 항목을 찾습니다. 대부분의 경우 <dnsserver>는 클라이언트가 가입된 도메인 이름과 동일합니다.

nslookup <clientname> <dnsserver>

다음으로 klist 명령을 사용하여 Kerberos 캐시의 티켓을 확인합니다. 다음과 유사한 krbtgt로 시작하는 항목이 있어야 합니다.

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

winbind의 PAM을 구성하지 않은 경우 klist에서 티켓 항목이 표시되지 않을 수 있습니다. 이 경우 사용자를 수동으로 인증하여 티켓을 얻을 수 있습니다.

wbinfo -K contososmbadmin

스크립트의 일부로 명령을 실행할 수도 있습니다.

wbinfo -K 'contososmbadmin%SUPERSECRETPASSWORD'

파일 공유 마운트

AD(또는 Microsoft Entra ID) Kerberos 인증을 사용하도록 설정하고 Linux VM을 도메인에 가입한 후 파일 공유를 탑재할 수 있습니다.

자세한 탑재 지침은 탑재를 사용하여 주문형 Azure 파일 공유 탑재를 참조하세요.

Kerberos 보안을 사용하도록 설정하려면 모든 액세스 제어 모델에서 다음 추가 탑재 옵션을 사용합니다. sec=krb5

참고 항목

이 기능은 모드 비트가 없는 NT ACL을 사용하는 서버 적용 액세스 제어 모델만 지원합니다. NT ACL을 업데이트하는 Linux 도구는 아주 적으므로 Windows를 통해 ACL을 업데이트합니다. 클라이언트 적용 액세스 제어(modefromsid,idsfromsid) 및 클라이언트 변환 액세스 제어(cifsacl) 모델은 현재 지원되지 않습니다.

기타 탑재 옵션

단일 사용자 대 다중 사용자 탑재

단일 사용자 탑재 사용 사례에서 탑재 지점은 AD 도메인의 단일 사용자가 액세스하며 도메인의 다른 사용자와 공유되지 않습니다. 각 파일 액세스는 파일 공유를 탑재하는 데 krb5 자격 증명이 사용된 사용자의 컨텍스트에서 발생합니다. 탑재 지점에 액세스하는 로컬 시스템의 모든 사용자는 해당 사용자로 가장합니다.

다중 사용자 탑재 사용 사례에는 여전히 단일 탑재 지점이 있지만 여러 AD 사용자가 동일한 탑재 지점에 액세스할 수 있습니다. 동일한 클라이언트의 여러 사용자가 동일한 공유에 액세스하고 시스템이 Kerberos용으로 구성되고 sec=krb5를 사용하여 탑재되는 시나리오에서는 multiuser 탑재 옵션을 사용하는 것이 좋습니다.

파일 권한

특히 Linux 및 Windows 클라이언트 모두가 파일 공유에 액세스하는 경우 파일 사용 권한이 중요합니다. 파일 사용 권한을 파일의 DACL로 변환하려면 기본 탑재 옵션(예: file_mode=<>,dir_mode=<>)을 사용합니다. file_modedir_mode로 지정된 파일 사용 권한은 클라이언트 내에서만 적용됩니다. 서버는 파일 또는 디렉터리의 보안 설명자에 따라 액세스 제어를 실행합니다.

파일 소유권

특히 Linux 및 Windows 클라이언트 모두가 파일 공유에 액세스하는 경우 파일 소유권이 중요합니다. 다음 탑재 옵션 중 하나를 선택하여 파일 소유권 UID/GID를 파일 DACL의 소유자/그룹 SID로 변환합니다.

  • uid=<>,gid=<>와 같은 기본값 사용
  • RFC2307 및 Active Directory(nss_winbind 또는 nss_sssd)를 통해 UID/GID 매핑 구성

파일 특성 캐시 일관성

파일 특성이 항상 정확하지는 않더라도 성능은 중요합니다. actimeo의 기본값은 1(초)이며, 이는 캐시된 특성이 1초 이상인 경우 서버에서 파일 특성을 다시 가져옴을 의미합니다. 값을 60으로 늘리면 특성이 1분 이상 캐시됩니다. 대부분의 사용 사례에서는 이 옵션의 값에 30을 사용하는 것이 좋습니다(actimeo=30).

최신 커널의 경우 actimeo 기능을 보다 세분화하여 설정하는 것이 좋습니다. 디렉터리 항목 유효성 재검사 캐싱에는 acdirmax를 사용하고 파일 메타데이터 캐싱에는 acregmax를 사용할 수 있습니다(예: acdirmax=60,acregmax=5).

다음 단계

Linux에서 SMB 파일 공유를 탑재하는 방법에 대한 자세한 내용은 다음을 참조하세요.