专栏首页青年夏日centos7 部署kerberos实现nfs用户密码认证挂载
原创

centos7 部署kerberos实现nfs用户密码认证挂载

任何程序错误,以及技术疑问或需要解答的,请扫码添加作者VX::1755337994

Kerberos 认证的NFS共享

RHCE 考试其中有一道题是需要配置kerberos 认证的nfs 文件共享,设置nfs共享比较简单,但是keberos服务器的设置虽然不在考点之内,确是需要完成这个实验搭建的重要一环,其实通过几天的资料查找和试验,我发现kerberos的搭建过程并不是很复杂,但是也遇到了一些让人抓耳挠腮的bug, 所以这里将整个过程跟大家分享一下,本文使用的OS版本为 RHEL 7.0, 有问题的地方也请批评指正。

试验的环境共有三台虚拟机构成,其名称和IP 配置如下: - Kerberos 服务器: hostname : remote.exmaple.com IP: 192.168.57.2 - NFS 服务器: hostname :server.exmaple.com IP: 192.168.57.3 - 客户端: hostname : client.exmaple.com IP: 192.168.57.204

Kerberos 服务器端设置

1.安装软件

yum -y install krb5-server krb5-workstation 
  • 1

2.编辑 /etc/krb5.conf 文件, 取消注释所有行,并替换kdc, admin server的设置,这里用default realm EXAMPLE.COM , 最后配置文件如下:

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = falsei
 default_realm = EXAMPLE.COM
 default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 EXAMPLE.COM = {
  kdc = remote.example.com
  admin_server = remote.example.com
 }

