📱 Erkannter Endgerättyp ⛱️ Tag und Nacht. Verbraucht keinen oder einen 🍪.
guest
Login 🍪 0 Anzahl Ihrer gespeicherten Kekse, führt zur Keksdose

🐧 Debian-Linux-Client Trixie

Aufbau:

  • Grundlegende Pakete
  • Kerberos
  • SSSD
  • AutoFS

Apt-Sammlung was ich eigentlich immer brauche

# Es gibt Rice
#   Fonts
root@linux:~# apt install fonts-noto-color-emoji fonts-material-design-icons-iconfont
#   Do not use Deb. Font-Awesome. Download https://use.fontawesome.com/releases/v6.7.2/fontawesome-free-6.7.2-desktop.zip
#   and save to ~.fonts/otf
#   Appearance
root@linux:~# apt install lxappearance

#   Wayland/Sway
root@linux:~# apt install sway swayidle swaylock fuzzel
#   Notifications, note that mako never worked stable for me
root@linux:~# apt install sway-notification-center

# Sysadmin
root@linux:~# apt install mc

# Programmieren
root@linux:~# apt install git

# Compilieren
root@linux:~# apt install build-essential cmake bison flex meson

# Waybar compilieren (https://github.com/Alexays/Waybar)
root@linux:~# apt install clang-tidy gobject-introspection libdbusmenu-gtk3-dev libevdev-dev libfmt-dev libgirepository1.0-dev libgtk-3-dev libgtkmm-3.0-dev libinput-dev libjsoncpp-dev libmpdclient-dev libnl-3-dev libnl-genl-3-dev libpulse-dev libsigc++-2.0-dev libspdlog-dev libwayland-dev scdoc upower libxkbregistry-dev

System-Mails an lokalen 📯 Postboten schicken

🔁 Automatische Updates

📀 Festplatten-Monitoring

🐆 LUKS-Verschlüsselung remote entsperren

🐆 LUKS-Verschlüsselung per USB-Stick entsperren

🌃 Konsolen-Zeug

🔨 Thunar-Thumbnailer

LDAP Client

ggf. Zertifikat für ldap.domain.tld holen und systemweit installieren --> siehe Eigene 🏰 ED25519-CA (Zertifizierungs-Authorität)

/etc/ldap/ldap.conf

BASE dc=domain,dc=tld
URI ldaps://ldap.domain.tld

# wer eine eigene CA nutzt, unbedingt drauf achten, dass die CA hier mit drin ist. Nur nach /etc/ssl/certs
# kopieren reicht NICHT. ca.domain.tld.crt und ldap.domain.tld.crt unbedingt nach /usr/local/share/ca-certificates
# kopieren, dann 'update-ca-certificates --fresh'
# 
# Ab Trixie unnötig, wird immer die systemweite CA-Sammlung genutzt (OpenSSL statt GnuTLS)
# TLS_CACERT    /etc/ssl/certs/ca-certificates.crt

# Hören Sie nicht auf Ratschläge hier never einzutragen oder etwas auszukommentieren, bestehen Sie immer
# auf korrekte Zertifikate, AUCH UND VORALLEM IM EIGENEN LAN
TLS_REQCERT demand

Kerberos Client

Statt Tickets in /tmp nutzen wir KCM. Das geht einfach und klärt alle Probleme mit Pfaden die irgendwann noch nicht da sind, chmods brauchen etc. pp.

root@client:~# apt install krb5-user sssd-kcm

Das installiert auch eine Datei in /etc/krb5.conf.d/kcm_default_ccache die default_ccache_name = KCM: setzt und man includen kann, macht meine krb5.conf aber nicht, also manuell setzen:

/etc/krb5.conf

