本文介绍在Linux操作系统中,如何以AD域身份挂载SMB文件系统。以及挂载成功后,如何以AD域身份访问SMB协议文件系统,查看和编辑文件或目录的ACL。
背景信息
在SMB文件系统挂载点接入AD域前,仅支持以匿名用户身份挂载并使用SMB文件系统。在SMB文件系统挂载点接入AD域后,您可以设置是否继续允许匿名用户身份挂载访问。
- 如果继续允许匿名访问文件系统,设备可以通过Kerberos认证以域身份访问文件系统,也可以通过NTLM认证以Everyone身份访问文件系统。
- 如果已设置为不允许匿名访问文件系统,该文件系统将只允许通过Kerberos认证协议的Linux客户端以AD域用户身份进行挂载。
以下步骤以Ubuntu和CentOS为例介绍如何以AD域身份挂载访问SMB文件系统。
方式一:Linux客户端加入AD域并挂载SMB文件系统
- 登录Linux客户端。
- Linux客户端加入AD域。
- Ubuntu操作系统
- 安装AD服务器配置包。
sudo apt-get update
sudo apt-get -y install realmd libnss-sss libpam-sss sssd sssd-tools adcli samba-common-bin oddjob oddjob-mkhomedir packagekit krb5-user
- 配置Linux客户端在AD域的机器名。
sudo hostnamectl set-hostname myubuntu.example-company.com
其中,example-company.com
为AD域名称,请您根据实际业务场景配置。
配置完成后,执行
hostnamectl命令检查已配置的客户端机器名称。

- 配置DNS。
执行以下命令停止DNS的自动更新。
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
然后将AD服务器IP写入
/etc/resolv.conf中。

执行
ping命令,
pingAD服务器名称验证连通性。

- 查找AD域。
realm discover <AD domain>

- Linux客户端加入AD域。
sudo kinit Administrator@EXAMPLE-COMPANY.COM
sudo realm join -U Administrator example-company.com
执行realm list命令,如果回显包含如下类似信息,说明Linux客户端已加入AD域。
- 配置以AD域用户登录时的home目录。
sudo bash -c "cat > /usr/share/pam-configs/mkhomedir" <<EOF
Name: activate mkhomedir
Default: yes
Priority: 900
Session-Type: Additional
Session:
required pam_mkhomedir.so umask=0022 skel=/etc/skel
EOF
执行以下命令激活该配置。pam-auth-update
激活后,通过上下键移动光标,并使用空格键增加选项标记*
,请确保activate mkhomedir
选项前标记为*
,然后使用Tab键将光标移动至Ok,即完成设置。
- 配置Linux sssd服务。
在配置文件
/etc/sssd/sssd.conf中,写入
krb5_ccname_template=FILE:%d/krb5cc_%U
。

执行以下命令重启sssd服务并确认服务状态。
sudo systemctl restart sssd
sudo systemctl status sssd
如果回显包含如下类似信息,说明Linux sssd服务已配置成功。

- CentOS操作系统
- 安装AD服务器配置包。
sudo yum update
sudo yum install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python-utils -y
- 配置Linux客户端在AD域的机器名。
sudo hostnamectl set-hostname mycentos.example-company.com
其中,example-company.com
为AD域名称,请您根据实际业务场景配置。
配置完成后,执行
hostnamectl命令检查已配置的客户端机器名称。

- 配置DNS。
将AD服务器IP写入
/etc/resolv.conf中,删除默认的DNS服务器。

执行
ping命令,
pingAD服务器名称验证连通性。

- 配置Kerberos。
请在配置文件
/etc/krb5.conf中添加如下内容。
default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

- 查找AD域。
realm discover example-company.com

- Linux客户端加入AD域。
sudo realm join -U Administrator example-company.com
执行realm list命令,如果回显包含如下类似信息,说明Linux客户端已加入AD域。
- 执行id命令,查询AD域用户身份状态。
id testuser@example-company.com
如果回显包含如下类似信息,说明AD域用户身份能被正常识别。

- 添加AD域用户登录权限。
- 授予指定用户登录Linux客户端的权限。
sudo realm permit usera1@example-company.com
sudo realm permit userb1@example-company.com userb2@example-company.com
- 授予指定用户组登录Linux客户端的权限。
sudo realm permit -g 'Security Users'
sudo realm permit -g 'Domain Users' 'Domain Admins'
- 授予所有用户登录Linux客户端的权限。
sudo realm permit --all
- 授予禁止所有用户登录Linux客户端的权限。
sudo realm deny --all
- 为AD域用户添加sudo权限。
执行以下命令打开
sudo配置文件,并根据业务场景配置
sudo权限。
sudo vim /etc/sudoers.d/domain_admins
- 为指定用户添加sudo权限。
usera1@example-company.com ALL=(ALL) ALL
userb2@example-company.com ALL=(ALL) ALL
- 为指定用户组添加sudo权限。
%admingroupc1@example-company.com ALL=(ALL) ALL
- 为指定多word组成组名的用户组添加sudo权限。
%domain\ admins@example-company.com ALL=(ALL) ALL
- 配置SSH登录项。
打开SSH配置文件
/etc/ssh/sshd_config,修改如下登录配置项:
PasswordAuthentication yes
执行以下命令重启SSHD服务。
- CentOS
service sshd restart
- Ubuntu
service ssh restart
- 以AD域身份登录Linux客户端。
ssh localhost -l usera1@example-company.com
如果回显包含如下类似信息,说明已使用AD域身份登录Linux客户端。

