OpenLDAP:修订间差异

来自Gea-Suan Lin's Wiki
跳到导航 跳到搜索
此页面具有访问限制。如果您看见此消息,则说明您没有权限访问此页面。
第141行: 第141行:
userPassword: ${PASSWORD_APR1MD5}
userPassword: ${PASSWORD_APR1MD5}
</pre>
</pre>
上面的行為可以寫一隻script使用:
<syntaxhighlight lang="bash">
#!/bin/bash
work() {
   local BASEDN
   BASEDN="dc=example,dc=com"
   local BASEDIR
   BASEDIR=$(dirname "${BASE_SOURCE}")
   local FIRSTNAME
   local LASTNAME
   local PASSWORD
   local PASSWORD_APR1MD5
   local USERNAME
   read -p 'Username: ' -r USERNAME
   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}
gn: ${FIRSTNAME}
sn: ${LASTNAME}
uid: ${USERNAME}
userPassword: ${PASSWORD_APR1MD5}
EOF
}
work
</syntaxhighlight>


=== 查詢使用者 ===
=== 查詢使用者 ===

2018年4月10日 (二) 08:08的版本

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

常用指令

这边会列出日常营运常用的指令。其中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}

上面的行为可以写一只script使用:

#!/bin/bash

work() {
    local BASEDN
    BASEDN="dc=example,dc=com"

    local BASEDIR
    BASEDIR=$(dirname "${BASE_SOURCE}")

    local FIRSTNAME
    local LASTNAME
    local PASSWORD
    local PASSWORD_APR1MD5
    local USERNAME

    read -p 'Username: ' -r USERNAME
    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}
gn: ${FIRSTNAME}
sn: ${LASTNAME}
uid: ${USERNAME}
userPassword: ${PASSWORD_APR1MD5}
EOF
}

work

查询使用者

一般情况下,不需要拉出密码字段时可以用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'

参考资料

外部链接