[libdefaults]
        default_realm = DOMAIN.TLD

        # Auch wenn der Server das als max time schon hat braucht man trotzdem im client dass man so lange Tickets willi
        ticket_lifetime = 24h
        # ist default 0 und gibt dann keine renewable tickets!! Unbedingt setzen!! Checken mit klist -f --> FRPIA (forward, renew, proxy, initial, preauth)
        renew_lifetime = 7d

        # wer srv records ordentlich hat kann hier 2x true setzen und sich alle realms und domain_realm Einträge sparen

        # erwartet: _kerberos.domain.tld    TXT     "DOMAIN.TLD"
        # dns_lookup_realm = false

        # erwartet _kpasswd, _kerberos und kerberos-adm SRV Records, siehe kerberos/050-Kerberos
        # dns_lookup_kdc = false

        # Ticket kann an andere Dienste weitergeleitet werden        
        forwardable = false

        # Ticket kann durch andere Hosts weiterverwendet werden
        proxiable = false

        # Eigenen hostnamen über DNS reverse-auflösen. Das ist historisch, brauchen wir nicht
        rdns = false

        # This corrective factor is only used by the Kerberos library; it is not used to change the system clock. The default value is 1.
        kdc_timesync = 1

        ### Ticket storage. Sollte man ändern in mehrnutzersystemen

        # format of credential cache types created by kinit or other programs. The default value is 4, which represents the most current format.
        ccache_type = 4

        # das ist der Default, siehe https://web.mit.edu/kerberos/krb5-1.12/doc/mitK5defaults.html#paths
        # default_ccache_name = FILE:/tmp/krb5cc_%{uid}

        # should not be in gssproxy - i mean you can do that its just not clean
        #default_ccache_name = FILE:/var/lib/gssproxy/userclients/krb5ucc_%{uid}

        # has problems as no run user is there on gui login yet - works with ssh though
        #default_ccache_name = FILE:/run/user/%{uid}/krb5cc

        # secure and hassle free - braucht aber sssd-kcm
        # wenn man das weglässt kann SSSD trotzdem KCM nutzen aber kinit schreibt dann wieder in /tmp
        default_ccache_name = KCM:

[appdefaults]

        # Die geheimen Schriften: https://manpages.debian.org/unstable/libpam-krb5/pam_krb5.5.en.html
        # das brauchen wir mit SSSD aber generell eigentlich nicht, maximal userproxy ohne SSSD vielleicht
    #    pam = {
    #            #ccache_dir = /var/lib/gssproxy/userclients
    #            # this has problems with gui logins as no run user is there yet
    #            #ccache = FILE:/run/user/%u/krb5cc
    #            # just use kcm lol
    #            ccache = KCM:
    #    }

[realms]
        DOMAIN.TLD = {
                kdc = auth.domain.tld
                admin_server = auth.domain.tld
        }
[domain_realm]

        domain.tld = DOMAIN.TLD
        # Das gilt für alle Subdomains. Man kann evtl. einen TXT Record  _kerberos.branch.domain.tld.  TXT "DOMAIN.TLD" machen. Noch nicht gebraucht. Eigentlich sollte er sich bei dns_lookup_realm = true von branch zu domain hangeln und dort suchen.
        .domain.tld = DOMAIN.TLD

[kcm]

        debug_level = 10

Debian neustarten!!! "Es geht bestimmt auch wenn ich den Service neustarte" - NEIN. Neustarten!

🐩 NFS4-Kerberos-Client

root@client:~# apt install nfs-common gssproxy

/etc/nfs.conf

[gssd]
use-gss-proxy = 1

/etc/gssproxy/99-network-fs-clients.conf

[service/network-fs-clients]
    mechs = krb5
    # keytab für NFS, siehe "Prinzipal für NFS holen"
    cred_store = keytab:/etc/krb5.keytab.nfs
    # hier liegen alle Tickets die wir als Client vom KDC (AS + TGS) erhalten
    cred_store = ccache:FILE:/var/lib/gssproxy/clients/krb5cc_%U
    # hier liegt das feste client keytab für z.B. einen HTPC-User zum Autologin
    cred_store = client_keytab:/var/lib/gssproxy/clients/%U.keytab
    cred_usage = initiate
    allow_any_uid = yes
    trusted = yes
    euid = 0
    min_lifetime = 60
    debug_level = 3

Prinzipal für NFS holen (User mit /admin Rechten):

root@client:~# kadmin -p user/admin@DOMAIN.TLD

kadmin: addprinc nfs/client.domain.tld@DOMAIN.TLD
kadmin: ktadd -k /etc/krb5.keytab.nfs nfs/client.domain.tld@DOMAIN.TLD
kadmin: q

root@client:~# chmod 600 /etc/krb5.keytab.nfs
root@client:~# chown root:root /etc/krb5.keytab.nfs

Das ist nur das Machine(!)-🦴-Prinzipal um überhaupt auf den NFS-Server zu kommen, das braucht man zwingend für jeden Machine-Client in der Domäne. GSSProxy fängt dann nach dem Userlogin auch das 🦴 Prinzipal für den User ab, allerdings nur nach Passwort. Wer hier noch für User ohne Passwort-Login Freigaben mounten will (z.B. ein HTPC-Nutzer der automatisch angemeldet wird) holt das User-Prinzipal auch in /var/lib/gssproxyclients:

Beispiel HTPC-Nutzer autologin und damit automount:

/etc/gssproxy/90-htpcautologin.conf

[service/htpcautologin]
mechs = krb5
cred_store = ccache:FILE:/var/lib/gssproxy/clients/krb5cc_htpc
cred_store = client_keytab:/var/lib/gssproxy/clients/htpc.keytab
cred_usage = initiate
euid = 108000

