#language de = Authentifizierung über tiss = Das tiss-Adressbuch ist ein ldap-server. Um sich auf einem Rechner mit dem TU-Konto und Passwort einloggen zu können, muss dieser Rechner die Informationen über den Nutzer vom ldap-server holen. Die technische Realisation auf dem math-Rechner wird im Folgenden beschrieben. == Voraussetzungen == Pakete unter ubuntu 14.04: `libpam-ldap`, `libnss-ldapd`, `nslcd` sowie `nscd`. Weiters musste unter ubuntu 14.04 die gnutls-library upgegraded werden, um sichere Abfragen (`ldaps://...` statt `ldap://..`) zu ermöglichen, `libldap-2.4-2`, `libgnutls-deb0-28`, `libtasn1-6`. Unter ubuntu 14.10 ist das nicht mehr nötig. ''Anmerkung:'' Im Juli 2015 funktionierte das einloggen nicht mehr. Es wurde `libpam-ldap` durch `libpam-ldapd` ersetzt. Für `ldapsearch` wurde ein link gesetzt, `ln -s /etc/ldap.conf /etc/ldap/ldap.conf`. Weiters wurden, wahrscheinlich unntigerweise, etliche Pakete aus ubuntu 15.10 (wily) manuell installiert, `ca-certificates, ldap-utils, libgmp, libgnutls-deb0-28, libhogweed4,` `libldap-2.4-2, libnettle6, libp11-kit0, libsasl2-2, libsasl2-modules,` `libsasl2-modules-db, libtasn1, p11-kit-modules`. Als Abhängigkeit von `libpam-ldap` werden `ldap-auth-config` und `ldap-auth-client` installiert, die die Dateien unter `/etc/pam.d` sowie `/etc/ldap.conf` schon teilweise konfigurieren. Der Name Service Caching Daemon, `nscd`, wurde installiert, nachdem alles funktionierte, um die Anzahl der ldap-Anfragen an den server zu reduzieren. ''Anmerkung:'' Es bestehen die Alternativen {`libpam-ldap` | `libpam-ldapd + nslcd`} und {`libnss-ldap` | `libnss-ldapd + nslcd`}. Die Pakete `libpam-ldap` und `libnss-ldap` stammen von www.padl.com, die Alternativen mit `*-ldapd` von arthurdejong.org. Letztere von arthurdejong bieten die Möglichkeit, abgefragte ldap-Attribute durch Variablen zu setzen. Das war nötig, um für jeden user ein individuelles home-Directory erstellen zu können, `map passwd homeDirectory "/home/${sAMAccountName}"` == Konfiguration == Versucht sich ein Nutzer einzuloggen, wird mit einem bestehenden, in den Konfigurationsdateien hinterlegten Konto, ein bind an den ldap-server durchgeführt. Die Attribute für den Nutzer werden abgefragt und das login für Mitglieder des Institutes E322 erlaubt. Konfigurationsdateien: `/etc/nsswitch.conf`, `/etc/ldap.conf`, `/etc/nslcd.conf` sowie, in `/etc/pam.d` `common-auth`, `common-account`, `common-password`, `common-session`. Die Dateien in `/etc/pam.d` werden größtenteils von `ldap-auth-config` modifiziert. Siehe das Listing der Dateien weiter unten. == Tests == `getent passwd`, `getent shadow` sollte alle tiss-Einträge zeigen. In `pam.d` die Option `debug` den Modulen zufügen, die dies unterstützen.[[BR]] Für `libnss-ldap` in `/etc/ldap.conf` die Zeile `debug 1` hinzufügen.[[BR]] `nslcd` manuell starten, siehe `man nslcd`. == Unterbinden von brute-force Attacken == Es finden oft eine Vielzahl von Versuchen statt, sich durch das Erraten des Passwortes z.B. als root einzuloggen, siehe `/var/log/auth.log`. Eine entsprechende iptables-Regel sperrt nach 6 Versuchen innerhalb einer Minute die entsprechende IP-Adresse. (Gefunden März 2015 auf http://kvz.io/blog/2007/07/28/block-brute-force-attacks-with-iptables.) Mit den folgenden Regeln stehen die gesperrten Adressen in `/proc/net/xt_recent/SSH`, siehe `man iptables-extensions`. `/etc/network/if-up.d/iptables`: {{{ #!/bin/sh if [ "$METHOD" = loopback ]; then exit 0 fi /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 '!' -s 128.130.169.1/25 -m state --state NEW -m recent --set --name SSH /sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 '!' -s 128.130.169.1/25 -m state --state NEW -m recent --update --seconds 60 --hitcount 6 --rttl --name SSH -j DROP }}} In `/etc/network/if-down.d/iptables` steht dasselbe, mit `-A` ersetzt durch `-D`. == Konfigurationsdateien == {{{ # /etc/nslcd.conf # The number of threads to start with. Each thread starts a separate # connection to the ldap-server. Default: 5. threads 1 # The user and group nslcd should run as. uid nslcd gid nslcd # The location at which the LDAP server(s) should be reachable. uri ldaps://dc.intern.tuwien.ac.at # The search base that will be used for all queries. base ou=tu,dc=intern,dc=tuwien,dc=ac,dc=at # The LDAP protocol version to use. #ldap_version 3 # The DN to bind with for normal lookups. binddn CN=E322_LDAP,OU=interactive,OU=exchange,OU=IT-services,OU=TU,DC=intern,DC=tuwien,DC=ac,DC=at bindpw _secret_passwd_ # SSL options # Request a valid certificate from the server. tls_reqcert demand tls_cacertfile /etc/ssl/certs/ca-certificates.crt # The search scope. #scope sub # Customize certain database lookups. base group ou=groups,ou=TU,dc=intern,dc=tuwien,dc=ac,dc=at base passwd ou=people,ou=TU,dc=intern,dc=tuwien,dc=ac,dc=at base shadow ou=people,ou=TU,dc=intern,dc=tuwien,dc=ac,dc=at #base shadow ou=People,dc=example,dc=com scope group onelevel #scope hosts sub # Mappings for Active Directory # Limit the amount of results returned. pagesize 1000 referrals no #idle_timelimit 800 filter passwd (&(objectClass=user)(memberOf=cn=E322,ou=groups,ou=TU,dc=intern,dc=tuwien,dc=ac,dc=at)) map passwd uid sAMAccountName map passwd uidNumber employeeID map passwd gecos cn map passwd homeDirectory "/home/${sAMAccountName}" map passwd gidNumber "100" map passwd loginShell "/bin/bash" #map passwd gecos displayName #map passwd homeDirectory unixHomeDirectory #filter shadow (&(objectClass=user)(!(objectClass=computer))(uidNumber=*)(unixHomeDirectory=*)) filter shadow (&(objectClass=user)(memberOf=cn=E322,ou=groups,ou=TU,dc=intern,dc=tuwien,dc=ac,dc=at)) map shadow uid sAMAccountName map shadow shadowLastChange pwdLastSet filter group (objectClass=group) }}} {{{ # /etc/ldap.conf # The distinguished name of the search base. base ou=tu,dc=intern,dc=tuwien,dc=ac,dc=at # Another way to specify your LDAP server is to provide an uri ldaps://dc.intern.tuwien.ac.at # The LDAP version to use (defaults to 3 # if supported by client library) ldap_version 3 # The distinguished name to bind to the server with. # Optional: default is to bind anonymously. binddn CN=E322_LDAP,OU=interactive,OU=exchange,OU=IT-services,OU=TU,DC=intern,DC=tuwien,DC=ac,DC=at # The credentials to bind with. # Optional: default is no credential. bindpw _secret_passed_ # The search scope. scope sub #scope one #scope base # man://nss_ldap: Specifies the path to the X.509 # certificate for peer authentication. # TLS certificates (needed for GnuTLS) # Openldap syntax, man ldap.conf TLS_CACERT /etc/ssl/certs/ca-certificates.crt # pam_ldap und nss_ldap syntax, man pam_ldap, man nss_ldap tls_cacertfile /etc/ssl/certs/ca-certificates.crt # The user ID attribute (defaults to uid) pam_login_attribute sAMAccountName # Filter to AND with uid=%s #pam_filter memberOf=CN=E320,OU=groups,OU=TU,DC=intern,DC=tuwien,DC=ac,DC=at # Group to enforce membership of pam_groupdn CN=E322,OU=groups,OU=TU,DC=intern,DC=tuwien,DC=ac,DC=at # Group member attribute pam_member_attribute member # Redirect users to a URL or somesuch on password # changes. pam_password_prohibit_message Please change your password via tiss, https://iu.zid.tuwien.ac.at/AuthServ.changePassword . }}} In `/etc/nsswitch.conf` füge `ldap` hinzu, {{{ passwd: compat ldap group: compat shadow: compat ldap }}} Patches in `/etc/pam.d`: {{{ --- pam.d.orig/common-auth 2015-03-26 13:41:52.434136244 +0100 +++ pam.d/common-auth 2015-03-26 13:45:31.650138595 +0100 @@ -13,8 +13,13 @@ # pam-auth-update to manage selection of other modules. See # pam-auth-update(8) for details. +#th +# Disallow attempts to login as root, _before_ trying to negotiate a passwd. +auth requisite pam_listfile.so item=user sense=deny file=/etc/security/listfile.conf onerr=succeed + # here are the per-package modules (the "Primary" block) -auth [success=1 default=ignore] pam_unix.so nullok_secure +auth [success=2 default=ignore] pam_unix.so +auth [success=1 default=ignore] pam_ldap.so use_first_pass # here's the fallback if no module succeeds auth requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; }}} {{{ --- pam.d.orig/common-account 2015-03-02 16:58:06.000000000 +0100 +++ pam.d/common-account 2015-03-19 15:25:55.000000000 +0100 @@ -14,7 +14,8 @@ # # here are the per-package modules (the "Primary" block) -account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so +account [success=2 new_authtok_reqd=done default=ignore] pam_unix.so +account [success=1 default=ignore] pam_ldap.so # here's the fallback if no module succeeds account requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; }}} {{{ --- pam.d.orig/common-password 2015-03-02 16:58:06.000000000 +0100 +++ pam.d/common-password 2015-03-11 12:52:49.000000000 +0100 @@ -23,7 +23,7 @@ # here are the per-package modules (the "Primary" block) -password [success=1 default=ignore] pam_unix.so obscure sha512 +password [success=2 default=ignore] pam_unix.so obscure sha512 +password [success=1 user_unknown=ignore default=die] pam_ldap.so use_authtok try_first_pass # here's the fallback if no module succeeds password requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; }}} {{{ --- pam.d.orig/common-session 2015-03-02 16:58:06.000000000 +0100 +++ pam.d/common-session 2015-03-23 10:55:29.000000000 +0100 @@ -27,8 +27,9 @@ session optional pam_umask.so # and here are more per-package modules (the "Additional" block) session required pam_unix.so +session optional pam_ldap.so session optional pam_systemd.so session optional pam_ecryptfs.so unwrap session optional pam_ck_connector.so nox11 # end of pam-auth-update config +session required pam_mkhomedir.so skel=/etc/skel umask=0022 }}}