Samba 4 als AD Controller einrichten

Submitted by admin on So, 11.12.2016 - 11:45

1438431786321-samba_logo.png

Samba 4 kann in den meisten Fällen als Ersatz für einen Windows Server verwendet werden, damit erhält man in einem Windows Netz die typischen Eigenschaften von Active Directory:

  • Single Sign On
  • Gruppenrichtlinien
  • Zentrale Administration der Windows Clients
  • Fileserver
  • Printserver

Erkauft wird das allerdings mit einer etwas aufwändigen Installation des Servers, was aber duch den Mehrwert von Linux oder FreeBSD aufgewogen wird.

  • Stabiles und gut skalierendes Filesystem, z.B. EXT4, XFS oder im Fall von FreeBSD ZFS
  • Bessere Kerberos Integration
  • Nicht nur für Windows nutzbar
  • Einfachere Updates durch Linux oder FreeBSD Paketmanagement
  • Schnellere Verfügbarkeit von sicherheitsrelevanten Updates
  • Bei Linux: Selinux Unterstützung

Installation

Wer die neusten Features braucht, wird nicht umhin kommen, den Samba Source selbst zu compilieren. Es wird hier die Installation unter Ubuntu 14.04LTS beschrieben. Zunächst werden die folgenden Pakete installiert, damit Samba compiliert werden kann.

gcc
g++
make
comerr-dev
dpkg-dev
golang-openldap-dev
libacl1-dev
libaio-dev
libasprintf-dev:amd64
libattr1-dev:amd64
libavahi-client-dev
libavahi-common-dev
libblkid-dev
libbsd-dev
libc-dev-bin
libc6-dev:amd64
libcups2-dev
libdbus-1-dev:amd64
libdm0-dev
libexpat1-dev:amd64
libfam-dev
libgcc-4.8-dev:amd64
libgcrypt11-dev
libgettextpo-dev:amd64
libgnutls-dev
libgpg-error-dev
libkrb5-dev
libldap2-dev:amd64
libncurses5-dev:amd64
libp11-kit-dev
libpam0g-dev:amd64
libpopt-dev:amd64
libpython-dev:amd64
libpython2.7-dev:amd64
libreadline-dev:amd64
libreadline6-dev:amd64
libssl-dev:amd64
libstdc++-4.8-dev:amd64
libtasn1-6-dev
libtinfo-dev:amd64
linux-libc-dev:amd64
manpages-dev
python-dev
python2.7-dev
uuid-dev
xfslibs-dev
zlib1g-dev:amd64

Im nächsten Schritt werden die Sourcen beschafft und Samba compiliert.

wget http://www.samba.org/samba/ftp/samba-latest.tar.gz
tar xvf samba-latest.tar.gz
cd samba-*<version>*
./configure --enable-selftest && make && make install

Hat alles geklappt, dann findet man unter /usr/local/samba seine Installation vor.

Konfiguration

Bevor man irgend etwas konfiguriert, sollte man sich einige Gedanken zu seiner Active Directory Infrastruktur gemacht haben. Folgende Fragen müssen vor allen weiteren Schritten beantwortet werden:

  • DNS Struktur, wie soll meine Domain heißen? Es sollte keine Überschneidungen mit den bei ICANN bekannten TLDs geben. Welche Domains man nicht verwenden sollte, kann unter http://data.iana.org/TLD/tlds-alpha-by-domain.txt eingesehen werden. Auch die Domain *.local’ sollte man vermeiden, wenn man Zeroconf nutzen will. Grundsätzlich kann man auch einfach eine offizielle Domain registrieren und davon eine Subdomain benutzen, z.B. myad.felsing.net
  • LDAP Struktur, wie ist meine Organisation aufgebaut? Wie könnte sie sich einmal ändern? Die LDAP Struktur ist weiterhin wichtig für den Gültigkeitsbereich von Gruppenrichtlinien.

Die selben Fragen sollten auch bei der Verwendung eines Windows Server für AD beantwortet werden. Jetzt kann der erste Server der AD Struktur generiert werden.

samba-tool domain provision --realm=MYAD.FELSING.NET --domain=MYAD --adminpass='MeinSupergeheimesPasswortDontUseThis' --dns-backend=SAMBA_INTERNAL --server-role=dc --function-level=2008_R2 --use-xattr=yes --use-rfc2307 --host-ip=192.168.1.1 --simple-bind-dn=MYAD.FELSING.NET --ipaddress=192.168.1.1

Der Vorgang dauert etwas länger, weil Samba die ganzen Strukturen für DNS, LDAP und Kerberos neu generiert. Im nächsten Schritt wird die Konfiguration noch etwas optimiert, damit alles wie erwartet funktioniert und sich auch Linux Maschinen in unser neues AD integrieren lassen. Dazu wird /usr/local/samba/etc/smb.conf wie folgt angepasst:

