为 Microsoft Entra 域服务配置 Azure 文件的 Linux 客户端

适用于: ✔️ SMB 文件共享

Azure 文件存储 结合 Microsoft Entra 域服务,使用 Kerberos 身份验证协议,支持 Linux 虚拟机 (VM) 通过服务器消息块 (SMB) 进行基于标识的身份验证。 本文展示了如何将Linux客户端连接到Microsoft Entra 域服务托管的域名,并通过Kerberos认证挂载Azure文件共享。

有关受支持的选项和注意事项的详细信息,请参阅 对 SMB 访问的 Azure 文件存储 基于身份的身份验证选项概述

注释

Microsoft Entra Kerberos 有别于 Microsoft Entra 域服务,并且不支持 Linux 客户端,无论使用哪种 Linux 发行版,也无论标识是混合式还是纯云端。 关于身份源和支持的客户端操作系统,请参见 Azure 文件存储 基于身份的认证选项概述,用于 SMB 访问

注释

本文使用 Ubuntu 说明示例步骤。 类似配置适用于 RHEL 和 SLES 客户端,允许你使用 Microsoft Entra 域服务 挂载 Azure 文件共享。

Linux SMB 客户端限制

你无法使用基于标识的身份验证,通过 fstab 条目在 Linux 客户端上于启动时挂载 Azure 文件共享。 之所以存在这一限制,是因为客户端无法及时获取 Kerberos 票证,因此无法在启动时完成挂载。 可以使用条目 fstab 并指定 noauto 选项,让用户在登录后使用简单的装载命令来装载文件共享,而无需所有参数。 还可以使用 autofs 在访问后装载共享。

先决条件

