Linux 中的 LDAP 身份验证
在此页
- 要求
- 介绍
- 配置 OpenLDAP
- 迁移/添加数据到目录
- 客户端配置
- Apache mod_auth_ldap
- LDAP 管理工具
- 其他 ldap 感知应用程序
- 总结
这个 howto 将向您展示如何在 LDAP 中存储您的用户并根据它验证某些服务。我不会展示如何安装特定的包,因为它依赖于分发/系统。我将专注于拥有 LDAP 身份验证/用户存储所需的所有组件的“纯”配置。 howto 以某种方式假设您正在从常规 passwd/shadow 身份验证迁移,但它也适合从头开始做的人。
要求
- OpenLDAP
- pam_ldap
- nss_ldap
- PADL 迁移工具
简介
我们想要实现的是将我们的用户存储在 LDAP 中,根据 LDAP(直接或 pam)进行身份验证,并拥有一些工具以人类可理解的方式进行管理。
这样我们就可以使用所有支持 LDAP 的软件或回退到 PAM LDAP 模块,它将充当 PAM->LDAP 网关。
有关 LDAP 思想的更多信息可以在维基百科上找到:LDAP wikipedia
配置 OpenLDAP
OpenLDAP 由 slapd 和 slurpd 守护进程组成。这个 howto 涵盖了一个没有复制的 LDAP 服务器,所以我们将只关注 slapd。我还假设您安装并初始化了 OpenLDAP 安装(取决于系统/发行版)。如果是这样,让我们转到配置部分。
在我的系统 (Gentoo) 上,OpenLDAPs 配置存储在 /etc/openldap 中,我们对 /etc/openldap/slapd.conf 文件感兴趣。但首先我们必须为 LDAP 管理员生成一个密码,并将其放入配置文件中:
slappasswd -h {md5}
配置如下所示:
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
modulepath /usr/lib/openldap/openldap
access to attrs=userPassword
by dn="uid=root,ou=People,dc=domain,dc=com" write
by dn="cn=Manager,dc=domain,dc=com" write
by anonymous auth
by self write
by * none
access to dn.base="" by * read
access to *
by dn="cn=Manager,dc=domain,dc=com" write
by * read
database bdb
suffix "dc=domain,dc=com"
rootdn "cn=Manager,dc=domain,dc=com"
rootpw {MD5}Tk1sMytv5ipjr+Vhcf03JQ==
directory /var/lib/openldap-data
index objectClass eq
请记住根据您的需要更改后缀和路径。
这些是基本选项,其中包含用户更改密码所需的一些基本 ACL。如果您需要更多功能,请阅读有关 OpenLDAP 的手册。现在,当我们对 slapd 进行了适当的配置后,我们就可以启动守护进程了:
service slapd start
请记住在负责传递给 slapd 的参数的配置文件中有类似的东西(路径应该指向 slapd.sock):
OPTS="-h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
现在我们可以测试 openldap 是否正在运行并正常工作。目录中还没有任何数据,但我们可以尝试绑定为 cn=Manager,dc=domain,dc=com。当系统要求您输入密码时,您应该使用您生成的密码(当然是它的纯文本版本 :):
ldapsearch -D "cn=Manager,dc=domain,dc=com" -W
迁移/添加数据到目录
现在,当我们有一个正在运行的 LDAP 服务器时,我们必须用数据填充它,创建或迁移条目。我将向您展示如何从常规 /etc/passwd、/etc/shadow、/etc/groups 迁移现有条目
第一步是根据您的需要配置 mogrationtools。 Gentoo 上的配置文件位于 /usr/share/migrationtools/migrate_common.ph。
通常,您只需要更改这些:
$DEFAULT_BASE = "dc=domain,dc=com";
$EXTENDED_SCHEMA = 1;
现在您已准备好迁移数据(实际上即使没有导出命令也可以):
export ETC_SHADOW=/etc/shadow
./migrate_base.pl > /tmp/base.ldif
./migrate_group.pl /etc/group /tmp/group.ldif
./migrate_hosts.pl /etc/hosts /tmp/hosts.ldif
./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif
现在我们有了 LDAP 服务器可以理解的格式的数据。请使用文本编辑器打开其中一个文件以熟悉语法。之后,我们可以从 ldifs 添加数据。
ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/base.ldif
ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/group.ldif
ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/passwd.ldif
ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/hosts.ldif
您可以尝试搜索一些数据:
ldapsearch uid=foouser
客户端配置
通过客户端,我的意思是连接到 LDAP 服务器以获取用户和授权的机器。它也可以是运行 LDAP 服务器的机器。在这两种情况下,我们都必须编辑三个文件:/etc/ldap.conf、/etc/nsswitch.conf 和 /etc/pam.d/system-auth
让我们从 ldap.conf,ldaps 客户端开始:
BASE dc=domain, dc=com
scope sub
suffix "dc=domain,dc=com"
## when you want to change user's password by root
rootbinddn cn=Manager,dc=domain,dc=com
## there are needed when your ldap dies
timelimit 5
bind_timelimit 5
uri ldap://ldap.domain.com/
pam_password exop
ldap_version 3
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
nss_base_passwd ou=Computers,dc=cognifide,dc=pl
nss_base_passwd ou=People,dc=cognifide,dc=pl
nss_base_shadow ou=People,dc=cognifide,dc=pl
nss_base_group ou=Group,dc=cognifide,dc=pl
nss_base_hosts ou=Hosts,dc=cognifide,dc=pl
现在是 nsswitch.conf 和 pam 的时候了
将这些添加到 nsswitch.conf:
passwd: files ldap
shadow: files ldap
group: files ldap
并将系统身份验证(或任何您拥有的登录名、sshd 等)更改为:
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account sufficient pam_unix.so
account sufficient pam_ldap.so
account required pam_ldap.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password sufficient pam_unix.so nullok md5 shadow use_authtok
password sufficient pam_ldap.so use_first_pass
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so
是时候测试一下了。最好的工具是一个很好的旧 getent。从您的系统中选择一个用户并发出:
getent passwd | grep foouser
您应该得到两次结果,如果是这样,nss_ldap 工作正常。可以通过从 /etc/passwd 中删除用户并尝试通过 ssh 登录来测试 pam 部分。
阿帕奇 mod_auth_ldap
要在 apache 中获得 LDAP 授权,您必须加载 mod_auth_ldap 模块
LoadModule mm_auth_ldap_module modules/mod_auth_ldap.so
现在足以使 .htaccess 像这样:
AuthName "Restricted"
AuthType Basic
AuthLDAPURL ldap://ldap.domain.com:389/ou=People,dc=domain,dc=com?uid
AuthLDAPBindDN "cn=Manager,dc=domain,dc=com"
AuthLDAPBindPassword "your_secret_secret_password_to_ldap_admin"
require valid-user
注意这个方法也可以用于WebDAV颠覆授权
LDAP 的管理工具
我推荐使用一些工具来管理 OpenLDAP 服务器
- phpldapadmin - 基于网络的工具
- ldapvi - vim 浏览
- PADL 迁移工具 - 迁移工具
- IDEALX sambaldap 工具 - samba LDAP 工具
其他 ldap 感知应用程序
- 后缀
- 快递 IMAP
- 喋喋不休
- 电子群件
概括
如果有人要添加什么,请添加。我知道配置可能并不完美。