Bug 25771 - Squid und Samba 4
Squid und Samba 4
Status: CLOSED FIXED
Product: UCS@school
Classification: Unclassified
Component: Proxy services
unspecified
Other Linux
: P5 normal (vote)
: UCS@school 3.0 MS1
Assigned To: Felix Botner
Arvid Requate
:
: 25804 (view as bug list)
Depends on:
Blocks: 24281
  Show dependency treegraph
 
Reported: 2012-01-06 16:42 CET by Stefan Gohmann
Modified: 2012-06-11 06:29 CEST (History)
2 users (show)

See Also:
What kind of report is it?: ---
What type of bug is this?: ---
Who will be affected by this bug?: ---
How will those affected feel about the bug?: ---
User Pain:
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number:
Bug group (optional):
Max CVSS v3 score:


Attachments
curl-ntlm-test.sh (798 bytes, text/x-sh)
2012-03-12 13:14 CET, Felix Botner
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Stefan Gohmann univentionstaff 2012-01-06 16:42:38 CET
Squid in UCS@school 3.0 muss SSO unterstützen, auch wenn Samba 4 verwendet wird.

Siehe auch:
 Bug #24281
 Bug #24277
Comment 1 Felix Botner univentionstaff 2012-01-10 16:19:59 CET
*** Bug 25804 has been marked as a duplicate of this bug. ***
Comment 2 Arvid Requate univentionstaff 2012-01-19 18:48:08 CET
Bei der Authentifikation per Samba4-ntlm_auth muss ntlm_auth aktuell mit setuid root installiert sein, sonst erhält man folgende Fehlermeldungen:

Unable to setup messaging listener for '/var/lib/samba/private/smbd.tmp/msg/msg.0:193676647.0':NT_STATUS_ACCESS_DENIED

Ein Test mit ntlm_auth3 schlägt hingegen direkt fehl:

2012/01/18 16:09:03.654| authenticateNTLMHandleReply: Failed validating user via NTLM. Error returned 'NT_STATUS_WRONG_PASSWORD'


Mit setuid Samba4-ntlm_auth scheitert der Proxy-Zugriff dann allerdings wegen der ldap_group ACL, da der ntlm_auth-Prozess als Benutzernamen "DOMAIN+user" zurückliefert und squid das dann so weiterverwendet. Das sieht man ich cache.log, wenn man in der squid3/squid.conf die Option "debug_options ALL,1 29,10 82,10" setzt:

2012/01/18 16:07:23.887| externalAclLookup: lookup in 'ldap_group' for 'ARUCSSCHOOL3+user1 www-access'

Vielleicht ist hier eine Option, einen python-Wrapper um ntlm_auth zu bauen, der den Gruppen-Teil abschneidet. Versuche, die Ausgabe von ntlm_auth über die smb.conf-Option "winbind use default domain = yes" zu ändern, waren leider erfolglos, vermutlich wird dieser Parameter nur von winbind3 (bzw. ggf. ntlm_auth3) ausgewertet.

Tests mit Kerberos stehen noch aus.
Comment 3 Felix Botner univentionstaff 2012-01-25 11:41:14 CET
Hier gibt es noch ein Problem mit dem Template:

univention-squid (5.1.3-1.149.201201242307) wird eingerichtet ...
File: /etc/squid3/squid.conf
  File "<stdin>", line 100
    if configRegistry['squid/ntlmauth'] == 'yes'
Comment 4 Arvid Requate univentionstaff 2012-01-25 13:03:31 CET
Der Template-Fehler ist behoben.
Comment 5 Arvid Requate univentionstaff 2012-01-25 16:13:02 CET
Tests mit Kerberos auf einem Samba4DC waren erfolgreich. Die Authentifikation per NTLM/Winbind/Samba4 ist hingegen aktuell nicht stabil, siehe Bug #24281.
Comment 6 Arvid Requate univentionstaff 2012-01-31 21:20:16 CET
Authentifikation per NTLM gegen windbind4 funktioniert bisher nicht stabil, sie Bug #24281. Eine Alternative ist der Einsatz des source3/winbindd unter Samba4. Laut upstream-Aussage ist winbind4 auf Samba4-DCs insbesondere für Forest-Szenarien notwendig, was aktuell nicht relevant ist. Der source3/winbindd verhielt sich in den ersten Tests stabil.

