本文介绍在Fedora服务器中使用Kerberos安全地共享NFS主目录,内容有安装和配置NTP、Kerberos及SSSD、加入Active Directory、配置PAM、创建主目录、配置NFS ID映射、启用Kerberos并共享主目录。
背景 你可以共享NFS主目录,而无需启用Kerberos以进行更安全的身份验证,但是,通过标准系统身份验证,远程用户可以更改其PC上本地帐户的UID并访问其他人的主目录。Kerberos添加了一项要求,即最终用户具有访问主目录的特殊安全令牌,你只能通过提供正确的密码从指定的密钥服务器获取该安全令牌。
本文介绍如何将Fedora服务器与Active Directory集成,以便你可以更安全地通过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 #prompt显示需要以root身份运行的命令,$prompt显示可以作为非特权用户运行的命令,sudo -i命令允许你成为root用户以执行必要的命令,参考配置Fedora系统以使用sudo的方法。 你可能需要自定义的任何值显示为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获取用户标识。 首先安装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*值对于确保NFS服务器与其所有客户端之间的UID Active Directory报告一致非常重要。 即使你没有通过在服务列表中包含pam来配置SSSD进行身份验证,最终用户仍然可以使用PubkeyAuthentication或GSSAPIAuthentication方法通过SSH登录到netboot服务器,你可能希望为谁可以通过SSH登录到netboot服务器设置明确的限制,例如: # echo DenyGroups users >> /etc/ssh/sshd_config && systemctl restart sshd.service
加入Active Directory 接下来,将服务器加入Active Directory域,在执行连接之前,请删除域中具有相同名称的所有计算机帐户,这有助于确保你不会从先前的连接尝试中继承任何不正确的设置: # MY_USERNAME=jsmith # adcli delete-computer "${MY_HOSTNAME%%.*}" -U "$MY_USERNAME" 此外,删除系统密钥表的任何先前版本,以避免从先前的联接尝试中继承任何不正确的设置: # 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台计算机加入其域。 如果adcli警告你DNS未更新,则主DNS服务器可能无法正确地将查询转发到Active Directory域控制器,设置网络配置以直接引用Active Directory服务器以获取DNS。 上述命令中的–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 最后,我们定义主导出并重新启动NFS服务器以确保注册所有配置更改: # echo "/export/home -rw,sec=krb5,root_squash $MY_SUBNET/$MY_PREFIX" > /etc/exports.d/home.exports # systemctl restart nfs-server.service 确保导出上的所有内容都正确,特别是,确保在根导出和home子文件系统上都设置了krb5标志: # exportfs -v 上述命令的输出应包括至少以下两行,完整请看下图(重点:sec=sys:krb5及sec=krb5): /export 192.0.2.0/24(sync,wdelay,hide,no_subtree_check,fsid=0,sec=sys:krb5) /export/home 192.0.2.0/24(sync,wdelay,hide,no_subtree_check,sec=krb5)
Kerberos协议还可以为NFS导出提供加密(krb5p)或完整性(krb5i),但krb5选项的这些变体将导致性能显着降低,你可能不想使用它们,除非你真的需要它们。
相关主题 |