Aufbau:
# 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
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
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!
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
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.
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
root@client:~# apt install autofs
Tutorial für Server: 🚗 AutoFS-Einträge in 🌳 OpenLDAP
Das wars, einmal neustarten und Login
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.
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
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