Authentifikation per Kerberos funktioniert mit den Anpassungen aus Bug #24277 auch mit Firefox. Auch mit Squid3 auf Memberservern, die in eine Samba4-Domäene gejoint sind, funktionierte das. Wenn das benötigt wird, muss hier noch univention-python-heimdal Version 4.0.3-2 per Cherrypick in den ucsschool Scope übernommen werden, damit der Code zum Anlegen der Keytab ohne Samba4 funktioniert.
Comment 7 Arvid Requate univentionstaff 2012-02-02 17:58:30 CET
NTLM-Authentifikation ist jetzt über Bug #24281 umgesetzt. Der Bug bleibt noch offen bis entschieden ist, ob Kerberos-Suuport wegen IP-basiertem Caching und Performance wieder herausgenommen wird. Falls es drin bleibt, wäre es sinnvoll für den Fall gleichzeitiger Verwendung von Kerberos und NTLM den http://sourceforge.net/projects/squidkerbauth/files/negotiate_wrapper in das squid3-Paket mit aufzunehmen. negotiate_wrapper ist vom gleichen Autor wie der squid_kerb_auth Helper in squid3 und wird als Teil von squid-3.2 standardmäßig mit ausgeliefert (siehe http://bugs.debian.org/656304).
Comment 8 Felix Botner univentionstaff 2012-03-12 13:11:36 CET
Wir werden nun ein eigenes Python Skript "squid_ldap_ntlm_auth" mitbringen, welches die NTLM Authentifizierung umsetzt. Dieses Skript fungiert als Authentifizierungs-Modul für den Squid, ähnlich wie ntlm_auth. Der Unterschied ist, dass das Python Skript die NT Hashes aus dem LDAP bezieht, die Authentifizierungs-Hashes damit selbst erzeugt und diese mit den Hashes vom Client vergleicht.

Vorteil:
   * Authentifizierung ohne winbind/samba/ntlm_auth 
   * squid auth_param children können beliebig gesetzt werden
Nachteil:
   * wir müssen uns um die NTLM Authentifizierung kümmern

Unterstützt werden im Skript nur NTLM, NTLM2 und NTLMv2 (keine Hashes auf Basis den LM Hash!).

Damit sollte die NTLM Authentifizierung gegen den Squid unabhängig von der eingesetzten Samba Version funktionieren (samba bzw winbind etc werden gar nicht mehr verwendet).

"squid_ldap_ntlm_auth" holt sich die NT Password Hashes über den Maschinen-Account. Zusätzlich gibt es einen Passwort "Cache" in dem Passwörter standardmäßig 1h gespeichert werden um die LDAP Anfragen zu minimieren.

Die Parameter für "squid_ldap_ntlm_auth" sind folgende:
 
  -d DOMAIN, --domain=DOMAIN
                        domain in ntlm authentication
  -c CACHELIFETIME, --cache-lifetime=CACHELIFETIME
                        password cache lifetime (3600)
  -t, --debug           debug modus (Attention, cleartext password hashes!)
  -f, --debug-file      debug file (/tmp/squid-ntlm-auth.log)

Mit "-d" wird die Domäne angegeben, aus der sich Benutzer anmelden können. Ist keine Domäne angegeben, wird diese auch nicht geprüft (dann können z.B. ungejointe Clients eine NTLM Authentifizierung durchführen.)

Tests:

Getestet wurde das ganze bisher mit Win7 (NTLMv2), WinXP (NTLM2), jeweils mit IE und Firefox und curl (NTLM, falls NTLM 2 Message die Negotiate Flags entsprechend gesetzt hat).

Die Geschwindigkeit scheint ausreichend (wurde mit dem angehängten Testscript ermittelt).

