引言
大多数常规网络服务使用基于密码的认证方案,其中用户提供密码以访问给定的网络服务器。 但是,许多服务的认证信息的传输是未加密的。 为了确保这种方案的安全,外部人员必须无法访问网络,并且网络上的所有计算机和用户都必须是受信任的和可信任的。
使用简单的基于密码的认证,不能假定连接到Internet的网络是安全的。 任何能够访问网络的攻击者都可以使用简单的数据包分析器或数据包嗅探器来拦截用户名和密码,从而破坏用户帐户,从而损害整个安全基础结构的完整性。
Kerberos是一种比普通的基于密码的认证更加安全的认证协议。Kerberos使用对称密钥加密技术对用户进行网络服务认证,这意味着永远不会实际通过网络发送密码。
Kerberos提供了一种机制,允许用户和机器向网络标识自己,并接收对管理员配置的区域和服务的定义的、受限的访问权限。Kerberos通过认证实体的身份对其进行认证证,并且Kerberos还保护此认证数据,使其不会被外人访问、使用或篡改。
前期准备
环境共有三台计算机构成,其名称和IP 配置如下
角色 | 主机名 | IP地址 |
---|---|---|
Kerberos 服务器 | kdc.exmaple.com | 100.10.11.10 |
NFS 服务器 | ns.exmaple.com | 100.10.11.20 |
NFS 客户端 | nc.exmaple.com | 100.10.11.50 |
配置时间同步服务器
为了保证kerberos 认证能够进行,需要在三台计算机统一时间, 现将kdc设置 为ntp server, 另外两台同步kdc的时间。
kdc的配置
-
安装chrony服务
# yum -y install chrony
-
修改配置文件
注释 /etc/chrony.conf中server开头的行,并添加
allow 100.10.11.0/24 local stratum 10 stratumweight 0
-
启动chrony服务
# systemctl enable chronyd && systemctl restart chronyd &&systemctl status chronyd
nfs服务器和客户端的配置
-
安装chrony服务
# yum -y install chrony
-
修改配置文件
注释 /etc/chrony.conf中server开头的行, 设置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 100.10.11.10 iburst local stratum 10 stratumweight 0
-
启动chrony服务
# systemctl enable chronyd && systemctl restart chronyd &&systemctl status chronyd
-
查看同步状态。
# chronyc sources -v
编辑/etc/hosts文件
在KDC节点的/etc/hosts文件添加三台计算机的信息,并复制到其它2个计算机。
100.10.11.10 kdc.example.com kdc
100.10.11.20 ns.example.com ns
100.10.11.50 nc.example.com nc
Kerberos 服务器设置
首先安装主KDC,然后在安装主KDC之后安装所有必要的从KDC。
KDC系统应为专用计算机。 这台机器必须非常安全-如果可能的话,除了KDC之外,它不应运行任何服务。
-
安装KDC所需的软件包:
# yum -y install krb5-server krb5-libs krb5-workstation pam_krb5
-
编辑 /etc/krb5.conf 和 /var/kerberos/krb5kdc/kdc.conf配置文件,以反映领域名称和域到领域(domain-to-realm)的映射。
例如 /etc/krb5.conf:
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = EXAMPLE.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true allow_weak_crypto = true [realms] EXAMPLE.COM = { kdc = kdc.example.com admin_server = kdc.example.com default_domain = example.com } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM
可以通过使用正确的域名替换EXAMPLE.COM和example.com的实例(确定将大写和小写的名称保持正确的格式)并将KDC从kerberos.example.com更改为Kerberos服务器名称来构造一个简单的领域。 按照惯例,所有领域名称均为大写,所有DNS主机名和域名均为小写。 这些配置文件的手册页包含有关文件格式的完整详细信息。
由于我们使用default realm为EXAMPLE.COM, 所以无需修改 /var/kerberos/krb5kdc/kdc.conf,若用另外的realm,需替换此文件中的EXAMPLE.COM
-
使用kdb5_util实用程序创建数据库。
# kdb5_util create -s
create命令创建存储Kerberos领域密钥的数据库。 -s参数创建一个存储主服务器密钥的存储文件。 如果不存在用于从中读取密钥的存储文件,则Kerberos服务器(krb5kdc)每次启动时都会提示用户输入主服务器密码(可用于重新生成密钥)。
-
编辑 /var/kerberos/krb5kdc/kadm5.acl文件。 kadmind使用此文件来确定哪些主体具有对Kerberos数据库的管理访问权限以及它们的访问级别。 例如:
*/admin@EXAMPLE.COM *
大多数用户在数据库中由单个主体表示(具有NULL或空实例,如joe@example.com)。在此配置中,具有admin实例的第二个主体(例如,joe/admin@example.com)的用户能够对领域的Kerberos数据库实施完全管理控制。
在服务器上启动kadmind之后,任何用户都可以通过在领域中的任何客户端或服务器上运行kadmin来访问其服务。 但是,只有kadm5.acl文件中列出的用户才能以任何方式修改数据库,但更改自己的密码除外。
kadmin实用程序通过网络与kadmind服务器通信,并使用Kerberos处理认证。因此,在通过网络连接到服务器进行管理之前,第一个主体必须已经存在。使用kadmin.local命令创建第一个主体,该命令专门设计为与KDC在同一主机上使用,并且不使用Kerberos进行身份验证
-
在KDC终端上使用kadmin.local创建主体(即nfs server和nfs client的host主体和nfs服务主体):
# kadmin.local -q "addprinc root/admin" # kadmin.local -q "addprinc -randkey host/ns.example.com" # kadmin.local -q "addprinc -randkey host/nc.example.com" # kadmin.local -q "addprinc -randkey nfs/ns.example.com" # kadmin.local -q "addprinc -randkey nfs/nc.example.com"
-
使用以下命令启动Kerberos:
# systemctl enable krb5kdc.service&&systemctl restart krb5kdc.service&&systemctl status krb5kdc.service # systemctl enable kadmin.service&&systemctl restart kadmin.service&&systemctl status kadmin.service
-
使用kadmin中的addprinc命令为用户添加主体。 kadmin和kadmin.local是KDC的命令行界面。 因此,启动kadmin程序后,可以使用许多命令(例如addprinc)。 有关更多信息,请参见kadmin手册页。
-
验证KDC是否正在签发票证。首先,运行kinit以获取票证并将其存储在凭证缓存文件中。
接下来,使用klist查看缓存中的凭证列表,并使用kdestroy销毁缓存及其包含的凭证。默认情况下,kinit尝试使用相同的系统登录用户名(而不是Kerberos服务器)进行认证。 如果该用户名与Kerberos数据库中的主体不对应,则kinit会发出错误消息。 如果发生这种情况,请在命令行中为kinit提供正确的主体名称作为参数:
kinit principal
为root/admin创建并缓存Kerberos票证授予票证:
# kinit root/admin # klist -f Ticket cache: KEYRING:persistent:0:0 Default principal: root/admin@EXAMPLE.COM Valid starting Expires Service principal 10/05/2020 13:58:10 10/06/2020 13:58:10 krbtgt/EXAMPLE.COM@EXAMPLE.COM # kadmin.local listprincs K/M@EXAMPLE.COM host/nc.example.com@EXAMPLE.COM host/ns.example.com@EXAMPLE.COM kadmin/admin@EXAMPLE.COM kadmin/changepw@EXAMPLE.COM kadmin/kdc.exmaple.com@EXAMPLE.COM kiprop/kdc.exmaple.com@EXAMPLE.COM krbtgt/EXAMPLE.COM@EXAMPLE.COM nfs/nc.example.com@EXAMPLE.COM nfs/ns.example.com@EXAMPLE.COM root/admin@EXAMPLE.COM
-
为nfs服务器和客户端生成各自的秘钥表文件,并保存在/tmp文件夹下, quit退出 kadmin
# kadmin.local -q "ktadd -norandkey -k /tmp/server.keytab nfs/ns.example.com" # kadmin.local -q "ktadd -norandkey -k /tmp/client.keytab nfs/nc.example.com"
-
查看keytab密钥表文件。
# klist -kt /tmp/server.keytab # klist -kt /tmp/client.keytab
NFS 服务器设置
NFS服务器同时充当Kerberos客户端。设置Kerberos 5客户端所需要做的就是安装客户端软件包并为每个客户端提供有效的krb5.conf配置文件。
-
在所有Kerberos 5客户端计算机上安装krb5-libs和krb5-workstation软件包。
yum -y install krb5-workstation krb5-libs pam_krb5
-
安装nfs服务器软件包
yum -y install nfs-utils
-
从kdc服务器拷贝配置文件和keytab秘钥表文件并保存在/etc目录下
# scp kdc:/etc/krb5.conf /etc/krb5.conf
# scp kdc:/tmp/server.keytab /etc/krb5.keytab
-
创建导出目录,修改目录的权限为777。
# mkdir /opt/share01/ # chmod 777 /opt/share01
-
编辑/etc/exports 文件。
/opt/share01 *.example.com(rw,sec=krb5p)
-
修改 /etc/sysconfig/nfs文件。
RPCNFSDARGS="-V 4"
-
启动nfs服务。
# systemctl enable nfs&&systemctl restart nfs&&systemctl status nfs # systemctl enable nfs-secure&&systemctl restart nfs-secure&&systemctl status nfs-secure
NFS客户端设置
NFS客户端同时充当Kerberos客户端。设置Kerberos 5客户端所需要做的就是安装客户端软件包并为每个客户端提供有效的krb5.conf配置文件。
-
在所有Kerberos 5客户端计算机上安装krb5-libs和krb5-workstation软件包。
# yum -y install krb5-workstation krb5-libs pam_krb5
-
安装nfs软件包
# yum -y install nfs-utils
-
从kdc服务器拷贝配置文件和keytab秘钥表文件并保存在/etc目录下
# scp kdc:/etc/krb5.conf /etc/krb5.conf # scp kdc:/tmp/cleint.keytab /etc/krb5.keytab
-
启动nfs服务。
# systemctl enable nfs&&systemctl restart nfs&&systemctl status nfs
-
创建挂载点,并挂载NFS共享
# mkdir /mnt/share01 # showmount -e 100.10.11.20 # mont -t nfs -o sec=krb5p 100.10.10.20:/opt/share01 /mnt/share01/