Wichtig, hier euid unbedingt auf die korrekte uid setzen.

🦴 Prinzipal für HTPC-User holen (User mit /admin Rechten):

root@client:~# kadmin -p user/admin@DOMAIN.TLD

kadmin: addprinc htpcuser@DOMAIN.TLD
kadmin: ktadd -k /var/lib/gssproxy/clients/htpc.keytab htpcuser@DOMAIN.TLD
kadmin: q

root@client:~# chmod 600 /var/lib/gssproxy/clients/htpc.keytab
root@client:~# chown root:root /var/lib/gssproxy/clients/htpc.keytab

Lesenswert https://man7.org/linux/man-pages/man8/rpc.gssd.8.html#DESCRIPTION

SSSD-KCM

https://manpages.debian.org/testing/sssd-kcm/sssd-kcm.8.en.html

apt install sssd-kcm

/etc/sssd/conf.d/kcm.conf

[kcm]
debug_level = 3

# wer will kann hier noch automatische renewals machen:
tgt_renewal = true
# wie oft geprüft wird ob Tickets erneuert werden müssen
krb5_renew_interval = 60m

# ungetestet
# tgt_renewal_inherit = domain-name

# diese Sachen soll man angeblich hier nochmal festlegen können, bei mir wurden die Werte aber immer ignoriert, liegt evtl. am KDC
# krb5_lifetime           =  86400
# krb5_renewable_lifetime = 604800

Datei muss chmod 600 auf root sein, dazu noch Service anschalten und starten:

chmod 600 /etc/sssd/conf.d/kcm.conf
chown root:root /etc/sssd/conf.d/kcm.conf
systemctl enable sssd-kcm.socket && systemctl start sssd-kcm.socket

KCM übernimmt auch die Pflege von Tickets die per kinit gemacht werden das is super praktisch weil nicht zwingend erforderlich ist dass SSSD das Ticket verwaltet.

SSSD installieren (OpenLDAP)

https://documentation.ubuntu.com/server/how-to/sssd/with-ldap-and-kerberos/

Wir nutzen auf Clients nicht nslcd, das ist zwar schlank und erfüllt seinen Zweck, aber Clients können auch mal Laptops sein und da ist das Caching durch SSSD ein riesen Vorteil wenn "mal kurz" die Verbindung weg ist.

root@client:~# apt install sssd sssd-tools sssd-ldap sssd-krb5 sssd-kcm ldap-utils krb5-user 

Damit wir den Kerberos-KDC-Server validieren können brauchen wir ein 🦴 Host-Prinzipal für den client. Remote holen und in /etc/krb5.keytab installieren:

root@client:~# kadmin -p user/admin@DOMAIN.TLD
kadmin: addprinc -randkey host/client.domain.tld@DOMAIN.TLD
kadmin: ktadd -k /etc/krb5.keytab host/client.domain.tld@DOMAIN.TLD
kadmin: q

root@client:~# chmod 600 /etc/krb5.keytab
root@client:~# chown root:root /etc/krb5.keytab

/etc/sssd/sssd.conf erstellen:

[sssd]
domains = domain.tld

# etwas unglücklich hier unser Standard domain.tld, also dann z.B: [domain/example.com]
[domain/domain.tld]
id_provider = ldap
ldap_uri = ldaps://ldap.domain.tld
ldap_search_base = dc=domain,dc=tld

# Wer nicht allen Usern Leserechte im LDAP-Baum gibt braucht noch einen Bind-DN:
ldap_default_bind_dn = cn=lookup,ou=Dienste,dc=domain,dc=tld
ldap_default_authtok = Bind-DN-Passwort im Klartext ... oder ...
# Wer das nicht im Klartext will:
    # apt install sssd-tools
    # sss_obfuscate -d domain.tld Klartext-Passwort --> obfuscated
#                             das ist kein platzhalter, sondern der TYP des authtok
# ldap_default_authtok_type = obfuscated_password

# Unser LDAP nutzt verschachtelte Gruppen
ldap_schema = rfc2307bis
# Welches Attribut in den Gruppen die Mitglieder bezeichnet. Bei uns ist das member, es gibt aber auch Implementierungen mit "uniqueMember"
ldap_group_member = member
# Das kann man zur Sicherheit noch extra setzen, ist so aber default
ldap_group_object_class = groupOfNames

auth_provider = krb5
krb5_server = auth.domain.tld
krb5_kpasswd = auth.domain.tld
krb5_realm = DOMAIN.TLD
krb5_validate = True

# Wenn kein KCM verwendet wird hier nutzen:
# krb5_renew_interval     =   7200

