参考文章
https://web.mit.edu/kerberos/krb5-latest/doc/admin/conf_files/krb5_conf.html#libdefaults
https://kb.synology.cn/zh-cn/DSM/tutorial/how_to_set_up_kerberized_NFS
https://www.ibm.com/docs/en/zos/2.5.0?topic=reference-zos-nfs-server-kerberos-authentication
测试环境
域控:
windows server 2016
NAS1(加域):
DSM 6.2.3 update3
NAS2(加域):
DSM 7.1.1 update5
Clinet1:
OracleLinux 9.1
Clinet2:
Ubuntu 22.04 LTS
Clinet3(加域):
Windows 11 22H2 企业版
DNS解析配置
建立反向查找区域
首先在域控的DNS服务器上建立反向查找区域,如果已经存在则可以跳过以下步骤
新建区域:

选择主要区域:

默认配置:

添加ipv4区域:

选择区域的IP地址,windows server所在网段为192.168.0.0,这边输入192.168.0即可:

默认配置:

点击完成:

添加NAS的反向解析记录
确认DNS服务器中是否有反向查找区域:

添加反向解析前,查询NAS的IP是找不到具体主机名的:

在正向查找区域的对应域名下添加主机的正向解析记录:

选择添加对应的PTR记录:

添加完成后就可以正常使用NAS的ip解析出主机名了:

按以上步骤再添加另一台NAS的记录:


添加完成后反向查找区域配置如下:

建立用户以及生成证书
在域控的Active Directory 用户和计算机中建立NAS主机名的对应用户:

建立NAS用户
NAS主机名称必须与NAS用户一致,否则会认证不通过
NAS主机名可以在 控制面板->网络->常规中查看:

建立用户:

取消勾选"用户下次登录时须更改密码",勾选"密码永不过期":

右键用户点击属性,在账户的账号选项中勾选并应用 "该账户支持 Kerberos AES 256 位加密":

生成NAS用户证书
打开Windows server的CMD,输入以下命令来进行证书生成(如果证书名相同则会覆盖):
ktpass princ nfs/[NAS用户名].[小写域名]@[大写域名] mapuser [NAS用户名] pass "[NAS用户密码]" out [证书文件名].keytab crypto AES256-SHA1 ptype KRB5_NT_PRINCIPAL
例如:
ktpass princ nfs/ds3617xs7.zhugh.local@ZHUGH.LOCAL mapuser ds3617xs7 pass "PASSWORD" out nfsserver.keytab crypto AES256-SHA1 ptype KRB5_NT_PRINCIPAL

如果登录域控的用户是administrator,则生成的证书存储在C:\Users\Administrator下:

建立Linux客户端用户
客户端主机名称必须与客户端用户一致,否则会认证不通过
建立用户:

取消勾选"用户下次登录时须更改密码",勾选"密码永不过期":

右键用户点击属性,在账户的账号选项中勾选并应用 "该账户支持 Kerberos AES 256 位加密":

生成Linux客户端用户证书
打开Windows server的CMD,输入以下命令来进行证书生成(如果证书名相同则会覆盖):
ktpass princ nfs/[Linux用户名].[小写域名]@[大写域名] mapuser [Linux用户名] pass "[Linux用户密码]" out [证书文件名].keytab crypto AES256-SHA1 ptype KRB5_NT_PRINCIPAL
例如:
ktpass princ nfs/oraclelinux9.zhugh.local@ZHUGH.LOCAL mapuser oraclelinux9 pass "PASSWORD" out krb5.keytab crypto AES256-SHA1 ptype KRB5_NT_PRINCIPAL

如果登录域控的用户是administrator,则生成的证书存储在C:\Users\Administrator下:

建立Windows客户端用户
如果客户端电脑上已经登录域用户则不需要建立,如果没有的话则需要将Windows加入域并登录域用户:

取消勾选"用户下次登录时须更改密码",勾选"密码永不过期":

右键用户点击属性,在账户的账号选项中勾选并应用 "该账户支持 Kerberos AES 256 位加密":

配置NAS NFS server
DSM 6 配置
在控制面板->文件服务->NFS 中启用 NFSv4.1支持,在NFSv4域中填写域名:

在 NFS 的高级设置中点击 Kerberos设置,在Kerberos密钥中选择导入,此处导入之前生成的NAS证书:

导入后查看主体中的主机名是否为当前 NAS 主机名:

DSM 7 配置
在控制面板->文件服务->NFS 中启用 NFS,并选择最大NFS协议为:NFSv4.1
在高级设置的 NFSv4/4.1域 中填写域名:

在 NFS 的高级设置中点击 Kerberos设置,在Kerberos密钥中选择导入,此处导入之前生成的NAS证书:

导入后查看主体中的主机名是否为当前 NAS 主机名:

