如何配置安全的Kerberized NFS服务器(RHEL/CentOS 7)

时间:2020-01-09 10:37:47  来源:igfitidea点击:

Kerberos用于身份验证,其思想是在Kerberos中保留一组凭据,因此我们将配置一个Kerberized NFS服务器。

Kerberos将了解NFS服务器,Kerberos将了解NFS客户端,而Kerberos将了解用户。

Kerberized NFS服务器

我们需要使用Kerberized NFS,因为NFS的安全性非常有限。
它仅检查客户端的IP地址或者主机名,如果客户端的IP地址或者主机名正确,则将授予访问权限。
如果我们想进一步加强安全性,可以使用sec =选项,该选项可与其他参数一起使用。

重要的提示:

我已经写了详细的分步教程来配置FreeIPA服务器和客户端。

因此,我将使用相同的设置来演示有关设置Kerberized NFS服务器的文章。

在IPA服务器上创建NFS服务

在开始NFS服务配置之前,我们必须在IPA服务器或者客户端上的任何一个上添加新服务。
对于本文,我将在IPA服务器(即node1.example.com)上创建NFS服务。

请按照以下屏幕截图实现相同的效果。

我将使用node1上的浏览器登录到我的IPA服务器。

example.com

接下来,从下拉菜单中将服务选择为" nfs",然后选择必须在其上创建服务的主机(node1.example.com对我们而言)

验证我们刚刚创建的服务。

现在,由于我已经将IPA服务器配置为NFS服务器,因此,我不需要导入keytab文件,但是如果我们使用的是其他NFS服务器,请按照以下命令进行操作

[root@node3 ~]# ipa-getkeytab -s  -p nfs/-k /etc/krb5.keytab
Keytab successfully retrieved and stored in: /etc/krb5.keytab

查看可用的凭证

[root@node1 ~]# klist -k
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- -------------------------------------------------------------------------
   2 host/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   1 nfs/[email protected]
   1 nfs/[email protected]

在服务器上配置Kerberized NFS共享

首先,让我们首先创建一个NFS共享路径,该路径将通过网络共享给我们的客户。

[root@node1 ~]# mkdir /secureshare

为了本文的目的,我将完全同意我的分享。

[root@node1 ~]# chmod 777 /secureshare/

有三种配置Kerberized NFS的选项:krb5,krb5i和krb5p。
sec =可以使用不同的安全性选项

  • none:它允许匿名访问文件和写入服务器,以nfsnobody发出。

  • sys:在这种情况下,文件访问基于UID和GID映射,这意味着如果服务器上的文件由用户1000拥有,并且来自客户端的用户1000尝试访问该文件,则我们将获得访问权限服务器中用户1000的权限。
    由于没有检查这些用户是否相同,因此从安全角度来看并不理想。

  • krb5:客户必须使用kerberos证明ID

  • krb5i:类似于krb5,但增加了保证数据未被篡改

  • krb5p:在上面添加了加密

实际上,除了krb5p之外,没有其他任何理由,因为使用该选项,客户端必须使用Kerberos票证来证明ID。
同样,Kerberos的作用是确保数据不会被篡改,并且还添加了加密。
如果要使用Kerberized NFS,这是一个非常不错的选择

[root@node1 ~]# cat /etc/exports
/secureshare *(sec=krb5p,rw)

下一步,启动nfs-server并检查状态以确保服务正常运行。

[root@node1 ~]# systemctl start nfs-server
[root@node1 ~]# systemctl status nfs-server
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
  Drop-In: /run/systemd/generator/nfs-server.service.d
           └─order-with-mounts.conf
   Active: active (exited) since Wed 2019-04-10 05:52:13 IST; 4s ago
  Process: 4960 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 4923 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 4921 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 4923 (code=exited, status=0/SUCCESS)
    Tasks: 0
   CGroup: /system.slice/nfs-server.service
Apr 10 05:52:08 node1.example.com systemd[1]: Starting NFS server and services...
Apr 10 05:52:13 node1.example.com systemd[1]: Started NFS server and services.

验证新创建的安装点

[root@node1 ~]# showmount -e localhost
Export list for localhost:
/secureshare *
[root@node1 ~]# exportfs -v
/secureshare    (sync,wdelay,hide,no_subtree_check,sec=krb5p,rw,secure,root_squash,no_all_squash)

在防火墙上启用NFS

将防火墙中的NFS服务添加到来自客户端的所有所有身份验证请求中。

[root@node1 ~]# firewall-cmd --permanent --add-service=nfs
success
[root@node1 ~]# firewall-cmd --permanent --add-service=mountd
success
[root@node1 ~]# firewall-cmd --permanent --add-service=rpc-bind
success

重新加载防火墙服务

[root@node1 ~]# systemctl reload firewalld

验证新添加的防火墙服务。

[root@node1 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: ssh dhcpv6-client freeipa-ldap freeipa-ldaps dns nfs mountd rpc-bind
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

在客户端节点上配置Kerberized NFS服务

现在,让我们在客户端节点上开始配置。
首先,使用管理员用户生成一个kerberos令牌。

[root@node2 ~]# kinit admin
Password for [email protected]:

使用klist验证kerberos凭证

[root@node2 ~]# klist -k
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- -------------------------------------------------------------------------
   1 host/[email protected]
   1 host/[email protected]

接下来,我们需要安装使用kerberos身份验证配置NFS客户端所需的所有rpm

[root@node2 ~]# yum groups install -y "Network File System Client"

下次启动并启用nfs-secure服务

[root@node2 ~]# systemctl enable nfs-secure
[root@node2 ~]# systemctl start nfs-secure

为NFS共享创建安装点

[root@node2 ~]# mkdir /securenfs

现在是时候在我们的客户端节点上挂载NFS共享了。

[root@node2 ~]# mount -o sec=krb5p node1.example.com:/secureshare /mnt

因此,成功挂载了NFS共享,我们可以使用mount命令来验证该共享。

[root@node2 ~]# mount | grep securenfs
node1:/secureshare on /securenfs type nfs4 (rw,relatime,vers=4.1,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5p,clientaddr=10.0.2.31,local_lock=none,addr=10.0.2.30)

LDAP用户访问NFS安全共享

现在,系统用户可以访问此共享,但是使用Kerberized NFS共享的好处是LDAP用户也可以使用它。
现在我有一个LDAP用户'hynman',所以让我尝试使用hynman用户来访问NFS共享。

[root@node2 securenfs]# su - hynman
Last login: Mon Nov 25 20:56:05 IST 2019 on :0

我将尝试浏览我的NFS共享。

[hynman@node2 ~]$cd /securenfs/
-bash: cd: /securenfs/: Permission denied

如我们所见,我们的权限被拒绝。
现在这是预期的行为。
由于没有为'hynman'用户生成令牌。
因此,让我们使用" kinit"为" hynman"用户生成一个kerberos令牌。

[hynman@node2 ~]$kinit hynman
Password for [email protected]:
Password expired.  You must change it now.
Enter new password:
Enter it again:

下次尝试访问NFS共享。

[hynman@node2 ~]$cd /securenfs/
[hynman@node2 securenfs]$pwd
/securenfs
[hynman@node2 securenfs]$touch file
[hynman@node2 securenfs]$ls -l
total 0
-rw-rw-r--. 1 hynman hynman 0 Apr 10 06:10 file

因此," hynman"用户现在可以访问共享,并且还具有对该共享的写许可权。