# Die 3 Sachen sind so default, %d ist krb5_ccachedir /tmp
# ldap_krb5_init_creds = True
# krb5_ccachedir = /tmp
# krb5_ccname_template = FILE:/tmp/krb5cc_%U_XXXXXX

# wir wollen aber KCM, das kann man offenbar weglassen wenn in /etc/krb5.conf schon [libdefaults] default_ccache_name = KCM: steht
krb5_ccname_template = KCM:

# Stellt sicher, dass der Client 7 Tage lang neue Tickets erhält (dann sollte man mal neustarten oder kinit -R ;))
# krb5.conf weiss eigentlich schon mit  ticket_lifetime = 24h und renew_lifetime = 7d diese Werte
# krb5_lifetime           =  86400
# krb5_renewable_lifetime = 604800

# Das muss man nur setzen wenn kein KCM installiert ist. KCM macht das renew auch für Tickets die von kinit kommen, nutzt man kein KCM muss es SSSD übernehmen:
# krb5_renew_interval     =   3600

cache_credentials = True

# LDAP erlaubt alle Benutzer und Gruppen aufzulisten
enumerate = True

access_provider = permit
sudo_provider = ldap
chpass_provider = krb5
autofs_provider = ldap
#resolver_provider = ldap

Die Config muss chmod 600 haben und root:root gehören:

root@client:~# chmod 600 /etc/sssd/sssd.conf
root@client:~# chown root:root /etc/sssd/sssd.conf

Anschliessend den Dienst starten:

root@client:~# systemctl enable sssd
root@client:~# systemctl start sssd

Den Cache neu laden wenn man was in der Config ändert:

root@client:~# sssctl cache-remove

AutoFS

root@client:~# apt install autofs

Tutorial für Server: 🚗 AutoFS-Einträge in 🌳 OpenLDAP

Das wars, einmal neustarten und Login

CacheFS für RoadWarriors

Für RoadWarrior kann man CacheFilesd aktivieren:

root@client:~# apt install cachefilesd

in /etc/default/cachefilesd RUN=yes setzen

root@client:~# systemctl enable cachefilesd

Die Standard-Einstellungen sind so ok, aber der NFS-Mount sollte kleiner sein, bei mir hat rsize=524288,wsize=524288 genügt. Das sollte für Mounts über OpenVPN ohnehin viel kleiner sein (1024).

Browser-Cache etc. müssen nicht manuell umgebogen werden (das machen wir trotzdem, aber der user merkt so weniger von der Verzögerung)

Zum Thema Roadwarrior kommt noch ein größeres Tutorial.

RPCBind komplett deaktivieren

Braucht man mit NFS4 nicht:

root@client:~# systemctl disable rpcbind.target
root@client:~# systemctl disable rpcbind.socket
root@client:~# systemctl disable rpcbind.service
root@client:~# systemctl stop rpcbind.target
root@client:~# systemctl stop rpcbind.socket
root@client:~# systemctl stop rpcbind.service

Hier der praktische Einzeiler:

root@client:~# systemctl disable rpcbind.target && systemctl disable rpcbind.socket && systemctl disable rpcbind.service && systemctl stop rpcbind.target && systemctl stop rpcbind.socket && systemctl stop rpcbind.service

Nicht irre werden mit 3x Kerberos Ticket Eigenschaften

Ich hab wirklich jeden Fall durchexerziert, die kdm.conf lifetimes werden ignoriert. Das kann am KDC liegen der keine Tickets mit anderer lifetime ausstellt - weiss ich nicht.

kinit beachtet die zeiten aus krb5.conf, sssd die aus der sssd.conf:

/etc/krb5.conf

Die legt fest wie Tickets aussehen wenn man einfach mit kinit tickets anfordert:

[libdefaults]
    ticket_lifetime = 24h
    renew_lifetime = 7d

Die Einstellungen in krb5.conf braucht man auf jeden Fall wenn man manuell kinit macht.

SSSD holt aber selbst tickets:

/etc/sssd/sssd.conf

[domain/example.tld]
krb5_lifetime   = 24h
krb5_renewable_lifetime = 7d 
krb5_renew_interval = 3600 # oder 2h

Daher muss man das auch da nochmal einstellen, sonst sind die nicht erneuerbar. Wenn man kein KCM nutzt muss man hier das krb5_renew_interval nutzen damit sssd die Tickets eneuert. Wenn man KCM nutzt gilt der timer aus der kcm.conf

Current PTF

Hintergrund ändern. Verbraucht keinen oder einen 🍪.

Verknüpften Viewport öffnen

🎮 Steuerung
Dokumentation 🕹️
Sie sind leider kein Entwickler :(

Content Nodes Amount

Diligence / PTF Amount

FPS

Vertex-Count