Hallo zusammen,
auch ich habe es jetzt geschafft, einen externen Domänencontroller zu installieren.
Mein Vorgehen:
- externen DNS für den neuen Host festlegen: idm.meineschule.de → 1.2.3.4
DNS intern habe ich zwar in der Schulkonsole vorher festgelegt: idm-ext.meineschule.de → 1.2.3.4, das wird aber nach dem Domainjoin dann geändert und a.) auf IDM-EXT → 172.31.0.12 (also eine unsinnige interne docker-IP) geändert und b.) weil ich intern eine andere Domäne als extern habe, lautet der Zoneneintrag dann auch „idm-ext.meineschule.intern“… Macht aber nix, scheint zu funktionieren.
-
Letsencrypt-Zertifikate für die Domäne machen (bei mir: auf dem docker-host certbot verwendet, speichert die zertifikate in /etc/letsencrypt/live/idm-ext.meineschule.de
) und sicherstellen, dass das auch in Zukunft passiert. Andere machen das mit Hilfe eines Dockercontainers, wie traefik oder acme-companion. Ginge auch.
-
sich mit wireguard auseinandersetzen: Ich habe das Plugin „os-wireguard-go“ in OpnSense installiert und dort ein Netz 10.10.10.0/24 aufgespannt mit IP 10.10.10.1 auf der OpnSense und 10.10.10.3 auf der externen Seite, Dokus dazu: OpnSense Wireguard Site-to-site ist schwerer lesbar als Anfänger als OpnSense Road-Warrior Setup, aber es ging auch das hier mit ein: (Digitalocean)[How To Set Up WireGuard on Ubuntu 20.04 | DigitalOcean]. Ist bloß ziemlich lang, bis man es halb gerafft hat.
Am Ende gibt es ein OpnSense-Ende (alles enable setzen und apply nicht vergessen, es gibt dort auch ein frontend das die handshakes anzeigt), bei dem man einen beliebigen Port freischaltet (bei mir: 4137 für die IP 1.2.3.4)
und es gibt später im dockercontainer ein anderes Ende, dessen Config sieht bei mir so aus: (wg0.conf
). Die OpnSense hat ja von außen auch einen externe IP, die wäre im Beispiel: 5.6.7.8
[Interface]
PrivateKey = xxxxxxxxxxxxxxxx=
#PublicKey dazu: HzAkNH02RZPOdwC2wVRivE3QNaM5O7RVW7csp12UaCM=
Address = 10.10.10.3/24
ListenPort = 51821
[Peer]
PublicKey = /HYTh1mPAgRhVWjq5BS34FGAP/Ap8iLCXeVAV94q43w=
AllowedIPs = 10.10.10.1/32,10.16.0.0/12
Endpoint = 5.6.7.8:4137
wer das checkt: bei Peer steckt der PublicKey der OpnSense drin. In der OpnSense steht im Endpoint der publickey der wg0.conf-Konfiguration. Wichtig ist bei „AllowedIPs“ in der „Peer“-Sektion auch 10.16.0.0/12
, so dass ich später nicht nur auf 10.10.10.1 sondern auch auf meinen LMN-Server 10.16.1.1 zugreifen kann.
Diese wg0.conf kopiere ich in die docker-config, hier nach /srv/docker/idm-ext/config/wireguard
mkdir -p /srv/docker/idm-ext/config/wireguard
- einen Dockercontainer gebastelt. Das kann ich nicht in Vollständigkeit dokumentieren. Wichtig ist am Ende:
- der Dockerhost muss bereits einen kernel haben, der Wireguard kann (ich habe ubuntu 20.04 mit kernel 5.4, ich denke, das ist das minimum).
- der Dockercontainer braucht die NET_ADMIN capability (vllt. auch SYS_MODULE)
docker pull debian:stable-slim
docker run -it --cap-add=NET_ADMIN --volume /srv/docker/idm-ext/config/wireguard:/etc/wireguard debian:stable-slim /bin/bash
im Dockercontainer:
apt install samba wireguard winbind
#apt install net-tools procps iproute2 emacs-nox iputils-ping less
wg-quick up wg0 #test
wg show #test
ping 10.16.1.1 #test
außerhalb des dockercontainers:
docker ps -a # ID des laufenden (oder beendeten Containers herausbekommen: abcdef)
docker commit abcdef debian:wireguard-working
Damit habe ich einen Container mit Samba und wireguard.
Jetzt mach ich es fast wie Jesko und Dorian und tjordan: docker-compose.yml und Datenstrukturen, die die Konfigurationen enthalten.
config/wireguard/wg0.conf
config/var-lib-samba/
config/samba/
entrypoint.sh
samba-pw
docker-compose.yml
Die zugehörigen Dateien sind: samba-pw
BIND_USER=adminstrator
BIND_PASSWORD=strenggeheim
entrypoint.sh
#!/bin/sh -e
echo "Important Variables:"
echo "Bind User: $BIND_USER + Password: xxx"
echo "Wireguard configuration:"
cat /etc/wireguard/wg0.conf
echo "Firing up wireguard"
wg-quick up wg0
echo "Return value: $?"
sleep 3s
echo "Ping the server:"
ping -c 1 $SERVERIP
echo "TLS Konfiguration:"
echo "TODO: muss manuell in /etc/samba/smb.conf eingetragen werden, z.B. "
cat <<EOF
tls enabled = yes
tls keyfile = /etc/letsencrypt/live/$(hostname)/privkey.pem
tls certfile = /etc/letsencrypt/live/$(hostname)/fullchain.pem
tls cafile =
tls verify peer = no_check
EOF
if [ -z "$NETBIOS_NAME" ]; then
NETBIOS_NAME=$(hostname -s | tr [a-z] [A-Z])
else
NETBIOS_NAME=$(echo $NETBIOS_NAME | tr [a-z] [A-Z])
fi
REALM=$(echo "$REALM" | tr [a-z] [A-Z])
if [ ! -f /etc/timezone ] && [ ! -z "$TZ" ]; then
echo 'Set timezone'
cp /usr/share/zoneinfo/$TZ /etc/localtime
echo $TZ >/etc/timezone
fi
echo $REALM
if [ ! -f /var/lib/samba/registry.tdb ]; then
echo "Keine Registry in /var/lib/samba erkannt: versuche einen JOIN"
if [ "$BIND_INTERFACES_ONLY" = "yes" ]; then
# INTERFACE_OPTS="--option=\"bind interfaces only=yes\ --option=\"interfaces=$INTERFACES\""
INTERFACE_OPTS="--option=\"bind interfaces only=yes\""
fi
if [ -z "$SERVERIP" ]; then
SERVERIP=10.16.1.1
fi
SERVER_OPTS="--server=$SERVERIP"
if [ $DOMAIN_ACTION = "join" ]; then
PROVISION_OPTS="$REALM DC $SERVER_OPTS -U$BIND_USER --password='$BIND_PASSWORD'"
else
echo 'Only join actions are supported.'
exit 1
fi
rm -f /etc/samba/smb.conf /etc/krb5.conf
echo "samba-tool domain $DOMAIN_ACTION $PROVISION_OPTS $INTERFACE_OPTS \
--dns-backend=SAMBA_INTERNAL"
# This step is required for INTERFACE_OPTS to work as expected
echo "samba-tool domain $DOMAIN_ACTION $PROVISION_OPTS $INTERFACE_OPTS \
--dns-backend=SAMBA_INTERNAL" | sh
#mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
echo 'root = administrator' > /etc/samba/smbusers
echo "Please add your TLS Konfiguration to smb.conf"
fi
mkdir -p -m 700 /etc/samba/conf.d
cp /var/lib/samba/private/krb5.conf /etc/
exec samba --model=standard -i </dev/null
und zuletzt docker-compose.yml
version: '3'
services:
##
## LDAP/AD Replikant
##
# host: idm-ext.meineschule.de
idm-ext:
dns:
- 10.16.1.1
image: debian:wireguard-working
restart: always
container_name: idm-ext
hostname: idm-ext.meineschule.de
entrypoint: ["/usr/local/bin/entrypoint.sh"]
#command: tail -f /dev/null
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
NETBIOS_NAME: "IDM-EXT"
REALM: "MEINESCHULE.DE"
TZ: "Europe/Berlin"
BIND_INTERFACES_ONLY: "yes"
DOMAIN_ACTION: "join"
SERVERIP: "10.16.1.1"
env_file:
- ./samba-pw
volumes:
- ./config/samba:/etc/samba
- ./config/wireguard:/etc/wireguard
- ./config/var-lib-samba:/var/lib/samba
- /etc/letsencrypt:/etc/letsencrypt:ro
- ./entrypoint.sh:/usr/local/bin/entrypoint.sh
ports:
- 127.0.0.1:389:389
- 636:636
- 127.0.0.1:135:135
Zuletzt passiert folgendes:
- letsencrypt wird der Einfachheit halber mit vollständigem Verzeichnis reingemountet, dann funktionieren auch die relativen Links von „live/domain/privkey.pem → …/…/archive… usw“
- man startet einmal
docker-compose up
und schaut sich den output an. Im besten Fall funktioniert der wireguard tunnel und der Domain JOIN Befehl. Wenn das geklappt hat, ist /var/lib/samba/private gefüllt, ebenso gibt es eine /etc/samba/smb.conf, jeweils aus Sicht innerhalb des Containers. Sollte was nicht klappen, kann man diese Verzeichnisse auch wieder leeren und rumschrauben.
- Danach sollte man TLS in
./config/samba/smb.conf
eintragen wie es der output auch suggeriert: tls enabled = yes
tls keyfile = /etc/letsencrypt/live/idm-ext.meineschule.de/privkey.pem
tls certfile = /etc/letsencrypt/live/idm-ext.meineschule.de/fullchain.pem
tls cafile =
tls verify peer = no_check
- Die TLS-Verbindung kann man von überall checken, auch im Vergleich mit dem Haupt-Server:
openssl s_client -showcerts -connect idm-ext.meineschule.de:636 > 636.txt
Voil´a. Hoffentlich klappts auch bei euch.
- Update des containers, falls niemand anderes eine bessere samba-wireguard kombi anbietet:
docker exec -it idm-ext /bin/bash
dem laufenden container beitreten. apt update && apt full-upgrade
und danach wieder ein docker commit abcdef12 debian:wireguard-working
absetzen.
VG, Tobias