[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM

3. 修改 /etc/hosts 文件

192.168.57.3 server.example.com remote
192.168.57.2 remote.example.com server
192.168.57.204 client.example.com client

4.修改 /var/kerberos/krb5kdc/kdc.conf 文件 由于我们使用default realm 所以无需修改此文件,若用另外的realm,需替换此文件中的EXAMPLE.COM

5. 运行命令以下命令创建数据库,并按照提示设置数据库密码

[root@remote ~]# kdb5_util create  -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'EXAMPLE.COM',
master key name 'K/M@EXAMPLE.COM'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:

6. 启动kerberos

 systemctl start kerberos  kadmin 
 systemctl enable kerberos kadmin 

7. 允许防火墙

firewall-cmd  --permanent  --add-service=kerberos
firewall-cmd --reload 

8. 运行kadmin.local 来管理kdc 并添加nfs server 和 client的 主机信息

[root@remote ~]# kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.
kadmin.local:  addprinc -randkey host/server.example.com
WARNING: no policy specified for host/server.example.com@EXAMPLE.COM; defaulting to no policy
Principal "host/server.example.com@EXAMPLE.COM" created.
kadmin.local:  addprinc -randkey host/client.example.com
WARNING: no policy specified for host/client.example.com@EXAMPLE.COM; defaulting to no policy
Principal "host/client.example.com@EXAMPLE.COM" created.

9. 添加nfs server 和 client的 nfs 服务主机和客户端

kadmin.local:  addprinc -randkey nfs/server.example.com
WARNING: no policy specified for nfs/server.example.com@EXAMPLE.COM; defaulting to no policy
Principal "nfs/server.example.com@EXAMPLE.COM" created.
kadmin.local:  addprinc -randkey nfs/client.example.com
WARNING: no policy specified for nfs/client.example.com@EXAMPLE.COM; defaulting to no policy
Principal "nfs/client.example.com@EXAMPLE.COM" created.

10. 运行 listprincs 来检查kdc设置

kadmin.local:  listprincs
K/M@EXAMPLE.COM
host/client.example.com@EXAMPLE.COM
host/server.example.com@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kadmin/server.example.com@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM
nfs/client.example.com@EXAMPLE.COM
nfs/server.example.com@EXAMPLE.COM
[root@remote ~]#

11. 为服务器和客户端生成各自的秘钥文件,并保存在/tmp文件夹下, quit退出 kadmin

kadmin.local:  ktadd -k /tmp/server.keytab nfs/server.example.com
[以下省略输出]
kadmin.local:  ktadd -k /tmp/client.keytab nfs/client.example.com
[以下省略输出]
kadmin.local:  quit

12. 配置时间服务器 为了保证kerberos 认证能够进行,需要在三台设备统一时间, 现在设置kdc 为ntp server, 另外两台同步kdc的时间。 - 安装npt服务

 yum -y install ntp 
  • 配置 npt服务 /etc/ntp.conf 第15行添加: restrict 192.168.57.0 mask 255.255.255.0

21 行到26行,设置服务器为自己: #server 0.rhel.pool.ntp.org iburst #server 1.rhel.pool.ntp.org iburst #server 2.rhel.pool.ntp.org iburst #server 3.rhel.pool.ntp.org iburst server 127.127.1.0 fudge 127.127.1.0 stratum 11

  • 启动ntp并开机启动 systemctl restart ntpd systemctl enable ntpd

NFS 服务器端设置

1. 安装软件

 yum -y install nfs-utils krb5-workstation pam_krb5

2.编辑/etc/hosts文件,添加三台设备的dns信息

192.168.57.3 server.example.com remote
192.168.57.2 remote.example.com server
192.168.57.204 client.example.com client

3. 从kdc服务器拷贝配置文件和keytab秘钥文件并保存在/etc目录下

 scp remote:/etc/krb5.conf /etc/krb5.conf   
 scp remote:/tmp/server.keytab /etc/krb5.keytab 

4.设立共享目录 /nfs1

 mkdir /nfs1 

5. 编辑/etc/exports 文件如下

 /nfs1  *.example.com(ro,sec=krb5p) 

6. 修改 /etc/sysconfig/nfs, 第13行的位置以下条目添加 -V 4.2

 RPCNFSDARGS="-V 4.2" 

7. 开启nfs,nfs-secure并设为开机启动

systemctl restart nfs nfs-secure 
systemctl enable nfs nfs-secure 

8. 设置防火墙

 firewall-cmd  --permanent  --add-service=kerberos
 firewall-cmd --reload 

9. 设置时间同步

  • 安装chrony yun -y install chrony
  • 配置 /etc/chrony.conf 第3行到第7行 修改设置kdc为ntp服务器 #server 0.rhel.pool.ntp.org iburst #server 1.rhel.pool.ntp.org iburst #server 2.rhel.pool.ntp.org iburst #server 3.rhel.pool.ntp.org iburst server 192.168.57.2 iburst
  • 启动/开机启动chronyd systemctl restart chronyd
  • 查看同步状态, 显示 NTP synchronized: yes 表示同步成功 时间同步肯能需要几分钟的时间,这里可能要等待以下。 timedatectl status

NFS 客户端设置

1. 安装软件

 yum -y install nfs-utils krb5-workstation pam_krb5

2.编辑/etc/hosts文件,添加三台设备的dns信息

192.168.57.3 server.example.com remote
192.168.57.2 remote.example.com server
192.168.57.204 client.example.com client

3. 从kdc服务器拷贝配置文件和keytab秘钥文件并保存在/etc目录下

scp remote:/etc/krb5.conf /etc/krb5.conf    
scp remote:/tmp/client.keytab /etc/krb5.keytab 

4. 创建挂载点/mnt/nfs1

mkdir /mnt/nfs1 

5.编辑/etc/fstab 文件实现自动挂载

 remote:/nfs1 /mnt/nfs1 nfs defaults,v4.2,sec=krb5p 0 0 

6.启动 nfs-secure ,这里注意nfs-server这个服务不要启动,否则可能挂载不了

 systemctl restart nfs-secure

7. 设置时间同步 步骤同 NFS 服务器端设置 step 9 8. 挂载

mount -a

常见问题及注意事项

1.注意事项

  • 防火墙的添加,建议三台虚拟机firewall添加kerberos, nfs服务
  • NFS server 端启用 nfs-secure 和nfs-server , 客户端只启用 nfs-secure
  • 注意 /etc/hosts 文件的设置,三台虚拟机都需要设置且保障长名字在前面,例如 remote.example.com 在remote的前面 192.168.57.2 remoete.example.com remote
  • 查看日志信息: kdc 日志: /var/log/krb5kdc.log nfs server和client的日志显示在: /var/log/messages

2.常见问题

nfs client 报错: No such file or directorymount.nfs: mounting remote:/nfs1 failed, reason given by server: No such file or directory

Debug方法

  • 确认/nfs1共享目录确实存在
  • 修改nfs server的共享设置(/etc/exports)为如下 /nfs1 *(ro,sync,sec=krb5p)

重新mount 客户端,如果问题解决,可能是域名解析错误或此处填写错误。

nfs client 报错: access denied

mount.nfs: access denied by server while mounting remote:/nfs1 Debug方法

  • 查看 NFS server端日志,若显示:
Aug 24 07:54:32 remote rpc.svcgssd[5833]: ERROR: GSS-API: error in handle_nullreq: 
gss_accept_sec_context(): GSS_S_FAILURE (Unspecified GSS failure.  
Minor code may provide more information) - Ticket not yet valid

或者

Aug 24 12:43:37 remote rpc.svcgssd[5833]: ERROR: GSS-API: error in handle_nullreq: 
gss_accept_sec_context(): GSS_S_FAILURE (Unspecified GSS failure.  
Minor code may provide more information) - Key table file '/etc/krb5.keytab' not found

是由于NFS Server端的keytab文件有问题,请根据前文介绍重新拷贝keytab文件

nfs client 报错: access denied 且nfs server端无报错mount.nfs: access denied by server while mounting remote:/nfs1 Debug方法

  • 查看kdc服务器的日志 /var/log/krb5kdc.log 正常情况应有类似以下输出: Aug 25 00:23:45 remote.example.com krb5kdc[3464](info): TGS_REQ (6 etypes {18 17 16 23 25 26}) 192.168.57.204: ISSUE: authtime 1535127825, etypes {rep=18 tkt=18 ses=18}, nfs/client.example.com@EXAMPLE.COM for nfs/remote.example.com@EXAMPLE.COM

若出现 server unknown 或者 client unknown 等信息,请 1) 确认kdc端数据库内有所需的principle (host 和nfs) 2) 确认 三台虚拟机的hosts 文件配置正确 nfs client 报错: access denied 且nfs server端无报错并且kdc日志显示正常mount.nfs: access denied by server while mounting remote:/nfs1 这个Bug也是困扰了我三天的bug,确实很难Debug,尝试了各种方法仍找不到原因,因为原因出现在一个很容易被忽略的细节. Debug方法

  • 重命名NFS server端的keytab文件 mv /etc/krb5.keytab /etc/krb5.keytab.bak 这一步是强迫NFS server报错,无keytab文件,如果此时仍无报错(我遇到的情况),(最后才意识到)由于这个报错是由rpc.svcgssd 这个服务产生的,如上文所示。如果没有报错那原因是因为rpc.svcgssd 没有启动, 至于为什么没有启动我也没有弄清楚。进一步确认的话可以执行命令: ps -aux | grep rpc.svcgssd

