Einbinden eines Linux Servers in eine Active Directory Domain – Teil 2 (Kerberos Authentifizierung)

Im ersten Teil wurde ein Server mittels Samba (winbind, Kerberos … ) in die Domain integriert. Man kann sich bereits am Server mit seinem Domainuser anmelden und arbeiten. Nun wird noch Single Sign On realisiert. Da Active Directory Kerberos nutzt, hat man die Möglichkeit sich am Server anzumelden ohne ein Passwort zum Server zu übertragen. Auch Putty unterstützt seit kurzem Kerberos (GSSAPI und Microsoft SSPI).

Etwas Kerberos Grundlagen sollte man sich aneignen um mehr Services zu in die Domain integrieren zu können. Vor allem die Grundlegenden Vorgänge sollten bekannt sein um bei der Fehlersuche das Problem ein grenzen zu können.

Keytab erzeugen

Um Kerberos zu nutzen muss die Datei /etc/krb5.keytab erzeugt werden. Diese Datei enthält die Schlüssel um den Server beim Domaincontroller zu authentifizieren.

Samba liefert dafür schon Tools mit um die Keytab an zu legen und eventuell zusätzliche Service Principals an zu legen was die Integration von Unix/Linux Server in eine Windows Domain enorm erleichtert.

root@ccwiki # net ads keytab create -U trabauer

Als User (-U) muss natürlich ein Domain Admin angeben werden. Normalerweise ist nach dem Erstellen eines Computeraccounts nur der Host-Principal vorhanden. Das reicht eigentlich für SSH. Nun ist die Keytab Dtei /etc/krb5.keytab mit den benötigten Einträgen vorhanden und kann von Services verwendet werden.

Hinzufügen von zusätzlichen Service-Principals

Samba liefert auch Tools mit um zusátzliche Service-Principals anzulegen.

Mit

net ads keytab add HTTP -U trabauer

Wird das Principal HTTP/ccwiki.openitsolutions.local@OPENITSOLUTIONS.LOCAL angelgt.

Das z.B. für den Apache Webserver verwendet werden kann.

openSSH

Um den Zugriff mit Kerberos zu ermöglichen muss GSSAPI in der Konfiguration von openSSH-aktiviert werden. Die Kerberos Optionen betreffen nur Kerberos 4 sind also in einer Active Directory Domain nicht relevant, da Micrsoft Kerberos 4 nicht unterstützt.

# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile     %h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

Das war auch schon openSSH noch neustarten und der SSH Server kann Kerberos zur Authentifizierung verwenden.

trabauer@ccwiki ~ % sudo /etc/init.d/ssh restart

Testen der Kerberos Authentifizierung

Als erstes holt man sich ein Ticke Granting Ticket (unter Windows geschieht dies bei der Anmeldung am PC)

trabauer@ccwiki ~ % kinit
Password for trabauer@OPENITSOLUTIONS.LOCAL:

Mit klist kann man seinen Ticketcache anzeigen lassen.

trabauer@ccwiki ~ % klist
Ticket cache: FILE:/tmp/krb5cc_12866
Default principal: trabauer@OPENITSOLUTIONS.LOCAL

Valid starting     Expires            Service principal
09/13/11 14:32:30  09/14/11 00:32:38  krbtgt/OPENITSOLUTIONS.LOCAL@OPENITSOLUTIONS.LOCAL
        renew until 09/14/11 14:32:30

Mit dem TGT kann man sich weitere Service Tickets holen ohne sich erneut authentifizieren zu müssen. Mit diesen Service Tickets erlangt man zugriff auf die Zielmaschine ohne sein Passwort übertragen zu müssen.

Baut man nun eine SSH verbindung auf wird ein Service Ticket beim Domain Controller beantragt (mit dem TGT) und diesem man sich wieder auf der Gegenseite Authentifizieren muss.

trabauer@ccwiki ~ % ssh ccwiki
The authenticity of host 'ccwiki (10.10.10.114)' can't be established.
RSA key fingerprint is 31:9f:1f:07:6b:46:42:e4:4a:05:0f:97:9c:b6:b2:3e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ccwiki,10.10.10.114' (RSA) to the list of known hosts.
Linux ccwiki 2.6.32-5-amd64 #1 SMP Fri Sep 9 20:23:16 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Sep 13 13:10:40 2011 from windose.openitsolutions.local
trabauer@ccwiki ~ % exit
Connection to ccwiki closed.

Nach dem Aufbau der Verbindung zu einem Server findet man das Service Ticket im Cache

trabauer@ccwiki ~ % klist
Ticket cache: FILE:/tmp/krb5cc_12866
Default principal: trabauer@OPENITSOLUTIONS.LOCAL

Valid starting     Expires            Service principal
09/13/11 14:32:30  09/14/11 00:32:38  krbtgt/OPENITSOLUTIONS.LOCAL@OPENITSOLUTIONS.LOCAL
        renew until 09/14/11 14:32:30
09/13/11 14:34:06  09/14/11 00:32:38  host/ccwiki.openitsolutions.local@OPENITSOLUTIONS.LOCAL
        renew until 09/14/11 14:32:30
