使用Apache2.4进行LDAP认证的配置
首先
既经准备好LDAP服务器,首先使用Apache HTTP服务器,检查是否可以使用自定义的组设置。
一个选项
-
- 使用httpd.conf文件进行整个网站的配置方法
- 在用户准备的文件(如.htaccess)中,进行组设置的方法
环境
-
- Ubuntu 18.04 LTS (64bit) on VMWare Workstation14
- apache2 deb package (2.4.29-1ubuntu4.3)
事前准备的中文翻译:预先准备
激活所需的模块。您需要启用mod_ldap(ldap)和mod_auth_basic(auth_basic),但您可以通过以下步骤从默认环境进行环境搭建。
$ sudo apt-get install libapache2-mod-webauthldap
$ ls /etc/apache2/mods-enabled/
access_compat.load authn_file.load autoindex.load env.load mpm_event.load status.conf
alias.conf authz_core.load deflate.conf filter.load negotiation.conf status.load
alias.load authz_host.load deflate.load mime.conf negotiation.load
auth_basic.load authz_user.load dir.conf mime.load setenvif.conf
authn_core.load autoindex.conf dir.load mpm_event.conf setenvif.load
$ sudo a2enmod authnz_ldap
Considering dependency ldap for authnz_ldap:
Enabling module ldap.
Enabling module authnz_ldap.
To activate the new configuration, you need to run:
service apache2 restart
$ ls /etc/apache2/mods-enabled/
access_compat.load authn_file.load autoindex.conf dir.load mime.conf negotiation.load
alias.conf authnz_ldap.load autoindex.load env.load mime.load setenvif.conf
alias.load authz_core.load deflate.conf filter.load mpm_event.conf setenvif.load
auth_basic.load authz_host.load deflate.load ldap.conf mpm_event.load status.conf
authn_core.load authz_user.load dir.conf ldap.load negotiation.conf status.load
如果使用TLS(ldaps://),
请务必添加安装ca-certificates。
$ sudo apt-get update
$ sudo apt-get install ca-certificates
如果在Docker的httpd官方容器中使用ldaps://…,需要先安装ca-certificates。
如果使用httpd.conf来影响整个网站,会面临什么挑战。
当在Location或Directory指令中进行指定时,通过基本身份验证的所有用户都可以访问。
在下面的示例中,我们启用了ldap-status处理程序,用于显示LDAP缓存信息。
在针对Apache 2.2的旧文章中,常见的示例是从官方文档中采用”Satisfy any”进行指定。但是从2.4版本开始,我们可以通过嵌套使用RequireAll、RequireAny、RequireNone等来进行所需的指定,因此在这一点上进行了修改。(默认值为RequireAny)
<Location /ldap-status>
SetHandler ldap-status
AuthType Basic
AuthName "LDAP Protected by LDAP-ID"
AuthBasicProvider ldap
AuthLDAPURL ldap://localhost/ou=people,ou=proxy,dc=example,dc=com?uid?one
<RequireAll>
Require valid-user
Require host localdomain ## "localdomain" は適切なアクセス元のFQDNかドメインを指定する
</RequireAll>
</Location>
顺便说一句,在没有提供更新版本2.4的日本语版的情况下,我注意到仍然有使用Order、Deny、Allow、Satisfy等描述的情况,但基本上,在2.4版本中,我们应该对传统的访问控制语法进行修改。
使用.htaccess进行配置的示例
为了使用.htaccess文件,需要在服务器的整体设置中,对特定目录以下的AllowOverride AuthConfig进行启用。
<Directory /var/www/html>
AllowOverride AuthConfig
</Directory>
将放置在conf-available目录下的文件可以通过a2enconf命令启用(创建自conf-enabled的符号链接)。随后需要重新启动进程。
$ sudo a2enconf sitewide-auth
Enabling conf sitewide-auth.
To activate the new configuration, you need to run:
service apache2 reload
##
## プロセスの再起動
$ sudo systemctl restart apache2
以下的例子是在使用httpd.conf文件的基础上进行了一些修改,仅限制为属于cn=ml01组的成员的例子。
AuthName "LDAP Authentication Gateway"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPUrl "ldap://localhost/ou=people,ou=proxy,dc=example,dc=com?uid"
AuthLDAPGroupAttribute member
Require ldap-group cn=ml01,ou=maillist,ou=proxy,dc=example,dc=com
启用Docker上的LDAP身份验证
以下是关于在 Kubernetes 上创建 Docker 容器的方法概述。
准备样本内容和.htaccess文件。
创建一个名为htdocs的目录,并在其中放置内容和.htaccess文件。
$ mkdir htdocs
$ cat <<EOF > htdocs/.htaccess
AuthName "LDAP Authentication Gateway"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPUrl "ldaps://ldap.example.com/ou=people,ou=proxy,dc=example,dc=com?uid"
<RequireAll>
Require valid-user
</RequireAll>
EOF
$ cat <<EOF > htdocs/index.html
<h1>Hello world!</h1>
EOF
Dockerfile 的意思是 原生中的 需要 一个 备选项。
准备以下类型的Dockerfile文件。
FROM httpd:2.4
RUN sed -i \
-e 's!^#\(LoadModule authnz_ldap_module modules/mod_authnz_ldap.so\)!\1!' \
-e 's!^#\(LoadModule ldap_module modules/mod_ldap.so\)!\1!' \
-e 's!AllowOverride None!AllowOverride AuthConfig!' \
-e 's!LogLevel warn!LogLevel info!' \
conf/httpd.conf
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates libldap-common
ADD htdocs /usr/local/apache2/htdocs
请使用Docker build等命令构建容器。
$ sudo docker build . --tag httpd-ldapauth
$ sudo docker run --rm --name httpd-ldapauth -p 8080:80 -v "`pwd`/htdocs:/usr/local/apache2/htdocs" -dit httpd-ldapauth
LDAP相关的主题
指定LDAP组的方法
在当前使用的OpenLDAP服务器上,我们通过启用translucent模块来添加属性(attribute)并创建条目,还可以添加自定义目录或使用meta模块将它们捆绑在一起。
在上述的例子中,ou=maillist目录包含以下条目。
$ldapsearch -x -h localhost -b ou=maillist,ou=proxy,dc=example,dc=com cn=ml01
# extended LDIF
#
# LDAPv3
# base <ou=mailgroup,ou=proxy,dc=example,dc=com> with scope subtree
# filter: cn=ml01
# requesting: ALL
#
dn: cn=ml01,ou=MailGroup,ou=proxy,dc=example,dc=com
member: uid=user01,ou=people,ou=proxy,dc=example,dc=com
member: uid=user02,ou=people,ou=proxy,dc=example,dc=com
objectClass: groupOfNames
cn: ml01
...
关于与操作系统的Group相对应的ou=group的情况如下所示。
$ ldapsearch -x -h localhost -b ou=group,ou=proxy,dc=example,dc=com cn=staff
# extended LDIF
#
# LDAPv3
# base <ou=group,ou=proxy,dc=example,dc=com> with scope subtree
# filter: cn=staff
# requesting: ALL
#
dn: cn=staff,ou=Group,ou=proxy,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: staff
gidNumber: xxxx
memberUid: user01
memberUid: user02
...
由于属性(Attribute)的memberUid没有指定域,为了使其匹配,可以使用AuthLDAPGroupAttributeIsDN(默认值为on)。
AuthLDAPGroupAttribute memberUid
AuthLDAPGroupAttributeIsDN off
Require ldap-group cn=staff,ou=group,ou=proxy,dc=example,dc=com
文献参考
-
- Apache Module mod_ldap
- Apache Module mod_authnz_ldap
2021/12/14 追加记录 – ldaps协议发生错误。
使用Docker容器 docker.io/library/httpd:2.4.51 时,需要安装libldap-common软件包以进行ldaps连接。我们已经在GitHub上登记了问题,并得到了解决,但如果您自己构建容器,请小心。
请查看以下链接以获取详细信息。
- Failed to access LDAP server over TLS
目前,透過明確指定 libldap-common,這個問題已經解決了。
上述内容