Squid mit Kerberos

Aus Xinux Wiki
Version vom 18. Oktober 2026, 16:46 Uhr von Thomas.will (Diskussion | Beiträge) (Neue Seite (Kurs Linux - Samba))
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen
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

  1. Tragen Sie den SPN HTTP/proxy.ad.it2XX.int ein und erzeugen Sie die Keytab für squid.
  2. Richten Sie die Anmeldung per Negotiate ein und testen Sie mit curl von lx.
  3. Prüfen Sie im access.log, ob der Benutzername erscheint.
  4. Lassen Sie nur Mitglieder der Gruppe internet surfen. Testen Sie mit einem Benutzer außerhalb der Gruppe.
  5. Richten Sie Firefox auf lx so ein, dass er ohne Passwortabfrage durch den Proxy geht.

Vertiefung

  1. Verteilen Sie den Proxy und die Intranet-Zone per Gruppenrichtlinie an win11.
  2. Schauen Sie mit tcpdump auf proxy, was der Browser im Header Proxy-Authorization schickt.
  3. 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.

Vertiefung

Weiter