trabauer@ccwiki ~ %

Putty und Kerberos

Auch Putty unterstützt in der aktuellen Version (0.61 vom 12.07.2011) Kerberos

Nun kann man Putty mit SSO in einer Windows Domain verwenden.

Apache mit Kerberos Authentifizierung

Auch Apache kommt wunderbar mit Kerberos klar. Apache und das entsprechende Kerberos Modul müssen natürlich installiert sein.

trabauer@ccwiki ~ % agi apache2 libapache2-mod-auth-kerb

In der Konfiguration von Apache wird noch zusätzlich die verwendung von .htaccess Dateien erlaubt . Ob man das ganze in .htaccess Dateien schreibt oder ob man direkt die Apache konfiguration anpasst beleibt natürlich einem selbst überlassen.

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Es wird zum Testen eine .htaccess Datei angelgt die einen gütligen User erfordert.

AuthType Kerberos
AuthName "Krb5 Auth"
KrbServiceName HTTP
KrbVerifyKDC On
Krb5Keytab /etc/krb5.keytab
KrbAuthRealms OPENITSOLUTIONS.LOCAL
KrbMethodNegotiate on
KrbMethodK5Passwd on
require valid-user
# only one user desired
#require user admin@WHO.COM

Damit der Apache Webserver auch die krb5.keytab lesen kann müssen die entsprechenden Leserechte auf die Datei vergeben werden. Dazu ändere ich wenn es nur Apache sein soll die Gruppe der krb5.keytab. Ansonsten kann man z.B. auch eine Gruppe anlegen und alle Service-User die Kerberos nutzen die Gruppe zuweisen.

chgrp /etc/krb5.keytab www-data

danach müssen noch die Rechte angepasst werden.

chmod g+r /etc/krb5.keytab

Nun muss die Seite noch in die Trustet Sites eingetragen werden. Damit der Internet Explorer auch Kerberos verwendet. Und schon ist es Domain Usern möglich die Seite zu nutzen ohne das sie sich erneut authentifizieren müssen.

Auch Firefox unterstützt Kerberos. Dazu muss die Seite in network.negotiate-auth.trusted-uris eingetragen werden. Diesen Wert kann man z.B in der User.js setzen und diese dann per Netlogon Skript an alle User im Unternehmen verteilen. Diese Einstellung manuell vor zu nehmen ist in großen Unternhmen etwas mühsam. Den Internet Explorer kann man ja über GPOs konfigurieren.

So eigenet sich Kerberos + Apache wunderbar um ein Intranet gegen Unbekannte abzusichern.

Im ersten Teil wurde ein Server mittels Samba (winbind, Kerberos … ) in die Domain integriert. Man kann sich bereits am Server mit seinem Domainuser anmelden und arbeiten. Nun wird noch Single Sign On realisiert. Da Active Directory Kerberos nutzt, hat man die Möglichkeit sich am Server anzumelden ohne ein Passwort zum Server zu übertragen. Auch Putty unterstützt seit kurzem Kerberos (GSSAPI und Microsoft SSPI).

Etwas Kerberos Grundlagen sollte man sich aneignen um mehr Services zu in die Domain integrieren zu können. Vor allem die Grundlegenden Vorgänge sollten bekannt sein um bei der Fehlersuche das Problem ein grenzen zu können.

Keytab erzeugen

Um Kerberos zu nutzen muss die Datei /etc/krb5.keytab erzeugt werden. Diese Datei enthält die Schlüssel um den Server beim Domaincontroller zu authentifizieren.

Samba liefert dafür schon Tools mit um die Keytab an zu legen und eventuell zusätzliche Service Principals an zu legen was die Integration von Unix/Linux Server in eine Windows Domain enorm erleichtert.

root@ccwiki # net ads keytab create -U trabauer

Als User (-U) muss natürlich ein Domain Admin angeben werden. Normalerweise ist nach dem Erstellen eines Computeraccounts nur der Host-Principal vorhanden. Das reicht eigentlich für SSH. Nun ist die Keytab Dtei /etc/krb5.keytab mit den benötigten Einträgen vorhanden und kann von Services verwendet werden.

Hinzufügen von zusätzlichen Service-Principals

Samba liefert auch Tools mit um zusátzliche Service-Principals anzulegen.

Mit

net ads keytab add HTTP -U trabauer

Wird das Principal HTTP/ccwiki.openitsolutions.local@OPENITSOLUTIONS.LOCAL angelgt.

Das z.B. für den Apache Webserver verwendet werden kann.

openSSH

Um den Zugriff mit Kerberos zu ermöglichen muss GSSAPI in der Konfiguration von openSSH-aktiviert werden. Die Kerberos Optionen betreffen nur Kerberos 4 sind also in einer Active Directory Domain nicht relevant, da Micrsoft Kerberos 4 nicht unterstützt.

# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile     %h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

Das war auch schon openSSH noch neustarten und der SSH Server kann Kerberos zur Authentifizierung verwenden.

trabauer@ccwiki ~ % sudo /etc/init.d/ssh restart