# Global parameters
[global]
	workgroup = MYAD
	realm = MYAD.FELSING.NET
	netbios name = ADMIN
	server role = active directory domain controller
	server services = s3fs, winbind, rpc, nbt, wrepl, cldap, ldap, kdc, drepl, ntp_signd, kcc, dnsupdate, dns
	dcerpc endpoint servers = epmapper, wkssvc, rpcecho, samr, netlogon, lsarpc, spoolss, drsuapi, dssetup, unixinfo, browser, eventlog6, backupkey, dnsserver, remote, winreg, srvsvc

	dns forwarder = 192.168.1.42

	spoolss: architecture = Windows x64

	load printers = yes
	printing = cups


	idmap_ldb:use rfc2307 = yes
	idmap config *:backend = tdb
	idmap config *:range = 2000-9999
	idmap config MYAD:backend = ad
	idmap config MYAD:schema_mode = rfc2307
	idmap config MYAD:range = 10000-99999

	winbind nss info = rfc2307
	winbind trusted domains only = no
	winbind use default domain = yes
	winbind enum users  = yes
	winbind enum groups = yes
	winbind refresh tickets = Yes


[netlogon]
	path = /usr/local/samba/var/locks/sysvol/myad/scripts
	read only = No

[sysvol]
	path = /usr/local/samba/var/locks/sysvol
	read only = No

[printers]
	path = /var/spool/samba
	printable = yes
	printing = CUPS
	writeable = yes
	browseable = Yes

[print$]
	path = /var/lib/samba/Printer_drivers
	comment = Printer Drivers
	writeable = yes

[install]
	path = /var/lib/samba/install
	read only = No

In der o.g. Samba Config ist noch ein DNS Forwarder eingerichtet, dabei handelt es sich um einen DNS Server, der Anfragen beantwortet, die unser Samba Server nicht kennt. Bei diesem DNS Forwarder handelt es sich entweder um einen internen Root DNS oder die Firewall, die dann auch Anfragen für Internet Domains beantwortet.

Jetzt brauchen wir noch ein Start-/Stopskript, dazu wird /etc/init.d/my-samba erstellt:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          samba4
# Required-Start:    $remote_fs $syslog $network
# Required-Stop:     $remote_fs $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Samba4
# Description:       Samba4
### END INIT INFO

# Author: Christian Felsing <hostmaster@***>

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="samba4"
NAME=samba
DAEMON=/usr/local/samba/sbin/$NAME
DAEMON_ARGS=""
PIDFILE=/usr/local/samba/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
		|| return 1
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
		$DAEMON_ARGS \
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"
}


case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  status)
	status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
	;;
  restart|force-reload)
	#
	# If the "reload" option is implemented then remove the
	# 'force-reload' alias
	#
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
		# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
	exit 3
	;;
esac

:

Damit können wir unseren neuen Samba Server mit /etc/init.d/my-samba starten. Im Erfolgsfall sollte ein lsof -i -P -n|grep samba zahlreiche offene Ports anzeigen. Mit samba-tool user list solte bereits eine Userliste zu sehen sein.

Ein dig myad.felsing.net @127.0.0.1 sollte ebenfalls eine sinnvolle Antwort geben, nämlich die IP Adresse unseres neu eingerichteten AD Servers. Wenn das erfolgreich war, dann sollte in der /etc/resolv.conf als Nameserver 127.0.0.1 angegeben werden.

Linux User und AD User

Das Linux System muss die AD User kennen, das filt auch für das Filesystem.

Filesystem

Das Filesystem muss mit den Attributen user_xattr und acl gemountet sein, das muss ggf. in der /etc/fstab angepasst werden, z.B.

UUID="deadbeef-13db-4008-8d83-c01dc0ffee076b"	/usr/local/samba	ext4	defaults,noatime,nodiratime,user_xattr,acl,barrier=1 0 0

User-/Gruppendatenbank

Zunächst ist das File /etc/ld.so.conf.d/my-samba4.conf zu erstellen

/usr/local/samba/lib

Mit ldconfig -v|grep winbind wird die neue Library bekannt gemacht, so dass nss auch mit Winbind etwas anfangen kann.

Die Datei /etc/nsswitch.conf ist wie folgt anzupassen:

passwd:         compat winbind
group:          compat winbind

Ein getent passwd sollte jetzt auch die AD User anzeigen.

# getent passwd
root:x:0:0:root:/root:/bin/bash
...
johndoe:x:1001:1001::/home/johndoe:
MYAD\Administrator:*:0:100::/home/MYAD/Administrator:/bin/false
MYAD\Guest:*:3000011:3000012::/home/MYAD/Guest:/bin/false
...

DHCP Server

Wird ein DHCP Server verwendet, dann sollte dieser als Nameserver den AD Server liefern, sonst wird das nichts mit der Einrichtung von AD auf den Windows Clients. DHCP ist nicht Aufgabe von Samba.

Windows

Es sollte nun möglich sein, einen Windows PC in die neue AD Domain aufzunehmen. Wie das geht, dazu sei auf die Dokumentation von Microsoft verwiesen. Zur Administration ist es weiterhin sinnvoll, die Remote Administration Tools für Windows zu installieren.

