使用Apache2.4进行LDAP认证的配置

首先

既经准备好LDAP服务器,首先使用Apache HTTP服务器,检查是否可以使用自定义的组设置。

一个选项

    1. 使用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,這個問題已經解決了。

上述内容

广告
将在 10 秒后关闭
bannerAds