建立Kerberos认证的共享文件夹
建立新的共享文件夹或者直接编辑需要Kerberos认证的共享文件夹的共享文件夹,在NFS权限中新增权限,添加NFS客户端的IP,这边添加的是允许所有客户端"*",在安全性中取消勾选"AUTH_SYS",只勾选"Kerberos 验证":
如果调整了权限映射规则,则无法通过Kerberos证书来区分用户权限

配置完成后如下:

问题
如果客户端无法连接或者连接账号有异常可以通过以下方式启用debug模式:
查询gssd进程信息:
ps -ef | grep gssd
获取到gssd启动命令为:
/usr/sbin/svcgssd -p nfs/ds3617xs7.zhugh.local@ZHUGH.LOCAL

关闭gssd:
systemctl stop rpc-svcgssd
手动启动debug模式gssd,在启动命令后添加-fvvvv -rrrr
/usr/sbin/svcgssd -p nfs/ds3617xs7.zhugh.local@ZHUGH.LOCAL -fvvvv -rrrr
正常登录会显示来源设备以及访问的用户:

用户不匹配需要检查对应域用户的userPrincipleName与serverPrincipleName是否正常:

如果连接异常则会显示错误原因:

如果证书损坏则会提示以下信息:
Sep 03 11:43:17 rs18017-2 svcgssd[780]: ERROR: GSS-API: error in handle_nullreq: gss_accept_sec_context(): GSS_S_FAILURE (Unspecified GSS failure. Minor code may provide more information) - Cannot decrypt ticket for nfs/rs18017-2.suphyperv.local@SUPHYPERV.LOCAL using keytab key for nfs/rs18017-2.suphyperv.local@SUPHYPERV.LOCAL
配置Linux客户端
OracleLinux 9.1
安装客户端环境
安装NFS client以及Kerberos验证模块:
yum -y install nfs-utils krb5-devel krb5-workstation

调整DNS配置
调整OracleLinux的DNS为域控DNS server:

cat /etc/resolv.conf

可以安装nslookup来验证:
yum install bind-utils -y

调整Kerberos验证模块配置
备份配置档:
cp -ar /etc/krb5.conf /etc/krb5.conf.bk
修改配置档:
[libdefaults]
default_realm = [域名大写]
[domain_realm]
.[域名小写] = [域名大写]
[域名小写] = [域名大写]
例如:
[libdefaults]
default_realm = ZHUGH.LOCAL
[domain_realm]
.zhugh.local = ZHUGH.LOCAL
zhugh.local = ZHUGH.LOCAL

导入Linux客户端用户证书
如果NAS有装Web Staiton套件,这边可以将证书文件放NAS的web共享文件夹下:

在linux可以使用wget命令直接下载:
wget http://192.168.0.68/krb5.keytab

将证书放到默认位置:
cp krb5.keytab /etc/krb5.keytab
然后导入证书:
klist -k /etc/krb5.keytab

检查证书是否正常:
klist -kte

重启服务让Kerberos配置生效:
systemctl restart rpc-gssd

测试装载
建立Linux本地文件夹
mkdir /nfsmount1
mkdir /nfsmount2
使用以下命令测试装载:
mount -t nfs -vvv -o vers=4,sec=krb5 [NASIP]:[NAS共享文件夹路径] [Linux本地路径]
例如:
mount -t nfs -vvv -o vers=4,sec=krb5 192.168.0.62:/volume1/krb5 /nfsmount1
mount -t nfs -vvv -o vers=4,sec=krb5 192.168.0.68:/volume1/krb5 /nfsmount2

Ubuntu 22.04
安装客户端环境
安装NFS client以及Kerberos验证模块:
apt-get -y install krb5-kdc nfs-common
这边直接确定,之后我们会手动调整配置档:


调整DNS配置
调整Ubuntu的DNS为域控DNS server:

resolvectl status

修改/etc/resolv.conf

或者/etc/systemd/resolved.conf
如果不修改会ping不通域名,很神奇:

可以使用nslookup来验证:

调整Kerberos验证模块配置
备份配置档:
cp -ar /etc/krb5.conf /etc/krb5.conf.bk
修改配置档:
[libdefaults]
default_realm = [域名大写]
[domain_realm]
.[域名小写] = [域名大写]
[域名小写] = [域名大写]
例如:
[libdefaults]
default_realm = ZHUGH.LOCAL
[domain_realm]
.zhugh.local = ZHUGH.LOCAL
zhugh.local = ZHUGH.LOCAL

导入Linux客户端用户证书
如果NAS有装Web Staiton套件,这边可以将证书文件放NAS的web共享文件夹下:

在linux可以使用wget命令直接下载:
wget http://192.168.0.68/krb51.keytab

将证书放到默认位置:
cp krb51.keytab /etc/krb5.keytab
然后导入证书:
klist -k /etc/krb5.keytab

检查证书是否正常:
klist -kte

重启服务让Kerberos配置生效:
systemctl restart rpc-gssd

