Nginx 作为安全 LDAP 的正向代理

Nginx 作为安全 LDAP 的正向代理

我需要帮助为安全 LDAP 构建正向代理。

客户端连接到 TCP 代理,并且请求必须重定向到 TCP 636 处的安全 LDAP。

[client]------->[localhost:636 Nginx-proxy]----TLS---->[db.debian.org:636 secure LDAP]

我尝试使用 Nginx 来构建它。

但是 TLS 连接无法正常工作。

看起来 上的证书有点乱localhost。 上的 TLS 代理应该使用什么证书localhost

如果 Nginx 在 Kubernetes 的容器中运行会怎么样?如果它在 上作为服务公开会怎么样*.svc.custer.local

ldapsearch工作代理的访问日志位于ldaps://localhost

ldapsearch -x -b "dc=org" -H ldaps://localhost -v -d8
ldap_initialize( ldaps://localhost:636/??base )
TLS: hostname (LAPTOP-I14D4GNQ.) does not match common name in certificate (db.debian.org).
TLS: can't connect: (unknown error code).
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

LDAPS 请求可以忽略服务器上的证书:

LDAPTLS_REQCERT=never  ldapsearch -x -b "dc=org" -H ldaps://localhost -v -d8
ldap_initialize( ldaps://localhost:636/??base )
filter: (objectclass=*)
requesting: All userApplication attributes
# extended LDIF
#
# LDAPv3

这是我的 Nginx 配置

worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /tmp/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       8080;
        location / {
            root   /usr/share/nginx/html;
            index  index.html;
        }
    }
}

stream {
    server {
        listen     636;
        proxy_pass db.debian.org:636;
    }
}

答案1

对于 nginx,您必须配置一个stream块来终止来自客户端的 SSL/TLS 连接 - 使用客户端信任的证书作为客户端使用的主机名,见下文 - 并与上游服务器建立新的 SSL/TLS 连接,类似于:

stream { 
        server {
                listen 0.0.0.0:636 ssl;
                listen [::]:636 ssl; # not actually needed since I ended up using IPv4 addressing, see below
                ssl_certificate /home/dthomps/certs/loc3bcert3.pem;
                ssl_certificate_key /home/dthomps/certs/srvx.pem; # or appended to above
                proxy_pass db.debian.org:636;
                proxy_ssl on;
                #proxy_ssl_name if necessary
                proxy_ssl_verify on;
                proxy_ssl_verify_depth 9; # should be plenty
                proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
        }
}

在我的 (Ubuntu) 系统上,/etc/ssl/certs/ca-certificates.crt是“标准” CA 的默认 PEM 格式信任库,其中包括 db.debian.org 使用的 CA(当前?),即 LetsEncrypt 又名 ISRG。它还可以包括使用 进行的本地修改update-ca-certificates;见下文。

让客户端 (ldapsearch) 信任 nginx 使用的证书是另一回事。您无法localhost像从任何标准 CA 那样获得名称或私有/保留地址的证书127.0.0.1。如果您所在的组织为其内部网运行自己的 (内部) CA,并将其系统设置为信任该 CA,则他们可能能够发出此类。否则你必须创建你的自己的“DIY” CA,向 nginx 颁发证书,并让客户端信任该 CA;在我的情况下,由于之前的工作,我已经设置并信任了这样的 CA(见update-ca-certificates上文)。即便如此,使用ldapsearch我拥有的版本 ( ldap-utils 2.4.45+dfsg-1ubuntu1.11),我无法让它信任 (有效) 证书localhost(它没有像您那样给我一个详细的错误,只有“无法联系 LDAP 服务器 (-1)”),但它在证书和 URL 中使用 127.0.0.1 可以工作:

$ ldapsearch -v -x -H ldaps://127.0.0.1:636/ -b dc=org
ldap_initialize( ldaps://127.0.0.1:636/??base )
filter: (objectclass=*)
requesting: All userApplication attributes
# extended LDIF
#
# LDAPv3
# base <dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

haproxy 类似;您必须设置mode tcp并创建一个listen块(或匹配的frontendbackend块),以终止来自客户端的 SSL/TLS 并将其发起到服务器。一个细微的差别是 haproxy需要证书和密钥放在一个文件中(nginx 和 apache httpd 将其作为选项)。我使用的 Ubuntu 上的打包配置option httplog对 tcp 模式无效,因此我也对其进行了更改。

listen x
        bind :636 ssl crt /home/dthomps/certs-loc3-combined-temp.pem
        server y db.debian.org:636 ssl verify required ca-file ca-certificates.crt verifyhost db.debian.org
# the Ubuntu package has ca-base configured so that ca-file expands to the correct one

相关内容