Linux als Mitglied einer Windows Domäne

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

Winbind2PAM

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.keytab

In 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.keytab

In 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

Leave a Reply