Home > Computer und Internet > HowTo: CentOS gegen Active Directory authentifizieren

HowTo: CentOS gegen Active Directory authentifizieren

Heute mal wieder ein etwas länger Text der wohl auch nur für ITler interessant sein wird 🙂 Alle anderen können also getrost aufhören zu lesen und werden nichts verpassen.

Im folgenden Text ist “meine” Art nachzulesen wie ich ein CentOS an ein Active Directory anbinde. Auch hier führen natürlich diverse Wege ans Ziel (vieles was ich per Hand mache lässt sich z.B. auch per authconfig direkt machen), aber ich bin mit diesem Weg bisher immer sehr gut gefahren.

Ich verwende eigentlich fast ausschließlich CentOS, aber im Prinzip sollte das HowTo auch mit Debian/Ubuntu/SuSE/whatever funktionieren, auch wenn dort evtl. die Paketnamen und Pfade andere sein könnten.

Interessant ist das ganze natürlich nicht nur für die eigentliche Anmeldung oder Samba-Fileservices, sondern auch für Opsi oder OpenVPN, worauf ich am Ende kurz eingehen will.

 

Nötige RPM Pakete

 

  • authconfig
  • krb5-libs
  • krb5-workstation
  • ntp
  • ntpdate
  • pam_krb5
  • samba
  • samba-common
  • samba-winbind
  • samba-winbind-clientsDiese lassen sich mit dem Befehlyum install authconfig krb5-libs krb5-workstation ntp ntpdate pam_krb5 samba samba-common samba-winbind samba-winbind-clients

    installieren.

    Samba Konfiguration

    Der Dreh-und-Angel-Punkt der Windows Authentifizeriung unter Linux ist Samba, bzw. dessen Bestandteil Winbind. Deshalb spielt die Konfiguration von Samba eine entscheidende Rolle, alle für die Authentifizierung erforderlichen Optionen befinden sich im Abschnitt [global] in der Konfigurationsdatei /etc/samba/smb.conf, entscheidend sind vorallem die winbind-Optionen.

    [global]
    workgroup = MEIN-ADS
    server string = Samba Server Version %v

    # logs split per machine
    log file = /var/log/samba/log.%m
    # max 50KB per log file, then rotate
    max log size = 50
    security = ads
    passdb backend = tdbsam
    realm = mein-ads.de
    kerberos method = system keytab
    password server = *
    idmap uid = 10000-500000
    idmap gid = 10000-500000
    template shell = /bin/bash

    winbind use default domain = true
    winbind enum users = Yes
    winbind enum groups = yes
    winbind offline logon = false
    winbind nested groups = yes
    encrypt passwords = yes

    dns proxy = yes

    Starten der Dienste

    Mit folgenden Befehlen werden alle Samba Dienste gestartet bzw. restartet
    /etc/init.d/winbind restart
    /etc/init.d/smb restart

    Diese beiden Befehle dienen dazu, Samba und Winbind beim Systemstart mitzustarten

    chkconfig winbind on
    chkconfig smb on

    Kerberos Konfiguration

    Die Konfiguration von Kerberos erfolgt in der Datei /etc/krb5.conf, diese sollte folgenden Inhalt aufweisen:

    [logging]
    default = FILE:/var/log/krb5libs.log
    kdc = FILE:/var/log/krb5kdc.log
    admin_server = FILE:/var/log/kadmind.log

    [libdefaults]
    default_realm = MEIN-ADS.DE
    dns_lookup_realm = false
    dns_lookup_kdc = false
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = true

    [realms]
    MEIN-ADS.DE = {
    kdc = dc.mein-ads.de:88
    admin_server = dc.mein-ads.de:749
    default_domain = mein-ads.de
    }

    [domain_realm]
    .mein-ads.de = MEIN-ADS.DE
    mein-ads.de = MEIN-ADS.DE

    Testen der Kerberos-Konfiguration

    Die Kerberos-Konfiguration kann mit den zwei folgenden Befehlen getestet werden:
    kinit USERNAME@mein-ads.de
    klist

    Der erste Befehl verlangt nach dem (Domain-)Passwort des angegebenen Benutzers, mit dem zweiten Befehl kann überprüft werden ob ein Kerberos-Ticket erstellt wurde. Die Ausgabe sollte dann in etwa so aussehen:

    Ticket cache: FILE:/tmp/krb5cc_0
    Default principal: standfest@MEIN-ADS.DE

    Valid starting     Expires            Service principal
    03/29/12 13:36:28  03/29/12 23:36:32  krbtgt/MEIN-ADS.DE@MEIN-ADS.DE
    renew until 04/05/12 13:36:28

    Mit dem Befehl “kdestroy“ kann das Kerberos-Ticket zerstört werden (also faktisch abgemeldet werden).

    PAM Konfiguration

    Linux verwendet PAM (Pluggable Authentication Modules) zur Authentifizierung. Die
    Konfigurationsdateien hierfür liegen im Ordner /etc/pam.d/ und weisen für verschiedene Dienste eigene Konfigurationen auf (z.B. sshd, login, smtp, …). Bis einschließlich CentOS5 verwendeten standardmäßig alle Dienste-Konfigurationen eine einheitliche systemweite Konfiguration (system-auth-ac). Seit CentOS6 verwendet nur noch login (Anmeldung direkt an der Konsole) diese Konfiguration, alle anderen verwenden standardmäßig die systemweite Konfiguration password-auth-ac. Beide Konfigurationen sollten aber identisch konfiguriert sein. Folgenden Inhalt muss die password-auth-ac enthalten (die Zeilen mit pam_krb5.so und pam_winbind.so
    sollten an der selben stelle auch in der system-auth-ac stehen):

    #%PAM-1.0
    # This file is auto-generated.
    # User changes will be destroyed the next time authconfig is run.
    auth        required      pam_env.so
    auth        sufficient    pam_unix.so nullok try_first_pass
    auth        requisite     pam_succeed_if.so uid >= 500 quiet
    auth        sufficient    pam_krb5.so use_first_pass
    auth        sufficient    pam_winbind.so krb5_auth use_fist_pass

    auth        required      pam_deny.so

    account     required      pam_unix.so
    account     sufficient    pam_localuser.so
    account     sufficient    pam_succeed_if.so uid < 500 quiet
    account     [default=bad success=ok user_unknown=ignore] pam_krb5.so
    account     sufficient    pam_winbind.so

    account     required      pam_permit.so

    password    requisite     pam_cracklib.so try_first_pass retry=3 type=
    password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
    password    sufficient    pam_krb5.so use_authtok
    password    sufficient    pam_winbind.so use_authtok
    password    required      pam_deny.so

    session     optional      pam_keyinit.so revoke
    session     required      pam_limits.so
    session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
    session     required      pam_unix.so
    session     optional      pam_krb5.so
    session     optional      pam_winbind.so use_first_pass

    Name Services konfigurieren

    Unter Linux kann man nicht nur Die Auflösung von IPs zu Namen (hosts, DNS, …) konfigurieren, sondern auch User IDs und Gruppen IDs zu den jeweiligen Namen (und weitere Namensauflösungen). Wie für die einzelnen Services Namen aufgelöst werden wird in der Datei /etc/nsswitch.conf konfiguriert. Relevant sind hier die Einträge für passwd und group.


    passwd:      files winbind
    shadow:      files
    group:       files winbind

    Zeitsynchronisation

    Kerberos benötigt eine synchrone Zeit auf allen beteiligten Geräten. Sollte die Zeit mehr als 10 Min. differieren schlägt die Authentifizierung darüber fehl. Allerdings stellen die Domain Controller ihre Zeit per NTP zur Verfügung, darüber können sich natürlich auch Linux-Server synchronisieren.

    Mit dem Befehl ntpdate dc.mein-ads.de kann man sich die Zeit vom Domain Controller holen und mit dem lokalen System synchronisieren. Dieser Vorgang ist aber nur einmalig. Für eine dauerhafte Synchronisierung der Zeit wird der NTP-Daemon benötigt. Dieser wird über die Konfigurationsdatei /etc/ntp.conf konfiguriert. In dieser Datei müssen nur die voreingesstellten Server-Einträge auskommentiert und für alle DCs neue erstellt werden:


    # Use public servers from the pool.ntp.org project.
    # Please consider joining the pool (
    http://www.pool.ntp.org/join.html).
    #server 0.centos.pool.ntp.org
    #server 1.centos.pool.ntp.org
    #server 2.centos.pool.ntp.org
    server dc.mein-ads.de
    server dc2.mein-ads.de

    Anschließend kann man den Daemon mit dem Befehl /etc/init.d/ntpd start starten und mit chkconfig ntpd on wird der Dienst zukünftig beim Systemstart mitgestartet.

    Domain Join

    Nun sind alle Voraussetzungen erfüllt um Linux in die Domäne aufzunehmen und damit Zugriff für Domänen Mitglieder zu gewähren. Mit dem Befehl net ads join -U USERNAME wird in der Domnäne ein neues Computerkonto erstellt und der Linux-Rechner ist hiermit Domain Member.

    Mit dem Befehl wbinfo -u sollten sich nun alle Domänen-Benutzer anzeigen lassen. Weitere Befehle sind getent passwd BENUTZERNAME (zeigt Informationen für den Benutzer, z.B. das lokale Benutzerverzeichns und die Linux UID), getent group GRUPPENNAME (Gruppeninformationen, z.B. Mitglieder) oder id BENUTZERNAME (Informatione z.B. Gruppenzugehörigkeiten eines Benutzers).

    Nun können auch Berechtigungen im Filesystem oder ähnliches ganz normal an Domänen-Benutzer und -Gruppen vergeben werden.

    Userhomes einrichten

    Wenn man sich jetzt versucht mit einem Domain-User anzumelden funktioniert dies bereits ganz gut – allerdings hat der Benutzer dann kein Userhome (und somit auch keine Configs ala .bashrc &Co). Man könnte nun nun die Userhomes manuell anlegen (mkdir /home/MEIN-ADS/username) und diese entsprechend verrechten.

    Die elegantere Methode ist natürlich wenn man PAM die Arbeit erledigen lässt. Dazu verwendet man das Plugin pam_mkhomedir.so indem man die Datei /etc/pam.d/password-auth-ac (bzw. system-auth-ac bei CentOS 5) um folgende Zeile erweitert:

    session     required      pam_mkhomedir.so skel=/etc/skel umask=0077

    Nun sollte PAM automatisch ein Userhome anlegen sobald sich ein Benutzer der noch kein Userhome hat anmeldet.

    Passwortloser SSH-Login mit PuTTY

    Einrichtung auf CentOS-Seite

    Hat man alles richtig gemacht sollte man mit folgendem Befehl eine ähnliche Ausgabe
    erhalten und damit Authentifizierung über Kerberos funktionieren.

    net ads keytab list
    Vno  Type        Principal
    2  DES cbc mode with CRC-32            host/myhost.mein-ads.de@HOME.STANDFEST.NET
    2  DES cbc mode with RSA-MD5           host/myhost.mein-ads.de@MEIN-ADS.DE
    2  ArcFour with HMAC/md5               host/myhost.mein-ads.de@MEIN-ADS.DE
    2  DES cbc mode with CRC-32            host/myhost@MEIN-ADS.DE
    2  DES cbc mode with RSA-MD5           host/myhost@MEIN-ADS.DE
    2  ArcFour with HMAC/md5               host/myhost@MEIN-ADS.DE
    2  DES cbc mode with CRC-32            MYHOST$@MEIN-ADS.DE
    2  DES cbc mode with RSA-MD5           MYHOST$@MEIN-ADS.DE
    2  ArcFour with HMAC/md5              
    MYHOST$@MEIN-ADS.DE

    Sollte das nicht der Fall sein unbedingt nochmal die smb.conf und den Parameter kerberos method überprüfen. Anschließend nochmal net ads join -U USERNAME ausführen.

    Ansonsten kann man Kerberos-Probleme über das Secure-Log (/var/log/secure) herauslesen und ggf. nach dort aufgeführen Fehlern googlen. Hilfreich hierbei ist übrigens auch das Microsoft Technet 🙂

    Weitere Dienste per Kerberos authentifizieren

    Um weitere Diesnte (z.B. HTTP) über Kerberos ohne Eingabe von Benutzerdaten nutzen zu können müssen diese Dienste auch entsprechend “bekannt gemacht” werden. In Fall von HTTP wäre das mit folgendem Befehl möglich
    net ads keytab add HTTP

    Einrichtung in PuTTY

    PuTTY kann in der aktuellen Version inzwischen Kerberos-Authentication von Haus aus, ohne weitere Tools (bzw. angepasste Versionen). Im Prinzip reicht es den Hostnamen angzugeben, unter ConnectionData bei When username is not specified: auf Use system username (BENUTZERNAME) umstellen und unter
    ConnectionSSHAuthGSSAPI den Haken bei Allow GSSAPI credenctial delegation zu setzen.

    putty1

    putty2

    Nun sollte man ohne Eingabe von Benutzername/Passwort direkt angemeldet werden.

    Opsi Configed gegen das Active Directory authentifizieren

    Wie eingangs erwähnt, lässt sich auch Opsi bzw. dessen Administrations-Frontend Configed gegen das ADS authentifizieren, alle Vorbereitungen dafür sind nun getroffen, jetzt muss nur noch in der Datei /etc/opsi/backendManager/acl.conf entsprechend Berechtigungen erteilt werden. Am besten legt man dafür im AD eine Gruppe (z.B. zugriff-opsi-configed) an und verrechtet diese. Dazu ergänzt man die folgende Zeile um einen entsprechenden Eintrag:

    .*                     : sys_group(opsiadmin); sys_group(zugriff-opsi-configed) ; opsi_depotserver; self

    OpenVPN gegen das Active Directory authentifizieren

    OpenVPN kann so konfiguriert werden, dass es statt Zertifikate auch Benutzername/Passwort akzeptiert (alternativ lässt sich beides auch mischen). Hierfür lässt sich PAM über ein Plugin nutzen. Dieses Plugin kommt normalerweise schon mit OpenVPN mit, folgende Zeilen müssen in die Server-Konfigurationsdatei eingetragen werden.

    plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
    username-as-common-name
    client-cert-not-required

    Das login bezieht sich auf die PAM Facility gegen die die Authentifizierung durchgeführt wird. Man kann z.B. auch eine eigene Facility anlegen, z.B. openvpn (einfach eine Datei unter /etc/pam.d/ mit dem gewünschten Namen erstellen) und dort z.B. auf eine bestimmte Gruppe filtern, sodass nur bestimmte Benutzer sich in OpenVPN anmelden können.

    Diese Datei könnte so aussehen

    auth        include       password-auth
    auth        required      pam_succeed_if.so user ingroup openvpn-users
    account     include       password-auth
    password    include       password-auth
    session     include       password-auth

    (Da ich zur Zeit kein OpenVPN installiert habe und verwende sind diese Angaben mit Vorsicht zu genießen und eher als Anhaltspunkt zu sehen :-))

 

  1. Adi
    2. September 2014, 12:08 | #1

    Auch wenn ich hier nun die Hälfte verstanden habe, so möchte ich dem Schreiber meinen Glückwunsch und Respekt für den super Artikel aussprechen, was ne Arbeit da drinstecken muss!

    LG

  1. Bisher keine Trackbacks