「OpenLDAP」:修訂間差異
第21行: | 第21行: | ||
在OpenLDAP的設定檔中,你可以用<code>rootdn</code>與<code>rootpw</code>設定管理員帳號與密碼,但這個方式將密碼寫死在設定檔內,對於有政策需要定期更換密碼時會比較困難。 | 在OpenLDAP的設定檔中,你可以用<code>rootdn</code>與<code>rootpw</code>設定管理員帳號與密碼,但這個方式將密碼寫死在設定檔內,對於有政策需要定期更換密碼時會比較困難。 | ||
在這種情境下我們會考慮只設定<code>rootdn</code>而不設定<code>rootpw</code>,另外建立一個<code>organizationalRole</code>, | 在這種情境下我們會考慮只設定<code>rootdn</code>而不設定<code>rootpw</code>,另外建立一個物件,掛上<code>organizationalRole</code>,並賦予<code>simpleSecurityObject</code>這個類別,將密碼放在資料庫內管理: | ||
<pre> | <pre> |
於 2018年3月30日 (五) 08:58 的修訂
OpenLDAP是一套LDAP伺服器軟體。
安裝
由於OpenLDAP 2.4在2007年十月發行,至今只有一直發行minor release,所以通常都可以透過系統的套件裝到合理的版本:
# apt install slapd
另外會安裝ldap-utils
,主要是因為CLI下常用的工具不在OpenLDAP內提供,而是透過第三方的方式操作(像是ldapmodify
、ldapdelete
這些指令):
# apt 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
設定檔
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
同時我們要將範本複製過來修改(範本在/usr/share/slapd/slapd.conf
這邊),裡面有一些變數需要設定:
@BACKEND@
設為mdb
。@SUFFIX@
設為dc=example,dc=com
。@ADMIN@
設為cn=Manager,dc=example,dc=com
。
其中的dc=example,dc=com
為範例,可以依照實際組織設定。
另外因為使用mdb,需要將dbconfig
的參數都刪除掉(這些是給BerkeleyDB,也就是bdb使用)。
資料初始化設定
預設資料庫內應該是空的(可以透過ldapsearch
確認),所以會需要塞一些資訊進去。
Domain
先加入domain本身,透過ldapmodify
加入即可:
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
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
常用指令
這邊會列出日常營運常用的指令。其中ldap*
系列指令有一些共通參數:
- 表示操作使用者的
-D
,通常會使用管理員帳號操作,像是-D 'cn=Manager,dc=example,dc=com'
或是-D 'cn=admin,dc=example,dc=com'
。 - 表示base的
-b
,像是-b 'dc=example,dc=com'
。
這些參數可以透過~/.ldaprc
的設定讓使用者不需要每次都輸入:
BASE dc=example,dc=com BINDDN cn=Manager,dc=example,dc=com
另外密碼是每次都得輸入的項目:
- 表示操作使用者密碼的
-y
,後面接檔案名稱,像是-y ~/passwd-Manager.txt
。另外一種輸入密碼的方式為-W
,表示程式執行時手動輸入密碼。
新增使用者
這邊是選用inetOrgPerson
處理,要給Unix-like系統帳號使用的,可以考慮用posixAccount
。
指令:
$ ldapmodify -x -y ~/passwd-Manager.txt -f user.ldif
對應的LDIF:
dn: uid=${USERNAME},ou=People,dc=example,dc=com changetype: add objectClass: inetOrgPerson cn: ${USERNAME} gn: ${FIRSTNAME} sn: ${LASTNAME} uid: ${USERNAME} userPassword: ${PASSWORD_APR1MD5}
查詢使用者
一般情況下,不需要拉出密碼欄位時可以用anonymous的方式列出(不指定密碼相關指令時會自動變成anonymous行為),像是這樣:
$ ldapsearch -x 'uid=gslin'
如果有需要拉出密碼欄位需求時,會需要登入(這邊有透過~/.ldaprc
減少輸入的參數):
$ ldapsearch -x -y ~/passwd-Manager.txt 'uid=gslin'
刪除使用者
刪除會透過有寫入權限(刪除權限)的帳號來處理,會需要指定dn
欄位,也就是完整的名稱:
$ ldapdelete -x -y ~/passwd-Manager.txt 'uid=gslin,ou=People,dc=example,dc=com'