「OpenLDAP」:修訂間差異

出自Gea-Suan Lin's Wiki
跳至導覽 跳至搜尋
本頁面具有訪問限制。如果您看見此訊息,這代表您沒有訪問本頁面的權限。
行 104: 行 104:


== 常用指令 ==
== 常用指令 ==
這邊會列出日常營運常用的指令。其中<code>ldap*</code>系列指令有一些共通參數:
{{Main|LDAP}}
 
* 表示操作使用者的<code>-D</code>,通常會使用管理員帳號操作,像是<code>-D 'cn=Manager,dc=example,dc=com'</code>或是<code>-D 'cn=admin,dc=example,dc=com'</code>。
* 表示base的<code>-b</code>,像是<code>-b 'dc=example,dc=com'</code>。
 
這些參數可以透過<code>~/.ldaprc</code>的設定讓使用者不需要每次都輸入:
 
<pre>
BASE dc=example,dc=com
BINDDN cn=Manager,dc=example,dc=com
</pre>
 
另外密碼是每次都得輸入的項目:
 
* 表示操作使用者密碼的<code>-y</code>,後面接檔案名稱,像是<code>-y ~/passwd-Manager.txt</code>。另外一種輸入密碼的方式為<code>-W</code>,表示程式執行時手動輸入密碼。
 
=== 新增使用者 ===
這邊是選用<code>inetOrgPerson</code>處理,要給Unix-like系統帳號使用的,可以考慮用<code>posixAccount</code>。
 
指令:
 
<syntaxhighlight lang="shell-session">
$ ldapmodify -x -y ~/passwd-Manager.txt -f user.ldif
</syntaxhighlight>
 
對應的LDIF:
 
<pre>
dn: uid=${USERNAME},ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
cn: ${USERNAME}
gn: ${FIRSTNAME}
sn: ${LASTNAME}
uid: ${USERNAME}
userPassword: ${PASSWORD_APR1MD5}
</pre>
 
上面的行為可以寫一隻script使用(需要自行修改<code>BASEDN</code>):
 
<syntaxhighlight lang="bash">
#!/bin/bash
 
work() {
   local BASEDN
   BASEDN="dc=example,dc=com"
 
   local MAILBASE
   MAILBASE="example.com"
 
   local BASEDIR
   BASEDIR=$(dirname "${BASE_SOURCE}")
 
   local DISPLAYNAME
   local FIRSTNAME
   local LASTNAME
   local PASSWORD
   local PASSWORD_APR1MD5
   local USERNAME
 
   read -p 'Username: ' -r USERNAME
   read -p 'Display name: ' -r DISPLAYNAME
   read -p 'First name: ' -r FIRSTNAME
   read -p 'Last name: ' -r LASTNAME
 
   stty -echo
   read -p 'Password: ' -r PASSWORD
   stty echo
   PASSWORD_APR1MD5=$(slappasswd -h '{CRYPT}' -c '$1$%.8s' -s "${PASSWORD}")
 
   cat <<EOF | ldapmodify -x -y "${BASEDIR}"/passwd-Manager.txt
dn: uid=${USERNAME},ou=People,${BASEDN}
changetype: add
objectClass: inetOrgPerson
cn: ${USERNAME}
displayName: ${DISPLAYNAME}
gn: ${FIRSTNAME}
mail: ${USERNAME}@${MAILBASE}
sn: ${LASTNAME}
uid: ${USERNAME}
userPassword: ${PASSWORD_APR1MD5}
EOF
}
 
work
</syntaxhighlight>
 
=== 查詢使用者 ===
一般情況下,不需要拉出密碼欄位時可以用anonymous的方式列出(不指定密碼相關指令時會自動變成anonymous行為),像是這樣:
 
<syntaxhighlight lang="shell-session">
$ ldapsearch -x 'uid=gslin'
</syntaxhighlight>
 
如果有需要拉出密碼欄位需求時,會需要登入(這邊有透過<code>~/.ldaprc</code>減少輸入的參數):
 
<syntaxhighlight lang="shell-session">
$ ldapsearch -x -y ~/passwd-Manager.txt 'uid=gslin'
</syntaxhighlight>
 
=== 刪除使用者 ===
刪除會透過有寫入權限(刪除權限)的帳號來處理,會需要指定<code>dn</code>欄位,也就是完整的名稱:
 
<syntaxhighlight lang="shell-session">
$ ldapdelete -x -y ~/passwd-Manager.txt 'uid=gslin,ou=People,dc=example,dc=com'
</syntaxhighlight>


== 參考資料 ==
== 參考資料 ==

於 2018年4月16日 (一) 04:14 的修訂

OpenLDAP是一套LDAP伺服器軟體。

安裝

由於OpenLDAP 2.4在2007年十月發行,至今只有一直發行minor release,所以通常都可以透過系統的套件裝到合理的版本:

# apt install slapd

另外會安裝ldap-utils,主要是因為CLI下常用的工具不在OpenLDAP內提供,而是透過第三方的方式操作(像是ldapmodifyldapdelete這些指令):

# apt install ldap-utils

基本概念

這邊會提到一些OpenLDAP與一般LDAP比較不一樣的地方,以及一些值得提出來的基本概念。

管理員帳號名稱

在OpenLDAP的文件的範例中,都是以cn=Manager當作是管理權限帳號。但透過網路搜尋可以看到很多人是使用cn=admin,甚至是cn=root的帳號。在這份文件裡面我們採用了OpenLDAP文件範例的慣例來設計。

管理員帳號本體

在OpenLDAP的設定檔中,你可以用rootdnrootpw設定管理員帳號與密碼,但這個方式將密碼寫死在設定檔內,對於有政策需要定期更換密碼時會比較困難。

在這種情境下我們會考慮只設定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,需要將dbconfig的參數都刪除掉(這些是給BerkeleyDB,也就是bdb使用)。

密碼設定

網路上大多數的文章(過舊的文章)都會推薦使用{SSHA},但這只是salted-SHA1,計算速度很快。目前OpenLDAP內建的演算法都沒有足夠的抵抗能力,需要透過外部支援降低被攻擊的可能性。

考慮到支援度,APR1-MD5是還算堪用的演算法,可以讓攻擊的計算速度慢一千倍(相比於SSHA)[1],所以透過以下的設定要求透過系統底層的crypt()使用APR1-MD5:

password-hash   "{CRYPT}"
password-crypt-salt-format "$1$%.8s"

如果支援度沒有問題,可以考慮Blowfish的方式,對於暴力計算的抵抗力會更好。

資料初始化設定

預設資料庫內應該是空的(可以透過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

常用指令

參考資料

外部連結