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

常用指令

参考资料

外部链接