在配置Linux客户端通过SMB使用Microsoft Entra 域服务认证以实现Azure文件共享之前,请先完成以下先决条件:

  • 运行 Ubuntu 18.04+ 或等效 SLES VM 的 Linux VM。 如果虚拟机运行在 Azure 中,它必须至少有一个虚拟网络接口,并连接到 Microsoft Entra 域服务 管理的域。
  • 具有已部署并配置的 Microsoft Entra 域服务 托管域的 Microsoft Entra 租户。 确保托管域正在运行,并且启用了密码哈希同步。
  • 一个配置为 Microsoft Entra 域服务 认证的存储账户中的 SMB Azure 文件共享。
  • 具有完全 sudo 权限的本地用户帐户的根用户或用户凭据(对于本指南,为 localadmin)。
  • Linux 虚拟机还没有加入其他域。 如果是这样,请先退出该域,然后再将虚拟机加入托管域。
  • 受管域中的一个用户账户,具有将计算机加入该域的权限。 用户必须在启用 Microsoft Entra 域服务(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 ,包含以下配置。 用与受管域相同的网络时间协议(NTP)服务器主机名或IP地址替换 ntp.server

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

然后重启服务:

sudo systemctl restart systemd-timesyncd.service

启用 Microsoft Entra 域服务 的 Kerberos 认证

请按照以下步骤启用 Microsoft Entra 域服务 的 Kerberos 认证。 有关配置Samba的更多信息,请参见 “作为域名成员设置Samba”。

连接 Microsoft Entra 域服务,探索相关服务

配置虚拟网络使用托管域控制器的IP地址作为其DNS服务器。 有关详细信息,请参阅更新 Azure 虚拟网络的 DNS 设置

确保你可以使用域名 ping 通受管理域。

ping contosodomain.contoso.com
PING contosodomain.contoso.com (10.0.2.4) 56(84) bytes of data.
64 bytes from pwe-oqarc11l568.internal.chinacloudapp.cn (10.0.2.4): icmp_seq=1 ttl=128 time=1.41 ms
64 bytes from pwe-oqarc11l568.internal.chinacloudapp.cn (10.0.2.4): icmp_seq=2 ttl=128 time=1.02 ms
64 bytes from pwe-oqarc11l568.internal.chinacloudapp.cn (10.0.2.4): icmp_seq=3 ttl=128 time=0.740 ms
64 bytes from pwe-oqarc11l568.internal.chinacloudapp.cn (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

确保你能找到网络上的托管域服务。

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 文件,填入最终的 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,以便能够联系 Microsoft Entra 域服务 中的 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 配置更改为使其充当 Microsoft Entra 域服务 域成员。 以下示例使用推荐的 rid 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

强制 winbind 重新加载更改后的配置文件。

sudo smbcontrol all reload-config

加入托管域

使用命令 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记录存在于受管理域中。

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

重启服务并检查状态。

sudo systemctl restart winbind
sudo systemctl status winbind

确保已发现受管域用户和组。

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

如果上述步骤无效,请使用以下 wbinfo 工具检查是否可访问受管域控制器:

wbinfo --ping-dc

为 winbind 配置 PAM

如果用户需要登录客户端机器并访问 Azure 文件共享,请配置 Windows Bind 的 PAM。 如果访问仅限于使用用户账户或电脑账户且需要Kerberos认证才能访问文件共享的应用程序,您可以跳过这一步。

将 WinBind 放入认证堆栈,使受管理域用户通过 WinBind 进行认证。 为 winbind 配置 PAM(可插拔身份验证模块)。 第二个命令确保系统在域名用户登录时为其创建主目录。

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

验证 PAM 认证配置在 /etc/pam.d/common-auth 中是否具有正确的 pam_winbind.so 参数:

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:

验证 Linux 上的 Microsoft Entra 域服务 认证

为了验证客户端是否加入了托管域,可以通过托管域的DNS服务器查询客户端的FQDN,并确认客户端的DNS条目是否存在。 在很多情况下,<dnsserver> 与客户端已加入的托管域相同。

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虚拟机加入托管域后,就可以挂载文件共享。

将以下装载选项用于所有访问控制模型以启用 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 其他挂载选项

单用户装载与多用户装载

在单用户挂载用例中,托管域中的单个用户访问挂载点,且不与域内其他用户共享。 每次访问文件都发生在用户使用 krb5 凭据装载文件共享时的上下文中。 在本地系统中访问挂载点的任何用户都会冒充该用户。

在多用户挂载场景中,仍然有一个挂载点,但多个托管域用户可以访问同一个挂载点。 如果同一客户端上的多个用户访问同一共享,并且系统针对 Kerberos 配置并使用 sec=krb5 装载,请考虑使用 multiuser 装载选项。

文件权限

文件权限很重要,尤其是在 Linux 和 Windows 客户端都访问文件共享时。 要将文件的权限转换为 DACL格式,请使用默认的挂载选项,例如 file_mode=<>,dir_mode=<>。 客户端仅强制实施指定为 file_modedir_mode的文件权限。 服务器根据文件或目录的安全描述符强制实施访问控制。

“文件所有权”

文件所有权很重要,尤其是在 Linux 和 Windows 客户端都访问文件共享时。 选择以下装载选项之一,将文件所有权 UID/GID 转换为文件 DACL 上的所有者/组 SID:

  • 使用默认值,比如 uid=<>,gid=<>
  • 通过RFC2307和Microsoft Entra 域服务配置UID/GID映射,使用nss_winbindnss_sssd

文件属性缓存一致性

性能非常重要,即使文件属性并不总是准确的。 actimeo 的默认值为 1(秒),这意味着如果缓存的属性超过 1 秒,则会再次从服务器获取文件属性。 将值增加到 60 表示至少缓存一分钟的属性。 对于大多数用例,对此选项使用值 30 (actimeo=30)。

对于较新的内核,请考虑更精细地设置 actimeo 功能。 可以使用 acdirmax 来缓存目录条目重新验证,并使用 acregmax 来缓存文件元数据,例如 acdirmax=60,acregmax=5

后续步骤

若要了解如何在 Linux 上装载 SMB 文件共享,请参阅: