基於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'