测试装载
建立Linux本地文件夹
mkdir /nfsmount1
mkdir /nfsmount2
使用以下命令测试装载:
mount -t nfs -vvv -o vers=4,sec=krb5 [NASIP]:[NAS共享文件夹路径] [Linux本地路径]
例如:
mount -t nfs -vvv -o vers=4,sec=krb5 192.168.0.62:/volume1/krb5 /nfsmount1
mount -t nfs -vvv -o vers=4,sec=krb5 192.168.0.68:/volume1/krb5 /nfsmount2

问题
如果装载提示 Protocol not supported

并且/var/log/syslog提示以下错误,请检查/etc/resolv.conf是否修改正确:
ERROR: No credentials found for connection to server ds3617xs7.zhugh.local
ERROR: gssd_refresh_krb5_machine_credential_internal: no usable keytab entry found in keytab /etc/krb5.keytab for connection with host ds3617xs7.zhugh.local

如果/var/log/syslog没有错误提示,请检查kerberos服务状态是否正常:
systemctl status rpc-gssd
检查ping NAS 主机域名是否可以正常ping通:

如果提示没有权限,并且/var/log/syslog提示以下错误
ERROR: No credentials found for connection to server ds3617xs7.zhugh.local
可能是/etc/krb5.conf配置问题引起。
如果版本较老可以调整/etc/krb5.conf
在[libdefaults]添加以下内容:
default_tgs_enctypes = aes256-cts-hmac-sha1-96
default_tkt_enctypes = aes256-cts-hmac-sha1-96
permitted_enctypes = aes256-cts-hmac-sha1-96
调整后需要重启kerberos服务:
systemctl restart rpc-gssd
然后删除/etc/krb5.keytab重新加域获取,对于已经获取凭证的用户需要通过以下命令清除历史凭证重新获取。
kdestroy
Windows 11
安装客户端环境
在控制面板->程序->程序和功能 中点击 "启用或关闭W indows 功能"
安装NFS客户端

windows加域
修改windows的dns为DNS server的IP:

在系统->系统信息->域或工作组->选择为域,输入域的名称:

输入域用户的账号密码加入:

加入成功:

添加域用户本地管理员权限
加入域后先用Windows本地管理员用户登录:

在计算机管理中,为域用户添加本地管理员权限。在administrators群组选择添加到组:

添加并查找域用户,这边需要输入下域用户的账号密码:

查找成功:

确认添加:

测试装载
使用添加本地管理员权限的域用户登录:

在CMD中使用klist命令检查获取到的凭据:

使用以下命令测试装载(windows仅支持域名装载):
mount -o sec=krb5 [Windows本地空余盘符] \\[NAS主机域名]\[NAS共享文件夹路径]
例如:
mount -o sec=krb5 f:\ \\ds3617xs7.zhugh.local\volume1\krb5

问题
这边测试DSM 6.2.3 update3装载会拒绝访问,可能之前有做什么修改导致NFS的krb服务出现问题了吧,重新安装系统后恢复正常
mount -o sec=krb5 g: \\zhsynology.zhugh.local\volume1\krb5
重装前:

重新安装系统后:


配置权限
Linux客户端域权限映射
由于在之前生成凭证时已经将凭证与域用户绑定,所以只要给对应共享文件夹域权限就可以正常写入文件。
共享文件夹权限配置如下:

装载命令:
mount -t nfs -vvv -o vers=4,sec=krb5 192.168.0.68:/volume1/krb5 /nfsmount2
在客户端分别写入文件:


服务器端存储情况如下:

Linux客户端配置映射NAS本地用户权限
在NAS本地建立映射用户:

通过以下命令查看客户端证书主体:

在 NFS 的高级设置中点击 Kerberos设置,在ID映射中选择新增ID映射:

主体填写客户端证书主体,本地用户选择在NAS本地建立映射用户:

映射如下:

共享文件夹添加NAS本地建立映射用户的读写权限:

装载命令:
mount -t nfs -vvv -o vers=4,sec=krb5 192.168.0.68:/volume1/krb5 /nfsmount2
在客户端分别写入文件(主体映射后需要重新挂载才可以生效):


服务器端存储情况如下:

Windows客户端域权限映射
由于自动生成的凭证已经与域用户绑定,所以只要给对应共享文件夹域用户权限就可以正常写入文件。
共享文件夹权限配置如下:

装载命令:
mount -o sec=krb5 f:\ \\ds3617xs7.zhugh.local\volume1\krb5
在客户端写入文件(主体映射后需要重新挂载才可以生效):

服务器端存储情况如下:

Windows客户端配置映射NAS本地用户权限
在NAS本地建立映射用户:

在CMD中使用klist命令获取主体名称:

在 NFS 的高级设置中点击 Kerberos设置,在ID映射中选择新增ID映射:

主体填写客户端证书主体,本地用户选择在NAS本地建立映射用户:

映射如下:

共享文件夹添加NAS本地建立映射用户的读写权限:

装载命令:
mount -o sec=krb5 f:\ \\ds3617xs7.zhugh.local\volume1\krb5
在客户端写入文件(主体映射后需要重新挂载才可以生效):

服务器端存储情况如下:
