云网牛站
所在位置:首页 > Linux云服务器 > 在Fedora服务器中使用Kerberos安全地共享NFS主目录

在Fedora服务器中使用Kerberos安全地共享NFS主目录

2019-03-14 21:49:47作者:李群稿源:云网牛站

本文介绍在Fedora服务器中使用Kerberos安全地共享NFS主目录,内容有安装和配置NTP、Kerberos及SSSD、加入Active Directory、配置PAM、创建主目录、配置NFS ID映射、启用Kerberos并共享主目录。

 

背景

你可以共享NFS主目录,而无需启用Kerberos以进行更安全的身份验证,但是,通过标准系统身份验证,远程用户可以更改其PC上本地帐户的UID并访问其他人的主目录。Kerberos添加了一项要求,即最终用户具有访问主目录的特殊安全令牌,你只能通过提供正确的密码从指定的密钥服务器获取该安全令牌。

在Fedora服务器中使用Kerberos安全地共享NFS主目录

本文介绍如何将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)

在Fedora服务器中使用Kerberos安全地共享NFS主目录

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

 

相关主题

在CentOS 7上配置NFSv3和NFSv4的步骤

精选文章
热门文章