15 children in squid.conf und 40x60 curl Prozesse im Testscript

(1) 2.4 ntlm_auth mit ipauth            -> 10s
(2) 2.4 ntlm_auth ohne ipauth           -> 33s
(3) 3.0 mit py ntlm (ohne ipauth)       -> 15s
(4) 3.0 mit py ntlm (return dummy user) -> 14s

Die 2.4 Version mit dem ipauth Cache ist zwar trotzdem noch etwas schneller, jedoch kann man im Python Script wahrscheinlich nicht mehr viel rausholen. In Test (4) wurde in der "Hauptschleife" einfach nur den ein fester Benutzername zurückgegeben (also keine LDAP Lookup, keine Berechnung der Hashes etc.)und dieser war ungefähre genauso schnell wie Test (3).
Ein Äquivalent zu ipauth in den Squid3 einzubauen scheint mir daher nicht sinnvoll.

univention-squid:

Das Skript wird von univention-squid nun als  
/usr/lib/squid3/squid_ldap_ntlm_auth mitgebracht und bei der NTLM Authentifizierung standardmäßig verwendet. Über die UCR Variable "squid/ntlmauth/tool" kann man jedoch konfigurieren, welches Tool (welche Optionen) der squid bei der der NTLM Authentifizierung einsetzt.

Zusätzlich wurde die basic -> ntlm_auth (früher squid/basicauth), die squid/ldapauth und die squid/ipauth Konfiguration entfernt. Es gibt jetzt noch folgende Möglichkeiten für die Authentifizierung am Squid:

negotiate -> /usr/lib/squid3/squid_kerb_auth (squid/krb5auth)
ntlm      -> /usr/lib/squid3/squid_ldap_ntlm_auth (squid/ntlmauth)
basic     -> /usr/lib/squid3/squid_ldap_auth (squid/basicauth)

QA:

Zunächst sollte nochmal kurz geschaut werden, ob die Berechnung der Hash in /usr/lib/squid3/squid_ldap_ntlm_auth sinnvoll ist oder ob es hier irgendwelche groben Schnitzer gibt.

Zusätzlich müssten man nochmal diverse (NTLM) Clients bzw. Windows Versionen getestet werden um sicherzugehen, das die NTLM Authentifizierung prinzipiell funktioniert.

Mit dem angehängten Testscript sollten dann noch "Belastungstests" gemacht werden. Ebenso mit einem Windows Client (hier kann man beispielsweise viele Anfragen erzeugen, wenn man im Firfox die History komplett neu öffnet). 

Bei den Tests sollte auch immer mit einem 2.4 mit ntlm_auth verglichen werden, da der Squid bei zu vielen Anfragen die Authentifizierungstools einfach neu startet, in /var/log/squid3/cache.log sieht man dann folgendes:
FATAL: Too many queued ntlmauthenticator requests
Squid Cache (Version 3.1.6): Terminated abnormally.
Comment 9 Felix Botner univentionstaff 2012-03-12 13:14:43 CET
Created attachment 4262 [details]
curl-ntlm-test.sh
Comment 10 Stefan Gohmann univentionstaff 2012-03-13 07:36:11 CET
Auf einem UCS@school Salve (nicht gejoint) bekomme ich bei der Installation folgende Meldung:

univention-squid (5.0.8-1.169.201203121107) wird eingerichtet ...
File: /etc/squid3/squid.conf
Traceback (most recent call last):
  File "<stdin>", line 62, in <module>
TypeError: cannot concatenate 'str' and 'NoneType' objects
File: /etc/security/packetfilter.d/20squid
File: /etc/default/squid3
adduser: Die Gruppe »winbindd_priv« existiert nicht.
Not updating squid/transparentproxy
Create squid/cache
Create squid/debug/level
File: /etc/squid3/squid.conf
Traceback (most recent call last):
  File "<stdin>", line 62, in <module>
TypeError: cannot concatenate 'str' and 'NoneType' objects
Comment 11 Stefan Gohmann univentionstaff 2012-03-13 07:50:58 CET
Auf einem Slave:

