Tobey's Notes

ldap和kerberos安装

字数统计: 2.9k阅读时长: 14 min
2018/10/17 Share

OpenLdap搭建

LDAP是一款轻量级目录访问协议(Lightweight Directory Access Protocol,简称LDAP),属于开源集中账号管理架构的实现

1、OpenLdap简介

    OpenLDAP目录中的信息是以树状的层次结构来存储数据((这很类同于DNS),最顶
层即根部称作“基准DN”,形如“dc=mydomain,dc=org”或者“o=mydomain.org”,前一种方式更为灵活也是Windows AD中使用的方式。

    在根目录的下面有很多的文件和目录,为了把这些大量的数据从逻辑上分开,OpenLDAP像其它的目录服务协议一样使用OU(Organization Unit,组织单元),可以用来表示公司内部机构,如部门等,也可以用来表示设备、人员等。同时OU还可以有子OU,用来表示更为细致的分类。

    OpenLDAP中每一条记录都有一个唯一的区别于其它记录的名字DN(Distinguished Name),其处在“叶子”位置的部分称作RDN(用户条目的相对标识名)。如dn:cn=tom,ou=animals,dc=ilanni,dc=com中cn即为RDN,而RDN在一个OU中必须是唯一的。

image

其中o=dlw.com是dc=dlw,dc=com的简写

部署的组织架构:

1
2
3
4
5
dn: dc=qbos,dc=com                      # 公司
dn: ou=krb5,dc=qbos,dc=com # 部门
dn: cn=admin,dc=qbos,dc=com # LDAP管理用户
dn: cn=kdc-srv,ou=krb5,dc=qbos,dc=com # kdc连接ldap用户
dn: cn=adm-srv,ou=krb5,dc=qbos,dc=com # kadmin连接ldap用户

1、安装软件包
1
# yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap -y
2、初始化配置
1
2
# cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

生产ldap服务管理用户密码

1
2
# slappasswd -s 123123
{SSHA}FGTQwm900Ac+FPPTpzB9R1ZHNVY/MOXP # hash加密后的值,直接复制到配置文件中使用

修改slap.conf,支持kerberos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# vim /etc/openldap/slapd.conf
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/nis.schema
# kerberos使用的schema文件
include /etc/openldap/schema/kerberos.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
database bdb
# 组织后缀
suffix "dc=qbos,dc=com"
# 管理员账号
rootdn "cn=admin,dc=qbos,dc=com"
# 管理员密码(slappasswd生产的密码)
rootpw {SSHA}FslGWaaPsw9XcM7Sr3gc24lFQQe1NxRA
directory /var/lib/ldap
# ldap数据库索引字段
index krbPrincipalName eq,pres,sub
index objectClass eq,pres
loglevel 256

# acl规则
access to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=qbos,dc=com" write
by anonymous auth
by self write
by * none
access to dn.subtree="ou=krb5,dc=qbos,dc=com"
by dn="cn=admin,dc=qbos,dc=com" write
# kerberos服务连接ladp的账号
by dn="cn=adm-srv,ou=krb5,dc=qbos,dc=com" write
# kerberos服务连接ladp的账号
by dn="cn=kdc-srv,ou=krb5,dc=qbos,dc=com" read
by * none
access to attrs=loginShell
by dn="cn=admin,dc=qbos,dc=com" write
by self write
by * none
access to dn.base=""
by * read
access to *
by self write
by * read
access to *
by dn="cn=admin,dc=qbos,dc=com" write
by users read
by * none
access to *
by dn.exact="cn=admin,dc=qbos,dc=com" read
by * none

3、初始化ldap配置

    官方 对于 OpenLDAP 2.4 ,不推荐使用 slapd.conf 作为配置文件。从这个版本开始所有配置数据都保存在 /etc/openldap/slapd.d/中,在slapd.d生成配置文件,但是还是能使用slapd.conf修改配置的,每次修改后都要执行slaptest -f 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# rm -rf /etc/openldap/slapd.d/*

修改文件权限
# chown ldap.ldap -R /var/lib/ldap/

每次修改完sldp.conf配置文件都要删除重新执行
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
报错忽略
> 5b99e55c bdb_db_open: database "dc=qbos,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).
> 5b99e55c backend_startup_one (type=bdb, suffix="dc=qbos,dc=com"): bi_db_open failed! (2)
> slap_startup failed (test would succeed using the -u switch)

# chown ldap.ldap -R /etc/openldap/slapd.d/

启动sldap服务
# /etc/init.d/slapd start

初始化ldap库,编写kerberos.ldif文件
# vim /tmp/kerberos.ldif
dn: dc=qbos, dc=com
dc: qbos
objectClass: top
objectClass: dcObject
objectClass: organization
o: qbos.com

dn: ou=krb5, dc=qbos,dc=com
ou: krb5
objectClass: organizationalUnit

dn: cn=kdc-srv,ou=krb5,dc=qbos,dc=com
cn: kdc-srv
objectClass: simpleSecurityObject
objectClass: organizationalRole
userPassword: {SSHA}o4pwTcWIoY/CX8mx7gUyy0PRdwfKilAx

dn: cn=adm-srv,ou=krb5,dc=qbos,dc=com
cn: adm-srv
objectClass: simpleSecurityObject
objectClass: organizationalRole
userPassword: {SSHA}o4pwTcWIoY/CX8mx7gUyy0PRdwfKilAx

注:userPassword中的密码是slappasswd生成的

导入kerberos.ldif到ldap库中
# ldapadd -x -D 'cn=admin,dc=qbos,dc=com' -w 123123 -h 127.0.0.1 -f /tmp/kerberos.ldif

注:userPassword中的密码是slappasswd生成的, -w 是'cn=admin,dc=qbos,dc=com'真实的用户密码

查看ldap数据库信息
# ldapsearch -x -D 'cn=admin,dc=qbos,dc=com' -w 123123 -b 'cn=adm-srv,ou=krb5,dc=qbos,dc=com'

搭建kerberos服务端

Kerberos 服务是单点登录系统,这意味着您对于每个会话只需向服务进行一次自我验证,即可自动保护该会话过程中所有后续事务的安全。服务对您进行验证后,即无需在每次使用基于 Kerberos 的服务时进行验证 官方文档

image

1、安装过程
1
# yum install krb5-server* krb5-auth-dialog* krb5-libs* krb5-workstation* -y
2、修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
编辑krb5.conf
# vim /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 = QBOS.COM # realm要与ldap DC保持一致
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h # 票据生命周期
renew_lifetime = 7d
forwardable = false

[realms]
QBOS.COM = {
kdc = 127.0.0.1:88 # kdc 服务
kadmin_server = 127.0.0.1:749 # 远程管理kdc服务
database_module = openldap_ldapconf # 数据信息保存
}

[domain_realm]
.qbos.com = QBOS.COM
qbos.com = QBOS.COM

[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf # 密钥分发中心配置文件


[dbdefaults]
ldap_kerberos_container_dn = ou=krb5,dc=qbos,dc=com

[dbmodules]
openldap_ldapconf = {
db_library = kldap
ldap_kdc_dn = "cn=kdc-srv,ou=krb5,dc=qbos,dc=com" # kdc-srv访问ldap用户
ldap_kadmind_dn = "cn=adm-srv,ou=krb5,dc=qbos,dc=com" # adm-srv kadmin访问ldap用户
ldap_service_password_file = /var/kerberos/krb5kdc/service.keyfile # 用户密码文件,使用kdb5_ldap_util生成
ldap_servers = ldap://127.0.0.1 # ldap服务
ldap_conns_per_server = 5
}

# mkdir /var/kerberos/krb5kdc/ssl/
# vim /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88

[realms]
QBOS.COM = {
pkinit_identity = FILE:/var/kerberos/krb5kdc/ssl/kdc.pem,/var/kerberos/krb5kdc/ssl/kdckey.pem # kdc服务X.509格式的证书
pkinit_anchors = FILE:/var/kerberos/krb5kdc/ssl/cacert.pem # 指定KDC信任签署客户端证书的可信根证书(CA)的位置
acl_file = /var/kerberos/krb5kdc/kadm5.acl # 文件应包含所有获许管理 KDC 的主体名称
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab # kadmind主体的Keytab :kadmin / fqdn,changepw / fqdn和kadmin / changepw
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
}

配置文件详解: https://docs.oracle.com/cd/E86824_01/html/E54775/kdc.conf-4.html
如果使用pkinit配置,生产principal时要添加 +requires_preauth

向数据库添加管理主体
可以根据需要添加任意数目的 admin 主体。至少必须添加一个 admin 主体,这样才能完成 KDC 配置过程

1
2
3
4
# kadmin.local: addprinc kadmin/admin
Enter password for principal kadmin/admin@QBOS.COM:<Type the password>
Re-enter password for principal kadmin/admin@QBOS.COM: <Type it again>
Principal "kadmin/admin@QBOS.COM" created.

为 kadmind 服务创建一个密钥表文件
此命令序列创建一个包含 kadmin/ 和 changepw/ 的主体项的特殊密钥表文件。kadmind 服务需要使用这些主体,要更改口令也需要使用这些主体

1
2
3
4
# kadmin.local: ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/admin@QBOS.COM
# kadmin.local: ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/changepw@QBOS.COM

参考文件:https://docs.oracle.com/cd/E24847_01/html/819-7061/setup-9.html

3、生成访问ldap的服务密码文件
1
2
3
4
# kdb5_ldap_util -D "cn=admin,dc=qbos,dc=com"  -w 123123 stashsrvpw -f /var/kerberos/krb5kdc/service.keyfile  "cn=kdc-srv,ou=krb5,dc=qbos,dc=com"
# kdb5_ldap_util -D "cn=admin,dc=qbos,dc=com" -w 123123 stashsrvpw -f /var/kerberos/krb5kdc/service.keyfile "cn=adm-srv,ou=krb5,dc=qbos,dc=com"

注:cn=admin,dc=qbos,dc=com 为ldap管理员与密码
4、创建kerberos数据库
1
2
3
# kdb5_ldap_util -D "cn=admin,dc=qbos,dc=com" -H ldap://  create  -r QBOS.COM 

注:输入cn=admin,dc=qbos,dc=com密码以及创建KDC database master key密码
5、启动kerberos服务
1
2
3
4
5
6
7
8
9
# /etc/init.d/krb5kdc start
# /etc/init.d/kadmin start
# netstat -tnlp|egrep 'kadmin|krb5kdc'
tcp 0 0 0.0.0.0:749 0.0.0.0:* LISTEN 11829/kadmind
tcp 0 0 0.0.0.0:464 0.0.0.0:* LISTEN 11829/kadmind
tcp 0 0 0.0.0.0:88 0.0.0.0:* LISTEN 11454/krb5kdc
tcp 0 0 :::749 :::* LISTEN 11829/kadmind
tcp 0 0 :::464 :::* LISTEN 11829/kadmind
tcp 0 0 :::88 :::* LISTEN 11454/krb5kdc
6、测试创建kerberos用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# kadmin.local
> Authenticating as principal root/admin@QBOS.COM with password.
> kadmin.local: addprinc admintest
> WARNING: no policy specified for admintest@QBOS.COM; defaulting to no policy
> Enter password for principal "admintest@QBOS.COM":
> Re-enter password for principal "admintest@QBOS.COM":
> Principal "admintest@QBOS.COM" created.
> kadmin.local: q

查看创建的用户是否写入ldap库中
# slapcat |grep admintest
5b9a34c3 bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
dn: krbPrincipalName=admintest@QBOS.COM,cn=QBOS.COM,ou=krb5,dc=qbos,dc=com
krbPrincipalName: admintest@QBOS.COM

验证用户登录
kinit admintest
Password for admintest@QBOS.COM:

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admintest@QBOS.COM

Valid starting Expires Service principal
09/13/18 17:58:46 09/14/18 17:58:46 krbtgt/QBOS.COM@QBOS.COM
renew until 09/13/18 17:58:46
7、问题
1
2
3
4
5
krb5kdc: Can not fetch master key (error: ?????????). - while fetching master key K/M for realm QBOS.COM

原因:未初始化kerberos数据库
解决:kdb5_ldap_util -D "cn=admin,dc=qbos,dc=com" -H ldap:// create -r QBOS.COM (数据库为LDAP)
如果不是LDAP,使用 /usr/sbin/kdb5_util create -s

搭建kerberos客户端

1、安装kerberos客户端
1
# yum install -y krb5-libs krb5-workstation krb5-devel
2、修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
修改kerberos配置文件
# vim /etc/krb5.conf
[libdefaults]
default_realm = QBOS.COM #默认域
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = false

[realms]
QBOS.COM = {
kdc = kdc1.qbos.com:88 # kdc配置
kdc = kdc2.qbos.com:88
kdc = kdc3.qbos.com:88
admin_server = kadmin.qbos.com:749 # kadmin配置
}

[domain_realm]
.qbos.com = QBOS.COM
qbos.com = QBOS.COM

修改sshd_conf,使其支持kerberos认证
# vim /etc/ssh/sshd_config
添加
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

KerberosAuthentication yes
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes

# /etc/init.d/sshd restart
3、生成keytab密钥表

    keytab密钥表是可以免密登录,如果用户有独立的密钥表是可以免密登录,提供服务的每台主机都必须包含称为 keytab(密钥表)的本地文件。
     要将服务密钥添加至密钥表文件,应使用 kadmin 的 ktadd 命令,将相应的服务主体添加至主机的密钥表文件。由于要将服务主体添加至密钥表文件,因此该主体必须已存在于 Kerberos 数据库中,以便 kadmin 可验证其存在
创建主机密钥表

1
2
3
4
5
6
7
8
创建主机kerberos主体
# kadmin.local -p kadmin/admin -q "addprinc -policy host_policy -randkey host/$HOSTNAME@QBOS.COM"

创建主机keytab密钥表
# kadmin.local -p kadmin/admin -q "ktadd -k /root/krb5.keytab.$IP host/$HOSTNAME@QBOS.COM"

将主机的keytab密钥表拷贝到客户端/etc/
# scp /root/krb5.keytab.$IP $HOSTNAME:/etc/
4、kerberos用户授权主机

用户配置文件: .k5login - 用于主机访问的Kerberos V5 acl文件,该文件驻留在用户的主目录,包含了Kerberos主体列表

1
2
3
4
5
在客户端主机172.28.0.106的root家目录下修改.k5login,授权给用户admintest

# vim ~/.k5login
...
admintest@QBOS.COM

admintest通过kinit获取到票据后就可以ssh root@172.28.0.106

注:-policy为指定密码安全策略,可以使用 list_policies 查看密码策略列表,使用get_policy查看策略详情

kerberos双活与主从

kerberos 双主+主从实际上是通知ldap实现的,只需实现LDAP的双主+主从

1、LDAP双主+主从部署

LDAP双主配置文档
LDAP主从配置文档

2、kerberos服务端配置

按照 搭建kerberos客户端 安装kerberos客户端,将 另一台 kerberos服务端配置CA、key、.k5.QBOS.COM 拷贝至相应位置即可

参考文档:

https://www.ilanni.com/?p=13775
https://www.cnblogs.com/zhaojonjon/p/5967281.html
https://www.cnblogs.com/zihanxing/p/7001201.html
https://docs.oracle.com/cd/E26926_01/html/E25889/refer-15.html
http://k5wiki.kerberos.org/wiki/LDAP_on_Kerberos

kerberos主从
https://help.ubuntu.com/lts/serverguide/kerberos-ldap.html.en

kerberos x.509证书
https://web.mit.edu/kerberos/krb5-latest/doc/admin/pkinit.html

ssh conf配置
https://www.cnblogs.com/Rozdy/p/4642928.html

CATALOG
  1. 1. OpenLdap搭建
    1. 1.1. 1、OpenLdap简介
    2. 1.2. 1、安装软件包
    3. 1.3. 2、初始化配置
    4. 1.4. 3、初始化ldap配置
  • 搭建kerberos服务端
    1. 0.1. 1、安装过程
    2. 0.2. 2、修改配置文件
    3. 0.3. 3、生成访问ldap的服务密码文件
    4. 0.4. 4、创建kerberos数据库
    5. 0.5. 5、启动kerberos服务
    6. 0.6. 6、测试创建kerberos用户
    7. 0.7. 7、问题
  • 1. 搭建kerberos客户端
    1. 1.1. 1、安装kerberos客户端
    2. 1.2. 2、修改配置文件
    3. 1.3. 3、生成keytab密钥表
    4. 1.4. 4、kerberos用户授权主机
  • 2. kerberos双活与主从
    1. 2.1. 1、LDAP双主+主从部署
    2. 2.2. 2、kerberos服务端配置
    3. 2.3. 参考文档: