LDAP 介紹與架設

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 帳號具有階層性,如下圖。

LDAP Hierarchy

最上層是 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
# add at the last line
# LDAP server's URI
URI ldap://localhost/
# specify Suffix
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
# add if you need ( create home directory automatically if it's none )
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
  1. 一開始先建立最上層的 Domain Name: dc=example,dc=com
  2. 建立 user 組織單位,隸屬於 dc=example,dc=com domain 下。
  3. 建立 user01 帳號名稱,屬於 user 這個組織單位下。
  4. 接著建立出基本的使用者群組單位 group
  5. group 下建立出和 user01 同名的個人群組

加入帳號

使用 ldapadduser.ldif 設定好的使用者帳號加入 LDAP。

1
$ slapadd -v -l /path/to/user.ldif

查詢帳號

使用 ldapsearch 查詢 LDAP 資訊。

1
2
3
4
5
# Search all users
$ ldapsearch -x -LLL '(uid=*)'
# Search domain subtree
$ 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
#-- Load schema
include /etc/openldap/schema/ppolicy.schema
#-- Load module
moduleload ppolicy.la
#-- Load overlay
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
# Creates a Policies OU (Organizational Unit)
dn: ou=Policies,dc=example,dc=com
objectClass: organizationalUnit
ou: Policies
# Creates a Policy object in Policies OU (Organizational Unit)
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