使用 Kerberos 安全地共享 NFS 主目录

您可以在不启用 Kerberos 的情况下共享 NFS 主目录 用于更安全的身份验证. 但是使用标准系统身份验证,远程用户可以轻松更改其 PC 上本地帐户的 UID 并访问其他人的主目录。 Kerberos 增加了一个要求,即最终用户有一个特殊的安全令牌来访问主目录。 您只能从指定的 密钥服务器 通过提供正确的密码。

本指南向您展示如何集成 Fedora 服务器与 活动目录 这样您就可以更安全地通过 NFS 共享用户主目录。 本指南假定您已经拥有一个 Active Directory 域。

安装和配置 NTP

Kerberos 协议要求所有参与加密通信的计算机将时钟同步到五分钟内。

首先,使用 ntpdate 命令同步 NFS 服务器的时钟,然后使用 hwclock 命令将更改提交到硬件时钟:

$ sudo -i
# MY_HOSTNAME=$(</etc/hostname)
# MY_DOMAIN=${MY_HOSTNAME#*.}
# dnf install -y ntpdate
# ntpdate $MY_DOMAIN
# hwclock -u -w

# 提示符显示需要以 root 身份运行的命令。 这 $ prompt 显示可以作为非特权用户运行的命令。 这 sudo -i 命令允许您成为 root 以发出必要的命令。

本指南旨在便于复制和粘贴。 您可能需要自定义的任何值都显示为 MY_* 变量,您可以在运行其余命令之前对其进行调整。 请注意,如果您注销,这些变量分配将被清除。

上述命令假定您的服务器主机名的域名部分与您的 Active Directory 的域名相匹配。 除非你设置 特殊配置选项 在 Active Directory 中,您可能需要设置您的主机名,以便域部分与您的 Active Directory 域名相匹配。

现在,安装 ntp 包:

# dnf install -y ntp

接下来,配置 NTP 服务:

# MY_NETWORK=192.0.2.0
# MY_NETMASK=255.255.255.0
# MY_ADSERVER1=192.0.2.91
# MY_ADSERVER2=192.0.2.92
# cat << END > /etc/ntp.conf
tinker panic 0
restrict -6 default ignore

driftfile /var/lib/ntp/drift
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys

restrict default ignore
restrict $MY_NETWORK mask $MY_NETMASK
restrict 127.0.0.1

server $MY_ADSERVER1
server $MY_ADSERVER2
END

如果您需要快速查找 Active Directory 服务器的 IP 地址,请运行以下命令:

# nslookup $MY_DOMAIN

最后,给防火墙添加一个例外并启动服务:

# firewall-cmd --add-service ntp
# firewall-cmd --runtime-to-permanent
# systemctl enable ntpd.service
# systemctl start ntpd.service

要验证 NTP 是否正常工作,请运行以下命令:

$ ntpq -4 -p

安装和配置 Kerberos

要在我们的服务器上启用 Kerberos 身份验证,请安装 krb5-workstation 软件包:

# dnf install -y krb5-workstation

然后配置您的默认领域:

# MY_REALM=${MY_DOMAIN^^}
# cat << END > /etc/krb5.conf.d/${MY_DOMAIN%%.*}
[libdefaults]
  default_realm = $MY_REALM
  dns_lookup_kdc = true

[domain_realm]
  .$MY_DOMAIN = $MY_REALM
END

默认领域是您的所有大写字母的 Active Directory 域名。

安装和配置 SSSD

对于 KRB5 认证的主目录,接下来需要的是用户 ID。 您可以在 NFS 服务器上手动创建它们。 但是,如果您有多个用户,则需要从 Active Directory 获取用户名列表及其关联的 UID。 使用 sssd 从 Active Directory 获取用户 ID。

首先安装 sssd 包:

# dnf install -y sssd

现在将 SSSD 配置为使用 Active Directory 作为 ID 提供程序:

# cat << END > /etc/sssd/sssd.conf
[sssd]
  services = nss
  config_file_version = 2
  domains = $MY_DOMAIN

[domain/$MY_DOMAIN]
  id_provider = ad
  ldap_idmap_range_min = 0
  ldap_idmap_range_max = 2100000000
  ldap_idmap_range_size = 100000000
  ldap_idmap_default_domain_sid = S-1-5-21-0-0-0
  krb5_store_password_if_offline = true
  cache_credentials = true
  ignore_group_members = true
  override_gid = 100
  override_shell = /bin/bash
  override_homedir = /home/%u
END
# chmod 600 /etc/sssd/sssd.conf

ldap_idmap* 值对于确保 UID Active Directory 报告在 NFS 服务器及其所有客户端之间保持一致非常重要。 这里有一个参考 SID 到 uid/gid 映射如何在 sssd 中工作.

即使您没有通过在服务列表中包含 pam 来配置 SSSD 进行身份验证,最终用户仍然可以使用 PubkeyAuthentication 或 GS​​SAPIAuthentication 方法通过 SSH 登录到网络引导服务器。 您可能需要明确限制谁可以通过 SSH 登录到您的网络引导服务器。 为了 example:

