Synology NAS NFS Kerberos 配置与使用

参考文章

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/[NAS用户名].[小写域名]@[大写域名] mapuser [NAS用户名] pass "[NAS用户密码]" 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证书来区分用户权限

配置完成后如下:

配置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

检查ping NAS 主机域名是否可以正常ping通:

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

在客户端写入文件(主体映射后需要重新挂载才可以生效):

服务器端存储情况如下: