Samba Active Directory Server

Seit samba4 lässt sich unter Linux ein vollwertiger Active Directory Server aufbauen!
Doch bei der Installation ist einiges zu beachten wie dieses How-To zeigt.

Einleitung

Zuerst mal ein kleiner Wermutstropfen, denn das AD mittels samba4 lässt sich derzeit nur auf Debian basierten Systemen (wie z.B. ubuntu) installieren.
Dies weil samba4 zur Zeit nur mit dem heimdal kerberos funktioniert und beispielsweise RedHat basierende Systeme (wie z.B. CentOS) das konkurrierende MIT-Kerberos fest im System integriert haben.
In diesem Tutorial wurde deshalb Ubuntu verwendet.

Ferner braucht es für ein Active Directory (AD) mindestens drei Server: Zwei Domain Controller (DC) und ein Fileserver (FS).
Zwar würde das AD mit nur einem DC funktionieren, die ganze Architektur ist aber auf mindestens zwei ausgelegt, und dies sollte man für einen stabilen Betrieb auch beachten.
Weiter sollten auch keinerlei Freigaben auf den Domain-Controllern liegen, da diese ein anderes ID-Mapping haben und somit die User auf den DCs andere IDs haben wie auf den restlichen Servern.
Daher wird für die Benutzer Heimverzeichnisse (homes) und Server gespeicherten Profile (profiles) ein eigener Fileserver verwendet; dieser kann natürlich noch beliebige andere Freigaben enthalten.

Ebenfalls erwähnenswert ist, dass auf den DCs ein Nameserver laufen muss, der von den DCs selbst und sämtlichen mit diesen verbunden Clients als Nameserver konfiguriert sein muss!
Samba bringt dazu einen internen Nameserver mit. Zwar liesse sich auch bind verwenden, doch das ist nicht ganz trivial und lässt sich später bei Bedarf auch unkompliziert umstellen, so dass man sicher mit dem internen Nameserver anfangen sollte.

Zuletzt sollte werden noch zwei wichtige Angaben gebraucht: Der Name der Domäne und der kerbereos realm.
Dies sollte keinesfalls ein Fantasie-Namen (wie z.B. meine.domain) sein, sondern entweder auf eine selbst registrierte Domain gehen oder eine reservierte, wie beispielsweise AD.EXAMPLE.NET.
In diesem Beispiel, welches ferner verwendet wird ist AD der Domain-Name und AD.EXAMPLE.NET der realm. Will man den ersten Teil „AD“ weg lassen, ist das auch möglich, dann ist der Name der Domain einfach EXAMPLE und der realm EXAMPLE.NET. Da jedoch manchmal die Domain auch noch für andere Dinge wie beispielsweise einer Webseite unter www.example.net verwendet werden soll ist es praktisch für die Domain eine dedizierte Subdomain zu machen. Ansonsten könnte man alternativ auch zwei Domains registrieren, etwa „example.com“ für extern und „example.net“ intern, bzw. fürs AD.

Zu den Servernamen die hier verwendet werden, heissen die beiden DCs dc01.ad.example.net (192.168.1.10), dc02.ad.example.net (192.168.1.20) und der Fileserver fs01.ad.example.net (192.168.1.30)

Beide Domain Controller (PDC und SDC)

Installation

Folgendes muss auf beiden domain controllern identisch installiert/konfiguriert werden:

apt install samba smbclient heimdal-clients winbind ldb-tools ldap-utils libnss-winbind libpam-winbind ntp xinetd

Nun muss die samba Konfigurationsdatei wie folgt (neu) erstellt werden:

 >/etc/samba/smb.conf

/etc/samba/smb.conf

[global]
        workgroup = AD
        realm = AD.EXAMPLE.NET
        netbios name = DC01
        server role = active directory domain controller
        dns forwarder = 8.8.8.8
        idmap_ldb:use rfc2307 = yes
        wins support = yes
 
[netlogon]
        path = /var/lib/samba/sysvol/ad.example.net/scripts
        read only = No
 
[sysvol]
        path = /var/lib/samba/sysvol
        read only = No

Als „workgroup“ wird der Name der Domain eingetragen, dann der realm und der unter „netbios name“ der Name des Servers. (dies ist bei jedem DC anders, beim zweiten, beispielsweise DC02!)
Einen (externen) „dns forwarder“ braucht es auch zwingend, da der integrierte Nameserver keine externen Namen auflösen kann; somit hätten andernfalls die Domain-Controller keinen Internet Zugriff.

Eine wichtige Option ist fernen die „idmap_ldb:use rfc2307 = yes“: Damit ist es möglich später Unix UIDs/GIDs bei den Benutzern zu vergeben.
Dies ist zwar normalerweise dank des id mappings von windind nicht nötig, es ist aber sehr aufwändig diese Option später hinzuzufügen!

Die beiden Freigaben [netlogon] und [sysvol] sind System-Freiagben die jeder DC zwingend braucht und, wie anfangs erwähnt die einzigen Freigaben darauf bleiben sollten.

Als nächstes kommt die kerbereos Konfiguration:

 >/etc/krb5.conf

/etc/krb5.conf

[libdefaults]
        default_realm = AD.EXAMPLE.NET
        dns_lookup_realm = false
        dns_lookup_kdc = true

Dann muss noch die Datei /etc/nsswitch.conf angepasst werden damit im System die AD Benutzer und Gruppen benutzt werden können.
Bei den zwei Einträgen „passwd“ und „group“ muss einfach noch „winbind“ angefügt werden:

passwd:         compat winbind
group:          compat winbind

Nun müssen beim Verzeichnis /var/lib/samba/ntp_signd/ die Berechtigungen angepasst werden:

chmown -v root:ntp /var/lib/samba/ntp_signd/
chmod -v 750 /var/lib/samba/ntp_signd/

Und die NTP Konfiguration wie folgt (neu) erstellt werden:

 >/etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 10
server 0.pool.ntp.org iburst prefer
server 1.pool.ntp.org iburst prefer
driftfile /var/lib/ntp/ntp.drift
logfile /var/log/ntp.log
ntpsigndsocket /var/lib/samba/ntp_signd/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
restrict default kod nomodify notrap nopeer mssntp
restrict 127.0.0.1
restrict 0.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
restrict 1.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery

Auch ein anpassen der ulimits ist erforderlich; dazu einfach zuunterst in der Datei: /etc/security/limits.conf folgendes anfügen:

*              -       nofile         16384

Zum Schluss ist noch auf beiden Domain Controllern die IP der Nameserver und der Suchpfad einzutragen und zwar am besten so, dass auf jeweils die eigene IP zuerst kommt.
Beispiel auf DC01:
/etc/resolv.conf

nameserver 192.168.1.10
nameserver 192.168.1.20
search ad.example.net

Einrichten der WINS Replikation

Zuerst wird auf dem ersten Domain Controller eine Datei: /root/wins.ldif mit folgendem Inhalt erstellt:
/root/wins.ldif

dn: CN=dc02,CN=PARTNERS
objectClass: wreplPartner
address: 192.168.1.20

Dann mittels ldbadd in die WINS Datenbank eingefügt:

cd /var/lib/samba/private/
ldbadd -H wins_config.ldb /root/wins.ldif

Danach muss dass auf dem zweiten DC mit umgekehrten Angaben wiederholt werden; in der wins.ldif Datei müssen nun aber Hostnamen und IP vom ersten DC stehen!

Damit ist auch der WINS Server fertig.

Primärer Domain Controller (PDC)

Installation

Die folgenden Schritte müssen nur auf dem ersten Domain-Controller gemacht werden.

sysvol Replikation

Da samba derzeit noch keine Dateisystem Replikation unterstützt wird das sysvol Verzeichnis mittels rsync synchronisiert.
Dazu wird auf dem PDC ein rsync-server eingerichtet:

/etc/xinetd.d/rsync

service rsync
{
  disable               = no
  only_from             = 192.168.1.20
  socket_type           = stream
  wait                  = no
  user                  = root
  server                = /usr/bin/rsync
  server_args           = --daemon
  log_on_failure        += USERID
}

Danach noch xinetd neu starten:

systemctl restart xinited

Dazu die rsync Konfiguationsdatei:
/etc/rsyncd.conf

[sysvol]
path = /var/lib/samba/sysvol/
comment = Samba sysvol
uid = root
gid = root
read only = yes
auth users = sysvol-repl
secrets file = /etc/samba/rsync.secret

Und das dazugehörige secrets file:
/etc/samba/rsync.secret

sysvol-repl:geheim

Dieses noch absichern:

chmod -v 600 /etc/samba/rsync.secret

ACL fixing

Weil die ACL Dateien manchmal korrupt werden können legt man am besten noch den folgenden cronjob an, damit diese automatisch repariert werden:

0 */12 * * * /usr/bin/samba-tool ntacl sysvolreset

Domain provisionieren

Nun kann endlich die Domäne erstellt werden!

Mittels:

samba-tool domain provision --use-rfc2307 --domain=AD --realm=AD.EXAMPLE.NET --dns-backend=SAMBA_INTERNAL

wird das actice directory erstellt!

Nun sollte als nächstes der Server rebootet werden, damit alle services danach laufen.

Testen

Nach dem Neustart sollte die Domain als erstes getestet werden.

Server Ports

netstat -tlpn | grep samba

Sollte eine Liste wie folgt ausgeben:

tcp        0      0 0.0.0.0:88              0.0.0.0:*               LISTEN      3337/samba
tcp        0      0 0.0.0.0:636             0.0.0.0:*               LISTEN      3335/samba
tcp        0      0 0.0.0.0:1024            0.0.0.0:*               LISTEN      3332/samba
tcp        0      0 0.0.0.0:3268            0.0.0.0:*               LISTEN      3335/samba
tcp        0      0 0.0.0.0:3269            0.0.0.0:*               LISTEN      3335/samba
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      3335/samba
tcp        0      0 0.0.0.0:135             0.0.0.0:*               LISTEN      3332/samba
tcp        0      0 0.0.0.0:42              0.0.0.0:*               LISTEN      3334/samba
tcp        0      0 0.0.0.0:464             0.0.0.0:*               LISTEN      3337/samba
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      3345/samba
tcp6       0      0 :::88                   :::*                    LISTEN      3337/samba
tcp6       0      0 :::636                  :::*                    LISTEN      3335/samba
tcp6       0      0 :::1024                 :::*                    LISTEN      3332/samba
tcp6       0      0 :::3268                 :::*                    LISTEN      3335/samba
tcp6       0      0 :::3269                 :::*                    LISTEN      3335/samba
tcp6       0      0 :::389                  :::*                    LISTEN      3335/samba
tcp6       0      0 :::135                  :::*                    LISTEN      3332/samba
tcp6       0      0 :::464                  :::*                    LISTEN      3337/samba
tcp6       0      0 :::53                   :::*                    LISTEN      3345/samba

DNS-Server

host dc01
dc01.ad.example.net has address 192.168.1.10
host -t SRV _kerberos._tcp.ad.example.net
_kerberos._tcp.ad.example.net has SRV record 0 100 88 dc01.ad.example.net.
host -t SRV _ldap._tcp.ad.example.net
_ldap._tcp.ad.example.net has SRV record 0 100 389 dc01.ad.example.net.
host -t SRV _gc._tcp.ad.example.net
_gc._tcp.ad.example.net has SRV record 0 100 3268 dc01.ad.example.net.

Hier wird ersichtlich: Beim active directory funkiotniert die Abfgrage wo ein spezifischer Dienst (z.B: ldap) läuft immer über einen spezillen SRV-Eintrag im Nameserver.
Es müssen alle Einträge aufgelöst werden können.

Verbindungsaufbau

smbclient -L localhost -Uadministrator

Nach Eingabe des Administrator Passwortes sollten die Freigaben angezeigt werden:

Domain=[AD] OS=[Windows 6.1] Server=[Samba 4.3.11-Ubuntu]
 
        Sharename       Type      Comment
        ---------       ----      -------
        netlogon        Disk
        sysvol          Disk
        IPC$            IPC       IPC Service (Samba 4.3.11-Ubuntu)
Domain=[AD] OS=[Windows 6.1] Server=[Samba 4.3.11-Ubuntu]
 
        Server               Comment
        ---------            -------
 
        Workgroup            Master
        ---------            -------

Wie man sieht gibt sich hier der Server tatsächlich als „Windows 6.1“ aus. 😉

Kerberos

Nun wird das erste „Kerberos Ticket“ erzeugt:

kinit administrator

mittels „klist“ kann dieses dann auch angezeigt werden:

Credentials cache: FILE:/tmp/krb5cc_0
        Principal: administrator@AD.EXAMPLE.NET
 
  Issued                Expires               Principal
Jan  5 04:13:55 2018  Jan  5 14:13:52 2018  krbtgt/AD.EXAMPLE.NET@AD.EXAMPLE.NET

Damit kann man isch nun direkt via kerberos anmelden und muss das Passwort nicht mehr angeben:

smbclient -L dc01 -k

(Parameter -k)
Wichtig: Mit kerberos kann man sich nie gegen „localhost“ authentifizieren, stattdessen muss immer der richtige name des Servers angegeben werden!

LDAP-Server

Zuletz wird nun noch der ldap-server getestet:

ldbsearch -H ldap://dc01 "cn=administrator" -k yes

Dies sollte so was ausgeben:

