welcome: please sign in
location: NslcdHowto

nslcd 配置攻略

nslcd 是一个让 Linux 主机使用 LDAP 数据库中的用户信息的程序,被部署在 TUNA 的大多数服务器上。TUNA 的 LDAP 服务器是 ldap.tuna.tsinghua.edu.cn。

1. 关于 NSS

机器名解析:

gethostbyname() -- (NSS) ---> /etc/hosts
                         |--> LDAP query
                         |--> DNS query
                         |...

获取用户信息:

getpwent() -- (NSS) ---> /etc/passwd
                    |--> LDAP query
                    |...

NSS (Name Server Switch) 是大多数类 UNIX 系统都提供的一个特性。正如它的名字,NSS 负责为系统运行所需的信息(机器名、用户信息……)提供多种可能的来源(文件、DNS 服务器、LDAP 服务器……)。在 Linux 中,gethostbyname()getpwent() 这些函数是 GNU C Library 的一部分,NSS 自然就作为 GNU C Library 的一部分实现。本文只讨论 GNU/Linux 下的具体实现,但是原理对于其它类 UNIX 系统也是适用的。

2. 安装 nss-pam-ldapd (nslcd)

让 NSS 使用 LDAP 查询需要一个接口库,负责进行 LDAP 查询并把查询结果提供给 NSS。xiaq 推荐使用的库是 nss-pam-ldapd。在 Debian/Ubuntu 下,它的包是 libnss-ldapd,在 Archlinux 下则有 AUR 中的 nss-ldapd,在 openSUSE 下为 nss-pam-ldapd 其它平台请大家补充。这类接口库还有一个更传统的 libnss-ldap,但是按 Debian wiki 的 LDAP/NSS 里面的说法,更年轻的 libnss-ldapd 似乎更有前途。

在上文中已经出现了这个软件的两个名字,即 nss-pam-ldapd 和 nss-ldapd。为了进一步复杂化术语 ;) ,我们在下文会一直采用它的守护进程和配置文件用的名字,即 nslcd

安装好 nslcd 之后你会发现两个文件,即 /lib/security/pam_ldap.so/usr/lib/libnss_ldap.so.2(这是在 xiaq 的 Arch 机器上的文件名。在你的机器上可能稍有不同。)前者是用于 PAM 的库,后者是用于 NSS 的。

本节开头说到,让 NSS 使用 LDAP 查询需要一个接口库。实际上 NSS 的任意类型的查询都是通过动态链接库来实现的,这些文件是 /lib/libnss_*/usr/lib/libnss_*

3. 配置举例:

接下来介绍如何配置 nslcd 以让你的机器使用 TUNA 的 LDAP 数据库中的 Hosts 列表——就好像它们在你的 /etc/hosts 文件里面一样。这样你就可以通过 ssh alef 远程登录 alef.tuna.tsinghua.edu.cn,等等。

注意:单就缩短域名来说,如果建议使用 ShortDomainHowto 中的方法。DNS 具有地域解析的功能,可以确保解析出合适的 IP(例如你在校外的时候就会解析出公网可访问的 IP)。但是本节作为一个配置的样例还是很有用的,你可以在本机上尝试配置。

3.1. 测试:没有 LDAP 时的 getent hosts

这是我的机器上的 /etc/hosts 文件:

% cat /etc/hosts
#
# /etc/hosts: static lookup table for host names
#

#<ip-address>   <hostname.domain.org>   <hostname>
127.0.0.1       localhost.localdomain   localhost blackie
::1             localhost.localdomain   localhost blackie
# End of file

getent 是在 #关于 NSS 部分提到的 gethostbyname() 等一族函数的一个简易的前端。在没有 LDAP 来源的时候,getent hosts 会列出一个和 hosts 文件几乎等同的表:

% getent hosts
127.0.0.1       localhost.localdomain localhost blackie
127.0.0.1       localhost.localdomain localhost blackie

3.2. nsswitch.conf

/etc/nsswitch.conf 找到这一句,加入 ldap 来源:

hosts: files dns

冒号左侧是目标数据库,右侧则是数据来源,顺序代表优先级。xiaq 是把 ldap 加在中间:

hosts: files ldap dns

3.3. nslcd.conf

这个文件也在 /etc 下。下面仅介绍和本文目标相关的一些选项。和通常的 UNIX 配置文件一样,行首的 # 表示注释。

  1. nslcd 的运行身份,应该是自明的。不过留意一下,如果你的机器上没有相应的用户和组,则需要手工建立。
    # The user and group nslcd should run as.
    uid nslcd
    gid nslcd
  2. 登入 LDAP 服务器的参数,应该也是自明的。下面没有给出 bindpw 的值。它在这里

    # The uri pointing to the LDAP server to use for name lookups.
    uri ldap://ldap.tuna.tsinghua.edu.cn/
    # The distinguished name of the search base.
    base o=tuna
    # The distinguished name to bind to the server with.
    # Optional: default is to bind anonymously.
    binddn cn=nss,ou=robots,o=tuna
    # The credentials to bind with.
    # Optional: default is no credentials.
    # Note that if you set a bindpw you should check the permissions of this file.
    bindpw --------
  3. 我们只需要指定搜索 hosts 需要的参数:
    # Customize certain database lookups.
    base   hosts  ou=hosts,o=tuna
    scope  hosts  one
  4. 使用 TLS 加密。目前(2011-07-05)我们的 LDAP 服务器是接受无加密连接的。但可能以后会不再接受,所以请开启这个选项。此外,LDAP 服务器使用的证书以后很可能会变,所以在此不对证书进行验证。

    # Use StartTLS without verifying the server certificate.
    ssl start_tls
    tls_reqcert never

3.4. 测试

为了方便调试,我们可以先 debug 模式运行:

% sudo nslcd -d

或者使用你的发行版的服务控制脚本,如 servicesystemctl 或是 /etc/init.d/nslcd/etc/rc.d/nslcd。有的发行版如 Debian 在安装好 libnss-ldapd 之后会自动开启,你需要 sudo /etc/init.d/nslcd stop 之后再 sudo nslcd -d

如果在 getent hosts 的输出中出现了 LDAP 数据库中的表项,那么你的 nslcd 配置就成功了。

% getent hosts
127.0.0.1       localhost.localdomain localhost blackie
127.0.0.1       localhost.localdomain localhost blackie
59.66.66.242    alef
202.112.3.240   alef
166.111.8.205   ftp3
202.112.3.91    lux-002
202.112.3.91    lux-003
202.112.3.91    lux-004
166.111.111.74  ftp4
166.111.111.118 major
202.112.3.176   major
202.112.3.95    nox-001
202.112.3.91    lux-001


CategoryHowto CategoryLdap

NslcdHowto (2012-08-13 13:31:35由heroxbd编辑)