Der Linux Host
Ich gehe beim Linux Host von Ubuntu aus aber Debian sollte hier genauso funktionieren. In meinem Test Setup hatte ich gemischte Linux Maschinen (Debian & Ubuntu) verwendet. Andere Kombinationen sollten aber auch funktionieren können sich dann allerdings für andere Distributionen ggfs. in der Konfiguration anders gestalten.
Um also unseren Linux Host in den snakeoil.org Realm zu bringen installiert man zunächst die winbind & krb5-user Pakete, winbind dient in erste Linie dazu Benutzer und Gruppen aus dem Realm den Linux Maschinen bekannt zu machen. Wer zusätzlich Samba als Dateifreigabe verwenden möchte kann vorher noch samba-common installieren, darauf gehe ich hier aber zunächst nicht näher ein. Zwar installiert winbind auch libkrb5 aber zusätzlich brauchen wir noch ein paar Tools dazu:
me@myComputer:~$ sudo apt-get install \ winbind \ libpam-winbind \ libnss-winbind \ krb5-user \ krb5-config \ libpam-krb5
Dann legen wir die /etc/samba/smb.conf Datei an die winbind mitteilt wo was zu finden ist:
me@myComputer:~$ cat /etc/samba/smb.conf [global] netbios name = [HOSTNAME] realm = SNAKEOIL.ORG workgroup = SNAKEOIL security = ADS encrypt passwords = yes password server = * idmap config * : backend = tdb idmap config * : range = 1-9999 idmap config SNAKEOIL : backend = ad idmap config SNAKEOIL : schema_mode = rfc2307 idmap config SNAKEOIL : range = 10000-19999 winbind nss info = rfc2307 winbind enum users = yes winbind enum groups = yes winbind offline logon = yes preferred master = no winbind nested groups = Yes winbind use default domain = Yes max log size = 50 log file = /var/log/samba/log.%m log level = 3 allow trusted domains = No client use spnego = Yes kerberos method = secrets and keytab dedicated keytab file = /etc/krb5.keytab winbind refresh tickets = true name resolve order = lmhosts host ...
Anschließend geben wir noch den Kerberos-Bibliotheken folgende Konfiguration:
me@myComputer:~$ cat /etc/krb5.conf [libdefaults] ticket_lifetime = 36000 default_realm = snakeoil.org dns_lookup_kdc = true # The following krb5.conf variables are only for MIT Kerberos. krb4_config = /etc/krb.conf krb4_realms = /etc/krb.realms kdc_timesync = 1 ccache_type = 4 forwardable = true proxiable = true # The following encryption type specification will be used by MIT Kerberos # if uncommented. In general, the defaults in the MIT Kerberos code are # correct and overriding these specifications only serves to disable new # encryption types as they are added, creating interoperability problems. # # Thie only time when you might need to uncomment these lines and change # the enctypes is if you have local software that will break on ticket # caches containing ticket encryption types it doesn't know about (such as # old versions of Sun Java). # # default_tgs_enctypes = des3-hmac-sha1 # default_tkt_enctypes = des3-hmac-sha1 # permitted_enctypes = des3-hmac-sha1 default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 des3-cbc-sha1 arcfour-hmac-md5 des-cbc-crc des-cbc-md5 des-cbc-md4 default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 des3-cbc-sha1 arcfour-hmac-md5 des-cbc-crc des-cbc-md5 des-cbc-md4 permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 des3-cbc-sha1 arcfour-hmac-md5 des-cbc-crc des-cbc-md5 des-cbc-md4 # The following libdefaults parameters are only for Heimdal Kerberos. v4_instance_resolve = false v4_name_convert = { host = { rcmd = host ftp = ftp } plain = { something = something-else } } fcc-mit-ticketflags = true [realms] SNAKEOIL.ORG = { kdc = dc.snakeoil.org admin_server = dc.snakeoil.org kpasswd_server = dc.snakeoil.org kpasswd_protocol = SET_CHANGE default_domain = dc.org } [domain_realm] *.snakeoil.org = SNAKEOIL.ORG .snakeoil.org = SNAKEOIL.ORG snakeoil.org = SNAKEOIL.ORG [login] krb4_convert = true krb4_get_tickets = false [appdefaults] pam = { debug = false ticket_lifetime = 3600 renew_lifetime = 3600 forwardable = true krb4_convert = false } [logging] default = FILE:/var/log/krb5.log kdc = FILE:/var/log/krb5_kdc.log
Unter den Konfigurationen [realms] & [domain_realm] sollte man beim Realm-Namen die Groß- & Kleinschreibung beachten. Nun können wir wenn alles stimmt die Linux Maschine in die Domäne bringen mit:
me@myComputer:~$ sudo service winbind restart me@myComputer:~$ sudo net ads join -U Administrator
Wobei man nicht zwingend das Administrator-Konto des DCs nehmen muss, jedes Domänen-Administrator-Konto sollte dafür reichen.
Achtung!
Hier ist die Rede von Konten aus der Domäne des Windows Servers also des Realms. Ein lokales Administrator-Konto kann durchaus parallel mit einem anderen Passwort koexistieren. Diese sollten nicht verwechselt werden.
Anschließend wird man nach dem Passwort dieses Kontos gefragt, sollte alles glatt gegangen sein können wir mit wbinfo erstmal prüfen ob wir es in die Domäne geschafft haben:
me@myComputer:~$ wbinfo -t checking the trust secret for domain SNAKEOIL via RPC calls succeeded
Erhält man diese Meldung dann sind wir schonmal einen großen Schritt weiter, es bedeutet das die Linux Maschine nun ein Mitglied der Domäne ist. Nun kann man noch prüfen ob Benutzer & Gruppen aus dem Realm auf der Linux Maschine verfügbar sind.
me@myComputer:~$ # für Benutzer me@myComputer:~$ wbinfo -u administrator guest support_388945a0 krbtgt iusr_mydc iwam_mydc ... me@myComputer:~$ # & Gruppen me@myComputer:~$ wbinfo -g helpservicesgroup telnetclients wins users domain computers domain controllers schema admins enterprise admins cert publishers domain admins domain users domain guests group policy creator owners ras and ias servers dnsadmins dnsupdateproxy iis_wpg certsvc_dcom_access dhcp users dhcp administrators sqlserver2005mssqluser$ragnarok$sqlexpress wsus reporters wsus administrators ...
Zwar sind Benutzer & Gruppen der Domäne jetzt über Winbind für die Linux Maschine abrufbar das bedeutet aber noch nicht das diese auch verwendet werden können. Denn Winbind dient in erster Linie dazu die Verbindung zur Domäne zu gewährleisten und die ID Mappings zu regeln, damit die Benutzer und Gruppen der Domäne auch auf der Linux Maschine verwendbar sind müssen diese erst in der Liste der gewöhnliche Benutzer des Linux Systems auftauchen:
me@myComputer:~$ getent passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh ...
Leider sind am Ende der Liste noch keine Domänen-Benutzer sichtbar. Um das zu bewerkstelligen fügen wir in der nsswitch.conf-Datei noch winbind zur Auflistung der Benutzer & Gruppen unter passwd und group hinzu, normalerweise sieht diese so oder so ähnlich aus:
me@myComputer:~$ cat /etc/nsswitch.conf # /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # If you have the `glibc-doc-reference' and `info' packages installed, try: # `info libc "Name Service Switch"' for information about this file. passwd: compat group: compat shadow: compat hosts: files dns wins mdns4 networks: files dns protocols: db files services: db files ethers: db files rpc: db files netgroup: nis
Wir ändern diese Zeilen wie folgt um:
... passwd: compat winbind group: compat winbind ...
Achtung!
Damit diese Einstellungen wirksam sind ist das Paket libnss-winbind erforderlich.
Der lokalen PAM Authentifizierung der Linux Maschine machen wir die Benutzer der Domäne ebenfalls zugänglich, dazu integriert man auch dort Winbind per:
me@myComputer:~$ pam-auth-update
Anschließend setzt man, im folgende Dialog, die Option Winbind NT/Active Directory authentication
Achtung!
Sollte das gewünschte PAM Modul nicht auftauchen muß man ggfs. noch das Paket libpam-winbind installieren.
Das überprüfen wir mit einem Blick in /etc/pam.d/common-auth:
me@myComputer:~$ cat /etc/pam.d/common-auth # # /etc/pam.d/common-auth - authentication settings common to all services # ... # here are the per-package modules (the "Primary" block) auth [success=2 default=ignore] pam_unix.so nullok_secure auth [success=1 default=ignore] pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass ...
Man sieht hier dass das Modul pam_winbind.so samt Kerberos Bibliotheken eingefügt wurde.
Achtung!
Ein hartnäckiger Bug im libpam-winbind Paket kann u.U. eine erfolgreiche Anmeldung verhindern, nähmlich dann wenn die Kerberos Schlüsseltabelle in /etc/krb5.keytab lediglich Zugriffsberechtigungen für den Benutzer root enthält.-rw------- 1 root root 1.1K Oct 27 20:28 /etc/krb5.keytabIn der Regel sollte das auch so sein, funtkioniert aber nicht zuverlässig. (vgl. Samba 4.1.13+dfsg-2)
Ein Workaround besteht darin auch der Gruppe root zumindest Leseberechtigungen zu erteilen. Das klingt zwar seltsam funtkioniert aber zumindest unter Debian basierten Systemen tatsächlich.me@myComputer:~$ chmod g+r /etc/krb5.keytabIn Internet findet man auch oft einen Workaround der empfiehlt die krb5_auth krb5_ccache_type=FILE Argumente aus der Zeile:
auth [success=1 default=ignore] pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass
zu entfernen allerdings funktioniert dann der Signle-SignOn Mechanismus über GSSAPI bei Kerberos Authentifizierung nicht mehr weil Winbind logischerweise, aufgrund des fehlenden Arguments, diese gar nicht mehr vornimmt.
Allerdings bekommt man beim getent Aufruf noch keine Domänen-Benutzer zu sehen weil diese dafür auf dem Windows Server erstmal konfiguriert sein müssen, doch dazu später mehr.
Im folgenden Aftermath beleuchten wir die einzelnen Konfigurationsoptionen der smb.conf im Detail.
Quellen:
https://blogs.iis.net/brian-murphy-booth/the-biggest-mistake-serviceprincipalname-s
Google: request wbcLogonUser WBC_ERR_AUTH_ERROR NT_STATUS_CONNECTION_DISCONNECTED
Samba Bugzilla #10490
Launchpad Bug #1310919