# record 1
dn: CN=Administrator,CN=Users,DC=ad,DC=example,DC=net
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Administrator
description: Built-in account for administering the computer/domain
instanceType: x
whenCreated: xxxxxxxxxxxxx
uSNCreated: xxxx
name: Administrator
objectGUID: xxxxxxxxxxxxx
userAccountControl: xxx
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 0
lastLogoff: 0
primaryGroupID: xxx
objectSid: xxxxxxxxxxxxx
adminCount: 1
accountExpires: xxxxxxxxxxxxx
logonCount: 0
sAMAccountName: Administrator
sAMAccountType: xxxxxxxxxxxxx
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=ad,DC=example,DC=net
isCriticalSystemObject: TRUE
memberOf: CN=Administrators,CN=Builtin,DC=ad,DC=example,DC=net
memberOf: CN=Group Policy Creator Owners,CN=Users,DC=ad,DC=example,DC=net
memberOf: CN=Enterprise Admins,CN=Users,DC=ad,DC=example,DC=net
memberOf: CN=Schema Admins,CN=Users,DC=ad,DC=example,DC=net
memberOf: CN=Domain Admins,CN=Users,DC=ad,DC=example,DC=net
lastLogonTimestamp: xxxxxxxxxxxxx
pwdLastSet: xxxxxxxxxxxxx
whenChanged: xxxxxxxxxxxxx.0Z
uSNChanged: xxx
lastLogon: xxxxxxxxxxxxx
distinguishedName: CN=Administrator,CN=Users,DC=ad,DC=example,DC=net
 
# Referral
ref: ldap://ad.example.net/CN=Configuration,DC=ad,DC=example,DC=net
 
# Referral
ref: ldap://ad.example.net/DC=DomainDnsZones,DC=ad,DC=example,DC=net
 
# Referral
ref: ldap://ad.example.net/DC=ForestDnsZones,DC=ad,DC=example,DC=net
 
# returned 4 records
# 1 entries
# 3 referrals

Vorbereitungen für zweiten Domain Controller

Nun noch kleine Vorbereitungen für den zweiten domain controller.

DNS Reverse Zone erstellen

Da keine reverse Zone automatisch im DNS erstellt, aber zukünftig benötigt wird, sollte das nun nachgeholt werden:

samba-tool dns zonecreate dc01  1.168.192.in-addr.arpa

Zweiten DC eintragen

Leider werden neu beigetretene hosts nicht automatisch im DNS erstellt, weshalbv dies nun für den zweiten DC noch gemacht werden muss:

samba-tool dns add dc01 1.168.192.in-addr.arpa 20 PTR dc02.ad.example.net

Und das ganze noch in der reverse Zone

samba-tool dns add dc01 ad.example.net dc02 A 192.168.1.20

Sekundärer Domain Controller (SDC)

Installation

Die folgenden Schritte müssen nur auf dem zweiten Domain-Controller gemacht werden.

Replikation konfigurieren

Die Datei mit dem rsync Passwort anlegen:

echo "geheim" > /etc/samba/rsync.pass
chmod -v 600 /etc/samba/rsync.pass

cronjob für die Replikation erstellen

*/5 * * * * rsync -XAavz --delete-after --password-file=/etc/samba/rsync.pass rsync://sysvol-repl@dc01/sysvol/ /var/lib/samba/sysvol/ > /dev/null 2>&1

Das wars schon mit der extra Konfiguration!

Der Domäne beitreten

Bevor nun der Domäne beigetreten werden kann, sollten dieselben tests wie beim PDC durchlaufen werden!

Nun kann der zweite DC der Domäne beitreten:

samba-tool domain join ad.example.net DC --realm=ad.example.net -Uadministrator

Ein erfolgreicher Beitritt kann mittels:

 net ads testjoin

überprüft werden

Nun sollte auch dieser Server zuerst rebootet werden.

Testen

Nach dem Neustart sollten nun die folgenden zusätzlichen Tests gemacht werden:

domain info

samba-tool domain info 192.168.1.20

ldap

ldbsearch -H /var/lib/samba/private/sam.ldb '(invocationid=*)' --cross-ncs objectguid

KCC

samba-tool drs kcc -U administrator dc01.ad.example.net

Replikation

samba-tool drs showrepl

FSMO Rollen

samba-tool fsmo show

Läuft das Active Directory bereit und es kann mit dem Fileserver fortgefahren werden!

Fileserver

Anders als bei den Domain Controllern ist es bei Domain Mitgliedern (also z.B: Fileserver) egal welches Linux verwendet wird.
Der Fileserver wird deshalb nachfolgend mit CentOS aufgesetzt.

Installation

Published by

Steven Varco

Steven ist ein Redhat RHCE-Zertifizierter Linux-Crack und ist seit über 15 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.