Testen der Kerberos Authentifizierung

Als erstes holt man sich ein Ticke Granting Ticket (unter Windows geschieht dies bei der Anmeldung am PC)

trabauer@ccwiki ~ % kinit
Password for trabauer@OPENITSOLUTIONS.LOCAL:

Mit klist kann man seinen Ticketcache anzeigen lassen.

trabauer@ccwiki ~ % klist
Ticket cache: FILE:/tmp/krb5cc_12866
Default principal: trabauer@OPENITSOLUTIONS.LOCAL

Valid starting     Expires            Service principal
09/13/11 14:32:30  09/14/11 00:32:38  krbtgt/OPENITSOLUTIONS.LOCAL@OPENITSOLUTIONS.LOCAL
        renew until 09/14/11 14:32:30

Mit dem TGT kann man sich weitere Service Tickets holen ohne sich erneut authentifizieren zu müssen. Mit diesen Service Tickets erlangt man zugriff auf die Zielmaschine ohne sein Passwort übertragen zu müssen.

Baut man nun eine SSH verbindung auf wird ein Service Ticket beim Domain Controller beantragt (mit dem TGT) und diesem man sich wieder auf der Gegenseite Authentifizieren muss.

trabauer@ccwiki ~ % ssh ccwiki
The authenticity of host 'ccwiki (10.10.10.114)' can't be established.
RSA key fingerprint is 31:9f:1f:07:6b:46:42:e4:4a:05:0f:97:9c:b6:b2:3e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ccwiki,10.10.10.114' (RSA) to the list of known hosts.
Linux ccwiki 2.6.32-5-amd64 #1 SMP Fri Sep 9 20:23:16 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Sep 13 13:10:40 2011 from windose.openitsolutions.local
trabauer@ccwiki ~ % exit
Connection to ccwiki closed.

Nach dem Aufbau der Verbindung zu einem Server findet man das Service Ticket im Cache

trabauer@ccwiki ~ % klist
Ticket cache: FILE:/tmp/krb5cc_12866
Default principal: trabauer@OPENITSOLUTIONS.LOCAL

Valid starting     Expires            Service principal
09/13/11 14:32:30  09/14/11 00:32:38  krbtgt/OPENITSOLUTIONS.LOCAL@OPENITSOLUTIONS.LOCAL
        renew until 09/14/11 14:32:30
09/13/11 14:34:06  09/14/11 00:32:38  host/ccwiki.openitsolutions.local@OPENITSOLUTIONS.LOCAL
        renew until 09/14/11 14:32:30
trabauer@ccwiki ~ %

Putty und Kerberos

Auch Putty unterstützt in der aktuellen Version (0.61 vom 12.07.2011) Kerberos

Nun kann man Putty mit SSO in einer Windows Domain verwenden.

Apache mit Kerberos Authentifizierung

Auch Apache kommt wunderbar mit Kerberos klar. Apache und das entsprechende Kerberos Modul müssen natürlich installiert sein.

trabauer@ccwiki ~ % agi apache2 libapache2-mod-auth-kerb

In der Konfiguration von Apache wird noch zusätzlich die verwendung von .htaccess Dateien erlaubt . Ob man das ganze in .htaccess Dateien schreibt oder ob man direkt die Apache konfiguration anpasst beleibt natürlich einem selbst überlassen.

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Es wird zum Testen eine .htaccess Datei angelgt die einen gütligen User erfordert.

AuthType Kerberos
AuthName "Krb5 Auth"
KrbServiceName HTTP
KrbVerifyKDC On
Krb5Keytab /etc/krb5.keytab
KrbAuthRealms OPENITSOLUTIONS.LOCAL
KrbMethodNegotiate on
KrbMethodK5Passwd on
require valid-user
# only one user desired
#require user admin@WHO.COM

Damit der Apache Webserver auch die krb5.keytab lesen kann müssen die entsprechenden Leserechte auf die Datei vergeben werden. Dazu ändere ich wenn es nur Apache sein soll die Gruppe der krb5.keytab. Ansonsten kann man z.B. auch eine Gruppe anlegen und alle Service-User die Kerberos nutzen die Gruppe zuweisen.

chgrp /etc/krb5.keytab www-data

danach müssen noch die Rechte angepasst werden.

chmod g+r /etc/krb5.keytab

Nun muss die Seite noch in die Trustet Sites eingetragen werden. Damit der Internet Explorer auch Kerberos verwendet. Und schon ist es Domain Usern möglich die Seite zu nutzen ohne das sie sich erneut authentifizieren müssen.

Auch Firefox unterstützt Kerberos. Dazu muss die Seite in network.negotiate-auth.trusted-uris eingetragen werden. Diesen Wert kann man z.B in der User.js setzen und diese dann per Netlogon Skript an alle User im Unternehmen verteilen. Diese Einstellung manuell vor zu nehmen ist in großen Unternhmen etwas mühsam. Den Internet Explorer kann man ja über GPOs konfigurieren.

So eigenet sich Kerberos + Apache wunderbar um ein Intranet gegen Unbekannte abzusichern.

About Florian