一、系统及网络环境
2台RHEL 7.0虚拟机,主机名和IP地址分别为:
station1.example.com 172.16.200.10
station2.example.com 172.16.200.20
这2台虚拟机都是通过DHCP获得IP地址,在DHCP服务器上设置有IP地址到MAC地址的绑定。
2台虚拟机都配置了内网的yum源:
[rhel7]
name=rhel7
baseurl=
enable=1
gpgcheck=0
宿主机的主机名为 gateway.example.com ,IP地址 172.16.200.254 ,静态IP。
gateway主机的 /etc/NetworkManager/NetworkManager.conf 配置如下,dns=none使NetworkManager不去更新/etc/resolv.conf文件。
[main]
plugins=ifcfg-rh
dns=none
重启 NetworkManager 服务,使配置生效:
systemctl restart NetworkManager
手动修改gateway主机的 /etc/resolv.conf 配置:
search example.com
domain example.com
nameserver 172.16.200.254
nameserver 202.106.0.20
nameserver 8.8.8.8
gateway主机的DHCP配置文件 /etc/dhcp/dhcpd.conf 配置如下:
key ddns {
algorithm hmac-md5;
secret PpkQt2CpoUHdZHmRZi16Lg==;
}
zone example.com. {
primary 172.16.200.254;
key ddns;
}
zone 200.16.172.in-addr.arpa. {
primary 172.16.200.254;
key ddns;
}
ddns-update-style interim;
ignore client-updates;
update-static-leases on;
default-lease-time 864000;
max-lease-time 864000;
option domain-name "example.com";
option domain-name-servers 172.16.200.254;
subnet 172.16.200.0 netmask 255.255.255.0 {
filename "pxelinux.0";
next-server 172.16.200.254;
range 172.16.200.100 172.16.200.200;
option subnet-mask 255.255.255.0;
option routers 172.16.200.254;
host station1 {
hardware ethernet 52:54:00:15:e0:71;
fixed-address 172.16.200.10;
ddns-hostname "station1";
ddns-domainname "example.com";
option host-name "station1";
option domain-name "example.com";
}
host station2 {
hardware ethernet 52:54:00:15:e0:72;
fixed-address 172.16.200.20;
ddns-hostname "station2";
ddns-domainname "example.com";
option host-name "station2";
option domain-name "example.com";
}
}
那个key的值,是用dnssec-keygen生成的密钥:
dnssec-keygen -a HMAC-MD5 -b 128 -n USER ddns
宿主机的DHCP服务做了IP地址到MAC地址的绑定,以及Kickstart安装的配置,这里我们没有用到Kickstart安装。注意IP地址池是100-200,而station1和station2设置的绑定IP地址分别是10和20,并不在地址池中。这是因为曾经发生过这种情况:有一次station1设置绑定101这个IP,在station1没有开机的情况下,DHCP服务器把101分配给了其他机器,这时station1开机,DHCP服务器又根据MAC地址绑定,再次将101这个IP分配给了station1,造成IP地址冲突。我不清楚这是不是DHCP服务的一个bug,为什么会在station1没有开机的情况下,将已绑定MAC的IP地址分配给其他机器。以上的配置中,有DDNS相关的设置,提供动态域名解析。
gateway主机上,设置了动态DNS服务,DNS服务配置为:
配置文件 /etc/named.conf :
key ddns {
algorithm hmac-md5;
secret PpkQt2CpoUHdZHmRZi16Lg==;
};
listen-on port 53 { 127.0.0.1; 172.16.200.254; };
allow-query { localhost; 172.16.200.0/24; };
max-refresh-time 20;
min-refresh-time 10;
配置文件 /etc/named.rfc1912.zones :
zone "example.com" IN {
type master;
file "example.com.zone";
allow-update { key ddns; };
};
zone "200.16.172.in-addr.arpa" IN {
type master;
file "200.16.172.zone";
allow-update { key ddns; };
};
正向域名解析区域配置文件 /var/named/example.com.zone :
$TTL 1D
@ IN SOA gateway.example.com. root.gateway.example.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS gateway.example.com.
gateway.example.com. A 172.16.200.254
反向域名解析区域配置文件 /var/named/200.16.172.zone :
$TTL 1D
@ IN SOA gateway.example.com. root.gateway.example.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS gateway.example.com.
254 PTR gateway.example.com.
修改 /var/named 目录的相关权限:
chown -R named.named /var/named/
setsebool -P named_write_master_zones 1
在 /etc/hosts 文件中添加:
172.16.200.254 gateway.example.com
在station1和station2和gateway上有1个普通用户tim,其用户ID都是1000。
NFS Secure可以通过Kerberos来建立NFS服务器和NFS客户端之间的认证。
在这里,我们用gateway主机作为Kerberos认证服务器,安装Kerberos相关软件包:
yum install -y krb5-libs krb5-server krb5-workstation pam_krb5
修改 Kerberos 配置文件 /var/kerberos/krb5kdc/kdc.conf :
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
EXAMPLE.COM = {
master_key_type = aes256-cts
default_principal_flags = +preauth
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
注意supported_enctypes变量的值,这里设置了6种加密算法。
修改 Kerberos 配置文件 /var/kerberos/krb5kdc/kadm5.acl :
*/admin@EXAMPLE.COM *
在gateway、station1、station2上,修改Kerberos配置文件 /etc/krb5.conf :
[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 = false
default_realm = EXAMPLE.COM
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
EXAMPLE.COM = {
kdc = gateway.example.com
admin_server = gateway.example.com
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
注意上述文件中的 EXAMPLE.COM ,需要按照实际情况改成相应的域名。
执行命令:
kdb5_util create -s -r EXAMPLE.COM
创建 Kerberos 数据库。
启动相关服务并配置防火墙规则:
systemctl start krb5kdc
systemctl start kadmin
systemctl enable krb5kdc
systemctl enable kadmin
firewall-cmd --permanent --add-service=kerberos
firewall-cmd --reload
Kerberos认证的唯一ID叫principal,由primary、instance、realm三部分组成,格式为 primary/instance@realm 。
principal有3种类型:user、service、host。
给root用户创建一个user类型的、带管理权限的principal:
# kadmin.local
kadmin.local: addprinc root/admin
Enter password for principal "root/admin@EXAMPLE.COM":
Re-enter password for principal "root/admin@EXAMPLE.COM":
Principal "root/admin@EXAMPLE.COM" created.
kadmin.local: listprincs
kadmin.local: quit
# kadmin
输入密码,然后创建service类型的principal
kadmin: addprinc -randkey host/station1.example.com
kadmin: addprinc -randkey host/station2.example.com
kadmin: addprinc -randkey nfs/station1.example.com
这里不会提示输入密码,因为用了-randkey指定了一个随机密码。
kadmin: addprinc tim
在这里设置tim用户的kerberos认证密码。
创建了principal之后,需要把key从KDC里导出来,KDC知道所有principal的key,通常导出为.keytab密钥串文件。
(某些版本的内核仅支持在NFS中用des-cbc-crc这一种加密方式,加 -e des-cbc-crc:normal 选项)
在nfs_client.keytab密钥串中添加密钥,作为客户端的密钥串,由于上面设置了6种加密算法,所以添加了6个密钥:
kadmin: ktadd -k /root/nfs_client.keytab host/station2.example.com
kadmin: q
# cp /root/nfs_client.keytab /var/www/html/nfs_client.keytab
在nfs_server.keytab密钥串中添加密钥,作为服务端的密钥串:
# kadmin
kadmin: ktadd -k /root/nfs_server.keytab host/station1.example.com
kadmin: ktadd -k /root/nfs_server.keytab nfs/station1.example.com
kadmin: q
# cp /root/nfs_server.keytab /var/www/html/nfs_server.keytab
查看keytab文件中的key:
klist -k /var/www/html/nfs_server.keytab
klist -k /var/www/html/nfs_client.keytab
server的那个keytab里面有2个key,client的那个keytab里面有1个key。
启动HTTP服务,使station1和station2能下载到两个keytab文件:
chmod -v 444 /var/www/html/nfs_{server,client}.keytab
systemctl start httpd
systemctl enable httpd
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
二、NFS配置要求
在station1上:
以只读的方式共享目录 /public ,同时只能被 example.com 域中的系统访问
以可读写的方式共享目录 /protected ,同时只能被 example.com 域中的系统访问
访问 /protected 需要通过Kerberos安全加密,使用KDC服务器提供的密钥
目录 /protected 应该包含名为 secret ,所有人为 tim 的子目录
用户 tim 能以读写方式访问 /protected/secret 目录
在station2上:
配置station2,从station1上挂载NFS共享目录如下
/public 目录被挂载到 /mnt/nfsmount 目录下
/protected 目录被挂载到 /mnt/nfssecure 目录下,使用KDC服务器提供的密钥
用户 tim 能够在 /mnt/nfssecure/secret 目录中创建文件
NFS文件系统需要在启动时被自动挂载
三、NFS服务器配置
在station1上执行下列步骤:
建立共享目录并设定权限:
mkdir -pv /public /protected/secret
chown tim.tim /protected/secret
修改SElinux上下文:
semanage fcontext -a -t public_content_t "/public(/.*)?"
semanage fcontext -a -t public_content_t "/protected(/.*)?"
restorecon -Rv /public/
restorecon -Rv /protected/
编辑 /etc/sysconfig/nfs 配置文件,修改 RPCNFSDARGS 变量的值:
RPCNFSDARGS="-V 4.2"
编辑 /etc/exports 配置文件:
/public 172.16.200.0/24(ro)
/protected 172.16.200.0/24(rw,sec=krb5p)
启动NFS服务:
systemctl start nfs-server.service
systemctl enable nfs-server.service
下载服务器keytab文件并复制到 /etc/krb5.keytab:
wget -O /etc/krb5.keytab
klist -k /etc/krb5.keytab
启动NFS Secure服务:
systemctl start nfs-secure-server.service
systemctl enable nfs-secure-server.service
showmount -e
设置防火墙,放行NFS、RPC、mountd服务:
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload
重新加载/etc/exports中的设置,并同步更新/var/lib/nfs/etab中的内容:
exportfs -r
四、NFS客户端配置
在station2上执行下列步骤:
建立挂载点目录:
mkdir -pv /mnt/nfsmount /mnt/nfssecure
下载客户端keytab文件并保存到 /etc/krb5.keytab ,并获得Kerberos票据:
wget -O /etc/krb5.keytab
查看keytab文件中的密钥:
klist -k /etc/krb5.keytab
尝试挂载NFS目录:
mount -t nfs 172.16.200.10:/public /mnt/nfsmount
启动nfs-secure客户端:
systemctl start nfs-secure.service
systemctl enable nfs-secure.service
(在RHEL7.1中,服务名需要用rpcsvcgssd.service,否则会报错找不到)
尝试挂载NFS Secure目录:
mount -t nfs -o sec=krb5p,v4.2 172.16.200.10:/protected /mnt/nfssecure
卸载刚才挂载的目录:
umount /mnt/nfsmount
umount /mnt/nfssecure
在/etc/fstab中添加2行:
172.16.200.10:/public /mnt/nfsmount nfs defaults 0 0
172.16.200.10:/protected /mnt/nfssecure nfs defaults,sec=krb5p,v4.2 0 0
保存退出,然后执行:
mount -a
mount
可以看到2个NFS目录都被挂载上了。
五、普通用户的Kerberos认证
对station2上的普通用户tim,如果要实现对 /mnt/nfssecure/secret 目录的读写,需要通过kinit先获取票据。
切换至tim用户:
# su - tim
通过kinit获取Kerberos票据:
$ kinit
Password for tim@EXAMPLE.COM:
这里输入在kadmin里面设置的tim用户的Kerberos密码。
查看票据信息:
$ klist
Ticket cache: KEYRING:persistent:1000:1000
Default principal: tim@EXAMPLE.COM
Valid starting Expires Service principal
05/24/2015 18:54:45 05/25/2015 18:54:42 krbtgt/EXAMPLE.COM@EXAMPLE.COM
renew until 05/24/2015 18:54:45
然后进入 /mnt/nfssecure/secret/ 目录,创建文件:
$ cd /mnt/nfssecure/secret/
$ touch testfile{1..9}
$ ls -l
total 0
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile1
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile2
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile3
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile4
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile5
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile6
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile7
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile8
-rw-rw-r--. 1 tim tim 0 May 24 19:06 testfile9
可以看到,所有的9个文件的所有者和属组都是tim,而不是nfsnobody,大功告成!
实际使用中,tim用户通常是LDAP用户。
阅读(1732) | 评论(0) | 转发(0) |