What is LDAP?
LDAP 全名為 Lightweight Directory Access Protocol (輕型目錄訪問協議),目前應用在很多企業裡面,作為一個中央控管的帳號管理工具,可用來根據組織架構做權限的劃分。LDAP 可以透過網路連結多台電腦,或是串接各種有支援 LDAP 的 services,統一為帳號做驗證,因此能夠提供一致的帳號管理。
安裝
在 centos 7上安裝 ldap server / clients 套件。
1
| yum install -y openldap openldap-servers openldap-clients openldap-devel
|
設定 slapd
slapd - Stand-alone LDAP Daemon,啟動後 listen LDAP connections ,處理和回應 LDAP 操作。
- OpenLDAP 在 2.3 之後不使用
/etc/openldap/slapd.conf
,但是有提供工具轉換成現在的格式,因此採取的作法是去找設定好的 slapd.conf 當做範例,之後再使用 openldap 提供的指令轉換過去。
- The slapd Configuration File
以下做法是透過設定 slapd.conf 。
設定 slapd.conf
設定 cn=admin,dc=example,dc=com
為擁有最高權限的帳號。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| database config access to attrs=userPassword by self write by anonymous auth by dn.base="cn=admin,dc=example,dc=com" write by * none access to * by self write by dn.base="cn=admin,dc=example,dc=com" manage by * read database bdb access to * by self write by dn.base="cn=admin,dc=example,dc=com" manage by * read suffix "dc=example,dc=com" rootdn "cn=admin,dc=example,dc=com" rootpw secret
|
rootpw 這個欄位可以透過 slappasswd -s secret
產出 hash 值放進設定裡。
接著套用設定。
1 2 3 4
| $ rm -rf /etc/openldap/slapd.d/* $ cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG $ slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d $ chown ldap:ldap -R /etc/openldap/slapd.d/
|
透過 systemctl
啟動 slapd。
1 2
| systemctl enable slapd systemctl start slapd
|
LDAP 帳號
LDAP 帳號具有階層性,如下圖。
最上層是 Base ,下層是 children ,也就是組織裡的中間單位,而最下層就會是使用者的名稱,由下往上追朔可以知道使用隸屬哪個單位,哪個部門,哪個組織。
常見的縮寫
String |
Attribute Type |
dn |
Distinguished Name |
cn |
Common Name |
o |
Organisational Name |
ou |
Organisational Unit Name |
dc |
Domain Component |
uid |
User Identification |
OpenLDAP with Linux
LDAP 帳號可以和 Linux 綁定,設定讓 LDAP 登入 Linux 。
User
- posixAccount 對應到
/etc/passwd
/etc/passwd |
posixAccount |
id |
uid |
password |
userPassword |
uid |
uidNumber |
gid |
gidNumber |
full_name |
gecos |
Home Directory |
homeDirectory |
Login Shell |
loginShell |
- shadowAccount 對應到
/etc/shadow
/etc/shadow |
shadowAccount |
username |
uid |
password |
userPassword |
last |
shadowLastChange |
may |
shadowMin |
must |
shadowMax |
warn |
shadowWarning |
expire |
shadowExpire |
disable |
shadowInactive |
reservered |
shadowFlag |
Group
- posixGroup 對應到
/etc/group
/etc/group |
posixGroup |
group name |
cn |
password |
userPassword |
group id |
gidNumber |
other account |
memberUid |
安裝套件
1
| $ yum install -y nscd nss-pam-ldapd
|
設定 ldap.conf
1 2 3 4 5 6 7 8
| $ vim /etc/openldap/ldap.conf URI ldap://localhost/ BASE dc=example,dc=com
|
設定 nslcd.conf
1 2 3 4 5 6
| $ vim /etc/nslcd.conf uri ldap://localhost/ base dc=example,dc=com ssl no tls_cacertdir /etc/openldap/cacerts
|
設定 PAM
1 2 3 4 5 6 7 8
| $ vim /etc/pam.d/system-auth auth sufficient pam_ldap.so use_first_pass account [default=bad success=ok user_unknown=ignore] pam_ldap.so password sufficient pam_ldap.so use_authtok session optional pam_ldap.so session optional pam_mkhomedir.so skel=/etc/skel umask=077
|
設定 nsswitch.conf
1 2 3 4 5 6 7
| $ vim /etc/nsswitch.conf passwd: files ldap shadow: files ldap group: files ldap netgroup: ldap automount: files ldap
|
設定 authconfig
1 2 3
| $ vim /etc/sysconfig/authconfig USELDAP= yes
|
設定開機時啟動
1
| $ systemctl enable nslcd
|
建立和操作 LDAP 帳號
以下是建立一個和 Linux 整合的帳號範例檔案 user.ldif
。
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
| # Domain Name dn: dc=example,dc=com dc: example objectClass: dcObject objectClass: organizationalUnit ou: example Dot com # User Organization Unit dn: ou=user,dc=example,dc=com ou: user objectClass: organizationalUnit # User: user01 dn: uid=user01,ou=user,dc=example,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount userPassword: raix cn: user01 uid: user01 sn: user01 uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/user01 loginShell: /bin/bash # Group dn: ou=group,dc=example,dc=com ou: group objectClass: organizationalUnit # User group dn: cn=uesr01,ou=group,dc=example,dc=com objectClass: posixGroup cn: user01 gidNumber: 1000 memberUid: user01
|
- 一開始先建立最上層的 Domain Name:
dc=example,dc=com
。
- 建立 user 組織單位,隸屬於
dc=example,dc=com
domain 下。
- 建立 user01 帳號名稱,屬於 user 這個組織單位下。
- 接著建立出基本的使用者群組單位 group
- 在 group 下建立出和 user01 同名的個人群組
加入帳號
使用 ldapadd
將 user.ldif
設定好的使用者帳號加入 LDAP。
1
| $ slapadd -v -l /path/to/user.ldif
|
查詢帳號
使用 ldapsearch
查詢 LDAP 資訊。
1 2 3 4 5
| $ ldapsearch -x -LLL '(uid=*)' $ ldapsearch -x -b 'dc=example,dc=com'
|
更改帳號
使用 ldapmodify
更改 LDAP 資訊。
假設要將 user01 改名成 ldapuser ,建立一個 modify_user.ldif
檔案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| dn: uid=user01,ou=user,dc=example,dc=com changetype: modrdn newrdn: uid=ldapuser deleteoldrdn: 1 dn: uid=ldapuser,ou=user,dc=example,dc=com changetype: modify replace: cn cn: ldapuser - replace: uid uid: ldapuser - replace: sn sn: ldapuser
|
接著套用這份設定檔。
1
| $ ldapmodify -x -f multichange.ldif
|
更改帳號密碼
使用 ldappasswd
更改密碼。
1 2
| $ ldappasswd -x -D "uid=user01,ou=user,dc=example,dc=com" -w old_passwd -a old_passwd \ -s new_passwd
|
設定 ppolicy
使用 slapd.conf
設定檔來設定 ppolicy。
1 2 3 4 5 6 7 8 9 10 11 12 13
| $ vim /etc/openldap/slapd.conf include /etc/openldap/schema/ppolicy.schema moduleload ppolicy.la overlay ppolicy ppolicy_default "cn=default,ou=Policies,dc=example,dc=com" ppolicy_use_lockout ppolicy_hash_cleartext
|
這樣表示預設的 policy 設定會落在 cn=default,ou=Policies,dc=example,dc=com
裡。
接著設定 ppolicy 規則。
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
| $ vim pwdpolicy.ldif dn: ou=Policies,dc=example,dc=com objectClass: organizationalUnit ou: Policies dn: cn=default,ou=Policies,dc=example,dc=com objectClass: top objectClass: device objectClass: pwdPolicy cn: default pwdAttribute: userPassword pwdMaxAge: 3888000 pwdExpireWarning: 604800 pwdInHistory: 3 pwdCheckQuality: 1 pwdMinLength: 8 pwdMaxFailure: 5 pwdLockout: TRUE pwdLockoutDuration: 86400 pwdGraceAuthNLimit: 0 pwdFailureCountInterval: 0 pwdMustChange: TRUE pwdAllowUserChange: TRUE pwdSafeModify: FALSE
|
加入 ppolicy 設定。
1
| $ ldapadd -x -D "cn=admin,dc=example,dc=com" -w secret -f pwdpolicy.ldif
|
unlock account
套用 ppolicy 之後,照設定帳號密碼嘗試錯誤達 5 次後帳號會鎖起來。
查詢被鎖起來的帳號。
1 2
| $ ldapsearch -x -D "cn=admin,dc=example,dc=com" -w secret -x -b 'dc=example,dc=com' \ "pwdAccountLockedTime=*" pwdAccountLockedTime
|
修改屬性解鎖帳號。
1 2 3
| dn: uid=user01,ou=user,dc=example,dc=com changetype: modify delete: pwdAccountLockedTime
|