适用于: ✔️ SMB 文件共享
Azure 文件存储 通过将 Kerberos 身份验证协议与本地 Active Directory 域服务 (AD DS) 配合使用,支持用于 Linux 虚拟机 (VM) 的基于标识的服务器消息块 (SMB) 身份验证。 使用此程序时,您必须通过使用 Microsoft Entra Connect Sync 将您的 AD DS 环境与 Microsoft Entra ID 同步。
有关支持选项和注意事项的详细信息,请参阅实现 SMB 访问的 Azure 文件存储基于标识的身份验证选项概述。
注意
本文使用 Ubuntu 说明示例步骤。 类似配置适用于 RHEL 和 SLES 客户端,允许你通过本地 AD DS 挂载 Azure 文件共享。
Linux SMB 客户端限制
你无法使用基于标识的身份验证,通过 fstab 条目在 Linux 客户端上于启动时挂载 Azure 文件共享。 之所以存在这一限制,是因为客户端无法及时获取 Kerberos 票证,因此无法在启动时完成挂载。 可以使用条目 fstab 并指定 noauto 选项,让用户在登录后使用简单的装载命令来装载文件共享,而无需所有参数。 还可以使用 autofs 在访问时装载共享。
先决条件
在配置Linux客户端通过SMB进行本地AD DS认证以获取Azure文件共享之前,请完成以下先决条件:
- 运行 Ubuntu 18.04+ 或等效 SLES VM 的 Linux VM。 虚拟机必须与本地的 AD DS 域控制器保持网络连接,并使用 DNS 服务器来解析 AD DS 域。
- 使用 Microsoft Entra Connect Sync 与 Microsoft Entra ID 同步的本地 AD DS 环境。
- 在为本地 AD DS 认证配置的存储账户中的 SMB Azure 文件共享。
- 具有完全 sudo 权限的本地用户帐户的根用户或用户凭据(对于本指南,为 localadmin)。
- Linux 虚拟机还没有加入另一个 AD DS 域。 如果是这样,请先使该虚拟机脱离该域,然后再将其加入该域。
- 一个具有将计算机加入该域权限的 AD DS 域用户帐户。
安装 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主机的时间与AD DS域控制器同步。 请参阅你的Linux发行版文档。 对于某些发行版,你可以 用 systemd-timesyncd 来实现。 编辑 /etc/systemd/timesyncd.conf ,包含以下配置。 用与你的 AD DS 环境使用的相同的网络时间协议(NTP)服务器主机名或 IP 地址替换 ntp.server 。
[Time]
NTP=ntp.server
FallbackNTP=ntp.ubuntu.com
然后重启服务:
sudo systemctl restart systemd-timesyncd.service
启用AD DS Kerberos认证
请按照以下步骤启用本地部署的 AD DS Kerberos 身份验证。 有关配置Samba的更多信息,请参见 “作为域名成员设置Samba”。
确保 AD DS 域控制器是可访问和可发现的
确保配置好的DNS服务器能够解析你的AD DS域和域控制器。
systemd-resolve --statusGlobal 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如果DNS服务器包含域控制器的IP地址,继续 设置主机名和FQDN。 如果命令未生成预期输出,请参阅“排查 AD DS 域控制器发现问题”。
排查 AD DS 域控制器发现过程中的问题
确保你能够 ping 通 AD DS 域控制器的 IP 地址。
ping 10.0.2.5PING 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如果ping不起作用,请复核前 置条件,确保你的虚拟机与AD DS域控制器有网络连接。
如果 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 applyWinbind 假定 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
解决问题后,继续 设置主机名和完全限定的域名。
设置主机名和完全限定的域名 (FQDN)
使用文本编辑器,更新 /etc/hosts 文件,填入最终的 FQDN(域加入后)和主机的别名。 IP 地址目前并不重要,因为此行主要用于将短主机名转换为 FQDN。 有关详细信息,请参阅 将 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"
现在,运行以下三个命令,验证你的主机名能否被正确解析。
用 getent hosts 来确认短主机名是否解析到FQDN。 你可以忽略返回的IP地址。
getent hosts contosovm
127.0.0.1 contosovm.contosodomain.contoso.com contosovm
使用 dnsdomainname 确认域名已正确配置。
dnsdomainname
contosodomain.contoso.com
用 hostname -f 来确认完整的FQDN已解决。
hostname -f
contosovm.contosodomain.contoso.com
注意
某些 Linux 发行版需要你运行 hostnamectl 命令才能更新 hostname -f:
hostnamectl set-hostname contosovm.contosodomain.contoso.com
设置 krb5.conf
配置 /etc/krb5.conf,使其能够联系到 AD DS 域控制器上的 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 配置更改为充当 AD DS 域成员。 以下示例使用了 rid idmap 后端。 查阅选择 idmap 后端,并选择符合 AD DS 环境要求的后端。
[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
强制 winbind 重新加载更改后的配置文件。
sudo smbcontrol all reload-config
加入AD DS域
使用 net ads join 命令将主机加入域。 如果命令返回错误,请参阅 “排查 samba 域成员 ”以解决问题。
sudo net ads join -U contososmbadmin
Enter contososmbadmin's password:
Using short domain name -- CONTOSODOMAIN
Joined 'CONTOSOVM' to dns domain 'contosodomain.contoso.com'
确保该主机的DNS记录存在于AD DS 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 工具检查是否可访问 AD DS 域控制器:
wbinfo --ping-dc
为 winbind 配置 PAM
如果计划用户主动登录到客户端计算机并访问Azure文件共享,则需要为 winbind 配置 PAM。 如果计划内访问仅限于需要 Kerberos 身份验证才能访问文件共享的用户帐户或计算机帐户表示的应用程序,则可以跳过此步骤。
将 winbind 置于身份验证堆栈中,并通过配置 PAM(可插入身份验证模块)以使域用户能够通过 winbind 进行身份验证。 第二个命令可确保系统在第一次登录时为域用户创建主目录。
sudo pam-auth-update --enable winbind
sudo pam-auth-update --enable mkhomedir
验证 pam_winbind.so 中的 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
如果命令没有输出,请重新运行 sudo pam-auth-update --enable winbind 以确保 winbind 被添加到 PAM 认证栈中。
现在,可以通过 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)
在Linux上验证AD DS认证
为了验证客户端机器是否加入了 AD DS 域,可以通过 AD DS DNS 服务器查询客户端的 FQDN,并确认客户端的 DNS 条目是否存在。 在许多情况下,<dnsserver> 与客户端已加入的 AD DS 域名相同。
nslookup <clientname> <dnsserver>
接下来,运行 klist 以查看 Kerberos 票据缓存中的工单:
klist
输出应包含一个以开头 krbtgt 的条目,看起来类似:
krbtgt/CONTOSODOMAIN.CONTOSO.COM@CONTOSODOMAIN.CONTOSO.COM
如果未为 winbind 配置 PAM,则 klist 可能不会显示票证条目。 在这种情况下,可以手动对用户进行身份验证以获取票证:
wbinfo -K contososmbadmin
还可以将命令作为脚本的一部分运行:
wbinfo -K 'contososmbadmin%SUPERSECRETPASSWORD'
挂载文件共享
启用 Kerberos 身份验证并将你的 Linux VM 加入域后,你可以装载文件共享。
将以下装载选项用于所有访问控制模型以启用 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 的访问控制模型。 更新 NT ACL 的 Linux 工具很少,因此通过 Windows 更新 ACL。 目前不支持客户端强制访问控制 (modefromsid,idsfromsid) 和客户端转换访问控制 (cifsacl) 模型。
适用于 Linux 的 Azure 文件 SMB 其他挂载选项
单用户装载与多用户装载
在单用户挂载场景中,AD DS 域内的单一用户访问挂载点,且不与域内其他用户共享。 每次访问文件都发生在用户使用 krb5 凭据装载文件共享时的上下文中。 在本地系统中访问挂载点的任何用户都会冒充该用户。
在多用户挂载场景中,仍然有一个挂载点,但多个AD DS用户可以访问同一个挂载点。 如果同一客户端上的多个用户访问同一共享,并且系统针对 Kerberos 配置并使用 sec=krb5 装载,请考虑使用 multiuser 装载选项。
文件权限
文件权限很重要,尤其是在 Linux 和 Windows 客户端都访问文件共享时。 要将文件的权限转换为 DACL格式,请使用默认的挂载选项,例如 file_mode=<>,dir_mode=<>。 客户端仅强制实施指定为 file_mode 和 dir_mode的文件权限。 服务器根据文件或目录的安全描述符强制实施访问控制。
“文件所有权”
文件所有权很重要,尤其是在 Linux 和 Windows 客户端都访问文件共享时。 选择以下装载选项之一,将文件所有权 UID/GID 转换为文件 DACL 上的所有者/组 SID:
- 使用默认值,例如 uid=<>,gid=<>
- 通过 nss_winbind 或 nss_sssd 配置 RFC2307 和 AD DS 中的 UID/GID 映射。
文件属性缓存一致性
性能非常重要,即使文件属性并不总是准确的。 actimeo 的默认值为 1(秒),这意味着如果缓存的属性超过 1 秒,则会再次从服务器获取文件属性。 将值增加到 60 表示至少缓存一分钟的属性。 对于大多数用例,对此选项使用值 30 (actimeo=30)。
对于较新的内核,请考虑更精细地设置 actimeo 功能。 可以使用 acdirmax 来缓存目录条目重新验证,并使用 acregmax 来缓存文件元数据,例如 acdirmax=60,acregmax=5。
下一步
若要了解如何在 Linux 上装载 SMB 文件共享,请参阅: