OpenLDAP
OpenLDAP是一套LDAP伺服器軟件。
安裝
由於OpenLDAP 2.4在2007年十月發行,至今只有一直發行minor release,所以通常都可以透過系統的套件裝到合理的版本:
sudo apt -y install slapd
另外會安裝ldap-utils
,主要是因為CLI下常用的工具不在OpenLDAP內提供,而是透過第三方的方式操作(像是ldapmodify
、ldapdelete
這些指令):
sudo apt -y install ldap-utils
基本概念
這邊會提到一些OpenLDAP與一般LDAP比較不一樣的地方,以及一些值得提出來的基本概念。
管理員帳號名稱
在OpenLDAP的文件的範例中,都是以cn=Manager
當作是管理權限帳號。但透過網絡搜尋可以看到很多人是使用cn=admin
,甚至是cn=root
的帳號。在這份文件裏面我們採用了OpenLDAP文件範例的慣例來設計。
管理員帳號本體
在OpenLDAP的設定檔中,你可以用rootdn
與rootpw
設定管理員帳號與密碼,但這個方式將密碼寫死在設定檔內,對於有政策需要定期更換密碼時會比較困難。
在這種情境下我們會考慮只設定rootdn
而不設定rootpw
,另外建立一個物件,掛上organizationalRole
,並賦予simpleSecurityObject
這個類別,將密碼放在資料庫內管理:
dn: cn=Manager,dc=example,dc=com objectClass: organizationalRole objectClass: simpleSecurityObject cn: Manager userPassword: {CRYPT}$1$xxxxxxxx$yyyyyyyyyyyyyyyyyyyyyy
設定檔
/etc/default/slapd
Ubuntu 16.04內的版本預設會使用目錄結構設定檔(預設讀取/etc/ldap/slapd.d/
整個目錄),但這跟網絡上一般使用單檔設定不同(通常會是/etc/ldap/slapd.conf
),所以我們要告知slapd使用檔案設定檔。
這要修改/etc/default/slapd
的內容,將SLAPD_CONF
參數從空的值改為/etc/ldap/slapd.conf
:
# Default location of the slapd.conf file or slapd.d cn=config directory. If
# empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to
# /etc/ldap/slapd.conf).
SLAPD_CONF=/etc/ldap/slapd.conf
/etc/ldap/slapd.conf
我們要將slapd.conf
的範本複製到/etc/ldap/slapd.conf
之後修改(範本在/usr/share/slapd/slapd.conf
這邊),裏面有一些變數需要設定:
@BACKEND@
設為mdb
。@SUFFIX@
設為dc=example,dc=com
。@ADMIN@
設為cn=Manager,dc=example,dc=com
。
其中的dc=example,dc=com
為範例,可以依照實際組織設定。
mdb
另外因為使用mdb,需要將bdb(指BerkeleyDB)相關的dbconfig
的參數都刪除掉。
密碼設定
網絡上大多數的文章(過舊的文章)都會推薦使用{SSHA}
,但這只是salted-SHA1,計算速度很快。目前OpenLDAP內建的演算法都沒有足夠的抵抗能力,需要透過外部支援降低被攻擊的可能性。
考慮到支援度,APR1-MD5是還算堪用的演算法,可以讓攻擊的計算速度慢一千倍(相比於SSHA)[1],所以透過以下的設定要求透過系統底層的crypt()
使用APR1-MD5:
password-hash "{CRYPT}" password-crypt-salt-format "$1$%.8s"
如果支援度沒有問題,可以考慮bcrypt的方式($2$
),對於暴力計算的抵抗力會更好。
rootdn與rootpw
設定rootdn
的dn會有完整的管理權限,不需要另外使用ACL授權。而rootdn
的密碼剛開始需要用rootpw
設定,可以用下面的指令產生rootpw
:
slappasswd -h '{CRYPT}' -c '$1$%.8s'
然後把設定寫入/etc/ldap/slapd.conf
內:
rootdn "cn=Manager,dc=example,dc=com" rootpw "{CRYPT}$1$xxxxxxxx$yyyyyyyyyyyyyyyyyyyyyy"
資料初始化設定
預設資料庫內應該是空的(可以透過ldapsearch -x
的指令確認),所以會需要塞一些資訊進去。資料初始化會透過ldapmodify
指令進行,這會需要安裝前面提到的ldap-utils
。
Domain
先加入domain本身,檔案寫到init-domain.ldif
,然後透過ldapmodify -x -D 'cn=Manager,dc=example,dc=com' -W -f init-domain.ldif
加入即可:(需要修改dn
與dc
的值)
dn: dc=example,dc=com changetype: add objectclass: top objectclass: domain dc: example
People
再來是產生ou=People,dc=example,dc=com
:
dn: ou=People,dc=example,dc=com changetype: add objectClass: organizationalUnit ou: People
Groups
再來是產生ou=Groups,dc=example,dc=com
:
dn: ou=Groups,dc=example,dc=com changetype: add objectClass: organizationalUnit ou: Groups
Manager
這是管理員的身份,可以不在資料庫內設定,而是透過slapd.conf
內的ACL與rootpw
設定。
dn: cn=Manager,dc=example,dc=com changetype: add objectClass: organizationalRole objectClass: simpleSecurityObject cn: Manager userPassword: {CRYPT}$1$xxxxxxxx$yyyyyyyyyyyyyyyyyyyy
增加完成後可以拿掉/etc/ldap/slapd.conf
內的rootpw
設定。
Replication
這邊先放設定:
# Replication readonly on syncrepl rid=100 binddn="cn=syncuser,dc=example,dc=com" bindmethod=simple credentials="password" interval=00:00:01:00 provider=ldaps://ldap-master.example.com:636 retry="60 +" searchbase="dc=example,dc=com" tls_cacert=/etc/ssl/certs/ca-certificates.crt type=refreshAndPersist
這邊ldaps
的部分表示走SSL,可以用Let's Encrypt的憑證會比較容易處理(不需要另外開CA授權)。
常用指令
相關連結
參考資料
- ↑ 8x Nvidia GTX 1080 Hashcat Benchmarks. [2018-03-30].