RUNNING 98univention-squid-samba4.inst 
ERROR(ldb): Failed to add user 'http-proxy-slave102':  - ../source4/dsdb/samdb/ldb_modules/ridalloc.c:494: No RID Set DN - Remote RID Set allocation needs refresh
ERROR: samAccountName not found for service account http-proxy-slave102
EXITCODE=1
Comment 12 Felix Botner univentionstaff 2012-03-13 11:32:34 CET
(In reply to comment #10)
> Auf einem UCS@school Salve (nicht gejoint) bekomme ich bei der Installation
> folgende Meldung:
> 
> univention-squid (5.0.8-1.169.201203121107) wird eingerichtet ...
> File: /etc/squid3/squid.conf
> Traceback (most recent call last):
>   File "<stdin>", line 62, in <module>
> TypeError: cannot concatenate 'str' and 'NoneType' objects
> File: /etc/security/packetfilter.d/20squid
> File: /etc/default/squid3
> adduser: Die Gruppe »winbindd_priv« existiert nicht.
> Not updating squid/transparentproxy
> Create squid/cache
> Create squid/debug/level
> File: /etc/squid3/squid.conf
> Traceback (most recent call last):
>   File "<stdin>", line 62, in <module>
> TypeError: cannot concatenate 'str' and 'NoneType' objects

Das Template ist repariert.
Comment 13 Stefan Gohmann univentionstaff 2012-03-15 06:51:11 CET
(In reply to comment #11)
> Auf einem Slave:
> 
> RUNNING 98univention-squid-samba4.inst 
> ERROR(ldb): Failed to add user 'http-proxy-slave102':  -
> ../source4/dsdb/samdb/ldb_modules/ridalloc.c:494: No RID Set DN - Remote RID
> Set allocation needs refresh
> ERROR: samAccountName not found for service account http-proxy-slave102
> EXITCODE=1

Damit der Benutzer zukünftig direkt im UCS LDAP angelegt wird gibt es Bug #26508.
Comment 14 Felix Botner univentionstaff 2012-03-15 10:22:59 CET
In UCS@school wird standardmäßig NTLM und BASIC Authentifizierung am Squid unterstützt.
Comment 15 Arvid Requate univentionstaff 2012-03-19 17:48:18 CET
Verified:
 * Die NTLM-Authentifikation funktioniert, auch wenn man den Client auf NTLMv2 only umschaltet.
 * Basic Auth funktioniert ebenfalls.
 * Changelog OK.

Bekannte Einschränkungen:
 * Falls squid/ntlmauth=yes, dann gibt es keinen Fallback auf basic. D.h. Authentifizierung von Benutzern ohne samba-Option scheitert dann dauerhaft.

Verbesserungsvorschläge:
 * Changelog Eintrag
 * chmod 500 auf das debug logfile
 * ggf. python logging Modul verwenden
 * Copyright Notiz sollte angepasst werden.
Comment 16 Felix Botner univentionstaff 2012-03-20 10:41:18 CET

> Verbesserungsvorschläge:
>  * Changelog Eintrag

ergänzt

>  * chmod 500 auf das debug logfile

wird jetzt auf 0600 gesetzt

>  * ggf. python logging Modul verwenden

hab ich jetzt nicht gemacht, jedoch wurde in den Funktionen jetzt selbst die debug Option geprüft, teilweise wurden debug Meldungen zusammengefasst, so dass nun nicht mehr so viele Tests auf die debug Option gemacht werden sollte.

>  * Copyright Notiz sollte angepasst werden.

ok
Comment 17 Arvid Requate univentionstaff 2012-03-26 12:03:48 CEST
Verified.
Comment 18 Stefan Gohmann univentionstaff 2012-06-11 06:29:53 CEST
UCS@school 3.0 wurde veröffentlicht. Sollte der hier beschriebene Bug mit einer  neueren Version von UCS@school erneut auftreten, so sollte dieser Bug dupliziert werden: "Clone This Bug"