# echo DenyGroups users >> /etc/ssh/sshd_config && systemctl restart sshd.service

加入活动目录

接下来,将服务器加入 Active Directory 域。 在执行加入之前,请删除域中同名的所有计算机帐户。 这有助于确保您不会从以前的加入尝试中继承任何不正确的设置:

# MY_USERNAME=jsmith
# adcli delete-computer "${MY_HOSTNAME%%.*}" -U "$MY_USERNAME"

此外,删除系统 keytab 的任何以前版本,以避免从以前的加入尝试中继承任何不正确的设置:

# rm -f /etc/krb5.keytab

现在您应该能够加入 Active Directory 域:

# MY_OU="cn=computers,dc=${MY_DOMAIN//./,dc=}"
# adcli join $MY_DOMAIN --login-user="$MY_USERNAME" --computer-name="${MY_HOSTNAME%%.*}" --host-fqdn="$MY_HOSTNAME" --user-principal="host/$MY_HOSTNAME@$MY_REALM" --service-name="host" --service-name="nfs" --domain-ou="$MY_OU"

默认情况下,Active Directory 仅允许普通用户将最多 10 台计算机加入其域(KB243327)。

如果 adcli 警告您 DNS 未更新,则您的主 DNS 服务器可能未将查询正确转发到 Active Directory 域控制器。 将您的网络配置设置为直接为 DNS 引用 Active Directory 服务器。

上述命令中的 –service-name=”nfs” 标志很重要。 如果没有 nfs “serviceprincipalname”,NFS 服务将无法为 Kerberized 主目录提供服务。

如果加入成功,您应该能够启动 SSSD 服务:

# systemctl start sssd.service

配置 PAM

sssd 运行后,配置 NFS 服务器以使用它解析 UID:

# cp -r /usr/share/authselect/default/sssd /etc/authselect/custom
# echo 'initgroups: files' >> /etc/authselect/custom/sssd/nsswitch.conf
# authselect select custom/sssd --force

将 initgroups 设置为文件作为性能优化,以防止从 Active Directory 中获取组信息。 您可以省略该行。 但是,如果这样做,您可能会在列出文件或执行其他尝试查找 UID 和 GID 信息的操作时看到延迟。

此时,您应该能够查找用户的 UID:

$ id $MY_USERNAME

您可能会发现有必要在上述命令生效之前运行 systemctl restart sssd.service。

创建主目录

现在 ID 提供程序正在工作,通过克隆 /etc/skel 目录并设置权限来创建主目录:

# cp -a /etc/skel /home/$MY_USERNAME
# chown -R $MY_USERNAME:users /home/$MY_USERNAME
# chmod -R go-rwx /home/$MY_USERNAME

配置 NFS ID 映射

在您可以导出主目录之前,您必须配置 NFS 的 idmap 服务:

# cat << END > /etc/idmapd.conf
[General]
  Domain = $MY_DOMAIN
  Local-Realms = $MY_REALM

[Mapping]
  Nobody-User = nfsnobody
  Nobody-Group = nfsnobody

[Translation]
  Method = static,nsswitch
  GSS-Methods = static,nsswitch

[Static]
END

对于 UID 可能无法解析为用户名的情况,您还必须定义特殊的 nfsnobody 用户:

# echo 'nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin' >> /etc/passwd
# echo 'nfsnobody:!!:::::::' >> /etc/shadow
# echo 'nfsnobody:x:65534:' >> /etc/group
# echo 'nfsnobody:!::' >> /etc/gshadow

启用 Kerberos 并共享主目录

在 NFS 上启用 KRB5 身份验证 伪文件系统

# MY_SUBNET=192.0.2.0
# MY_PREFIX=24
# echo "/export -fsid=0,ro,sec=sys:krb5,root_squash $MY_SUBNET/$MY_PREFIX" > /etc/exports

现在创建并挂载主文件系统:

# mkdir /export/home
# echo '/home /export/home none bind 0 0' >> /etc/fstab
# mount /export/home

最后,我们定义 home 导出并重新启动 NFS 服务器以确保注册所有配置更改:

# echo "/export/home -rw,sec=krb5,root_squash $MY_SUBNET/$MY_PREFIX" > /etc/exports.d/home.exports
# systemctl restart nfs-server.service

确保出口上的一切看起来都正确。 特别是,确保在根导出和主子文件系统上都设置了 krb5 标志:

# exportfs -v

上述命令的输出应至少包括以下两行(已添加重点):

/export         192.0.2.0/24(sync,wdelay,hide,no_subtree_check,fsid=0,sec=sys:krb5,ro,secure,root_squash,no_all_squash)
/export/home    192.0.2.0/24(sync,wdelay,hide,no_subtree_check,sec=krb5,rw,secure,root_squash,no_all_squash)

Kerberos 协议还可以为 NFS 导出提供加密 (krb5p) 或完整性 (krb5i),但 krb5 选项的这些变体将导致性能显着降低。 除非你真的需要它们,否则你可能不想使用它们。

摄影者 彼得罗·郑不飞溅.