Linux: Tuning zur Absicherung
Debian-Installation
GnuPG-Schlüssel
Import des zuletzt aktuellen „Debian CD signing key“ laut Angaben auf Verifying authenticity of Debian CDs mit GnuPG:
gpg --recv-keys --keyserver keyserver hkps://keyserver.ubuntu.com "Key fingerprint String"
- dirmngr.conf
keyserver hkps://keyserver.ubuntu.com
Installationsmedium
Download der ersten DVD ISO-Imagedatei und der Signaturdateien
- per HTTP/FTP
- per BitTorrent
- plus SHA512SUMS und SHA512SUMS.sign Datei
Siehe Firmware, falls während der Installation nach Firmware gefragt bzw. nicht-freie Firmware für spezielle Hardware benötigt wird.
Verifizierung
gpg --verify SHA[256|512]SUMS.sign gpg --with-colons --print-md sha[256|512] debian-version-amd64-DVD-n.iso
Nach dem Vergleich der ausgegebenen Prüfsumme mit der entsprechenden Angabe in der SHA[256|512]SUMS Datei werden die ISO-Imagedateien auf DVD-Rohlinge oder USB-Sticks geschrieben.
Installation
Während der Installation kann bestimmt werden, einen Debian-Mirror mit TLS (https) für den TLS-verschlüsselten Download zusätzlicher Pakete zu verwenden. Da keine Auswahlliste der Mirror-Adressen angeboten wird, muss man vor der Installation wie unter Repositories & Pakete beschrieben, die Adresse eines geeigneten Mirrors ermitteln und notieren.
Vor und während der Installation kann man auch die Debian GNU/Linux – Installationsanleitung und das 4. Kapitel - Installation des Debian Administrationshandbuchs heranziehen.
Zusatzpakete & Informationen
Nach der Installation wird wie unter Repositories & Pakete beschrieben, die /etc/apt/sources.list Datei so abgeändert, dass Debian-Mirror mit TLS verwendet werden, während man die DVD-Einträge mit # auskommentiert. Für die Ermittlung der TLS Debian-Mirror kann man das debian_tls_mirrors.sh Skript verwenden, nachdem curl installiert wurde.
sudo apt-get install aptitude sudo aptitude install curl
Abschließend werden die Paketlisten und das System aktualisiert:
sudo aptitude update sudo aptitude safe-upgrade
Danach kann man auch auf die Tor+TLS bzw. Tor+TOS Variante wechseln.
Nach dem 1. Start
Nach dem Reboot kann man zuerst mit systemctl
überprüfen, welche Dienste laufen und mit lsof
, welche bereits auf eingehende Netzwerkverbindungen lauschen, um sie ggf. zu deaktivieren oder zu entfernen:
sudo systemctl --type=service list-units
sudo lsof -i -P -n | grep -v COMMAND | sort avahi-dae 1575 avahi 12u IPv4 16360 0t0 UDP *:5353 avahi-dae 1575 avahi 14u IPv4 16362 0t0 UDP *:52982 cups-brow 1607 root 7u IPv4 16915 0t0 UDP *:631 rpcbind 1526 root 6u IPv4 14470 0t0 UDP *:111 rpcbind 1526 root 7u IPv4 14473 0t0 UDP *:853 rpcbind 1526 root 8u IPv4 14474 0t0 TCP *:111 (LISTEN) rpc.statd 1537 statd 8u IPv4 14593 0t0 UDP *:50764 rpc.statd 1537 statd 9u IPv4 14596 0t0 TCP *:58041 (LISTEN) sshd 1611 root 3u IPv4 18849 0t0 TCP *:22 (LISTEN)
Wird z. B. der rpcbind Portmapper, sshd SSH-Daemon, Avahi-Daemon oder der cups-browsed Daemon des CUPS Systems nicht benötigt, kann man sie auch zunächst deaktivieren oder entfernen:
sudo systemctl disable name.service
sudo aptitude purge paket-namen
Für die Bestandsaufnahme aller installierten Pakete, um sich über die Pakete zu informieren oder sie zu entfernen:
aptitude search '~i' -F '%p' --disable-columns > /tmp/ipakete.txt
Debian Repositories & Pakete
Download
Die Integrität von Paketen aus Repositories werden nach dem Download mittels GnuPG-Signaturen und Prüfsummen überprüft. Bei der Installation von Debian wird das debian-archive-keyring Paket installiert, das Schlüsselringdateien in /etc/trusted.gpg.d/ für die Debian Repositories speichert. Die Signaturen der Repository-Dateien und Pakete, die mit Schlüsseln aus den dort gespeicherten Dateien erstellt wurden, gelten automatisch als gültig. Deshalb sollten in dem Verzeichnis auch nur Debian Schlüssel bzw. Schlüsselringdateien gespeichert werden, während für Repositorys bzw. Pakete von Dritt-Parteien eine andere Lösung gewählt wird.
Zusätzlich kann der Download verschlüsselt erfolgen und nicht im Klartext, um möglichen Manipulationen durch MITM-Angreifer und negativen Auswirkungen bei Ausführung der Installationsroutinen vorzubeugen. Falls ein Repository-Server oder im Fall der TLS-Verschlüsselung das Zertifikat bzw. die CA kompromittiert ist, nützt eine Transportverschlüsselung selbstverständlich nichts. In der Hinsicht gibt es drei Arten von Repository-Server
- mit TLS
- ohne TLS/Tor Onion Service
mit TLS
Dafür wird das apt-transport-https Paket installiert
sudo aptitude install apt-transport-https
Um zu ermitteln, welche Debian-Mirror TLS unterstützen, kann man das folgende Skript ausführen, das alle Mirror der Mirrorliste mit TLS-Unterstützung und der im Skript angegebenen TLD in der /tmp/mirror_tls Datei sammelt.
- debian_tls_mirrors.sh
#!/bin/sh ddir=/tmp tld=de trap "rm $ddir/list $ddir/mirrors_http" EXIT cd $ddir && \ curl --tlsv1.3 --ipv4 -C - --retry 3 --proto https --capath /etc/ssl/certs --no-sessionid --remote-name https://www.debian.org/mirror/list && \ cat $ddir/list | grep nofollow | grep http | awk -F \" '{ print $6 }' | awk -F / '{ print $3 }' | grep -E "\.$tld$" | uniq | sort > mirrors_http && \ for i in $(cat mirrors_http) ; do tls="$(timeout 30 openssl s_client -connect $i:443 -tls1_3 2>/dev/null </dev/null | head -n 1 | awk -F \( '{ print $1 }')" if [ "$tls" = "CONNECTED" ]; then echo "$i" >> mirrors_tls fi done exit 0
chmod 750 ./debian_tls_mirrors.sh ./debian_tls_mirrors.sh
Aus der mirrors_tls entnimmt man dann einen Domainnamen und setzt ihn in die /etc/apt/sources.list Datei bzw. /etc/apt/source.list.d/*.list Dateien ein:
- /etc/apt/sources.list Beispiel
# deb cdrom:[Debian GNU/Linux ... deb http://security.debian.org/ releasename/updates main contrib non-free deb https://ftp.fau.de/debian/ releasename main contrib non-free deb https://ftp.fau.de/debian/ releasename-updates main contrib non-free deb https://ftp.fau.de/debian/ releasename-backports main contrib non-free
mit Tor Onion Service
Für Repositories, die kein TLS unterstützen, aber einen Tor Onion Service anbieten, erhält man die verschlüsselte Verbindung mit der Tor Transportverschlüsselung. Bei Repositories mit TLS kann der Download zusätzlich verschlüsselt und anonymisiert erfolgen. Ohne TLS sollte man den Domainnamen in der torrc mit MapAddress an einen „vertrauenswürdigen“ Tor Ausgangsknoten binden.
sudo aptitude install apt-transport-tor
In die /etc/apt/sources.list Datei bzw. die /etc/apt/source.list.d/*.list Dateien setzt man ein:
- datei.list
deb tor+http://tos.onion ... deb tor+https://domainname ... deb tor+http://domainname ... (plus MapAddress)
Für Debian lauten die Einträge:
- /etc/apt/sources.list
deb tor+http://vwakviie2ienjx6t.onion/debian releasename main contrib non-free deb tor+http://sgvtcaew4bxjd7ln.onion/debian-security releasename/updates main contrib non-free deb tor+http://vwakviie2ienjx6t.onion/debian releasename-updates main contrib non-free deb tor+http://vwakviie2ienjx6t.onion/debian releasename-backports main contrib non-free
ohne TLS/Tor Onion Service
Dritt-Partei Repositories & Pakete
Wenn neben den offiziellen Debian Repositories auch Pakete aus Repositories von Dritt-Parteien bezogen werden sollen, geht man so vor:
Für die Schlüssel- bzw. Schlüsselringdateien wird ein eigenes Verzeichnis angelegt:
sudo mkdir /etc/apt/signedby.gpg.d/ sudo chmod 0755 /etc/apt/signedby.gpg.d/
Schlüssel- bzw. Schlüsselringdateien von Dritt-Partei Repositories, die auf sicherem Wege erhalten und überprüft wurden, werden in das erstellte Verzeichnis für alle Benutzer oder nur für den _apt Benutzer lesbar verschoben, nachdem sie ggf. zuvor im Binärformat exportiert wurden:
gpg --output schlüsseldatei.gpg --no-armor --export schlüssel-id sudo mv schlüsseldatei.gpg /etc/apt/signedby.gpg.d/ sudo chmod 644 /etc/apt/signedby.gpg.d/schlüsseldatei.gpg
Für das Dritt-Partei Repository wird in /etc/sources.list.d/ eine reponame.sources Datei im deb822-Format angelegt, in der mit der Signed-By Option auf die Schlüsseldatei verwiesen wird, die Schlüssel enthält, die für das Repository gültige Signaturen zeichnen können.
- reponame.sources
Types: deb [deb-src] URIs: [tor+]http(s)://hostname/... Suites: stretch Components: main | contrib | non-free Signed-By: /etc/apt/signedby.gpg.d/schlüsseldatei.gpg
Pakete aktualisieren
Zur Basis eines sicheren Systems gehört die regelmäßige Aktualisierung der installierten Software bzw. Pakete zum Einspielen von Fehlerbereinigungen und Sicherheitskorrekturen. Die Aktualisierung kann entweder automatisch oder manuell erfolgen. Von grafischen Paketmanagern würde ich abraten und sie deinstallieren.
automatisch
sudo aptitude install unattended-upgrades apt-listchanges
In 50unattended-upgrades das Kommentarzeichen // vor den angegebenen Zeilen entfernen und bei Verwendung des Backports Repository Zeile hinzufügen:
sudo vi /etc/apt/apt.conf.d/50unattended-upgrades
- /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Origins-Pattern { "o=Debian,n=releasename"; "o=Debian,n=releasename-updates"; "o=Debian,n=releasename-backports"; "o=Debian,n=releasename,l=Debian-Security"; }; Unattended-Upgrade::Mail "root";
sudo dpkg-reconfigure -plow unattended-upgrades -> mit Ja bestätigen
manuell
apticron überprüft per Cron-Job oder als apticron-systemd installiert, per systemd Timer-Unit, ob Aktualisierungen vorliegen, lädt die entsprechenden Pakte aus den Repositories herunter und versendet danach entsprechende E-Mail Benachrichtigungen, die auch Hinweise zu den Veränderungen beinhalten.
- apticron E-Mail
apticron report [Mon, 23 Jan 2017 18:00:47 +0100] ======================================================================== apticron has detected that some packages need upgrading on: debian.domain.local [ 192.168.3.99 ] The following packages are currently pending an upgrade: tor 0.2.9.9-1~d80.jessie+1 tor-geoipdb 0.2.9.9-1~d80.jessie+1 ======================================================================== Package Details: Lese Changelogs... --- Änderungen für tor (tor tor-geoipdb) --- tor (0.2.9.9-1~d80.jessie+1) jessie-backport; urgency=medium * Build for jessie-backport. -- jenkins role account <jenkins@build-x86-06.torproject.org> Mon, 23 Jan 2017 15:48:42 +0000 tor (0.2.9.9-1) unstable; urgency=medium * New upstream version. + Downgrade the "-ftrapv" option from "always on" to "only on when --enable-expensive-hardening is provided." (re: TROVE-2017-001). -- Peter Palfrader <weasel@debian.org> Mon, 23 Jan 2017 16:44:32 +0100 tor (0.2.9.8-2) unstable; urgency=medium * Actually target unstable. -- Peter Palfrader <weasel@debian.org> Mon, 19 Dec 2016 22:21:05 +0100
sudo aptitude install apticron oder apticron-systemd
Nach der Installation von apticron kann man das Intervall ändern, in dem apticron aktiv wird.
sudo vi /etc/cron.d/apticron
- /etc/cron.d/apticron
# Beispiel: alle 3h 0 */3 * * * root if test -x /usr/sbin/apticron; then /usr/sbin/apticron --cron; else true; fi
Für apticron-systemd kann man die Konfiguration des Timers ändern. Die Standardwerte sind in /lib/systemd/system/apticron.timer hinterlegt.
Nach Erhalt der apticron E-Mail können Aktualisierungen wie gewohnt installiert werden:
sudo aptitude safe-upgrade
Oder man kann z. B. nachschauen, was das für ein Paket ist, welche Pakete vom zu aktualisierenden Paket abhängen und es ggf. anstatt der Aktualisierung entfernen:
aptitude show paketname apt-cache rdepends paketname sudo aptitude purge paketname
Daten retten, sichern, wiederherstellen
Borg Backup | Anwendung (Konsole) |
Clonezilla | Live CD/USB |
FSArchivar | Anwendung (Konsole) |
GParted | Live CD/USB |
Mondo Rescue | Anwendung (Konsole) |
Rescatux / Super Grub2 Disk | Live CD/USB |
Rescuezilla | Live CD/USB |
Restic | Anwendung (Konsole) |
SystemRescueCD | Live CD/USB |
TestDisk | Anwendung (Konsole), Live CD/USB |
Datenintegrität/HIDS
Samhain und fcheck
Boot-Check
Die beiden folgenden Skripte und die systemd Unit-Datei überprüfen die Inhalte der /boot Boot-Partition bei jedem Start auf Integrität. Die gleiche Überprüfung ist auch Bestandteil der HIDS Routinen, aber so erhält man zusätzlich speziell über den Zustand der /boot Partition auf einen Blick Auskunft.
bootsums
Nach
- Installation oder Aktualisierung eines Kernels oder von GnuPG
- update-grub
- Änderung des checkbootsums Skripts
wird mit dem bootsums Skript
- mittels sha512sum Prüfsummen von Dateien in der /boot Partition, des checkbootsums Skripts und der gpg2 Binärdatei erstellt, die in einer Prüfsummendatei gespeichert werden
- mittels GnuPG die Prüfsummendatei signiert und in /pfad/bootsums.asc gespeichert. Dafür unterhält root einen eigenen GnuPG-Schlüssel, dessen Passphrase in der /pfad/pfile Datei gespeichert ist. Das Skript wird nur für root rwx gespeichert und mit
sudo bootsums
ausgeführt.
- /pfad/bootsums
#!/bin/sh store="/pfad/store" pfile="/pfad/pfile" tmpdir=$(mktemp -d) file="bootsums" sigfile="$tmpdir/$file.asc" checkscript="/pfad/checkbootsums" gpgbin="/pfad/bin/gpg2" trap "shred -n1 -uz $tmpdir/* && rmdir $tmpdir" EXIT gpg-connect-agent --quiet 1>/dev/null </dev/null && \ cd $store if [ -f $file.asc ]; then rm $file.asc fi echo "$(for f in $(find /boot/ -type f); do sha512sum $f; done)" > $tmpdir/$file && \ echo "$(sha512sum $checkscript)\n" >> $tmpdir/$file && \ echo "$(sha512sum $gpgbin)\n" >> $tmpdir/$file && \ gpg2 -q --no-tty --no-verbose --no-ask-sig-expire --batch --pinentry-mode loopback --passphrase-file $pfile --clearsign $tmpdir/$file 2>/dev/null mv $sigfile $store/ exit 0
checkbootsums
Das checkbootsums Skript wird automatisch bei jedem Start per systemd ausgeführt.
- Es überprüft die Gültigkeit der GnuPG Signatur der Prüfsummendatei (sigtest)
- Wenn die GnuPG Signatur gültig ist, überprüft es die SHA512 Prüfsummen mit sha512sum und den Prüfsummen in der signierten Prüfsummendatei (status)
- Wenn die GnuPG Signatur ungültig ist oder die Verifizierung der SHA512 Prüfsummen fehlschlägt, versendet es entsprechende, GnuPG signierte Fehlermeldungen per E-Mail
- Wenn beide Überprüfungen korrekte Resultate ergeben, versendet es eine entsprechende, GnuPG signierte Erfolgsmeldung per E-Mail
- Wenn überhaupt keine E-Mail erhalten wird, gibt es entweder ein Problem mit der Mailzustellung oder der Skriptaufruf wurde entfernt/manipuliert. Die Existenz und Integrität des Skripts muss garantiert sein und wird nur für root rwx gespeichert
- /pfad/checkbootsums
#!/bin/sh store="/pfad/store" sigfile="bootsums.asc" tmpdir=$(mktemp -d) errorfile="$tmpdir/shatest" bootstamp="$(date -d "`cut -f1 -d. /proc/uptime` seconds ago")" timestamp="$(date)" gpgopt="-q --no-tty --no-verbose" pfile="/pfad/pfile" trap "rmdir $tmpdir" EXIT gpg-connect-agent --quiet 1>/dev/null </dev/null && \ cd $store sigtest="$(gpg2 $gpgopt --verify --status-fd 1 $sigfile 2>/dev/null | egrep "^\[GNUPG:\] (BAD|VALID)+SIG" | cut -d\ -f 2)" if [ "$sigtest" = "BADSIG" ]; then echo "Bootzeit:$bootstamp\nStartzeit:$timestamp\n\nVerifizierung der Prüfsummendatei-Signatur fehlgeschlagen.\n" | gpg2 $gpgopt --no-ask-sig-expire --batch --pinentry-mode loopback --passphrase-file $pfile --clearsign 2>/dev/null | mail -s "[Bootsums] Signaturdatei manipuliert" slave exit 0 elif [ "$sigtest" = "VALIDSIG" ]; then status="$(sha512sum --quiet -c $sigfile --status ; echo $?)" if [ $status -gt "0" ]; then sha512sum -c $sigfile > $errorfile 2>/dev/null echo "Bootzeit:$bootstamp\nStartzeit:$timestamp\n\n1. Prüfsummendatei-Signatur korrekt verifiziert.\n2. Überprüfung überwachter Dateien ergab:\n$(grep FEHLSCHLAG $errorfile).\n" | gpg2 $gpgopt --no-ask-sig-expire --batch --pinentry-mode loopback --passphrase-file $pfile --clearsign 2>/dev/null | mail -s "[Bootsums] Datei(en) manipuliert" root shred -n1 -uz $errorfile exit 0 else echo "Bootzeit:$bootstamp\nStartzeit:$timestamp\n\n1. Prüfsummendatei-Signatur korrekt verifiziert.\n2. Dateiprüfsummen korrekt verifiziert.\n" | gpg2 $gpgopt --no-ask-sig-expire --batch --pinentry-mode loopback --passphrase-file $pfile --batch --clearsign 2>/dev/null | mail -s "[Bootsums] Check OK" root exit 0 fi fi exit 0
boot-check.service
- /etc/systemd/system/boot-check.service
[Unit] Description=Boot-Check After=local-fs.target mta.service Requires=mta.service [Service] ExecStart=/pfad/checkbootsums Type=oneshot [Install] WantedBy=multi-user.target
Zugriffskontrolle
AppArmor
Siehe Linux: AppArmor
/etc/fstab
nodev | noexec | nosuid | quota | Anmerkungen | |
---|---|---|---|---|---|
/boot | X | X | X | ||
/home | X | X | X | X | Alle Dateien, die unter /home/benutzer ausführbar (auch mmap) sein müssen, müssen wg. noexec in Volumes mit exec verschoben werden mit entsprechenden Symlinks zurück unter /home/benutzer. |
/opt | X | X | Kein noexec, sofern Dritt-Programme bzw. -Pakete auszuführende Dateien unter /opt benötigen. | ||
/proc | X | X | X | /etc/fstab:proc /proc proc rw,nosuid,nodev,noexec,relatime,hidepid=invisible,gid=gruppenname 0 0 sudo groupadd gruppenname
|
|
/dev/shm | X | X | X | /etc/fstab:tmpfs /dev/shm tmpfs rw,noexec,nosuid,nodev,relatime 0 0 |
|
/usr | X | ||||
/tmp /var | X X | (X) (X) | X X | X (X) | apt, dpkg und weitere Anwendungen führen ggf. Skripte in /tmp und /var aus. Deshalb kann noexec nur gesetzt werden, wenn man die Anwendungen anpasst.
java -Djava.io.tmpdir=/pfad/tmpdir Quota für /var, wenn sich /var/tmp nicht in einem eigenen Volume befindet. |
/var/tmp | X | X | X | X | wenn für /var/tmp ein eigenes Volume angelegt wurde. |
/andere | X | X | X |
Logs
Wer für Logs und ihre Auswertung nicht nur das systemd Journal mit journalctl
verwendet, installiert zusätzlich rsyslogd, logrotate und logcheck.
sudo aptitude install rsyslog logrotate logcheck
Anschließend wird der rsyslogd angewiesen, Loginhalte per imuxsock Modul über den /run/systemd/journal/syslog Syslog-Socket zu importieren und den dev/log bzw. /run/systemd/journal/dev-log System-Socket zu ignorieren:
- /etc/rsyslog.conf
module(load="imuxsock" SysSock.Use="on" SysSock.Name="/run/systemd/journal/syslog") $ModLoad imklog $KLogPermitNonKernelFacility on
Die Standard umask wird restriktiver als 0022 gesetzt:
- /etc/rsyslog.conf
$FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0750 $Umask 0027
Da mit der rsyslogd Standardkonfiguration die adm Systemgruppe Leserechte auf Logdateien erhält, wird die Mitgliedschaft normaler Benutzer in der adm Gruppe entfernt:
id -Gn loginname sudo usermod -G gruppe1,gruppeN (ohne adm) loginname
In /etc/logcheck/logcheck.logfiles.d/journal.logiles wird bestimmt, ob logcheck das systemd Journal auswertet und mit Pfadangaben in weiteren *.logfiles Dateien, welche anderen oder weiteren Logdateien logcheck auswertet.
Damit logrotate neue Logdateien in /var/log/ mit den Berechtigungen root:adm und 640 anlegt, wird in jede Datei unter /etc/logrotate.d/ angeefügt:
- /etc/logrotate.d/datei
create root adm 0640
Jedes Unterverzeichnis in /var/log/ mit Ausnahme von /var/log/cups/ oder auch z. B. /var/log/lightdm/ erhält die Berechtigungen root:adm bzw. daemon:adm und 750.
Quota
Vorbereitung
Mit Quota kann der Speicherplatzverbrauch für einzelne Benutzer und/oder Gruppen limitiert werden, so dass ein „Volllaufen“ eines Volumes bzw. einer Partition verhindert wird. Für die Quotaverwendung muss der Kernel entsprechend konfiguriert sein. Ist CONFIG_QFMT_V2 als Modul eingestellt, wird das quota_v2.ko Kernelmodul in /etc/modules eingetragen:
sudo echo quota_v2 >> /etc/modules
Für die Quotaverwendung werden die enstprechenden Pakete installiert:
sudo aptitude install quota quotatool
Wird kein Quota auf per NFS eingehängten Dateisystemen bzw. RPC Quota-Server verwendet, kann der RPC Remote Quota Server Dienst deaktiviert werden:
sudo systemctl disable quotarpc.service
In der /etc/fstab Datei werden die Mountoptionen des /fs Dateisystems mit den Optionen zur Nutzung von Journaling Quota ergänzt:
- /etc/fstab
/fs /mountpoint ext4 optionen,usrjquota=aquota.usr/grpjquota=aquota.group,jqfmt=vfsv0|1
Man kann mit usrjquota Quota für Benutzer und/oder mit grpjquota Quota für Gruppen einrichten. Bei Volumes mit einer Größe > 4TB wird das Quotaformat vfsv1 verwendet.
Anschließend wird ein Neustart ausgeführt, falls das Dateisystem nicht mit dem folgenden Kommando neu eingehängt werden kann:
sudo mount -o remount /mountpoint
Aktivierung
Danach wird die /mountpoint/aquota.usr|group Datei erstellt und Benutzer- (u) und/oder Gruppen-Quota (g) aktiviert:
sudo quotacheck -v[u|g]c -F vfsv0|1 /fs sudo quotaon -v[u|g] /fs
Limits und Gnadenfristen
Zur Festlegung der Speicherplatz-Limits lässt man sich die aktuelle Speicherplatzbelegung anzeigen und überlegt sich, wieviel Prozent des verfügbaren Speicherplatzes dem Benutzer und/oder der Gruppe maximal zur Verfügung stehen soll (bei der Einrichtung eines ext4 Dateisystems werden mit den Standardeinstellungen 5% der Dateisystem-Blöcke für root reserviert). Das Maximum ist zugleich das Hardlimit (z. B. 95 - 97% des Speicherplatzes) bis zu dem ein Benutzer und/oder eine Gruppe das Softlimit (z. B. 90% des Speicherplatzes) innerhalb einer Zeitspanne (Grace Period oder Blockgnadenfrist) überschreiten kann, bevor keine weiteren Daten mehr geschrieben werden dürfen.
df -h /mountpoint/ Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /fs 7,3G 17M 6,9G 1% /mountpoint df -k /mountpoint/ Dateisystem 1K-Blöcke Benutzt Verfügbar Verw% Eingehängt auf /fs 7557288 17224 7133128 1% /mountpoint
Abschließend wird für den Benutzer und/oder die Gruppe das Softlimit, Hardlimit und eine Blockgnadenfrist mit einer bestimmten Anzahl von Tagen (ndays) für Benutzer und/oder Gruppen vergeben.
sudo edquota -[u|g] -F vfsv0|1 -f /mountpoint/ benutzer|gruppe Datenträgerquotas für user|group name (uid|gid nnnn): Dateisystem Blöcke weich hart Inodes weich hart /fs 56 6419815 6776471 14 0 0
sudo edquota -[u|g] -F vfsv0|1 -f /mountpoint/ -t Gnadenfrist bevor die weichen Limits durchgesetzt werden für users|groups: Zeiteinheiten dürfen sein: days, hours, minutes, oder seconds Dateisystem Blockgnadenfrist Inodegnadenfrist /fs 1days 7days
Bericht und Information
Aktuell
Die aktuellen Daten über die Anwendung der Limits kann man sich mit repquota
für ein oder alle Dateisysteme anzeigen lassen:
sudo repquota -vs[u|g] /fs sudo repquota -vsuga
Mit dem quota Paket wird auch die warnquota
Anwendung instaliert, mit der E-Mail Benachrichtigungen bei Überschreitung von Softlimits zugestellt werden. In der /etc/quotagrpadmins Datei wird angegeben, zu welchen Gruppen mit eingerichtetem Quota an welchen Benutzer entsprechende Benachrichtigungen gehen sollen:
- /etc/quotagrpadmins
gruppenname:root # oder gruppenname:loginname
In der /etc/quotatab Datei können Übersetzungen der Geräte-Dateinamen von Dateisystemen mit Quota zu „verständlichen“ Namen vorgenommen werden, die in den Benachrichtigungen angegeben werdem.
- /etc/quotatab
# Beispiele für /home /dev/mapper/volumename:/home /dev/mapper/volumename:Heimatverzeichnis
In der /etc/warnquota.conf Datei wird die E-Mail Vorlage bearbeitet:
- /etc/warnquota.conf Beispiel
MAIL_CMD = "/usr/sbin/sendmail -t" FROM = "root@host.domain.tld" SUBJECT = "[Quota] Limit-Warnung" CC_TO = "" SUPPORT = "root@host.domain.tld" MESSAGE = Der Benutzer '%i' hat sein Softlimit überschritten. Daten müssen innerhalb von n Tagen|\ auf folgenden Dateisystemen gelöscht werden:| SIGNATURE = was auch immer| GROUP_MESSAGE = Die Gruppe '%i' hat ihr Softlimit überschritten. Daten müssen innerhalb von n Tagen|\ auf den folgenden Dateisystemen gelöscht werden:| GROUP_SIGNATURE = was auch immer| CHARSET = UTF-8
Wer in der E-Mail statt der Angabe von Blöcken andere Einheiten (Mega-, Gigabyte usw.) anzeigen lassen will, muss den warnquota Aufruf in der /etc/cron.daily/quota Datei um „s“ ergänzen. Hier kann auch mit „i“ angegeben werden, autofs Mountpoints zu ignorieren oder das Quotaformat mit „-F vfsv0|1“.
- /etc/cron.daily/quota
/usr/sbin/warnquota -ugs
Zur Aktivierung des täglichen warnquota Cron-Jobs ist die /etc/default/quota Datei zu editieren:
- /etc/default/quota
run_warnquota=true
Malware aufspüren
Vorbemerkung
Generell gilt auch hier das Gleiche wie zu Antiviren-Scannern: Gegen Zero-Day Exploits bzw. Malware, für die noch keine Signaturen vorliegen und die auch nicht mittels heuristischer Analysen zuverlässig erkannt werden, helfen keine Anti-Malware Anwendungen. Weist die Anti-Malware Anwendung Sicherheitslücken auf und/oder wird sie in einem unsicheren Kontext ausgeführt, kann sie die Sicherheit des Systems unterminieren. Siehe Linux Malware Scanner.
Kernel
Konfiguration
Die Einstellungen beziehen sich auf Kernelversionen ab 6.4. Generell sollte man alles deaktivieren, was nicht benötigt wird und benötigte Kernelmodule möglichst fest in den Kernel einbauen. Die Konfiguration ist auf einen Einzelplatzrechner mit „normaler“ Benutzung für den Alltag ausgerichtet. Anwender mit speziellen Anforderungen oder Entwickler müssen natürlich davon abweichen und man sollte parallel einen Backup-Kernel installiert haben, falls Start und Betrieb des Kernels mit der Konfiguration fehlschlägt. Angaben mit K:string
beziehen sich auf zusätzliche Parameter, die man auf der Kernel Kommandozeile bzw. in GRUB_CMDLINE_LINUX_DEFAULT der GRUB Konfiguration angibt, Angaben mit S:typ
auf sysctl Kernel-Variablen. Einstellungen mit [?]
weisen Probleme auf, sind fragwürdig oder Ansichtssache.
Wie man unter Debian einen eigenen Kernel konfiguriert, kompiliert und installiert, kann im Debian Administrationshandbuch ab Einen Kernel kompilieren nachgelesen werden.
Mit dem kconfig-hardened-check Skript kann man sich empfohlene Einstellungen zur Härtung des Kernels ausgeben lassen und die aktuelle Konfiguration des Kernels auf gesetzte bzw. nicht gesetzte Einstellungen zur Härtung überprüfen. Dabei ist zu beachten, dass einige nicht gesetzte Einstellungen, die mit „FAIL“ ausgewiesen werden, Optionen betreffen, die für Kernelentwickler oder IT-Sicherheitsforscher interessant sind, aber nicht für normale Benutzer, keinen praktischen Schutz bieten, sondern dem Reporting und Debugging dienen oder für die eigene Architektur nicht relevant sind.
git clone https://github.com/a13xp0p0v/kconfig-hardened-check.git ./kconfig-hardened-check/bin/kconfig-hardened-check -p X86_64 ./kconfig-hardened-check/bin/kconfig-hardened-check -m show_fail -c /boot/config-version
General Setup
General Setup ---> [ ] Enable process_vm_readv/writev syscalls (CONFIG_CROSS_MEMORY_ATTACH) [ ] uselib syscall (CONFIG_USELIB) BPF subsystem ---> [*] Enable bpf() system call (CONFIG_BPF_SYSCALL) [*] Enable BPF Just In Time compiler (CONFIG_BPF_JIT) [*] Permanently enable BPF JIT and remove BPF interpreter (CONFIG_BPF_JIT_ALWAYS_ON) -> deaktivieren, wenn der BPF Paketfilter (z. B. von systemd) nicht verwendet wird [*] Disable unprivileged BPF by default (CONFIG_BPF_UNPRIV_DEFAULT_OFF) S:kernel [*] Core Scheduling for SMT (CONFIG_SCHED_CORE) -> falls Hyperthreading/Simultaneous Multithreading genutzt wird -*- Control Group support ---> [*] Support for eBPF programs attached to cgroups (CONFIG_CGROUP_BPF) -> wenn [*] Enable bpf() system call (CONFIG_BPF_SYSCALL) [ ] Checkpoint/restore support (CONFIG_CHECKPOINT_RESTORE) [ ] Boot config support (CONFIG_BOOT_CONFIG) [*] Configure standard kernel features (CONFIG_EXPERT) ---> [ ] sgetmask/ssetmask syscalls support (CONFIG_SGETMASK_SYSCALL) [ ] Sysfs syscall support (CONFIG_SYSFS_SYSCALL) [*] BUG() support (CONFIG_BUG) [ ] Enable IO uring support (CONFIG_IO_URING) [ ] Load all symbols for debugging/ksymoops (CONFIG_KALLSYMS) [ ] Profiling support (CONFIG_PROFILING)
64-bit
[*] 64-bit kernel (CONFIG_64BIT)
Processor type & features
Processor type and features (ohne herstellerspez. Erweiterungen) ---> [ ] Enable vsyscall emulation (CONFIG_X86_VSYSCALL_EMULATION) [ ] IOPERM and IOPL Emulation (CONFIG_X86_IOPL_IOPERM) [*] CPU microcode loading support (CONFIG_MICROCODE) [*] Intel/AMD microcode loading support (CONFIG_MICROCODE_INTEL/_AMD)
sudo aptitude install intel|amd64-microcode
< > /dev/cpu/*/msr - Model-specific register support (CONFIG_X86_MSR) [ ] x86 architectural random number generator (CONFIG_ARCH_RANDOM) K:random.trust_cpu=off [*] Supervisor Mode Access Prevention (CONFIG_X86_SMAP - Intel CPU) [*] User Mode Instruction Prevention (CONFIG_X86_UMIP) [*] Indirect Branch Tracking (CONFIG_X86_KERNEL_IBT) [*] Memory Protection Keys (CONFIG_X86_INTEL_MEMORY_PROTECTION_KEY) TSX enable mode (off) ---> (CONFIG_X86_INTEL_TSX_MODE_OFF) K:tsx=off [ ] EFI runtime service support (CONFIG_EFI) [ ] kexec system call (CONFIG_KEXEC) [ ] kexec file based system call (CONFIG_KEXEC_FILE) [ ] kernel crash dumps (CONFIG_CRASH_DUMP) [*] Randomize the address of the kernel image (KASLR) (CONFIG_RANDOMIZE_BASE) [*] Randomize the kernel memory sections (CONFIG_RANDOMIZE_MEMORY) vsyscall table for legacy applications ---> (x) None (CONFIG_LEGACY_VSYSCALL_NONE) K:vsyscall=none [ ] Enable the LDT (local descriptor table) (CONFIG_MODIFY_LDT_SYSCALL)
Mitigations for speculative execution vulnerabilities
[*] Mitigations for speculative execution vulnerabilities (SPECULATION_MITIGATIONS) [*] Remove the kernel mapping in user mode (CONFIG_PAGE_TABLE_ISOLATION) [*] Avoid speculative indirect branches in kernel (CONFIG_RETPOLINE) K:spectre_v2=retpoline [*] Enable return-thunks (CONFIG_RETHUNK) [*] Mitigate RSB underflow with call depth tracking (CONFIG_CALL_DEPTH_TRACKING) [*] Enable IBRS on kernel entry (CONFIG_CPU_IBRS_ENTRY) K:spectre_v2=ibrs [*] Mitigate Straight-Line-Speculation (CONFIG_SLS) [ ] Force GDS Mitigation (CONFIG_GDS_FORCE_MITIGATION) K:gather_data_sampling=force -> gegen GDS ("Downfall") Schwachstelle. Unnötig mit Microcode mit entsprechenden Abwehrfunktionen. Ansonsten wird AVX deaktiviert, was ggf. einige Anwendungen funktionsunfähig macht
Power management and ACPI options
Power management and ACPI options ---> [*] ACPI (Advanced Configuration and Power Interface) Support ---> [ ] Allow upgrading ACPI tables via initrd (CONFIG_ACPI_TABLE_UPGRADE) < > ACPI configfs support (CONFIG_ACPI_CONFIGFS) < > ACPI Platform Firmware Runtime Update and Telemetry (CONFIG_ACPI_PFRUT)
Binary Emulations
Binary Emulations ---> [ ] IA32 Emulation (CONFIG_IA32_EMULATION) [ ] x32 ABI for 64-bit mode (CONFIG_X86_X32)
General architecture-dependent options
General architecture-dependent options ---> [ ] Kprobes (CONFIG_KPROBES) [*] Enable seccomp to safely execute untrusted bytecode (CONFIG_SECCOMP) [*] Stack Protector buffer overflow detection (CONFIG_STACKPROTECTOR) [*] Strong Stack Protector (CONFIG_STACKPROTECTOR_STRONG) (32) Number of bits to use for ASLR of mmap base address (CONFIG_ARCH_MMAP_RND_BITS) [*] Use a virtually-mapped stack (CONFIG_VMAP_STACK) [*] Support for randomizing kernel stack offset on syscall entry (CONFIG_RANDOMIZE_KSTACK_OFFSET) K:randomize_kstack_offset=on/off [*] Default state of kernel stack offset randomization (CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT) GCOV-based kernel profiling --- [*] GCC plugins ---> [*] Generate some entropy during boot and runtime (CONFIG_GCC_PLUGIN_LATENT_ENTROPY)
sudo aptitude install gcc-n-plugin-dev Für Debian 11 muss aus dem gcc-n-plugin-dev Testing (Bookworm) Paket das /lib/.../include/common/ Verzeichnis in das System kopiert werden.
Enable loadable module support
[*] Enable loadable module support (CONFIG_MODULES) ---> [ ] Forced module loading (CONFIG_MODULE_FORCE_LOAD) [ ] Module unloading (CONFIG_MODULE_UNLOAD) [*] Module signature verification (CONFIG_MODULE_SIG) [*] Require modules to be validly signed (CONFIG_MODULE_SIG_FORCE) [*] Automatically sign all modules (CONFIG_MODULE_SIG_ALL) Which hash algorithm should modules be signed with? ---> >= SHA-256 [?] Trim unused exported kernel symbols (CONFIG_TRIM_UNUSED_KSYMS) -> Nur dann, wenn Kernelmodule nicht auch extern kompiliert werden z. B. Grafikkarte.
Executable file formats
Executable file formats ---> < > Kernel support for MISC binaries (CONFIG_BINFMT_MISC) -> <*> z. B. für Emulatoren, Container, Virtuelle Maschinen, Durchsuchung v. Binärdateien [ ] Enable core dump support (CONFIG_COREDUMP)
Memory Management options
SLAB allocator options ---> [ ] Allow slab caches to be merged (CONFIG_SLAB_MERGE_DEFAULT) K:slab_nomerge [*] Randomize slab freelist (CONFIG_SLAB_FREELIST_RANDOM) [*] Harden slab freelist metadata (CONFIG_SLAB_FREELIST_HARDENED) [*] Page allocator randomization (CONFIG_SHUFFLE_PAGE_ALLOCATOR) plus K:page_alloc.shuffle=1 [ ] Disable heap randomization (CONFIG_COMPAT_BRK) [ ] Enable KSM for page merging (CONFIG_KSM) < > HWPoison pages injector (CONFIG_HWPOISON_INJECT) [*] Enable memfd_secret() system call (CONFIG_SECRETMEM) [ ] Enable userfaultfd() system call (CONFIG_USERFAULTFD)
Networking support
[*] Networking support ---> Networking options ---> [*] TCP/IP networking < > INET: socket monitoring interface (CONFIG_INET_DIAG) < > * Protocol usw. -> die nicht benötigt werden [*] Network packet filtering framework (Netfilter) ---> [*] Advanced netfilter configuration (CONFIG_NETFILTER_ADVANCED) <*> IP set support --->
Device Drivers
Device Drivers ---> Generic Driver Options ---> [*] Use nosuid,noexec mount options on devtmpfs (CONFIG_DEVTMPFS_SAFE) -> kann z. B. die Funktionalität von nicht-KMS Videotreibern verhindern [*] Select only drivers that don't need compile-time external firmware (CONFIG_STANDALONE) [*] Disable drivers features which enable custom firmware building (CONFIG_PREVENT_FIRMWARE_BUILD) Firmware loader ---> [ ] Enable the firmware sysfs fallback mechanism (CONFIG_FW_LOADER_USER_HELPER) [ ] Enable users to initiate firmware updates using sysfs (CONFIG_FW_UPLOAD) [ ] Allow device coredump (CONFIG_ALLOW_DEV_COREDUMP) Firmware Drivers ---> EFI (Extensible Firmware Interface) Support ---> < > EFI Variable Support via sysfs (CONFIG_EFI_VARS) [*] Clear Busmaster bit on PCI bridges during ExitBootServices() (CONFIG_EFI_DISABLE_PCI_DMA) K: efi=[no_]disable_early_pci_dma -> wenn [*] EFI runtime service support (CONFIG_EFI) [*] Multiple devices driver support (RAID and LVM) (CONFIG_MD) ---> <*> Device mapper support (CONFIG_BLK_DEV_DM) <*> Crypt target support (CONFIG_DM_CRYPT) [*] Network device support ---> <*> WireGuard secure network tunnel (CONFIG_WIREGUARD) -> falls man WireGuard für VPNs¹ nutzt <*> Universal TUN/TAP device driver support (CONFIG_TUN) Character devices ---> [ ] Legacy (BSD) PTY support (CONFIG_LEGACY_PTYS) [ ] Allow legacy TIOCSTI usage (CONFIG_LEGACY_TIOCSTI) S:dev.tty.legacy_tiocsti [ ] Automatically load TTY Line Disciplines (CONFIG_LDISC_AUTOLOAD) <*> Hardware Random Number Generator Core support (CONFIG_HW_RANDOM) < > Intel|AMD|VIA HW Random Number Generator support [ ] /dev/mem virtual device support (CONFIG_DEVMEM) < > /dev/nvram support (CONFIG_NVRAM) [ ] /dev/port character device (CONFIG_DEVPORT) [*] HPET - High Precision Event Timer (CONFIG_HPET) [ ] Allow mmap of HPET (CONFIG_HPET_MMAP) <*> TPM Hardware Support (CONFIG_TCG_TPM) ---> [*] TPM HW Random Number Generator support (CONFIG_HW_RANDOM_TPM) [*] USB support ---> <*> ChaosKey random number generator driver support² [*] IOMMU Hardware Support (CONFIG_IOMMU_SUPPORT) ---> IOMMU default domain type ---> (X) Translated - Strict (CONFIG_IOMMU_DEFAULT_DMA_STRICT) [*] AMD/Intel IOMMU ...
¹siehe Linux: WireGuard VPN mit Mullvad
²siehe Linux: TRNGs
File systems
File systems ---> <*> Typ filesystem (CONFIG_Typ_FS) [*] Typ POSIX Access Control Lists (CONFIG_Name_FS_POSIX_ACL) [*] Typ Security Labels (CONFIG_Name_FS_SECURITY) [*] Quota support (CONFIG_QUOTA) <*> Quota format vfsv0 and vfsv1 support (CONFIG_QFMT_V2) Pseudo filesystems --> [ ] /proc/kcore support (CONFIG_PROC_KCORE) [ ] Enable /proc page monitoring (CONFIG_PROC_PAGE_MONITOR) < > Userspace-driven configuration filesystem (CONFIG_CONFIGFS_FS) < > EFI Variable filesystem (CONFIG_EFIVAR_FS) -> wenn [*] EFI runtime service support (CONFIG_EFI)
Security options
In der Konfiguration wird nur auf die Nutzung von AppArmor und Yama als Sicherheits-Erweiterungen („security models“) eingegangen. Daneben können noch folgende Erweiterungen genutzt werden:
- SELinux (CONFIG_SECURITY_SELINUX)
- SMACK (CONFIG_SECURITY_SMACK)
- TOMOYO (CONFIG_SECURITY_TOMOYO)
- LoadPin (CONFIG_SECURITY_LOADPIN)
- Integrity subsystem (CONFIG_INTEGRITY)
Security options ---> [*] Restrict unprivileged access to the kernel syslog (CONFIG_SECURITY_DMESG_RESTRICT) [*] Enable different security models (CONFIG_SECURITY) [*] Harden memory copies between kernel and userspace (CONFIG_HARDENED_USERCOPY) [*] Harden common str/mem functions against buffer overflows (CONFIG_FORTIFY_SOURCE) [*] NSA SELinux Support (CONFIG_SECURITY_SELINUX) [ ] NSA SELinux runtime disable (CONFIG_SECURITY_SELINUX_DISABLE) K:selinux=0 [*] NSA SELinux Development Support (CONFIG_SECURITY_SELINUX_DEVELOP) [*] AppArmor support (CONFIG_SECURITY_APPARMOR) K:apparmor=1 [*] Enable introspection of sha1 hashes for loaded profiles (CONFIG_SECURITY_APPARMOR_HASH) [*] Enable policy hash introspection by default (CONFIG_SECURITY_APPARMOR_HASH_DEFAULT) [*] Yama support (CONFIG_SECURITY_YAMA) S:kernel [*] Gate setid transitions to limit CAP_SET{U/G}ID capabilities (CONFIG_SECURITY_SAFESETID) [*] Basic module for enforcing kernel lockdown (CONFIG_SECURITY_LOCKDOWN_LSM) [*] Enable lockdown LSM early in init Kernel default lockdown mode (Confidentiality) K:lockdown=""|integrity|confidentiality [*] Landlock support (CONFIG_SECURITY_LANDLOCK) First legacy 'major LSM' to be initialized (AppArmor) (CONFIG_DEFAULT_SECURITY) ---> (landlock,lockdown,yama,safesetid,apparmor) (CONFIG_LSM) K:lsm=lsm1,lsmN Kernel hardening options ---> Memory initialization ---> Initialize kernel stack variables at function entry --> (X) zero-init everything passed by reference (very strong) (CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL) [*] Poison kernel stack before returning from syscalls (CONFIG_GCC_PLUGIN_STACKLEAK) [ ] Show STACKLEAK metrics in the /proc file system (CONFIG_STACKLEAK_METRICS) [ ] Allow runtime disabling of kernel stack erasing (CONFIG_STACKLEAK_RUNTIME_DISABLE) [*] Enable heap memory zeroing on allocation by default (CONFIG_INIT_ON_ALLOC_DEFAULT_ON) K:init_on_alloc=1|0 [*] Enable heap memory zeroing on free by default (CONFIG_INIT_ON_FREE_DEFAULT_ON) K:init_on_free=1|0 [*] Enable register zeroing on function init (CONFIG_ZERO_CALL_USED_REGS) Randomize layout of sensitive kernel structures ---> (X) Fully randomize structure layout (CONFIG_RANDSTRUCT_FULL)
Kernel hacking
Kernel hacking ---> Generic Kernel Debugging Instruments ---> [ ] Debug Filesystem (CONFIG_DEBUG_FS) [ ] KGDB: kernel debugger (CONFIG_KGDB) Memory Debugging ---> [ ] Track page owner (CONFIG_PAGE_OWNER) [*] Enable SLUB debugging support (CONFIG_SLUB_DEBUG) K:slub_debug=- [*] SLUB debugging on by default (CONFIG_SLUB_DEBUG_ON) [*] Warn on W+X mappings at boot (CONFIG_DEBUG_WX) [ ] Kernel memory leak detector (CONFIG_DEBUG_KMEMLEAK) [*] Detect stack corruption on calls to schedule() (CONFIG_SCHED_STACK_END_CHECK) Debug Oops, Lockups and Hangs ---> (n) panic timeout (CONFIG_PANIC_TIMEOUT) -> n=-1 sofortiger Reboot, n>0 nach n Sekunden Debug kernel data structures ---> [*] Debug linked list manipulation (CONFIG_DEBUG_LIST) [*] Debug SG table operations (CONFIG_DEBUG_SG) [*] Debug notifier call chains (CONFIG_DEBUG_NOTIFIERS) [*] Trigger a BUG when data corruption is detected (CONFIG_BUG_ON_DATA_CORRUPTION) [*] Debug credential management (CONFIG_DEBUG_CREDENTIALS) [ ] Tracers (CONFIG_FTRACE) x86 Debugging ---> < > Export kernel pagetable layout to userspace via debugfs (CONFIG_X86_PTDUMP) [ ] Dump the EFI pagetable (CONFIG_EFI_PGT_DUMP) Kernel Testing and Coverage ---> < > Notifier error injection (CONFIG_NOTIFIER_ERROR_INJECTION) [ ] Fault-injection framework (CONFIG_FAULT_INJECTION)
sysctl Kernel-Variablen
fs
fs.protected_fifos = 2 fs.protected_hardlinks = 1 fs.protected_regular = 2 fs.protected_symlinks = 1 fs.suid_dumpable = 0
kernel
kernel.yama.ptrace_scope = 1 kernel.unprivileged_bpf_disabled = 1 # permanent/unveränderbar, überschreibt aktivierte CONFIG_BPF_UNPRIV_DEFAULT_OFF Einstellung, # die zunächst kernel.unprivileged_bpf_disabled = 2 setzt, d. h. deaktiviert, aber spätere # Aktivierung mit 0 oder permanente Deaktivierung mit 1 möglich
net
net.core.bpf_jit_harden = 1|2
Parameter Kernel-/GRUB-Kommandozeile
mitigations=auto,nosmt | aktiviert alle Möglichkeiten zur Begebung von CPU Schwachstellen, die auch nachfolgend angegeben sind |
l1tf=full,force | Parameter, der alle Möglichkeiten zur Abwehr von L1TF (L1 Terminal Fault) aktiviert |
kvm.nx_huge_pages=auto|force | Parameter gegen iTLB multihit bei Verwendung von KVM |
mds=full,nosmt | Parameter, der alle Möglichkeiten zur Abwehr von MDS (Microarchitectural Data Sampling) aktiviert |
spectre_v2=on (impliziert spectre_v2_user=on) spectre_v2_user=on spec_store_bypass_disable=on | Parameter, die der Abwehr/Erschwerung von Angriffen mittels Spectre-Varianten dienen. Siehe Meltdown und Spectre. |
retbleed=auto,nosmt | Parameter, der Möglichkeiten zur Abwehr der Retbleed Schwachstelle aktiviert |
secretmem_enable | aktiviert die Beachtung des memfd_secret Systemaufrufs, mit dem Benutzer-Prozesse einen eigenen, von Prozessen anderer Benutzer abgeschotteten Speicherbereich anfordern bzw. einrichten können |
mmio_stale_data=full,nosmt | Parameter, der alle Möglichkeiten zur Abwehr der Processor MMIO Stale Data Schwachstellen aktiviert |
Analyse
Um auszuwerten, für welche Schwachstellen die CPU anfällig ist, kann man:
- das folgende Kommando absetzen:
grep . /sys/devices/system/cpu/vulnerabilities/*
- das spectre-meltdown-checker Skript installieren und ausführen:
sudo aptitude install spectre-meltdown-checker sudo spectre-meltdown-checker
Module signieren
Dokumentation siehe Documentation/admin-guide/module-signing.rst
im Kernel Quellcodeverzeichnis. Für das Signieren von Kernelmodulen muss der Kernel entsprechend konfiguriert sein.
Sofern man keinen eigenen Schlüssel erstellt und ihn in der Kernel-Konfiguration einträgt, wird während der Kompilierung automatisch ein 4096-bit RSA Schlüsselpaar generiert. Wer im Zertifikat eigene Angaben unter req_distinguished_name machen möchte, kann vor der Kompilierung die x509.genkey Datei im certs Unterverzeichnis des Kernel Quellcodeverzeichnisses anlegen und editieren:
- /quellcodedir/certs/x509.genkey
[ req ] default_bits = 4096 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = myexts [ req_distinguished_name ] O = hostname CN = hostname.domain.tld emailAddress = root@hostname.domain.tld [ myexts ] basicConstraints=critical,CA:FALSE keyUsage=digitalSignature subjectKeyIdentifier=hash authorityKeyIdentifier=keyid
Der automatisch erstellte Schlüssel kann nur für den aktuell kompilierten Kernel verwendet werden. Die beiden im certs Unterverzeichnis erstellten Dateien siging_key.pem und signing_key.x509 sollte man an einem sicheren Ort speichern, um ggf. mit root später externe Kernelmodule (z. B. Grafikkarte) signieren zu können.
Wenn man einen selbst erstellten bzw. den gleichen Schlüssel für alle zu kompilierenden Kernel verwenden will, speichert man die einmal erstellten Zertifikatdateien an einem anderen Ort als im certs Kernelunterverzeichnis und ändert die Kernel-Konfiguration entsprechend:
Cryptographic API
Certificates for signature checking ---> (/pfad/zu/signing_key.pem) File name or PKCS#11 URI of module signing key (CONFIG_MODULE_SIG_KEY)
Für das spätere Signieren externer Kernelmodule wird die im scripts Unterverzeichnis während der Kernel-Kompilierung erstellte sign-file
Anwendung in ein Verzeichnis des Pfads kopiert und das folgende Kommando verwendet:
sudo sign-file sha256|512 /pfad/signing_key.pem /pfad/signing_key.x509 /pfad/modulname.ko
Module blockieren
Verhindert nach dem Systemstart und dem Laden der Kernelmodule das spätere, nachträgliche Nachladen zusätzlicher Kernelmodule und das nachträgliche Entladen der beim Systemstart geladenen Kernelmodule.
- /etc/systemd/system/kernelmodule-block.service
[Unit] Description=Kernelmodule-Block After=systemd-modules-load.service [ggf. weitere Units, die Module laden] [Service] Type=oneshot ExecStart=/bin/sh -c "echo 1 > /proc/sys/kernel/modules_disabled" [Install] WantedBy=multi-user.target
sudo systemctl enable kernelmodule-block.service
Dienste mit systemd
Entfernung und Deaktivierung
Alle nicht benötigten Dienste sollten deaktiviert werden. Entweder werden zum Dienst zugehörige Pakete gleich komplett deinstalliert oder – sofern eine Deinstallation nicht erfolgen soll – mittels systemctl deaktiviert.
Listen
Auflistung aller installierten Unit-Dateien
sudo systemctl list-unit-files
Auflistung aller geladenen, aktiven Dienste-Units
sudo systemctl -t service
Entfernung
sudo systemctl stop name.service sudo aptitude purge paketname
Deaktivierung
sudo systemctl stop name.service sudo systemctl disable name.service sudo systemctl mask name.service
Will man Unit-Dateien modifizieren, die bereits per Paket unter /lib/systemd/system installiert wurden, sollte man die Unit-Dateien in Zukunft unter /etc/systemd/system führen, um ein Überschreiben der eigenen Einstellungen nach einem Paket-Update zu verhindern. Dazu geht man so vor:
- sudo systemctl stop name.service
- sudo systemctl disable name.service
- sudo systemctl daemon-reload
- sudo cp /lib/systemd/system/name.service /etc/systemd/system/
- sudo vi /etc/systemd/system/name.service
- sudo systemctl daemon-reload
- sudo systemctl enable name.service
- sudo systemctl start name.service
Direktiven zur Absicherung
Dienste, die mit systemd gemanaged werden, können mit folgenden Direktiven abgesichert werden, die im [Service] Abschnitt von name.service systemd Unit-Dateien zu setzen sind. Die gleichen Informationen finden sich primär in der systemd.exec und systemd.resource-control Manpage.
Analyse
Um sich einen Überblick zu negativen Härtungsgraden aller Dienste zu verschaffen, kann man das folgende Kommando ausführen:
systemd-analyze security | grep -E '(UNSAFE|EXPOSED|MEDIUM)' | sort
Anschließend kann man relevante Dienste genauer analysieren, um Ansatzpunkte zur Verbesserung des Härtungsgrads aufzufinden:
systemd-analyze security name.service | grep -e ✗ | sort
Benutzer und Gruppe
User=name|ID [Group=name|ID] | Name/ID des Benutzers, mit dem ein Dienst ausgeführt wird. Ist keine Gruppe mit Group=name|ID angegeben, wird die Standard-Gruppe des Benutzers verwendet. |
DynamicUser=true | einer Unit werden Benutzer und Gruppe dynamisch generiert & zugeordnet und existieren nicht mehr statisch per /etc/passwd und /etc/group. Benutzername und Gruppenname können mit User=benutzername und Group=gruppenname vergeben werden, andernfalls gilt Name=Unit-Name. Bei Verwendung dynamischer Benutzer gilt für die Unit: RemoveIPC=true PrivateTmp=true ProtectSystem=strict ProtectHome=read-only ReadWritePaths=Angabe der Pfade, auf die der Prozess ausnahmsweise lesend-schreibend zugreifen können soll RuntimeDirectory=Name des temporären Verzeichnisses, in das der Dienst zur Laufzeit temporäre Daten schreiben darf Voraussetzungen:
sudo aptitude install libnss-systemd |
PrivateUser=true | für ausgeführte Prozesse der Unit wird ein neuer Benutzer-Namensraum eingerichtet, in den Benutzer+Gruppe root, des Benutzers der Unit und nobody für alle Dateien, Verzeichnisse Prozesse und Ressourcen, die nicht root oder dem Unit-Benutzer zugehörig sind, gemappt werden und vor allem für chroot-Umgebungen mit der RootDirectory Direktive gedacht |
CPU
RestrictRealtime=true | unterbindet Versuche eines Dienstes, für sich Echtzeit Prozess-Scheduling zu aktivieren und damit Zugriff auf Scheduling-Richtlinien wie SCHED_FIFO, SCHED_RR, SCHED_DEADLINE |
Datei- und Verzeichnisschutz
InaccessiblePaths=[-]/pfad | Kein Zugriff auf Verzeichnisse und ihre Unterverzeichnisse. Nicht für Dienste, die Einhängepunkte in den mount-Namensraum installieren. |
ReadOnlyPaths=[-]/pfad | Nur-Lesen Zugriff auf Verzeichnisse und ihre Unterverzeichnisse. Nicht für Dienste, die Einhängepunkte in den mount-Namensraum installieren. |
ReadWritePaths=/pfad | Lesen-Schreiben Zugriff auf Verzeichnisse und ihre Unterverzeichnisse |
Mit -/pfad Prefix werden die Pfadangaben ignoriert, wenn sie nicht existieren. Mehrere Pfade können mit Leerzeichen getrennt gelistet oder die Direktiven mehrmals gesetzt werden. Zugriffsbeschränkungen können auch oder zusätzlich mit MACs wie AppArmor gesetzt werden. Die Direktiven können auch auf block- und zeichenorientierte Gerätedateien, Sockets, FIFOs und reguläre Dateien angewendet werden. | |
PrivateTmp=true | Für den Dienst wird ein neuer Dateisystem-Namensraum eingerichtet und in ihn ein privates /tmp bzw. /var/tmp Verzeichnis eingehängt, d. h. vom /tmp Systemverzeichnis isoliert. Nicht für Dienste, die in /tmp Kommunikation-Sockets anlegen und verwenden oder Einhängepunkte in den mount-Namensraum installieren. Zusätzliche Isolierung für Benutzer mittels pam_tmpdir PAM-Modul, mit dem das /tmp/user/ Verzeichnis (root, 711) und darin für jeden Benutzer ein eigenes /tmp/user/uid/ Verzeichnis eingerichtet wird, auf das die TMP und TMPDIR Umgebungsvariablen verweisen. Anwendungen, die die Variablen auswerten, schreiben nicht mehr in /tmp, sondern unterhalb von /tmp/user/uid/. sudo aptitude install libpam-tmpdir sudo pam-auth-update --force [*] per-user temporary directories |
ProtectSystem=true | Nur-Lesen Zugriff auf /boot und /usr |
ProtectSystem=full | Nur-Lesen Zugriff auf /boot, /etc und /usr |
ProtectSystem=strict | Nur-Lesen Zugriff auf gesamte Dateisystem-Hierarchie mit Ausnahme von /dev, /proc und /sys. Weitere Ausnahmen können mit ReadWritePaths bestimmt werden. Nicht für Dienste, die Einhängepunkte in den mount-Namensraum installieren. |
ProtectHome=true | Kein Zugriff auf /home, /root und /run/user bzw. Präsentation als leere Verzeichnisse |
ProtectHome=read-only | Nur-Lesen Zugriff auf /home, /root und /run/user |
ProtectKernelLogs=true | Prozessen von System-Diensten wird die CAP_SYSLOG Capability entzogen; sie werden per SystemCallFilter daran gehindert, den syslog Systemaufruf abzusetzen und sie erhalten keinen Zugriff auf /dev/kmsg und /proc/kmsg. |
ProtectKernelModules=true | das Laden/Entladen von Kernelmodulen wird Prozessen der Unit verboten, ohne CAP_SYS_MODULE Capability, mit SystemCallFilter für @module und InaccessiblePaths für /usr/lib/modules. Siehe auch Module blockieren |
ProtectKernelTunables=true | Auf Kernel-Variablen, die unterhalb von bzw. in /proc/sys, /sys, /proc/sysrq-trigger, /proc/latency_stats, /proc/acpi, /proc/timer_stats, /proc/fs und /proc/irq gesetzt wurden, haben Prozesse der Unit Nur-Lesen Zugriff |
ProtectControlGroups=true | Auf die gesamte Control Groups Hierarchie unterhalb von /sys/fs/cgroup haben Prozesse der Unit Nur-Lesen Zugriff |
ProtectProc=invisible | Die Mountoption der procfs-Instanz von Systemdiensten wird auf hidepid=invisible gesetzt, so dass die meisten Prozesse anderer Benutzer in /proc/ vor Prozessen des Systemdienstes versteckt werden. |
RemoveIPC=true | wenn die Unit gestoppt wird, werden alle System V und POSIX IPC Objekte entfernt, die sich Besitz von Benutzer und Gruppe befinden. Die Direktive ist nur wirksam, wenn zumindest User=, Group= oder DynamicUser= gesetzt sind |
RestrictSUIDSGID=true | Prozesse der Unit können für Dateien und Verzeichnisse nicht das SUID oder SGID Bit setzen. |
RuntimeDirectory=name RuntimeDirectoryMode=nnnn | Name des temporären Verzeichnisses unterhalb von /run (für System-Dienste) oder /run/user/ID (für Benutzer-Dienste) und dessen Zugriffsberechtigungen, in dem Dienste zu ihrer Laufzeit Sockets, PID-Dateien usw. anlegen. |
UMask=nnnn | Standard-Maske für Dateirechte neuer Dateien. Standard ist 0022. |
Capabilities
CapabilityBoundingSet=[~]CAP_1 CAP_N | Nur die angegebenen Capabilities sind erlaubt. Mit ~ werden alle außer den gelisteten Capabilities erlaubt. Statt mit Leerzeichen getrennter Liste kann die Direktive auch mehrmals gesetzt werden. |
AmbientCapabilities=[~]CAP_1 CAP_N | Nur die angegebenen Capabilities sind erlaubt. Mit ~ werden alle außer den gelisteten Capabilities erlaubt. Statt mit Leerzeichen getrennter Liste kann die Direktive auch mehrmals gesetzt werden. Für Dienste, die mit einem eigenen, nicht-priviligierten Benutzer ausgeführt werden, denen aber ein paar Capabilities gegeben werden sollen (beinhaltet SecureBits=keep-caps). |
Beschränkungen der Capabilities können auch oder zusätzlich mit MACs wie AppArmor gesetzt werden. CAP_SYS_ADMIN hebt alle Beschränkungen potentiell auf bzw. sollte nicht erlaubt sein. | |
SecureBits=keep-caps[-locked] no-setuid-fixup[-locked] noroot[-locked] | Kombination von Securebit-Flags gemäß Capabilities für Dienste, deren UIDs von 0 (root) zu anderen UIDs wechseln. |
NoNewPrivileges=true | Dienst kann keine neuen Privilegien bzw. Capabilities erhalten und die UID zu 0 (root) zurückwechseln. |
Systemaufrufe
SystemCallArchitectures=native LockPersonality=true | Prozesse der Unit dürfen nur Systemaufrufe der systemspzifischen Architektur (z. B. x86-64) absetzen. |
SystemCallFilter=[~]@name1 @nameN | Liste der @Gruppennamen von Systemaufrufen, die ein Prozess absetzen darf, ohne terminiert zu werden (Whitelist). Mit ~ darf ein Prozess alle außer den Systemaufrufen der angegebenen @Gruppennamen absetzen, ohne terminiert zu werden (Blacklist). Mit systemd-analyze syscall-filter [@gruppenname] erhält man die Liste der Systemaufrufe.Im folgenden Beispiel darf ein Dienst nur Systemaufrufe der @system-service Gruppe absetzen, die als typisch für Systemdienste angesehen werden. Aus der @system-service Gruppe werden zusätzlich Systemaufrufe der @privilged und @resources entfernt, die der Dienst nicht ausführen soll. Verbotene Systemaufrufe führen nicht zur Terminierung des Dienstes, sondern zur EACCES Fehlerausgabe:
|
MemoryDenyWriteExecute=true | Verbietet, Dateien schreib- und ausführbar im Speicher abzubilden bzw. mmap Systemaufrufe, wo PROT_EXEC und PROT_WRITE gesetzt ist oder mprotect Systemaufrufe, wo PROT_EXEC gesetzt ist. |
RestrictAddressFamilies=AF_name1 AF_nameN | Liste der Socket Protokollfamilien, auf die ein Prozess Zugriff hat. Beschränkung gilt nicht für Sockets per systemd Socket-Units. Beispiel: RestrictAddressFamilies=AF_INET AF_UNIX |
RestrictNamespaces=true RestrictNamespaces=[~]nstyp1 nstypN | beschränkt oder verbietet das Erstellen und Wechseln von Namensräumen durch Prozesse der Unit. Mit true wird der Zugriff komplett untersagt. Andernfalls können in einer Liste die Namensraum-Typen (cgroup, ipc, net, mnt, pid, user, uts) angegeben werden, auf die Zugriff gewährt wird (Whitelist). Mit ~ erhalten Prozesse Zugriff auf alle Namensräume außer den aufgeführten Typen (Blacklist). Mit RestrictNamespaces werden damit die clone, setns und unshare Systemaufrufe reguliert. |
Gerätedateien
DevicePolicy=closed | Nur Zugriff auf /dev/null, /dev/zero, /dev/full, /dev/urandom, /dev/random, /dev/tty, /dev/shm, /dev/pts, /dev/mqueue, /dev/hugepages, /dev/stdout, /dev/stderr, /dev/stdin |
DevicePolicy=strict | Zugriff nur auf Gerätedateien, die explizit mit DeviceAllow angegeben wurden |
DeviceAllow=/dev/[pfad/]name rwm DeviceAllow=char-gruppenname rwm DeviceAllow=block-gruppenname rwm | Zusätzlicher bzw. explizit erlaubter Zugriff auf Gerätedateien. Für char- und block-gruppenname siehe cat /proc/devices. |
PrivateDevices=true | Neuer /dev Namensraum für Prozess mit DevicePolicy=closed, kein Zugriff auf physikalische Geräte, ohne CAP_MKNOD, CAP_SYS_RAWIO Capability, mit SystemCallFilter für @raw-io |
Netzwerk
IPAddressAllow=adresse[/netmask]|localhost IPAddressDeny=any | Aktiviert BPF Whitelist Paketfilter. Ein- und ausgehender Internet-Netzwerkverkehr von bzw. zu angegebenen IP-/Netzwerk-Adressen wird zugelassen, alle anderen Internet-Verbindungen werden verworfen. Voraussetzung:
|
PrivateNetwork=true | Dienst-Prozesse laufen in einem privaten Netzwerk-Namensraum und haben nur Zugriff auf ein privates Loopback-Netzwerkinterface, d. h. weder Netzwerk-Kommunikation zwischen Host und Dienst, noch mit dem Internet. |
ProtectHostname=true | Für Prozesse von System-Diensten wird ein neuer UTS Namensraum eingerichtet und das Ändern des Host- oder Domainnamen durch den System-Dienst verhindert. |
at & cron
Zur Beschränkung, welche Benutzer außer root at, batch und cron Jobs erstellen und modifizieren dürfen, wird die /etc/at.allow und /etc/cron.allow Datei angelegt und in den beiden Dateien die Login-Namen der Benutzer zeilenweise aufgeführt, die eine entsprechende Berechtigung erhalten sollen.
bash
history
Um Kommandos/Strings nicht in die History aufzunehmen:
- ~/.bashrc
HISTIGNORE="string1:stringN[*]:&"
- Beispiel
HISTIGNORE="curl*:gpg*:scp*:sftp*:ssh*:su:sudo*:wget*:&"
An- und Abmeldung
TTY Auto-Abmeldung
Wie im Arch Wiki beschrieben, das folgende Skript in /etc/profile.d/ speichern. Im Beispiel erfolgt nach 10 Minuten (60*10) Inaktivität die automatische Abmeldung eines Benutzers, der an einem virtuellen Terminal angemeldet ist.
- /etc/profile.d/shell-timeout.sh
TMOUT="$(( 60*10 ))"; [ -z "$DISPLAY" ] && export TMOUT; case $( /usr/bin/tty ) in /dev/tty[0-9]*) export TMOUT;; esac
Wer die mit systemds getty@.service gestarteten TTYs 1 – 6 automatisch nach einem Timeout von n Sekunden wieder beenden lassen will, muss die Datei editieren:
- getty@.service
ExecStart=-/sbin/agetty --noclear --timeout n %I $TERM # Restart=always # RestartSec=0
Anmeldung als root deaktivieren
Standardmäßig wird das root Konto bei der Installation nicht aktiviert, aber um generell eine potentielle Anmeldung als root über Konsolen zu deaktivieren, wird die existierende /etc/securetty Datei durch eine leere Datei ersetzt. Die Auswertung der securetty Datei wird durch das pam_securetty PAM-Modul vorgenommen, das für /bin/login
in der /etc/pamd./login Datei gesetzt ist. Die Anwendung von su
, sudo
, Login als root per ssh (wenn aktiviert) und des Single-User bzw. Rettungs-Modus per /sbin/sulogin
ist weiterhin möglich.
sudo echo > /etc/securetty
Anmelden mit YubiKey
Lokale Anmeldungen und sudo können zusätzlich per PAM mit einem YubiKey und HMAC-SHA1 Challenge-Response Authentifizierung abgesichert werden. Der eingesteckte YubiKey ist dann der „2nd-Factor“ neben dem Passwort. Wenn man so will, ist das Berühren-müssen des YubiKey Buttons ein weiterer Faktor. Bei der Methode wird die Online-Authentifizierung über den Yubico Cloud-Server nicht verwendet, denn man will sich ja auch anmelden können, wenn keine Internetverbindung besteht (Alternative wäre ein lokal gehosteter YubiKey Validierungs-Server).
Zuerst konfiguriert man Slot 2 des YubiKey für Challenge-Response. Zur Konfiguration wird das YubiKey Tool zur Personalisierung und das Yubico PAM-Modul installiert:
sudo aptitude install yubikey-personalization yubikey-personalization-gui libpam-yubico
Nach Aufruf des grafischen YubiKey Personalization Tool geht man wie folgt vor:
- Challenge-Response Tab anklicken
- (X) Configuration Slot 2 aktivieren
- HMAC-SHA1 Parameters:
- [X] Require user input (button press) aktivieren
- (X) Variable input → >=3 x Generate Button anklicken
- Write Configuration (später verschlüsselt sichern)
Alternativ in der Konsole:
ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -ochal-btn-trig
Dann legt man ein Verzeichnis an, in dem später die Challenge-Response Statusdateien der Benutzer systemweit gespeichert werden:
sudo mkdir -m 0700 /pfad/yubico
Jeder Benutzer generiert die Statusdateien, die danach in das Verzeichnis verschoben werden. Dabei wird der challenge-seriennr durch den benutzername-seriennr Dateiname ersetzt:
cd ~ mkdir -m 0700 .yubico ykpamcfg -2 Ausgabe von: Stored initial challenge and expected response in '/homedir/.yubico/challenge-seriennr'. sudo mv /homedir/.yubico/challenge-seriennr /pfad/yubico/benutzername-seriennr sudo chown root:root /pfad/yubico/benutzername-seriennr sudo chmod 600 /pfad/yubico/benutzername-seriennr
Abschließend wird PAM konfiguriert:
sudo vi /etc/pamd.d/common-auth
- common-auth 1. Zeile
auth required pam_yubico.so mode=challenge-response chalresp_path=/pfad/yubico
Wer die korrekte Funktion verfolgen will:
- common-auth 1. Zeile
auth required pam_yubico.so mode=challenge-response chalresp_path=/pfad/yubico debug
sudo touch /run/pam-debug.log sudo chmod 666 /run/pam-debug.log sudo tail -f /run/pam-debug.log
Bei Anmeldungen, Verwendung von sudo oder Aufruf grafischer Anwendungen mit sudo (kdesudo etc.) blinkt der YubiKey Button und nach Berühren des Buttons erfolgt die Passworteingabe.
Anmeldesperre
Wenn bei einem Benutzer (inklusive root) n Authentifizierungsversuche fehlschlagen, wird das Benutzerkonto mittels pam_faillock PAM für n Sekunden gesperrt. Das bisher genutzte pam_tally2 Modul wurde in verschiedenen Linux-Distributionen entfernt.
Konfiguration
- /etc/security/faillock.conf
# Verzeichnis, in dem Fehlschläge u. Reakivierungen protokolliert werden dir = /run/sudo/faillock # Benutzernamen, die verwendet wurden, aber im System nicht existieren, werden protokolliert audit # nur mit Prüfung gegen /etc/passwd local_users_only # Sperre nach n fehlgeschlagenen Versuchen deny = n # Sekunden-Intervall, in dem n fehlgeschlagene Versuche stattfinden fail_interval = n # Aufhebung der Speere nach n Sekunden unlock_time = n # auch für root even_deny_root root_unlock_time = n # für alle Gruppenmitglieder gemäß Angaben zu root # admin_group = gruppenname
sudo chmod 640 /etc/security/faillock.conf
- /etc/pam.d/common-auth
auth requisite pam_faillock.so preauth auth required pam_yubico.so mode=challenge-response chalresp_path=/pfad/yubico auth [success=1 default=bad] pam_unix.so nullok auth [default=die] pam_faillock.so authfail auth sufficient pam_faillock.so authsucc
Beispiel
Beispiel der auth.log Einträge nach fehlgeschlagenen Versuchen mittels sudo:
sudo: pam_unix(sudo:auth): authentication failure; logname=name uid=nnnn euid=0 tty=/dev/pts/13 ruser=name rhost= user=name sudo: pam_faillock(sudo:auth): Consecutive login failures for user name account temporarily locked sudo: name : 3 incorrect password attempts ; TTY=pts/13 ; PWD=/root ; USER=root ; COMMAND=/bin/bash
Beispiel der Ausgabe mittels faillock
Kommando. Mit --reset wird das betroffene Benutzerkonto sofort reaktiviert.
sudo faillock --dir /run/sudo/faillock [--user name] [--reset] name: When Type Source Valid 2021-10-19 18:32:18 TTY /dev/pts/13 V 2021-10-19 18:32:27 TTY /dev/pts/13 V 2021-10-19 18:32:34 TTY /dev/pts/13 V
su & sudo
su
Nur root und Benutzer, die Mitglied der sudo Gruppe sind, können /bin/su
ausführen:
sudo dpkg-statoverride --update --add root sudo 4750 /bin/su
sudoers Konfiguration
Mit dem Kommando sudo visudo
editiert man die /etc/sudoers Datei.
- /etc/sudoers
Defaults editor=/pfad/name, !env_editor Defaults env_reset,always_set_home,set_home,timestamp_timeout=N,mail_badpass,mail_no_host,mail_no_perms Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Defaults listpw="always",verifypw="always" root ALL=(ALL:ALL) ALL Runas_Alias OP = root %sudo ALL=(ALL:ALL) ALL loginname ALL=(OP) NOPASSWD: \ kommando1 -args, komandoN -args, \ sudoedit /pfad/datei, letztes_kommando -args loginname ALL=(OP) NOPASSWD:NOXEC: \ kommando1 -args, komandoN -args, \ letztes_kommando -args
Defaults
editor, !env_editor | Es wird ausschließlich der angegebene Editor /pfad/name für visudo verwendet. |
env_reset | Kommandos werden in minimaler Umgebung ausgeführt, die nur die TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME und SUDO_* Umgebungsvariablen auswertet. |
always_set_home | sudo wird immer als sudo -H, d. h. mit HOME = /root aufgerufen. Für andere Ziel-Benutzer muss sudo -H -u loginname verwendet werden. |
timestamp_timeout=N | Timeout in N Minuten, nachdem erneut nach Passwort gefragt wird. |
mail_* | E-Mail Benachrichtigung, wenn Benutzer falsches Passwort eingibt, auf diesem Host keine Erlaubnis und keine Erlaubnis für das eingegebene Kommando hat |
secure_path | PATH, der für alle Kommandos gesetzt wird. |
listpw=„always“,verifypw=„always“ | sudo -l (Auflistung erlaubter Kommandos) und sudo -v (bewirkt Verlängerung des Timeouts um weitere N Minuten) bzw. Ermittlung, ob man sudo verwenden darf, wird nur nach Passworteingabe ausgeführt |
Kommandos
Runas_Alias OP = root loginname ALL=(OP) NOPASSWD: | Der Benutzer mit dem loginname darf die Kommandos mittels sudo als root ohne Eingabe des Passworts ausführen, die in der Liste hinter NOPASSWD aufgeführt sind. Kommandos sollten so spezifisch wie möglich mit allen Argumenten und Optionen ohne Wildcards angegeben werden. Anstelle von z. B. /usr/bin/vi /pfad/datei sollte sudoedit /pfad/datei verwendet werden. |
Runas_Alias OP = root loginname ALL=(OP) NOPASSWD:NOEXEC: | Der Benutzer mit dem loginname darf die Kommandos mittels sudo als root ohne Eingabe des Passworts ausführen, die in der Liste hinter NOPASSWD aufgeführt sind. Kommandos sollten so spezifisch wie möglich mit allen Argumenten und Optionen ohne Wildcards angegeben werden. Dynamisch gelinkte Anwendungen, die in Kommandos aufgeführt sind, können ihrerseits keine weiteren Anwendungen ausführen. |
%sudo ALL=(ALL:ALL) ALL | Wenn der Benutzer Mitglied der sudo Gruppe (%sudo) ist, kann er mittels sudo alle Kommandos als root nach Eingabe des Passworts ausführen. |
Gehärtetes Kompilieren
Flags, die man dem configure Skript übergeben kann.
Executable
- 'CFLAGS= -g -O2 -fPIE -fstack-protector-strong -Wformat -Wformat-security -Werror=format-security'
- 'CPPFLAGS= -D_FORTIFY_SOURCE=2'
- 'CXXFLAGS= -g -O2 -fPIE -fstack-protector-strong -Wformat -Wformat-security -Werror=format-security'
- 'LDFLAGS= -fPIE -pie -Wl,-z,relro -Wl,-z,now'
Überprüfung
sudo aptitude install devscripts hardening-check /pfad/executable
Beispiel KeePassX
- vorher
Position Independent Executable: no, normal executable! Stack protected: yes Fortify Source functions: no, only unprotected functions found! Read-only relocations: yes Immediate binding: no, not found!
Nach Anpassung der CMakeLists.txt:
- nachher
Position Independent Executable: yes Stack protected: yes Fortify Source functions: yes (some protected functions found) Read-only relocations: yes Immediate binding: yes
Shared Library
- 'CFLAGS= -g -O2 -fpic -fstack-protector-strong -Wformat -Wformat-security -Werror=format-security'
- 'CPPFLAGS= -D_FORTIFY_SOURCE=2'
- 'CXXFLAGS= -g -O2 -fpic -fstack-protector-strong -Wformat -Wformat-security -Werror=format-security'
- 'LDFLAGS= -fpic -Wl,-z,relro -Wl,-z,now'
Geht -fpic nicht → -fPIC
Anwendungen
Name | Information |
---|---|
checksecurity | führt per täglichem und wöchentlichem Cron-Job Basis-Sicherheitsüberprüfungen (setuid, passwd, disk-free, sockets) durch. |
chkrootkit | scannt bestimmte Programm- und Logdateien, Pfade und die Netzwerkkonfiguration auf Hinweise für die Existenz von bekannten Rootkits. |
debian-security-support | prüft, ob es installierte Pakete gibt, für die Sicherheitsaktualisierungen nur noch eingeschränkt angeboten werden oder vor Ablauf des Release-Zeitraums keine Sicherheitsaktualisierungen mehr erscheinen. |
debsecan | gleicht die Liste der installierten Pakete gegen Einträge im Debian Security Bug Tracker ab und informiert per E-Mail, für welche Pakete Einträge zu (gefixten) Schwachstellen und Sicherheitsaktualisierungen vorliegen. |
debsums | überprüft die Integrität installierter Paketdateien mittles MD5-Prüfsummen, die mit dem Paket installiert wurden und loggt Abweichungen bzw. Dateiänderungen. |
logcheck | wertet die in der /etc/logcheck/logcheck.logfiles angegebenen Logdateien aus und stellt die Ergebnisse per E-Mail zu. Inhalte die ausgenommen bzw. ausgefiltert werden sollen, werden in Dateien in den /etc/logcheck/ignore.d.levelname/ (Standard: server) Unterverzeichnissen definiert. |
Lynis | überprüft mit über 200 Tests die Sicherheits-Konfiguration und den Härtungsgrad des Betriebssystems und von Dienste-Anwendungen. |
needrestart | startet Daemons nach Bibliotheks-Aktualisierungen manuell oder automatisch neu. |
rkhunter + unhide | scannt das System auf Hinweise für die Existenz von Rootkits, Backdoors, Sniffern und Exploits. |
ssh-audit | überprüft SSH Server- und Client-Konfigurationsdateien zur Absicherung/Härtung |
MDS Tool | grafisches Tool zur Überprüfung der CPU auf Anfälligkeit für Meltdown, Spectre Sicherheitslücken und ihre Varianten |
usbguard | reguliert die Authorisierung bzw. Blockierung von USB Geräten mit regelbasierten Black- und Whitelists |