- 挂载SMB文件系统。
- 安装挂载工具包。
- 查询keytab信息。
执行
id命令查看登录后的uid、gid信息。

- 执行以下命令挂载文件系统。
sudo mount -t cifs //205dee494a3-uub48.us-west-1.nas.aliyuncs.com/myshare /mnt -o vers=2.1,sec=krb5,cruid=371801107,uid=371801107,gid=371800513 --verbose
说明 如果控制台SMB ACL选项中选择了启用传输加密,则需要使用vers=3.0挂载。
- 添加自动挂载配置。
挂载完成后,添加自动挂载配置。重启Linux客户端,将自动完成挂载。
- 在配置文件/etc/auto.master中,添加如下选项:
/share /etc/auto.cifs --timeout=30 --ghost
- 按如下示例修改配置文件/etc/auto.cifs内容:
* -fstype=cifs,vers=2.1,sec=krb5,cruid=${UID},uid=${UID},gid=${GID},file_mode=0700,dir_mode=0700 ://205dee494a3-uub48.us-west-1.nas.aliyuncs.com/myshare/&
- 重启autofs服务。
systemctl restart autofs.service
- 确认自动挂载配置结果。
假设创建了
//205dee494a3-uub48.us-west-1.nas.aliyuncs.com/myshare/usera1目录,权限设置为用户usera1拥有所有权限。
在AD域用户登录后,执行ls /share/usera1
命令,就能够查看到SMB文件系统目录usera1下的内容即配置成功。
方式二:Linux客户端连接AD服务器并挂载SMB文件系统
- 登录Linux客户端。
- 连接AD服务器。
- Ubuntu操作系统
- 安装AD服务器配置包。
sudo apt-get -y install keyutils cifs-utils krb5-user
- 配置DNS。
执行以下命令停止DNS的自动更新。
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
然后将AD服务器IP写入
/etc/resolv.conf中。

执行
ping命令,
pingAD服务器名称验证连通性。

- CentOS操作系统
- 安装AD服务器配置包。
sudo yum install keyutils cifs-utils krb5-workstation
- 配置DNS。
将AD服务器IP写入
/etc/resolv.conf中,删除默认的DNS服务器。

执行
ping命令,
pingAD服务器名称验证连通性。

- 配置Kerberos。
请在配置文件
/etc/krb5.conf中添加如下内容。
default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

- 以本地用户身份保存SMB文件系统挂载点的票据信息。
- 新建本地用户并记录新建用户的UID和GID。
useradd usera1
su - usera1
id

- 使用新建的本地用户保存SMB文件系统挂载点的票据信息。
kinit administrator@EXAMPLE-COMPANY.COM
klist

- 挂载SMB文件系统。
- 安装挂载工具包。
- 执行以下命令挂载文件系统。
sudo mount -t cifs //205dee494a3-uub48.us-west-1.nas.aliyuncs.com/myshare /mnt -o vers=2.1,sec=krb5,cruid=1004,uid=1004,gid=1004 --verbose
其中,cruid
和uid
为本地usera1用户的ID,gid
为本地usera1用户的group。
说明 如果控制台SMB ACL选项中选择了启用传输加密,则需要使用vers=3.0挂载。
- 添加自动挂载配置。
挂载完成后,添加自动挂载配置。重启Linux客户端,将自动完成挂载。
- 在配置文件/etc/auto.master中,添加如下选项:
/share /etc/auto.cifs --timeout=30 --ghost
- 按如下示例修改配置文件/etc/auto.cifs内容:
* -fstype=cifs,vers=2.1,sec=krb5,cruid=${UID},uid=${UID},gid=${GID},file_mode=0700,dir_mode=0700 ://205dee494a3-uub48.us-west-1.nas.aliyuncs.com/myshare/&
- 重启autofs服务。
systemctl restart autofs.service
- 确认自动挂载配置结果。
假设创建了
//205dee494a3-uub48.us-west-1.nas.aliyuncs.com/myshare/usera1目录,权限设置为用户usera1拥有所有权限。
在AD域用户登录后,执行ls /share/usera1
命令,就能够查看到SMB文件系统目录usera1下的内容即配置成功。
使用cifsacl工具管理SMB文件系统ACL
您可以使用getcifsacl和setcifsacl命令管理SMB文件系统ACL。示例如下:
getcifsacl /mnt/usera1/

setcifsacl -a "ACL:S-1-5-21-3076751034-3769290925-1520581464-513:ALLOWED/OI|CI/FULL" /mnt/usera1
