Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36268
  • 博文数量: 12
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 123
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-27 11:20
个人简介

Passion for technology and design!

文章分类
文章存档

2015年(8)

2014年(4)

我的朋友

分类: LINUX

2015-05-24 19:17:30

一、系统及网络环境

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用户。
阅读(1729) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~