基于Kerberos +LDAP的集中用户认证及授权系统搭建实验
[root@localhost openldap]# kinit ldapadmin
kinit: Cannot resolve network address for KDC in realm "EXAMPLE.COM" while getting initial credentials
问题解决:可能的方法:编辑我的/etc/hosts
文件并将以下内容添加到其中:10.0.0.1 example.com(krb5.conf里面的realm设置的域名)
1、安装ldap
yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y
yum install openldap openldap-clients openldap-servers openldap-devel compat-openldap -y
查看安装的版本:
rpm -qa openldap
2、 配置ldap
更新配置库:
rm -rf /var/lib/ldap/*
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap.ldap /var/lib/ldap
注意:在2.4以前的版本中,OpenLDAP 使用 slapd.conf 配置文件来进行服务器的配置,而2.4开始则使用 slapd.d 目录保存细分后的各种配置,这一点需要注意,其数据存储位置即目录 /etc/openldap/slapd.d 。尽管该系统的数据文件是透明格式的,还是建议使用 ldapadd, ldapdelete, ldapmodify 等命令来修改而不是直接编辑。下面所有用户的添加,配置的修改都是生成.ldif后缀的文件然后使用ldapdelete, ldapmodify等命令是其生效
默认配置文件保存在 /etc/openldap/slapd.d,将其备份:
cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
添加一些基本配置,并引入 kerberos 和 openldap 的 schema:
(ldap的schema定义了ldap目录所应遵循的结构和规则,schema给ldap服务器提供了ldap目录中的类别,属性等识别的方式,让这些可以被ldap服务器识别)
cp /usr/share/doc/krb5-server-ldap-1.9/kerberos.schema /etc/openldap/schema/
touch /etc/openldap/slapd.conf
vim /etc/openldap/slapd.conf
更新slapd.d
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap:ldap /etc/openldap/slapd.d && chmod -R 700 /etc/openldap/slapd.d
注明:/etc/openldap/slapd.conf不要添加corba.schama,否则有可能会报错
启动slapd service slapd start
删除该目录中的所有文件,否则无法启动LDAP服务
rm -f /etc/openldap/slapd.d/cn=config/cn=schema/*
或者去目录下面删除所有的重复项
3、启动服务
启动 LDAP 服务:
chkconfig --level 345 slapd on
service slapd start
启动失败,重新更新slapd.d
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap:ldap /etc/openldap/slapd.d && chmod -R 700 /etc/openldap/slapd.d
再启动service slapd start
查看状态,验证服务端口:
ps aux | grep slapd | grep -v grep
netstat -tunlp | grep :389
4、LDAP集成Kerberos
先装上kerberos服务之后再进行集成
1安装并开启ntp服务
yum intall -y ntp
service ntpd start
安装完成后,
2安装kerberos服务器
yum install -y krb5-server krb5-libs krb5-workstation krb5- krb5-auth-dialog
查看安装版本:
rpm -qa krb5-server-ldap
修改kerberos配置文件
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 = EXAMPLE.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
EXAMPLE.COM = {
kdc = 192.168.10.130:88 (Kerberos服务器ip)
admin_server = 192.168.10.130:749
default_domain = EXAMPLE.COM
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
其中,EXAMPLE.COM可任取,但需要前后统一。
vim /var/kerberos/krb5kdc/kdc.conf ,不用改
创建/初始化kerberos database
(设置数据库管理密码是12345678 EXAMPLE.COM是数据库名[-r 指定 的realm name ])
/usr/sbin/kdb5_util create -s -r EXAMPLE.COM (-s表示生成stash file 并再其中存储master server key[ krb5kdc] -r 制定一个 realm name ,当krb5。conf中定义了多个realm时才是必要的)
vim /var/kerberos/krb5kdc/kadm5.acl
启动kerberos服务
service krb5kdc start
service kadmin start
当数据库创建好了 ,/var/Kerberos/krb5kdc/目录下生成
Kadm5.acl
kdc.conf
principal
principal.adm5
principal.kadmin5.lock
principal.ok
为了使Kerberos能够绑定到OpenLDAP服务器,需要创建一个管理员用户和一个principal,并生成keytab文件
设置该文件的权限为LDAP服务运行用户可读(一般为ldap):
添加数据库管理员:
新建一管理用户 ldapadmin 密码是12345678
kadmin.local -q "addprinc ldapadmin@EXAMPLE.COM" (生成指定key的principal
新建另一个用户 ldap/c2bde55 (-randkey 是生成随机key的principal)
kadmin.local -q "addprinc -randkey ldap/c2bde55@EXAMPLE.COM"
拓展:
查看principal: listprincs
修改用户密码:change_password -pw xxx 用户
删除principal :delete_principal 用户
形成ldap.keytab文件
kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/c2bde55@EXAMPLE.COM"2
chown ldap:ldap /etc/openldap/ldap.keytab && chmod 640 /etc/openldap/ldap.keytab
使用ldapadmin用户测试:
kinit ldapadmin
重启slapd服务
service slapd restart
如果不生效,执行如下命令:
cp /etc/openldap/ldap.keytab /etc/krb5.keytab
chgrp ldap /etc/krb5.keytab && chmod 640 /etc/krb5.keytab
5、创建LDAP的数据库
进入到 /etc/openldap/slapd.d目录,查看
cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif 可以看到一些默认的配置,例如:
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
建立modify.ldif文件,内容如下:
vim /etc/openldap/slapd.d/modify.ldif
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
# Temporary lines to allow initial setup
olcRootDN: uid=ldapadmin,ou=people,dc=example,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: 12345678
dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=#1,ou=people,dc=example,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
# Everyone can read everything
olcAccess: {0}to dn.base="" by * read
# The ldapadm dn has full write access
olcAccess: {1}to * by dn="uid=ldapadmin,ou=people,dc=example,dc=com" by dn="cn=root,dc=example,dc=com" write by * read
使用下面命令导入更新配置:
ldapmodify -Y EXTERNAL -H ldapi:/// -f modify.ldif
注明:cn=root,dc=example,dc=com授权,以便整合Kerberos使用
更新配置过程中出现错误:additional info: modify/add: olcRootPW: no equality matching rule,修改modify.ldif中对应选项的add为replace即可
6、导入linux系统用户
接下来你可以从 /etc/passwd, /etc/shadow, /etc/groups 中生成 ldif 更新 ldap 数据库,这需要用到 migrationtools 工具。
安装migrationtools工具:
yum install migrationtools -y
利用迁移工具生成模板,先修改默认的配置:
# vim /usr/share/migrationtools/migrate_common.ph
#71行默认的dns域名
DEFAULT_MAIL_DOMAIN = "example.com";
#74行默认的base
DEFAULT_BASE = "dc=example,dc=com";
生成模板文件:导入的系统用户信息,变成ldif格式
/usr/share/migrationtools/migrate_base.pl > /opt/base.ldif
然后,可以修改该文件,然后执行导入命令:
ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 123456 -f /opt/base.ldif
将test用户导入到 ldap 中,可以有选择的导入指定的用户:
# 先添加用户
useradd test
# 查找系统上的 test用户,将test的用户信息导入passwd.txt
grep -E "test" /etc/passwd >/opt/passwd.txt
使用工具将passwd.txt 变成 ldif格式的文件
/usr/share/migrationtools/migrate_passwd.pl /opt/passwd.txt /opt/passwd.ldif
最后再将passwd.ldif 中的信息导入到 /etc/openslapd/slapd.d中
ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /opt/passwd.ldif
将用户组导入到 ldap 中:
# 生成用户组的 ldif文件,然后导入到
grep -E "test" /etc/group >/opt/group.txt
/usr/share/migrationtools/migrate_group.pl /opt/group.txt /opt/group.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /opt/group.ldif
7、LDAP用户增删修改
查询:查询新添加的 test 用户:
# ldapsearch -LLL -x -D ‘uid=ldapadmin,ou=people,dc=example,dc=com‘ -w 12345678 -b ‘dc=example,dc=com‘ ‘uid=test‘
修改
用户添加好以后,需要给其设定初始密码,运行命令如下:
ldappasswd -x -D ‘uid=ldapadmin,ou=people,dc=example,dc=com‘ -w 12345678 " uid=test,ou=people,dc=example,dc=com" -S
密码修改为 123456
删除(就不要删除了,否则还得新建)
删除用户
# ldapdelete -x -w 12345678 -D‘uid=ldapadmin,ou=people,dc=example,dc=com‘ "uid=test,ou=people,dc=example,dc=com"
删除组条目:
# ldapdelete -x -w 12345678 -D‘uid=ldapadmin,ou=people,dc=example,dc=com‘ "cn=test,ou=group,dc=example,dc=com"
8、客户端配置 开启另外一台虚拟机 ip是192.168.10.131
安装openldap客户端:
yum install openldap-clients -y
修改 /etc/openldap/ldap.conf 以下两个配置:
BASE dc=example,dc=com
URI ldap://192.168.10.130(服务器IP)
vim /etc/krb5.conf
然后,运行下面命令测试:
先删除 ticket
运行kdestroy会报异常
运行ldapsearch -x -b ‘dc=example,dc=com‘
(注意此时应该到服务器端关闭防火墙,不然运行这个命令会报错)
# 重新获取 ticket
kinit ldapadmin
没有报错
运行 ldapsearch -b ‘dc=example,dc=com‘ -x
# ldapwhoami -x
#直接输入 ldapsearch -x 不会报错
# ldapsearch 报错
报ldap_sasl_interactive_bind_s错误,且发现/etc/krb5.keytab不存在, 执行如下操作:cp /etc/openldap/ldap.keytab (服务器) /etc/krb5.keytab(客户端)
chgrp ldap /etc/krb5.keytab && chmod 640 /etc/krb5.keytab
要以 root 用户身份运行 slapd)
如果报错:SASL(-4): no mechanism available: No worthy mechs found
ldapsearch 加一个 -x 参数,略过sasl认证
9、Kerberos整合(共用LDAP数据库的集成方式)服务器端
1)配置
Kerberos 相关的数据也需要存储在某个数据库中,在这里我们选择使用 LDAP 作为其数据库,目的是为了数据备份的方便(只需要统一备份 LDAP 数据库即可)。如果需要使用其自身的数据库,则需要将下面的 kdb5_ldap_util 命令替换为 kdb5_util。
vim /etc/krb5.conf末尾内容如下:
[dbdefaults]
ldap_kerberos_container_dn = cn=kerberos,dc=example,dc=com
[dbmodules]
openldap_ldapconf = {
db_library = kldap
ldap_servers = ldapi://
ldap_kerberos_container_dn = cn=kerberos,dc=example,dc=com
ldap_kdc_dn = cn=root,dc=example,dc=com
ldap_kadmind_dn = cn=root,dc=example,dc=com
ldap_service_password_file = /etc/krb5.ldap
ldap_conns_per_server = 5
}
其中 ldap_kdc_dn 和 ldap_kadmind_dn 分别对应 Kerberos 访问 LDAP 数据库时的服务和管理帐号。前者需要有读权限,后者需要读写权限。此处为了简单方便统一用cn=root,dc=example,dc=com一个进行管理
说明: ldap_kerberos_container_dn must start with a ‘cn‘
2)ldap添加用户
vim user.ldif内容如下:
dn: cn=kerberos,dc=example,dc=com
cn: kerberos #这是添加的一个kerberos用户
objectClass: organizationalRole
dn: cn=root,dc=example,dc=com
cn: root #这是添加一个root用户
userPassword:: e1NTSEF9UTg2T1hqeXcreCtzck5yL1JEUzhLbTBGQ2tZeFBzWnI=
objectClass: simpleSecurityObject
objectClass: organizationalRole
执行命令:ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f user.ldif
管理员修改普通用户的密码:
ldappasswd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 "cn=root,dc=example,dc=com" -s 123456
把密码修改出123456
3)生成访问ldap的服务密码文件
因为 Kerberos 需要有 ldap_kdc_dn 和 ldap_kadmind_dn 的密码才能访问 LDAP数据库,执行如个命令:12345678
# kdb5_ldap_util -D uid=ldapadmin,ou=people,dc=example,dc=com -w 12345678 stashsrvpw -f /etc/krb5.ldap cn=root,dc=example,dc=com
这里输入的是12345678
# cat /etc/krb5.ldap
4)创建kerberos数据库 密码:12345678 123456 123456
kdb5_ldap_util -D uid=ldapadmin,ou=people,dc=example,dc=com -H ldapi:// create -r EXAMPLE.COM -s
5)重启Kerberos
service krb5kdc restart
6)测试:添加用户
# kadmin.local
kadmin.local: addprinc test
密码是123456
然后
# slapcat |grep “test”
使用Kerberos+LDAP进行认证整合,LDAP进行账号管理,Kerberos进行认证。
1)采用该 LDAP作为用户认证。
只需要对用户 (如uid=test,ou=People,dc=example,dc=com)添加 userPassword成员即可。如果通过 命令行添加,需要先准备如下文件(userPassword对应的密码为123456):
vim test.ldif
dn: uid=test,ou=People,dc=example,dc=com
changetype: modify
add: userPassword
userPassword:: e1NTSEF9Ym0rZXloV1ExalB1aWNEVU1BaHlNM0hZVHh3REIrWU4K
然后执行命令
# ldapmodify -x -D ‘cn=root,dc=example,dc=com‘ -w 123456 -h 127.0.0.1 -f test.ldif
命令执行成功后,通过
# ldapsearch -x -D ‘uid=test,ou=People,dc=example,dc=com‘ -w 123456 127.0.0.1 -b ‘ou=People,dc=example,dc=com‘
确认。
2)使用 Kerberos 认证。
需要将用户的密码域做如下修改(userPassword 对应的密码由echo -n "{SASL}test@EXAMPLE.COM" | base64生成):
dn: uid=test,ou=People,dc=example,dc=com
changetype: modify
replace: userPassword
userPassword:: e1NBU0x9dGVzdEBFWEFNUExFLkNPTQ==
执行ldapmodify -x -D ‘cn=root,dc=example,dc=com‘ -w 123456 -h 127.0.0.1 -f test.ldif应用该修改。
3)修改配置
# vim /etc/sysconfig/saslauthd
修改值
MECH=kerberos5
重启:service saslauthd restart
创建vim /etc/sasl2/slapd.conf文件
内容:pwcheck_method: saslauthd
重启:service slapd restart
4)执行命令:service saslauthd status -l查看是否报错
不报错
执行如下操作:
# kadmin.local -q "ank -clearpolicy -randkey host/c2bde55"
# kadmin.local -q "ktadd host/c2bde55"
# service saslauthd restart
# ps -aux | grep saslauthd
# kadmin.local -q ‘ank -pw 123456 test‘
配置 test 用户的密码为:123456
# testsaslauthd -u test -p 123456
报错执行以下命令
kadmin.local -q "ank -clearpolicy -randkey host/localhost"
kadmin.local -q "ktadd host/localhost"
配置 test 用户的密码为:123456 成功
至此, Kerberos 认证测试成功。
执行 ldapsearch测试LDAP 认证是否成功
ldapsearch -x -D ‘uid=test,ou=People,dc=example,dc=com‘ -w 123456 -h 127.0.0.1 -b ‘ou=People,dc=example,dc=com‘
结果成功
如果不成功执行:
kadmin.local -q "ank -clearpolicy -randkey host/localhost"
kadmin.local -q "ktadd host/localhost"
客户端验证:将服务器端的防火墙关闭
ldapsearch -x -D ‘uid=test,ou=People,dc=example,dc=com‘ -w 123456 -h 192.168.10.130(服务器ip地址) -b ‘ou=People,dc=example,dc=com‘
原文:https://www.cnblogs.com/wsnan/p/11074636.html