Active-Directory, Linux und Kerberos Keytabs (HOWTO)
Alle Informationen welche du brauchst um für einen ActiveDirectory Account einen Kerberos Keytab zu generieren, kannst du per LDAP aus dem ActiveDirectory abholen.
Die Befehle beziehen sich auf RHEL/CentOS 7. Funktionieren vermutlich aber auch auf anderen Distributionen (andere Pfade, andere Paketnamen, ...)
Nehmen wir an, du hast einen myhttp-service Account in der ad.dom.ain Domäne.
yum install krb5-workstation \
cyrus-sasl-gssapi \
openldap-clients \
mod_auth_gssapi
# basis krb5.conf
cat - >/etc/krb5.conf <<EOF
[libdefaults]
default_realm = AD.DOM.AIN
dns_lookup_realm = false
dns_lookup_kdc = true
EOF
# eine basic ldap.conf
cat - >/etc/openldap/ldap.conf <<EOF
BASE dc=ad,dc=dom,dc=ain
URI ldap://ad.dom.ain
# prüfe das Server-Zertifikat nicht
# (natürlich nur zum Testen!!!)
TLS_REQCERT allow
# Turning this off breaks GSSAPI used
# with krb5 when rdns = false
SASL_NOCANON on
EOF
Informationsbeschaffung
kinit myhttp-service
ldapsearch -Y GSSAPI \
-Q -LLL \
-h ldaps://ad.dom.ain \
-O maxssf=0 \
sAMAccountName=myhttp-service \
userPrincipalName \
servicePrincipalName \
msDS-KeyVersionNumber \
msDS-SupportedEncryptionTypes
Der msDS-SupportedEncryptionType musst zu zuerst noch übersetzen in den Encryption-Type (aka enctype):
Der ktutil Befehl sieht dann ungefähr so aus für ein /etc/httpd.keytab Keytab (ohne die Zeilenumbrüche mit \):
$> ktutil
ktutil: addent -password -p $userPrincipalName \
-k $msDS-KeyVersionNumber \
-e $enctype
Password for $userPrincipalName: $passwortWieBeiKinit
ktutil: addent -password -p $servicePrincipalName \
-k $msDS-KeyVersionNumber \
-e $enctype
Password for $servicePrincipalName: $passwortWieBeiKinit
ktutil: wkt /etc/httpd.keytab
ktutil: quit
<Location />
AuthType GSSAPI
AuthName "GSSAPI Single Sign On Login"
GssapiCredStore keytab:/etc/httpd.keytab
Require valid-user
</Location>
Nicht vergessen:
chmod 0640 /etc/httpd.keytab && chgrp apache /etc/httpd.keytab
Die Befehle beziehen sich auf RHEL/CentOS 7. Funktionieren vermutlich aber auch auf anderen Distributionen (andere Pfade, andere Paketnamen, ...)
Vorbereitung
Nehmen wir an, du hast einen myhttp-service Account in der ad.dom.ain Domäne.
- krb5-workstation: kinit, ktutil etc. - Kerberos Tools
- cyrus-sasl-gssapi: Library für Kerberos Anmeldung via LDAP (unter anderem)
- openldap-clients: ldapsearch und Co.
- mod_auth_gssapi: Apache Modul für Kerberos Authentifizierung
yum install krb5-workstation \
cyrus-sasl-gssapi \
openldap-clients \
mod_auth_gssapi
# basis krb5.conf
cat - >/etc/krb5.conf <<EOF
[libdefaults]
default_realm = AD.DOM.AIN
dns_lookup_realm = false
dns_lookup_kdc = true
EOF
# eine basic ldap.conf
cat - >/etc/openldap/ldap.conf <<EOF
BASE dc=ad,dc=dom,dc=ain
URI ldap://ad.dom.ain
# prüfe das Server-Zertifikat nicht
# (natürlich nur zum Testen!!!)
TLS_REQCERT allow
# Turning this off breaks GSSAPI used
# with krb5 when rdns = false
SASL_NOCANON on
EOF
Informationsbeschaffung
kinit myhttp-serviceldapsearch -Y GSSAPI \
-Q -LLL \
-h ldaps://ad.dom.ain \
-O maxssf=0 \
sAMAccountName=myhttp-service \
userPrincipalName \
servicePrincipalName \
msDS-KeyVersionNumber \
msDS-SupportedEncryptionTypes
Erstellen vom Keytab
Jetzt muss du einfach für den userPrincipalName und jeden servicePrincipalName und jeden msDS-SupportedEncryptionType einmal addent im ktutil ausführen.Der msDS-SupportedEncryptionType musst zu zuerst noch übersetzen in den Encryption-Type (aka enctype):
- 1: des-cbc-crc
- 2: des-cbc-md5
- 4: rc4-hmac
- 8: aes128-cts-hmac-sha1-96
- 16: aes256-cts-hmac-sha1-96
Der ktutil Befehl sieht dann ungefähr so aus für ein /etc/httpd.keytab Keytab (ohne die Zeilenumbrüche mit \):
$> ktutil
ktutil: addent -password -p $userPrincipalName \
-k $msDS-KeyVersionNumber \
-e $enctype
Password for $userPrincipalName: $passwortWieBeiKinit
ktutil: addent -password -p $servicePrincipalName \
-k $msDS-KeyVersionNumber \
-e $enctype
Password for $servicePrincipalName: $passwortWieBeiKinit
ktutil: wkt /etc/httpd.keytab
ktutil: quit
Apache einrichten
mit dem mod_auth_gssapi Modul, z.B. in /etc/httpd/conf.d/gssapi_auth.conf speichern:<Location />
AuthType GSSAPI
AuthName "GSSAPI Single Sign On Login"
GssapiCredStore keytab:/etc/httpd.keytab
Require valid-user
</Location>
Nicht vergessen:
chmod 0640 /etc/httpd.keytab && chgrp apache /etc/httpd.keytab