Infrastruktur

Server ldap1

Netzwerk
IPv4172.23.195.70, 45.11.17.233 (NAT)
IPv62a01:367:ff1f:100::70
Hostnameldap1.hsmr.cc

Der Hackspace betreibt einen LDAP-Server zur Authentifizierung, u.a. genutzt vom Zammad.

Ein LdapCherry ist unter https://ldap.hsmr.cc/ zu erreichen.

Auf der Maschine läuft ein Arch Linux. Das Webinterface, LdapCherry, ist unmaintained und basiert auf Python 2.7. Wer hier updated, muss es danach auch wieder zum Laufen bringen, viel Erfolg ;-)

SSH-Zugang

Für den root-User sind für folgende User SSH Public Keys von hadar hinterlegt.

root@ldap1 ~ # grep '^PermitRootLogin' /etc/ssh/sshd_config
PermitRootLogin prohibit-password

root@ldap1 ~ # awk '{ print $3 }' < ~root/.ssh/authorized_keys
alvar
binbash
oleander
oleander
xkey

OpenLDAP

root@ldap1 ~ # grep '^TLS' /etc/openldap/slapd.conf
TLSCertificateFile /etc/dehydrated/certs/ldap1.hsmr.cc/cert.pem
TLSCertificateKeyFile /etc/dehydrated/certs/ldap1.hsmr.cc/privkey.pem
TLSCACertificateFile /etc/dehydrated/certs/ldap1.hsmr.cc/fullchain.pem
TLSCACertificatePath /usr/share/ca-certificates/trust-source
root@ldap1 ~ # id ldap
uid=439(ldap) gid=439(ldap) groups=439(ldap),33(http)

Der ldap-User ist in der http-Gruppe, für welche die Zertifikate lesbar sind, siehe unten.

slapd neuladen

OpenLDAP lauscht auf allen Interfaces mit SSL, siehe ArchWiki und FS#73008.

root@ldap1 ~ # cat /etc/conf.d/slapd
SLAPD_URLS="ldaps:///"
SLAPD_OPTIONS=

Das Neustarten des OpenLDAP-Servers, slapd, ist z.B. nach dem Erneuern des TLSZertifikats (LE) notwendig.

/etc/openldap/reload.sh

Dies sollte auch nach dehydrated ausgeführt werden, siehe unten.

root@ldap1 ~ # cat /etc/openldap/reload.sh
#!/bin/sh

chmod 0640 /etc/dehydrated/certs/ldap1.hsmr.cc/*

rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap:ldap /etc/openldap/slapd.d

systemctl restart slapd nginx

Bind DN hinzufügen

# Passwort-Hash generieren, schreibt auf stdout
$ slappasswd

# Hier exemplarisch am bbb
$ cat /root/bbb.ldif
dn: cn=bbb,dc=hsmr,dc=cc
objectClass: top
objectClass: person
objectClass: inetOrgPerson
cn: Big Blue Button
sn: BBB
userPassword: {SSHA}XXX

$ ldapadd -x -D 'cn=root,dc=hsmr,dc=cc' -W -f /root/bbb.ldif

# Lese- oder Schreibberechtigung setzen
# Im Block "access to *" neuen Eintrag setzen
$ cat /etc/openldap/slapd.conf
[snip]
access to *
        by self read
        by dn.base="cn=root,dc=hsmr,dc=cc" write
        by dn.base="cn=zammad,dc=hsmr,dc=cc" read
        by dn.base="cn=bbb,dc=hsmr,dc=cc" read
        by * none
[snip]

$ /etc/openldap/reload.sh

LdapCherry

Leider ist das Projekt tot und basiert auf Python 2, welchem Arch bereits den Todesstoß verpasst hat. Mit OpenLDAP 2.6 ist besondere Leichenfledderei von Nöten:

root@ldap1 ~ # ls -l  /usr/lib/libldap_r-2.4.so.2
lrwxrwxrwx 1 root root 19 Jun  5 19:47 /usr/lib/libldap_r-2.4.so.2 -> /usr/lib/libldap.so
root@ldap1 ~ # ldconfig

Somit sollte dies dringendst ersetzt werden, nächstes Jahr oder so also.

Web, ACME

Das LdapCherry bindet lokal an den Port 8080. Als HTTPS-Proxy arbeitet dann ein nginx.

Um ACME kümmert sich dehydrated, welches sich per systemd timer aktuell hält.

root@ldap1 ~ # cat /etc/nginx/sites-available/ldap_hsmr_cc.conf
server {
        listen 443 ssl;
        listen [::]:443 ssl;

        ssl_certificate_key /etc/dehydrated/certs/ldap1.hsmr.cc/privkey.pem;
        ssl_certificate /etc/dehydrated/certs/ldap1.hsmr.cc/fullchain.pem;
        ssl_trusted_certificate /etc/dehydrated/certs/ldap1.hsmr.cc/fullchain.pem;

        server_name ldap1.hsmr.cc ldap.hsmr.cc;

        location / {
                proxy_pass http://127.0.0.1:8080/;
        }
}

server {
        listen 80;
        listen [::]:80;

        server_name ldap1.hsmr.cc ldap.hsmr.cc;

        location / {
                rewrite ^(.*)$ https://$host$1 permanent;
        }

        location ^~ /.well-known/acme-challenge {
                alias /etc/dehydrated/well-known;
        }
}

root@ldap1 ~ # cat /etc/dehydrated/config
DEHYDRATED_USER=http
DEHYDRATED_GROUP=http

CHALLENGETYPE="http-01"

BASEDIR="/etc/dehydrated"
DOMAINS_TXT="${BASEDIR}/domains.txt"
CERTDIR="${BASEDIR}/certs"
ACCOUNTDIR="${BASEDIR}/accounts"
WELLKNOWN="${BASEDIR}/well-known"

KEY_ALGO=rsa
CONTACT_EMAIL=mail@hsmr.cc
root@ldap1 ~ # cat /etc/dehydrated/domains.txt
ldap1.hsmr.cc ldap.hsmr.cc

root@ldap1 ~ # systemctl cat dehydrated.service
# /usr/lib/systemd/system/dehydrated.service
[Unit]
Description=Check and renew ACME TLS certificates

[Service]
Type=oneshot
ExecStart=/usr/bin/dehydrated -c

# /etc/systemd/system/dehydrated.service.d/override.conf
[Service]
ExecStartPost=/etc/openldap/reload.sh