使用Kerberos给Linux鉴权
> 密钥分发中心(KDC)后台进程:处理所有的密码验证请求,并生成Kerberos证书,叫做凭证授予凭证(TGT);
> Kerberos管理进程:允许你远程添加、删除和修改账号,而不用登陆到运行Kerberos管理进程的计算机上,它也处理来自用户的密码修改请求。
使用Kerberos,只有一个密码修改需要通过网络传输一个强壮的加密密码。认证用户的过程中,Kerberos KDC给用户授予一个临时的证书,TGT,典型地,这些证书有10或24小时的有效期,这个有效期是可以配置的,但是不能超过24小时。
realm(Kerberos区域):它是一个管理域,它有自己的Kerberos数据库,每个Kerberos区域都有它自己的一套Kerberos服务员,你的区域名可以是任何内容,但是它应该映射到你在DNS中的区域,如果新Kerberos区域是为你的整个DNS域example.com准备的,你应该将你的Kerberos区域取一个相同的名字(所有字母大写,这是Kerberos的惯例):EXAMPLE.COM,或者,如果你正在example.com下创建一个新的工程部区域,你应该选项ENG.EXAMPLE.COM作为区域名。
1. 安装:
# yum install krb5-server
配置kerberos集群的总控文件,kerberos服务可以由多台服务器组成,其中有且只有一台作master,由admin_server决定该master在哪里。:
# vi /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 = HANBORQ.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes
[realms]
HANBORQ.COM = {
kdc = nd0-rack2-cloud:88
admin_server = nd0-rack2-cloud:749
default_domain = hanborq.com
}
[domain_realm]
.hanborq.com = HANBORQ.COM
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
其中[libdefaults]:定义整个kerberos的缺省值,。
其中[realms]:定义Kerberos区域,可以定义多个,它里面的kdc表示kdc进程运行在哪里,admin_server表示管理进程运行在哪里,default_domain表示缺省处理哪个DNS域名。
其中[domain_realm]:定义主机或DNS域名到kerberos域的映射关系,就是那些DNS域名或主机由哪个kerberos域处理,因为前面的default_domain只能定义一个域名,这里可以让该域处理更多的主机或DNS域名。
配置具体该集群每台机器的kdc文件:
# vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
v4_mode = nopreauth
kdc_tcp_ports = 88
[realms]
HANBORQ.COM = {
#master_key_type = des3-hmac-sha1
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 des-cbc-crc:v4 des-cbc-crc:afs3
}
建立kerberos鉴权数据库:
# kdb5_util create -r HANBORQ.COM -s
会要求输入数据库密码,必须记住该密码。
查看那些principal已经建立:
# kadmin.local -q “listprincs”
Authenticating as principal root/admin@HANBORQ.COM with password.
K/M@HANBORQ.COM
kadmin/admin@HANBORQ.COM
kadmin/changepw@HANBORQ.COM
kadmin/history@HANBORQ.COM
kadmin/nd0-rack2-cloud@HANBORQ.COM
krbtgt/HANBORQ.COM@HANBORQ.COM
建立keytab,注意keytab跟上面kdc.conf文件中一致:
# kadmin.local -q “ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/admin”
# kadmin.local -q “ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/changepw”
增加用户,需记住密码:
# kadmin.local -q “addprinc krbadm@HANBORQ.COM”
# kadmin.local -q “addprinc ldapadm@HANBORQ.COM”
# kadmin.local -q “delprinc XXX@HANBORQ.COM”
修改ACL规则,文件位置就是kdc.conf里面定义的:
# vi /var/kerberos/krb5kdc/kadm5.acl
krbadm@HANBORQ.COM *
*/admin@HANBORQ.COM *
*/*@HANBORQ.COM i
*@HANBORQ.COM i
启动:
# service krb5kdc start
# service krb524 start
# /usr/kerberos/sbin/kadmind
测试一下:
# kadmin -p krbadm -q “listprincs”
# kadmin -p krbadm
# kadmin -p ldapadm -q “listprincs”
最后一个会提示没有list权限,因为ACL规则里面没有添加该用户。
测试客户端能否得到ticket:
# kinit krbadm@HANBORQ.COM
# klist
klist命令能看到已经得到了ticket。
Linux SSH通过Kerberos登录,必须在kerberos和linux同时存在该用户才能使用kerberos鉴权登录,因为kerberos只能保存用户名、密码,不能保存其它用户信息,需要保存的话,应该使用LDAP:
打开Kerberos鉴权:
# scp KERBEROS_SERVER:/etc/krb5.conf /etc/krb5.conf
修改pam设置,/etc/pam.d/system-auth文件增加内容,注意放置的位置:
# vi /etc/pam.d/system-auth
auth sufficient pam_krb5.so use_first_pass ignore_root forwardable
auth required pam_unix.so nullok_secure try_first_pass
session sufficient pam_unix.so
# vi /etc/ssh/sshd_config
KerberosAuthentication yes
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes
UsePAM yes
AllowTcpForwarding yes
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
GssapiKeyExchange yes
# vi /etc/ssh/ssh_config
Host *
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
# service sshd restart
这里的host固定为”host”四个字符,vmw1为客户端hostnname或DNS域名,-randkey使用随机key登录,不用输入密码。
在客户端增加用户:
# useradd testUser
Kerberos里面添加用户,有要求输入krbadm的密码和新用户需要的密码:
# kadmin -p krbadm -q “addprinc testUser@HANBORQ.COM”
登录:
# ssh testUser@10.24.1.40
可以使用kerberos里面的密码登录,当然也可以使用linux里面的密码登录。