Squid mit Kerberos
| Kurs | Lab | Rechner | Domäne |
|---|---|---|---|
| Linux - Samba | Linux - Samba Lab | proxy · 10.2XX.1.33 | ad.it2XX.int |
Einfach erklärt
- Ein Proxy soll wissen, wer surft, ohne dass jemand ein Passwort eintippt.
- Der Browser meldet sich am Proxy per Negotiate an. Dahinter steckt ein Kerberos-Ticket für HTTP/proxy.ad.it2XX.int.
- squid prüft das Ticket mit einem kleinen Hilfsprogramm und seiner Keytab und schreibt den Benutzernamen ins Log.
- Mit Gruppen aus dem AD lässt sich steuern, wer überhaupt ins Internet darf.
Das Wichtigste
- Der Browser muss den Proxy über seinen Namen ansprechen, nicht über die IP. Sonst gibt es kein Kerberos.
- Der SPN HTTP/proxy.ad.it2XX.int muss beim Konto von proxy im AD stehen.
- Die Keytab muss für den Benutzer proxy lesbar sein, unter dem squid läuft.
Vorbereitung
- proxy tritt der Domäne bei wie ein Samba Mitgliedsserver, nur ohne Freigaben. winbind wird für die Gruppenprüfung gebraucht.
- In der smb.conf zwei Keytabs, eine für das System, eine für squid:
sync machine password to keytab = /etc/krb5.keytab:spn_prefixes=host:account_name:sync_spns:sync_kvno:machine_password, /etc/squid/HTTP.keytab:spn_prefixes=HTTP:sync_kvno:machine_password
apt install squid net ads setspn add HTTP/proxy.ad.it201.int -U administrator net ads setspn list net ads keytab create chgrp proxy /etc/squid/HTTP.keytab chmod 640 /etc/squid/HTTP.keytab klist -k /etc/squid/HTTP.keytab
- net ads setspn add trägt den SPN im AD ein. Die Zeile in der smb.conf allein ändert im AD nichts.
Die squid.conf
- /etc/squid/conf.d/kerberos.conf
auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -k /etc/squid/HTTP.keytab -s HTTP/proxy.ad.it201.int@AD.IT201.INT -r auth_param negotiate children 10 auth_param negotiate keep_alive on external_acl_type adgruppe %LOGIN /usr/lib/squid/ext_wbinfo_group_acl acl angemeldet proxy_auth REQUIRED acl internet external adgruppe internet http_access deny !angemeldet http_access allow localnet internet http_access deny all
| Zeile | Bedeutung |
|---|---|
| negotiate_kerberos_auth -k -s | Hilfsprogramm, das Tickets mit dieser Keytab und diesem SPN prüft |
| -r | entfernt @AD.IT201.INT aus dem Namen, im Log steht dann max |
| ext_wbinfo_group_acl | fragt per winbind, ob der Benutzer in einer AD-Gruppe ist |
| acl internet external adgruppe internet | nur Mitglieder der AD-Gruppe internet |
| http_access deny !angemeldet | ohne Anmeldung kein Zugriff, löst die Anmeldung aus |
- Die Zeilen müssen vor den http_access-Zeilen der Haupt-squid.conf stehen. conf.d wird bei Debian am Anfang eingelesen.
- squid -k parse
- systemctl restart squid
- Die Gruppe internet im AD anlegen und max hineinnehmen.
Testen
Mit curl auf lx
kinit max curl --proxy-negotiate -U : -x http://proxy.ad.it201.int:3128 -I https://www.debian.org tail -f /var/log/squid/access.log
- Im Log steht jetzt der Benutzer:
… 172.26.201.101 TCP_TUNNEL/200 … CONNECT www.debian.org:443 max HIER_DIRECT/…
Im Browser
- Firefox: about:config, network.negotiate-auth.trusted-uris = .ad.it201.int, dazu Proxy proxy.ad.it201.int Port 3128.
- Edge und Chrome unter Windows: Der Proxy muss in der Zone „Lokales Intranet“ liegen. Am einfachsten per Gruppenrichtlinie, dort auch den Proxy selbst verteilen.
Stolperfallen
- Proxy per IP eingetragen: Der Browser fragt nach Benutzer und Passwort oder bekommt einfach 407.
- SPN fehlt im AD: Der Client bekommt kein Ticket, im Log von squid steht kein Name.
- Keytab nicht lesbar: negotiate_kerberos_auth bricht ab. Im cache.log steht ein Fehler zur Keytab.
- Keytab nach Passwortwechsel: winbind schreibt sie neu. Danach Rechte prüfen, sonst kann squid sie nicht mehr lesen.
- Reihenfolge der http_access-Zeilen: Ein allow weiter oben lässt alle durch, bevor die Anmeldung geprüft wird.
Übungen
Grundübungen
- Tragen Sie den SPN HTTP/proxy.ad.it2XX.int ein und erzeugen Sie die Keytab für squid.
- Richten Sie die Anmeldung per Negotiate ein und testen Sie mit curl von lx.
- Prüfen Sie im access.log, ob der Benutzername erscheint.
- Lassen Sie nur Mitglieder der Gruppe internet surfen. Testen Sie mit einem Benutzer außerhalb der Gruppe.
- Richten Sie Firefox auf lx so ein, dass er ohne Passwortabfrage durch den Proxy geht.
Vertiefung
- Verteilen Sie den Proxy und die Intranet-Zone per Gruppenrichtlinie an win11.
- Schauen Sie mit tcpdump auf proxy, was der Browser im Header Proxy-Authorization schickt.
- Was passiert, wenn das Ticket von max abläuft, während der Browser offen ist?
Fehlersuche
- 1. curl bekommt immer 407 Proxy Authentication Required
max hat kein Ticket (klist), oder der Proxy wird per IP angesprochen, oder der SPN fehlt im AD. Mit kvno HTTP/proxy.ad.it2XX.int auf lx prüfen, ob es ein Ticket gibt.
- 2. Im cache.log steht
- gss_acquire_cred() failed: No credentials were supplied
squid kann die Keytab nicht lesen oder findet darin keinen passenden Eintrag. ls -l /etc/squid/HTTP.keytab und klist -k /etc/squid/HTTP.keytab
- 3. Die Anmeldung klappt, aber jeder darf surfen, auch ohne die Gruppe internet
In der Haupt-squid.conf steht vor den eigenen Regeln schon http_access allow localnet. Die Reihenfolge der Regeln prüfen.