http://wiki.jabbercn.org/index.php/OpenLDAP2.4%E7%AE%A1%E7%90%86%E5%91%98%E6%8C%87%E5%8D%97php
#中文文檔html
http://www.openldap.org/doc/admin24/node
#官方英文文檔mysql
LDAP的英文全稱是Lightweight Directory Access Protocol,通常都簡稱爲LDAP,相似DNS的樹形結構來組織信息web
通常狀況下,LDAP須要結合Kerberos作認證,kerberos提供了一個不須要傳輸密碼的狀況下,能夠給你和你想使用的服務之間創建信任關係的服務,並且不須要你每次都輸入密碼。實現單點登錄sql
條目,也叫記錄項,是LDAP中最基本的顆粒,就像字典中的詞條,或者是數據庫中的記錄。一般對LDAP的添加、刪除、更改、檢索都是以條目爲基本對象的。數據庫
每個條目都有一個惟一的標識名(distinguished Name ,DN)編程
相似URI的功能centos
CN, OU, DC 都是 LDAP 鏈接服務器的端字符串中的區別名稱(DN, distinguished name)
LDAP鏈接服務器的鏈接字串格式爲:ldap://servername/DN
api
其中DN有三個屬性,分別是CN,OU,DC
DC (Domain Component)
OU (Organizational Unit)
CN (Common Name)
CN=Common Name 爲用戶名或服務器名,最長能夠到80個字符,能夠爲中文;
OU=Organization Unit爲組織單元,最多能夠有四級,每級最長32個字符,能夠爲中文;
O=Organization 爲組織名,能夠3—64個字符長
C=Country爲國家名,可選,爲2個字符長
例如:CN=test,OU=developer,DC=domainname,DC=com
在上面的代碼中 cn=test 可能表明一個用戶名,ou=developer 表明一個 active directory 中的組織單位。這句話的含義可能就是說明 test 這個對象處在domainname.com 域的 developer 組織單元中。
每一個條目均可以有不少屬性(Attribute),好比常見的人都有姓名、地址、電話等屬性。每一個屬性都有名稱及對應的值,屬性值能夠有單個、多個,好比你有多個郵箱。
屬性不是隨便定義的,須要符合必定的規則,而這個規則能夠經過schema制定。好比,若是一個entry沒有包含在 inetorgperson 這個 schema 中的objectClass: inetOrgPerson,那麼就不能爲它指定employeeNumber屬性,由於employeeNumber是在inetOrgPerson中定義的。
一些經常使用的別名:
dn:一條entry的惟一路徑
cn:用戶的全名
sn:用戶的姓
uid:用戶的登錄名稱
c:兩個字符的國家代碼,好比:中國,cn
o:組織名稱(公司名)
ou:部門名稱
mail:郵件地址
schema定義了哪些屬性可用,以及屬性的格式(相似mysql的約束)
好比:電話號碼,就不能輸入英文字母,不然報錯
openlda默認自帶RFC標準的schema,若是沒有特殊需求,導入便可
對象類是屬性的集合,LDAP預想了不少人員組織機構中常見的對象,並將其封裝成對象類。
好比,人員(person)含有姓(sn)、名(cn)、電話(telephoneNumber)、密碼(userPassword)等屬性,單位職工(organizationalPerson)是人員(person)的繼承類,除了上述屬性以外還含有職務(title)、郵政編碼(postalCode)、通訊地址(postalAddress)等屬性。
LDIF(LDAP Data Interchange Format,數據交換格式)是LDAP數據庫信息的一種文本格式,用於數據的導入導出,每行都是「屬性: 值」對
LDIF文件是OpenLDAP操做數據或修改配置的一切來源
yum源:
1.centos7的OS源
2.epel源
yum install -y openldap-servers openldap-clients
#openldap-servers,服務端
#openldap-clients,客戶端工具箱,包含ldapadd等工具
https://www.openldap.org/doc/admin24/slapdconf2.html
OpenLDAP 2.4有兩種配置方式:
(1)slapd.conf配置文件,這是舊版本的配置方式
(2)數據庫(cn=config),這是新的推薦的配置方式
slappasswd
#產生一個加密事後的密碼
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,而且設定密碼
#注意,密碼爲上面slappasswd命令建立的加密事後的密碼
slaptest -u
systemctl start slapd
systemctl enable slapd
ls /etc/openldap/schema/*.ldif |xargs -I {} ldapadd -Y EXTERNAL -H ldapi:/// -f {}
也就是定義整個組織的架構
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.多個dn之間必須使用一個空行來隔離
2.最後一個dn定義完成以後,不能有空行
3.dn最左邊的定義項(RDN),必須出如今屬性描述裏
ldapadd -x -D cn=Manager,dc=example,dc=com -W -f /etc/openldap/base.ldif
#使用ldapadd工具,將上面的定義,寫進數據庫
ldapsearch -x -D cn=Manager,dc=example,dc=com -w
#默認查詢全部內容
migrationtools,將本地/etc/passwd和/etc/group文件,轉換成ldif文件
yum install -y migrationtools
useradd demouser1
useradd demouser2
vi /usr/share/migrationtools/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "example.com";
$DEFAULT_BASE = "dc=example,dc=com";
$EXTENDED_SCHEMA = 1;
grep demo /etc/passwd > /tmp/users
grep demo /etc/group > /tmp/groups
cd /usr/share/migrationtools/
./migrate_passwd.pl /tmp/users /tmp/users.ldif
./migrate_group.pl /tmp/groups /tmp/groups.ldif
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
注意:
默認,會有一個Manager的管理員
ldapsearch -H ldap://172.25.254.142 -x -b "ou=People,dc=example,dc=com"
#查詢ou爲People的信息
ldapsearch -H ldap://172.25.254.142 -x -b "uid=demouser1,dc=example,dc=com"
#查詢uid爲demouser1的信息
ldappasswd -x -D "cn=Manager,dc=example,dc=com" \
-w redhat "cn=demouser1,dc=example,dc=com" -s New_PASS
#管理員修改普通用戶密碼
yum install -y httpd phpldapadmin
#phpldapadmin,ldap的web程序,在EPEL源中
vi /etc/phpldapadmin/config.php
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array('dc=example,dc=com'));
$servers->setValue('login','auth_type','session');
#取消上述行的註釋
// $servers->setValue('login','attr','uid');
#將這行註釋掉
vi /etc/httpd/conf.d/phpldapadmin.conf
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
vi /etc/openldap/base.ldif
dn: dc=example,dc=com
o: ldap
objectclass: dcObject
objectclass: organization
dc: example
#定義根節點
ldapadd -f /etc/openldap/base.ldif -x -D cn=Manager,dc=example,dc=com -W
#建立根節點
#注意,根節點必須命令行建立,web無法建立根
systemctl start httpd
systemctl enable httpd
firefox http://172.25.254.142/phpldapadmin/
username:cn=Manager,dc=example,dc=com
方法一,pam直接去找ldap服務器,這樣若是中間網絡出問題,客戶端就沒辦法登錄
方法二,在客戶端上安裝一個緩存服務(sssd或nss),pam找這個緩存服務去拿認證信息,而後緩存服務和ldap服務器通信,拿到認證信息交給pam,並緩存到本地,這樣,就能夠實現客戶端脫機狀態也可登錄。
注意:
若是要經過客戶端的sssd進行LDAP認證,必須開啓TLS加密。sssd不支持不加密的認證通道。
有兩個圖形工具,均可以:
system-config-authentication
#純圖形化
authconfig-tui
#字符圖形化
yum install -y nss-pam-ldapd
#nss-pam-ldapd,是pam模塊和nss模塊的集合
#讓PAM身份驗證服務使用 OpenLDAP 服務器中的用戶
authconfig-tui
getent passwd demouser1
id demouser1
注意,
默認ldap用戶在客戶端本地是沒辦法建立家目錄的
http://www.openldap.org/doc/admin24/tls.html#Server%20Certificates
若是要經過客戶端的sssd進行LDAP認證,必須開啓TLS加密。sssd不支持不加密的認證通道。
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
touch serial index.txt
echo 01 > serial
cd /etc/pki/tls/certs
(umask 077;openssl genrsa -out slapd.key 1024)
#建立key
openssl req -new -key slapd.key -out slapd.csr
#建立請求文件
openssl ca -in slapd.csr -out slapd.crt -days 3650
#由CA機構生成用戶證書
注意:
ldap用戶必須有讀取證書的權限
chown root.ldap slapd.*
chmod 750 slapd.*
vi /etc/openldap/slapd.d/cn\=config.ldif
olcTLSCACertificateFile: /etc/pki/CA/cacert.pem
olcTLSCertificateFile: /etc/pki/tls/certs/slapd.crt
olcTLSCertificateKeyFile: /etc/pki/tls/certs/slapd.key
#指定3個文件的位置
#刪除TLSCACertificatePath
systemctl restart slapd
注意:
1.TLSCACertificatePath,指CA證書所在目錄,指定的路徑下面只能放CA證書,不能放其它證書
2.TLSCACertificatePath和olcTLSCACertificateFile這兩個參數衝突,二選一
ldapsearch -x -D "cn=Manager,dc=example,dc=com" -W -Z
#-Z,使用加密鏈接
yum install -y sssd
#使用sssd緩存用戶信息,實現單點登錄
mkdir /etc/openldap/cacerts/
#sssd默認查找ca證書的路徑
scp root@server.example.com:/etc/pki/CA/cacert.pem /etc/openldap/cacerts/
#在server端,將CA證書拷過來
authconfig-tui
注意:
1.會更改三個配置文件:/etc/sssd/sssd.conf 、/etc/nsswithch.conf、/etc/pam.d/system-auth
2.配置結束,sssd服務自動啓動
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
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
kerberos和ldap結合,ldap存儲用戶信息,kerberos實現認證
也就是密碼要由kerberos來存儲
KDC,票據分發中心
realm,就是域名,要大寫
注意:
Kerberos 要求參與通訊的主機的時鐘同步。票據具備必定有效期,所以,若是主機的時鐘與 Kerberos 服務器的時鐘不一樣步,認證會失敗。默認設置要求時鐘的時間相差不超過 10 分鐘。
有一箇中間人叫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,若是能解開,說明客戶端可信。
yum install -y krb5-server
#安裝kerberos
通用配置文件
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
注意:
無論服務端,仍是客戶端,都會用到/etc/krb5.conf
kdb5_util create -s -r EXAMPLE.COM
#建立kerberos的數據庫,並設置數據庫密碼
#-s,表示將密碼保存爲文件,不用每次啓服務時,須要輸入密碼
systemctl start kadmin
systemctl start krb5kdc
systemctl enable krb5kdc
systemctl enable kadmin
Kerberos認證的惟一ID叫principal,由primary、instance、realm三部分組成
kadmin.local
?
#查看幫助
addprinc root/admin
#建立一個用戶root,角色是admin
#並建立密碼
addprinc demouser1
addprinc demouser2
#設置兩個用戶的密碼
#注意,這兩個用戶信息存在LDAP中
addprinc -randkey host/node2.example.com
#建立主機,即kerberos客戶端主機
#-randkey,主機密碼隨機設置
listprincs
#列出建立的princ
quit
SSSD在LDAP目錄中查找用戶,而後聯繫Kerberos KDC進行身份驗證並獲取票證。
這麼多配置文件,很容易出錯,因此建議使用工具,進行配置:
authconfig,命令行
authconfig-tui,文本圖形
authconfig-gtk,圖形
yum install -y krb5-workstation sssd pam_krb5
#krb5-workstation,kerberos客戶端
#sssd,安全服務守護進程,負責檢索和緩存用戶信息和身份驗證信息
#pam_krb5,默認,kerberos會繞過pam,安裝此包,就是讓使用pam的應用程序可使用kerberos進行身份驗證
scp root@server.example.com:/etc/krb5.conf node1:/etc
#拷貝kerberos服務器的/etc/krb5.conf過來
mkdir /etc/krb5.conf.d/
#由於配置文件裏有includedir /etc/krb5.conf.d/,因此必須建立這個目錄,不然下面的命令失敗
#也能夠將配置文件中的inludedir刪掉
keytab必須爲:/etc/krb5.keytab
kadmin
#遠程連到KDC服務器
#鏈接信息,在配置文件中
ktadd host/node1.example.com
#根據配置文件,鏈接到kerberos服務器,將主機的key下載到本地
authconfig-tui
SSH登錄,經過kerberos認證,無需輸入密碼
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 restart sshd
ssh demouser1@node1
#不須要輸入密碼就對了
klist
#列出票據
NFS默認不須要身份驗證,帶來不少安全問題,經過kerberos來保護NFS的安全
前提:
NFS服務端和客戶端先配置好kerberos驗證
kadmin -p root/admin
#使用root登錄到KDC
addprinc -randkey host/server.example.com
addprinc -randkey host/client.example.com
#建立nfs服務器和客戶端的host principal
addprinc -randkey nfs/server.example.com
addprinc -randkey nfs/client.example.com
#建立nfs服務端和客戶端的service principal
ktadd host/server.example.com
ktadd nfs/server.example.com
#默認會將兩個principal,以追加的方式保存到本地的/etc/krb5.keytab
q
yum install krb5-workstation
yum install nfs-utils
mkdir -p /share
chown demouser1.demouser1 /share
vi /etc/exports
/share *(rw,sec=krb5p)
vi /etc/sysconfig/nfs
RPCNFSDARGS="-V 4.2"
#開啓NFS4.2版本
#注意,在centos7.1以後,須要重啓系統才能生效
systemctl start nfs-server
systemctl start nfs-secure-server
#注意,centos7.1以後,再也不使用nfs-secure-server服務,改用rpc-gssd
kadmin -p root/admin
ktadd host/client.example.com
ktadd nfs/client.example.com
q
systemctl restart nfs-secure
mkdir /mnt/share
showmout -e server.example.com
mount -o sec=krb5p,v4.2 server.example.com:/share /mnt/share