输出应该有以下一行: root 5833 0.0 0.4 46752 4676 ? Ss Aug24 0:00 /usr/sbin/rpc.svcgssd

如果没有执行以下命令开启:

/usr/sbin/rpc.svcgssd

nfs客户端重新 mount, 这下应该可以从nfs server看到久违的报错信息了。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker实践(二):Harbor搭建私有Registry

    Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware中国研发团队负责开发的开源企业级Registry项目。作为一个企业...

    loong576
  • 004.Autofs自动挂载

    木二
  • 如何优雅的使用NFS文件系统

    NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步

    小柒吃地瓜
  • NAS 共享访问协议 — NFS、SMB、FTP、WebDAV 各有何优势?

    随着智能化互联时代的来临,家中的智能设备越来越多:电视机、平板、游戏主机、电脑、手机等遍及家中各个角落,同时设备之间共享数据的需求变的越来越强烈。比如同步、备份...

    JMCui
  • Ubuntu Server 第九章 文件服务

    在文件服务之前,先提下网络。网络是一个意外的产物,最早在美国国防部提出,出于战争的需要,担心军事指挥中心被摧毁,设计了一套去中心化的系统(APPAnet)。NS...

    天钧
  • nginx动静分离实操

    部署wordpress实现整个网站的动静分离,实现如下要求: 1.前端Nginx收到静态请求,直接从NFS中返回给客户端。 2.前端Nginx收到动态请求转交给...

    后端技术探索
  • 搞它!!!Linux构建远程YUM仓库与NFS共享存储服务

    FTP服务:ftp://… HTTP服务: http://… 本地目录:file://…

    不吃小白菜
  • Centos7-NFS服务配置实战

    NFS,是Network File System的简写,即网络文件系统。网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS,NFS允许一个系统在...

    JAVA日知录
  • nfs不同版本的挂载与解析

    1、在上面的操作过程中,如果你不幸遇到下面这个问题的话,可以尝试更新 Linux kernel 或通过打开 IPv6 来解决这个问题,这是1个 bug:

    孙杰
  • 如何在Debian 9上安装NFS共享

    网络文件系统(NFS)是一种文件系统协议,允许类Unix系统的用户通过网络访问文件,就像使用本地存储一样。这对于跨Internet上的多个腾讯云CVM服务器或其...

    爆栈工程师
  • 这是我看过最详细的k8s中部署Jenkins教程

    使用的HostPath的方式,今天看到一篇用NFS做存储,且更为详细的文章推荐给大家。

    我的小碗汤
  • centos8+kubeadm1.20.5+cilium+hubble环境搭建

    https://cloud.tencent.com/document/product/457/35747 一些containerd与docker的对应

    对你无可奈何
  • 大点干!早点散----------LVS负载均衡之LVS-NAT部署实战

    VMware软件 一台centos7作为LVS网关,双网卡 两台centos7作为Apache服务器 一台centos7作为NFS存储 一台win10作...

    不吃小白菜
  • OpenStack实践(十一):Instance Live Migrate and Evacuate

        Live Migrate(动态迁移),是指在保证客户机上应用服务正常运行的同时,让客户机在不同的宿主机之间进行迁移,分为无共享存储的Block Migr...

    loong576
  • 007.基于CentOS7.8安装Ambari2.7+HDP3.1大数据平台

    我这里创建了一个普通用户名为admin,并且具有sudo权限,4个节点都需要有这个用户。

    CoderJed
  • CentOS 7中搭建NFS文件共享存储服务的完整步骤

    NFS(Network File System)意为网络文件系统,它最大的功能就是可以通过网络,让不同的机器不同的操作系统可以共享彼此的文件。简单的讲就是可以挂...

    砸漏
  • CentOS 7中搭建NFS文件共享存储服务的完整步骤

    NFS(Network File System)意为网络文件系统,它最大的功能就是可以通过网络,让不同的机器不同的操作系统可以共享彼此的文件。简单的讲就是可以挂...

    砸漏
  • 如何在 Kubernetes 集群中搭建一个复杂的 MySQL 数据库?

    实际生产环境中,为了稳定和高可用,运维团队一般不会把 MySQL 数据库部署在 Kubernetes 集群中,一般是用云厂商的数据库或者自己在高性能机器(如裸金...

    高楼Zee
  • 看完您如果还不明白 Kerberos 原理,算我输!

    强大的身份验证和建立用户身份是 Hadoop 安全访问的基础。用户需要能够可靠地 “识别” 自己,然后在整个 Hadoop 集群中传播该身份。完成此操作后,这些...

    create17

扫码关注云+社区

领取腾讯云代金券