TLDR: Ignore this post if you are using a private certificate authority to issue your client certificates - as is commonly done and recommended.

On 15/06/2023 8:23 am, Sean Gallagher wrote:
I'd like to propose a new feature to substantially strengthen the existing access controls in slapd. This follows on from comments made in the discussion around Issue 10065. In particular Comment 17 and Comment 19.

The objective here is to validate the credentials supplied by external security mechanisms BEFORE the main server loop starts, and terminate the connection if the client is not "known".

If the reader has been following along on this discussion and is considering installing a proxy in front of their slapd instance but is not sure how, I have posted here a genericised version of my haproxy.cfg file. This does more than is strictly necessary. I have precisely no expertise in haproxy and make no warranties about this whatsoever but if you find it useful, that's great. If you have questions, I'm not the one to answer them. I suggest a haproxy user's forum. Comments on improvements are welcome.

I have set up slapd to listen on unix domain sockets, so I can identify which client I am talking to in the ACL ruleset. This is an ugly implementation but works. It may be possible to configure haproxy to re-use the client's certificate presented to the front end, again on the back end. This would undoubtedly lead to a cleaner ruleset - but is not what I have done, simply because I don't know how.

The slapd.conf ACL rules look like this:

access to *
    by dn.base="cn=managersock,dc=example,dc=com" manage stop
    by *         sockname.exact="PATH=/var/run/openldap/c1.sock" none break     by *         sockname.exact="PATH=/var/run/openldap/c2.sock" none break     by *         sockname.exact="PATH=/var/run/openldap/c3.sock" none break     by *         sockname.exact="PATH=/var/run/openldap/c4.sock" none break

The haproxy.cfg file

global
#    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
    #log                     /dev/log local0 warning
    log                     /dev/log local0  debug

    ssl-default-bind-options ssl-min-ver TLSv1.2
    ssl-default-bind-options ssl-max-ver TLSv1.3
    ssl-dh-param-file       /etc/ssl/private/dhparam

defaults
    mode                    tcp
    log                     global
    retries                 3
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout check           10s
    maxconn                 3000

frontend main
    option                  tcplog
    bind ipv4@10.0.0.10:636 ssl verify required ciphers DHE-RSA-AES256-GCM-SHA384 ciphersuites TLS_AES_256_GCM_SHA384 ca-verify-file /etc/ssl/select_ca_ldapclients.pem crt /etc/ssl/ttldap.example.com.crt

    tcp-request inspect-delay 2s
    tcp-request content accept  if  { req.ssl_hello_type 1 }

    acl c1_sip src 10.0.0.1
    acl c1_sdn ssl_c_s_dn -m str "/CN=client1.example.com"
    acl c1_idn ssl_c_i_dn -m str "/C=US/O=Let's Encrypt/CN=R3"
    acl c1_sni ssl_fc_sni -m str "ldap.example.com"

    acl c2_sip src 10.0.0.2
    acl c2_sdn ssl_c_s_dn -m str "/CN=client2.example.com"
    acl c2_idn ssl_c_i_dn -m str "/C=US/O=Let's Encrypt/CN=R3"
    acl c2_sni ssl_fc_sni -m str "ldap.example.com"

    acl c3_sip src 10.0.0.3
    acl c3_sdn ssl_c_s_dn -m str "/CN=client3.example.com"
    acl c3_idn ssl_c_i_dn -m str "/C=US/O=Let's Encrypt/CN=R3"
    acl c3_sni ssl_fc_sni -m str "ldap.example.com"

    acl c4_sip src 10.0.0.4
    acl c4_sdn ssl_c_s_dn -m str "/CN=client4.example.com"
    acl c4_idn ssl_c_i_dn -m str "/C=US/O=Let's Encrypt/CN=R3"
    acl c4_sni ssl_fc_sni -m str "ldap.example.com"

    use_backend c1_be if c1_sip c1_sdn c1_idn c1_sni
    use_backend c2_be if c2_sip c2_sdn c2_idn c2_sni
    use_backend c3_be if c3_sip c3_sdn c3_idn c3_sni
    use_backend c4_be if c4_sip c4_sdn c4_idn c4_sni

backend c1_be
    server smtps unix@/var/run/openldap/c1.sock

backend c2_be
    server pwgui unix@/var/run/openldap/c2.sock

backend c3_be
    server imaps unix@/var/run/openldap/c3.sock

backend c4_be
    server samba unix@/var/run/openldap/c4.sock

   Sean.


--
This email has been checked for viruses by AVG antivirus software.
www.avg.com

Reply via email to