Kerberos

Es ist sinnvoll eine Kerberos Config anzulegen, das erfolgt mit dem File /etc/krb5.conf

[libdefaults]
    default_realm = MYAD.FELSING.NET
    dns_lookup_realm = false
    dns_lookup_kdc = true

Testen kann man das mit

kinit administrator@MYAD.FELSING.NET

Es wird nach dem AD Passwort gefragt, danach sollte man ein Kerberos Ticket haben.

Weiteren DC erstellen

Aus Redundanzgründen sollte unbedingt ein zweite Domain Controller aufgesetzt werden. Dieser verfügt über eine Kopie aller AD Funktionen, so dass ein Controller ausfallen darf und die Clients dann noch funktionieren. Zunächst brauchen wir wieder smb.conf

[global]
	workgroup = MYAD
	realm = myad.felsing.net
	netbios name = AD2
	server role = active directory domain controller
	dns forwarder = 192.168.1.42

	auth methods = sam, winbind
	server services = s3fs, winbind, rpc, nbt, wrepl, cldap, ldap, kdc, drepl, ntp_signd, kcc, dnsupdate, dns
	dcerpc endpoint servers = epmapper, wkssvc, rpcecho, samr, netlogon, lsarpc, spoolss, drsuapi, dssetup, unixinfo, browser, eventlog6, backupkey, dnsserver, remote, winreg, srvsvc


	idmap_ldb:use rfc2307 = yes
	idmap config *:backend = tdb
	idmap config *:range = 2000-9999
	idmap config AUTH : backend = ad
	idmap config AUTH : range = 10000-99999
	idmap config AUTH : schma_mode = rfc2307

	winbind nss info = rfc2307
	winbind trusted domains only = no
	winbind use default domain = yes
	winbind enum users  = yes
	winbind enum groups = yes
	winbind refresh tickets = Yes

[netlogon]
	path = /usr/local/samba/var/locks/sysvol/myad/scripts
	read only = No

[sysvol]
	path = /usr/local/samba/var/locks/sysvol
	read only = No

Jetzt kann unser zweite AD Controller in die Domain aufgenommen werden.

samba-tool domain join myad.felsing.net DC -U Administrator@auth.lan

Es sei jedoch darauf hingewiesen, dass keine Sysvol Replikation stattfindet. Das kann man aber leicht mit rsync und Cron erstellen.

Nützliche Skripte

Passwort Regeln

Die Windows Passwortregeln sind gerade bei Tests etwas nervig. Zunächst kann man sie deaktivieren, in den Gruppenrichtlinien kann man passend zur OU neue Regeln festlegen.

samba-tool domain passwordsettings set --complexity=off
samba-tool domain passwordsettings set --history-length=0
samba-tool domain passwordsettings set --min-pwd-age=0
samba-tool domain passwordsettings set --max-pwd-age=0

Das Admin Passwort sollte auch kein Expire haben

samba-tool user setexpiry administrator --noexpiry

Datenbank prüfen

Im Falle von Problemen sollte zunächst die Integrität der Datenbank geprüft werden, das sollte man auh bei jedem Samba Update machen.

samba-tool dbcheck
samba-tool dbcheck --cross-ncs

Passwort setzen

User vergessen immer wieder ihre Passwörter, das kann man in Samba direkt einfach neu setzen

samba-tool user setpassword 'john.doe'

Keytab für Host extrahieren

Hat man im AD einen Server angelegt und dieser seine Auth Aufgaben über Kerberos erledigen soll, dann braucht man das Keytab File für diesen Servern.

samba-tool domain exportkeytab xxx.krb5.keytab --principal='testserver$@MYAD.FELSING.NET'

User anlegen

Statt mit Windows kann man auch über die Bash Shell einen User anlegen.

samba-tool user create 'John Doe' 'VeryBadPassword'  --gecos 'Hello World' --userou='OU=user,OU=test' --given-name='John' --surname='Doe' --mail-address='john.doe@example.net' --description="$(date)" --telephone-number='+49-900-123456789'

Damit werden auch gleich einige AD Attribute befüllt.

DNS Zone anlegen

Eine neue DNS Zone im AD wird mit dem folgenden Skript angelegt:

samba-tool dns zonecreate <myserver> 1.168.192.in-addr.arpa --username=administrator

Wobei <myserver> der Hostname der Linux Maschine ist.

LDAP Config

Einen Blick in die LDAP Config kann man mit

ldbsearch --url=/usr/local/samba/private/sam.ldb --all -b cn=Schema,cn=Configuration,dc=auth,dc=lan

werfen. Hier niemals etwas ändern, sonst hast Du evtl. keine Domain mehr…

LDAP Schema ändern

**Warnung: ** Damit kann man die AD richtig kaputt machen, also Think Twice

Das macht man am besten mit den Bordmitteln von Windows, da gibt es einen sehr schönen Schema Editor. Sollte der eine Warnung ausgeben, dann unbedingt den Vorgang abbrechen, denn ansonsten macht man garantiert etwas kaputt.