一、介绍
在centos7中,实现Kerberos+openldap来实现集中身份认证,其中Kerberos来作认证,openldap用来做账号管理。
LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP,类似DNS的树形结构来组织信息.
一般情况下,LDAP需要结合Kerberos做认证,kerberos提供了一个不需要传输密码的情况下,可以给你和你想使用的服务之间建立信任关系的服务,而且不需要你每次都输入密码。实现单点登陆.
二、openldap
1.名词解释
1、entry
条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。
2、dn
每一个条目都有一个唯一的标识名(distinguished Name ,DN)
类似URI的功能
3、Attribute
每个entry都可以有很多属性,比如常见的人都有姓名、地址、电话等属性。
属性不是随便定义的,需要符合一定的规则,而这个规则可以通过schema制定。
常用的属性:
dn:一条entry的唯一路径
cn:用户的全名
sn:用户的姓
uid:用户的登陆名称
c:两个字符的国家代码,比如:中国,cn
o:组织名称(公司名)
ou:部门名称
mail:邮件地址
4、schema
schema定义了哪些属性可用,以及属性的格式(类似mysql的约束)
比如:电话号码,就不能输入英文字母,否则报错
openlda默认自带RFC标准的schema,如果没有特殊需求,导入即可
5、ObjectClass
对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。
6、 LDIF
LDIF文件,用来定义对数据的操作或配置的修改
2.配置YUM源
cat /etc/yum.repos.d/base.repo
[os]
name=os
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/
enabled=1
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
enabled=1
gpgcheck=0
3.安装ldap
yum install -y openldap-servers openldap-clients
#openldap-servers,服务端
#openldap-clients,客户端
4.配置openldap
https://www.openldap.org/doc/admin24/slapdconf2.html
openldap 2.4有两种配置方式:
(1)slapd.conf,这是2.3版本以前的配置方式,2.4版本也支持
(2)LDIF数据库,2.3版本以后,使用动态运行时配置引擎的方式来配置ldap,其配置数据存储在LDIF数据库中,位于/etc/openldap/slapd.d
优势:
ldap的配置在运行中就可以进行修改,无需重启服务即可生效
4.1、配置
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
#ldap的数据库配置文件
#不用修改
chown -R ldap. /var/lib/ldap/
slappasswd
#产生一个加密过后的密码
vi /etc/openldap/slapd.d/cn\=config/olcDatabase\={0}config.ldif
olcRootPW: {SSHA}fdD1iX+g42FnwbjVhuDuKv2FEj69U9No
#设置管理员密码
#在最后添加一行
#密码为上面产生的密码
vi /etc/openldap/slapd.d/cn\=config/olcDatabase\={2}hdb.ldif
olcSuffix: dc=example,dc=com
olcRootDN: cn=Manager,dc=example,dc=com
olcRootPW: {SSHA}oe7odi30W9Jy4YbqW348HV4p7B5n6khU
olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=Manager,dc=example,dc=com" write by anonymous auth by none
olcAccess: {1}to by dn.base="cn=Manager,dc=example,dc=com" write by self write by * read
#设置manager的密码
#将dc改成自己的域名
4.2、监控
vi /etc/openldap/slapd.d/cn\=config/olcDatabase\={1}monitor.ldif
olcAccess: {0}to by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=Manager,dc=example,dc=com" read by none
#将dc改成自己的域名
4.3、测试配置文件
slaptest -u
4.4、启动服务
systemctl start slapd
systemctl enable slapd
4.5、定义schema
ls /etc/openldap/schema/*.ldif |xargs -I {} ldapadd -Y EXTERNAL -H ldapi:/// -f {}
4.6、定义命名空间
也就是定义整个组织的架构
vi /etc/openldap/base.ldif
dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
dc: example
o: ldap
#定义suffix,也就是目录树的最顶端
dn: ou=People,dc=example,dc=com
objectclass: organizationalUnit
ou: People
#在根下面定义一个分支,叫people,使用部门这个类,表示这定义的是一个部门信息dn: ou=Group,dc=example,dc=com
objectclass: organizationalUnit
ou: Group
#同上,定义另一个部门
注意
1.条目之间必须要有一个空行
2.文件的最后不能有空行
ldapadd -x -D cn=Manager,dc=example,dc=com -W -f /etc/openldap/base.ldif
#使用ldapadd工具,将上面的定义,写进数据库
#-x,使用简单身份认证,也就是使用账号和密码
#-D,指定账号
#-W,指定密码,不指定,回车会提示输密码
#-f,指定ldif文件
4.7、查询
ldapsearch -x -D cn=Manager,dc=example,dc=com -w -b "dc=example,dc=com"
#使用ldapsearch工具,对数据库进行查询
5、migrationtools
要往ldap数据库中添加用户信息,有两种方法:
1.将用户信息写到一个ldif文件,然后用ldapadd工具导入
2.使用migrationtools工具,将本地/etc/passwd和/etc/group文件内容,转换成ldif文件,然后用ldapadd工具导入
为了方便,我们这里使用migrationtools工具
5.1、安装
yum install -y migrationtools
5.2添加用户
useradd demouser1
useradd demouser2
grep demo /etc/passwd > /tmp/users
grep demo /etc/group > /tmp/groups
5.3更改migrationtools的配置文件
vi /usr/share/migrationtools/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "example.com";
$DEFAULT_BASE = "dc=example,dc=com";
$EXTENDED_SCHEMA = 1;
#指定转换中,需要用到的信息
5.4转换成ldif文件
cd /usr/share/migrationtools/
./migrate_passwd.pl /tmp/users /tmp/users.ldif
./migrate_group.pl /tmp/groups /tmp/groups.ldif
5.5导入
ldapadd -x -D cn=Manager,dc=example,dc=com -w redhat -f /tmp/groups.ldif
ldapadd -x -D cn=Manager,dc=example,dc=com -w redhat -f /tmp/users.ldif
6、LDAP客户端
配置ldap客户端,要改的配置文件太多,所以我们使用工具来配置
配置工具有:
1.authconfig,命令行
2.authconfig-tui,文本图形
3.authconfig-gtk,图形化,系统装了图形化才能用
这里我们使用authconfig-tui工具
6.1 装包
yum install -y nss-pam-ldapd
6.2 配置
authconfig-tui
#图形化配置客户端
6.3 测试
getent passwd demouser1
#如果能获取到用户信息,说明OK
id demouser1
注意,
默认ldap用户在客户端本地是没办法创建家目录的
7、共享家目录
7.1、服务端
使用nfs共享家目录
yum install -y nfs-utils
vi /etc/exports
/home *(rw,sync)
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
7.2、客户端
使用autofs挂载家目录
yum install -y nfs-utils autofs
vi /etc/auto.master
/home /etc/auto.autofs --timout=600
vi /etc/auto.autofs
- kerberos.example.com:/home/&
systemctl enable autofs
systemctl start autofs
8、配置TLS加密
http://www.openldap.org/doc/admin24/tls.html#Server%20Certificates
如果要通过客户端的sssd进行LDAP认证,必须开启TLS加密。sssd不支持不加密的认证通道。
8.1、创建CA机构
cd /etc/pki/tls/certs
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.crt -days 3650
cd /etc/pki/CA
touch serial index.txt
echo 01 > serial
8.2、生成用户证书
cd /etc/pki/tls/certs
(umask 077;openssl genrsa -out slapd.key 1024)
openssl req -new -key slapd.key -out slapd.csr
#生成请求文件
openssl ca -in slapd.csr -out slapd.crt -days 3650
#CA机构签发用户证书
8.3、配置服务端
vi /etc/openldap/slapd.d/cn\=config.ldif
olcTLSCACertificateFile: /etc/pki/tls/certs/cacert.crt
olcTLSCertificateFile: /etc/pki/tls/certs/slapd.crt
olcTLSCertificateKeyFile: /etc/pki/tls/certs/slapd.key
#指定3个文件的位置,并将将3个文件拷贝到指定位置
#olcTLSCACertificateFile,指定CA证书的位置
#olcTLSCertificateFile,指定kerberos服务器的证书
#olcTLSCertificateKeyFile,指定kerberos服务器的key
#删除TLSCACertificatePath这一行
systemctl restart slapd
注意:
1.TLSCACertificatePath,指CA证书所在目录,指定的路径下面只能放CA证书,不能放其它证书
2.TLSCACertificatePath和olcTLSCACertificateFile这两个参数冲突,二选一
8.4 配置客户端
注意:
默认,会到/etc/openldap/cacert目录下找CA证书,所以提前将CA证书拷贝过去
authconfig-tui
三、kerberos
1、kerbors身份验证过程
kerberos服务器,有一个角色叫KDC(票据分发中心),他为用户端生成好密码,并分发给用户
1.KDC知道所有人的密码,因为客户端的密码就是由KDC生成的
2.每个人都知道自己的密码
3.所有人都向KDC申请验证
客户端输入用户密码-->密码hash保存到本地,用户名以明文发给KDC,请求验证
KDC收到请求,在数据库搜索该用户,找到,就用该用户的密码hash值加密一个TGT(key1),发送给客户端。
客户端收到TGT(key1),如果上面输入的密码正确,就可以解密,验证成功,并将解开的TGT缓存到本地
客户端-->向KDC申请访问某个服务的请求,KDC将生成一个新的TGT,将新的TGT用key1加密,生成key2;再用服务的密码加密,生成key3,都发给客户端
客户端拿到这两个加密的TGT,将用自己key1解开key2;然后用解开的新TGT加密系统当前的时间戳,生成key4,然后将key4和key3一起发给要访问的服务
服务收到这两个key,用自己的密码解开key3,拿到TGT,然后解开key4,如果能解开,说明客户端可信。
2、安装kerberos
yum install -y krb5-server
#安装kerberos
3、配置
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]
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 = kerberos.example.com
admin_server = kerberos.example.com
}[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
注意:
1. kerberos.example.com这个主机名要能解析
2. 不管服务端,还是客户端,都会用到/etc/krb5.conf,这是个通用配置文件
vi /var/kerberos/krb5kdc/kdc.conf
#服务端的主配置文件
#没有特殊需求,只需要将realm改下即可
vi /var/kerberos/krb5kdc/kadm5.acl
#配置访问控制
#将域名改为自己的就好
3、初始化kerberos
kdb5_util create -s -r EXAMPLE.COM
#创建kerberos数据库
systemctl start kadmin
#kadmin,管理工具
systemctl start krb5kdc
#krb5kdc,kerberos守护进程
systemctl enable krb5kdc
systemctl enable kadmin
4、创建认证
Kerberos认证的唯一ID叫principal,由primary、instance、realm三部分组成
格式为:primary/instance@realm
principal有3种类型:user、service、host
kadmin.local
addprinc root/admin
#创建一个用户root,角色是admin
#并创建密码
addprinc demouser1
addprinc demouser2
#创建两个普通用户
addprinc -randkey host/node1.example.com
addprinc -randkey host/node2.example.com
#创建两台主机,用户和服务都需要认证主机
#-randkey,随机创建密码,因为主机的密码,我们不需要记忆
addprinc -randkey nfs/node1.example.com
#创建一个service,在node1.example.com这台主机上
#后面node1节点配置NFS,可通过kerberos安全导出
ktadd -k /tmp/node1.keytab host/node1.example.com
ktadd -k /tmp/node2.keytab host/node2.example.com
ktadd -k /tmp/nfs.keytab nfs/node1.example.com
#将key从KDC导出
listprincs
#列出客户端
quit
scp /etc/krb5.conf /tmp/node1.keytab root@node1:/tmp
scp /etc/krb5.conf /tmp/node2.keytab root@node2:/tmp
#拷贝krb5配置文件和客户端的key
5、客户端配置
5.1 装包
yum install -y pam_krb5 sssd krb5-workstation
#pam_krb5,默认,kerberos会绕过pam,安装此包,就是让使用pam的应用程序可以使用kerberos进行身份验证
#krb5-workstation,kerberos的客户端小工具,可不装
#sssd,安全服务守护进程,负责检索和缓存用户信息和身份验证信息,可选
5.2 配置文件
cp /tmp/krb5.conf /etc/
#将之前从kerberos服务器拷贝的配置文件,拷贝到/etc/
mkdir /etc/krb5.conf.d/
#因为配置文件里有includedir /etc/krb5.conf.d/,所以必须创建这个目录,否则下面的命令失败
#也可以将配置文件中的inludedir删掉
5.3 导入keytab
ktutil
rkt /tmp/node1.keytab
#读取文件
wkt /etc/krb5.keytab
#将上面读取的内容,生成一个新文件:brb5.keytab
list
#查看
quit
#退出
5.4 配置
authconfig-tui
6、配置ssh
GSSAPI:Generic Security Services Application Program Interface,GSSAPI 本身是一套 API,由 IETF 标准化。其最主要也是著名的实现是基于 Kerberos 的。一般说到 GSSAPI 都暗指 Kerberos 实现。
GSSAPI 是一套通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,降低编程难度。
vi /etc/ssh/ssh_config
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
vi /etc/ssh/sshd_config
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
systemctl reload sshd
7、测试
ssh demouser1@node1
klist
#列出连接信息
转载于:https://blog.51cto.com/gongxin12/2174978