podman rm App1
Montag, 15. November 2021
Podman Container als systemd-Dienste automatisch starten
podman rm App1
Sonntag, 14. November 2021
Der bind / named DNS Server
Anders als ich es oft höre, ist die Konfiguration von einem bind9 DNS Server wirklich nicht schwierig. Eine einfach Grundkonfiguration für das lokale Netzwerk ist schnell erstellt und ermöglicht die Namensauflösung lokaler Server/Clients im Netzwerk und auch die Namensauflösung im Internet.
Als erstes muss natürlich die Software installiert werden:
sudo dnf install bind bind-utils
Die Konfigurationsdateien befinden sich dann hier:
/etc/named.conf --> Hauptkonfiguration des named-Servers
/var/named --> Zonen und Reverse-Zonen Dateien
Bei anderen Linux-Distributionen die nicht von RedHat abgeleitet sind, können die Pfade unterschiedlich sein.
/etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { none; };
directory "/var/named" ;
forward first;
forwarders {
8.8.8.8;
8.8.4.4;
};
};
zone "beispiel.lokal" {
type master;
file "beispiel.zone";
};
zone "2.168.192.in-addr.arpa" {
type master;
file "beispiel.rzone";
};
Der Options-Block definiert auf welchen Port der DNS-Server lauschen soll und das Verzeichnis wo die Zonen-Dateien zu finden. Die Forwarder sind öffentliche DNS-Server, welche befragt werden sollen, wenn eine Adresse angefragt wird, die nicht aus den lokalen Netz stammt. Die IP-Adressen 8.8.8.8 und 8.8.4.4 stammen von den google-DNS Servern (primary und secondary).
Die Zone beispiel.lokal sagt dem DNS-Server, in welcher Datei er Informationen zur Namensauflösung findet. Dadurch das der Pfad /var/named/ schon im ersten Block definiert ist, reicht hier der Dateiname aus. Der DNS Server sucht die Datei dann unter /var/named/beispiel.zone.
Die Zone 2.168.192.in-addr.arpa definiert die Reverse-Lookup Datei für das Netz 192.168.2/24.
/var/named/beispiel.zone
$ttl 3600
beispiel.lokal. IN SOA ns.beispiel.lokal. admin.beispiel.lokal. (
1636891000
3600
600
1209600
3600 )
beispiel.lokal. IN NS desk.beispiel.lokal.
ovirt.beispiel.lokal. IN A 192.168.2.201
desk IN A 192.168.2.202
nfs.beispiel.lokal. IN CNAME desk.beispiel.lokal.
ovirt.beispiel.lokal IN A 192.168.2.201
desk.beispiel.lokal IN A 192.168.2.202
/var/named/beispiel.rzone
Mittwoch, 10. November 2021
SELinux Fehlersuche- und Behebung
SELinux Teil IV
Im letzten Teil der SELinux-Reihe will ich anhand von einem Beispiel demonstrieren, wie man SELinux-Probleme aufdeckt und behebt.
Eine Kunde hat einen neuen Webserver installiert, der auf Port 85 seinen Dienst zur Verfügung stellen soll. Aus irgendeinem Grund aber lässt sich der Apache-httpd-Server nicht starten.
| Der httpd Server startet nicht |
Als erstes prüfe ich, ob es ein SELinux Problem ist. Ich schalte SELinux in den permissive Modus und versuche erneut den Webserver zu starten:
| SELinux permissive Mode / Webserverstart |
Tatsächlich hat das Problem mit SELinux zu tun. Ich bringe SELinux wieder in den enforcing Modus und begebe mich an die Fehlersuche.
Ein Blick in die Logfiles ist sicherlich erstmal eine gute Idee:
journalctl -u httpd
grep httpd /var/log/audit/audit.log | more
ausearch -c 'httpd' --raw
und zum guten Schluss auch noch in /var/log/messages
grep httpd /var/log/messages | less
Nov 10 13:42:10 rocky setroubleshoot[10596]: SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 85.#012#012***** Plugin bind_ports (99.5 confidence) suggests ************************#012#012If you want to allow /usr/sbin/httpd to bind to network port 85#012Then you need to modify the port type.#012Do#012# semanage port -a -t PORT_TYPE -p tcp 85#012 where PORT_TYPE is one of the following: http_cache_port_t, http_port_t, jboss_management_port_t, jboss_messaging_port_t, ntop_port_t, puppet_port_t.#012#012***** Plugin catchall (1.49 confidence) suggests **************************#012#012If you believe that httpd should be allowed name_bind access on the port 85 tcp_socket by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'httpd' --raw | audit2allow -M my-httpd#012# semodule -X 300 -i my-httpd.pp#012
Es wurden zwei Dateien erzeugt (my-httpd.pp, my-httpd.te) welche mit semodule in die SELinux Datenbank importiert werden.
SSH Passwortübergabe in Skripten
Grundsätzlich gilt: Es sollten niemals Passwörter im Klartext übergeben oder übers Netz geschickt werden. Wer SSH nutzt, sollte auf den passwortlosen Verbindungsaufbau mit öffentlichen und privaten Schlüsseln setzen. Manchmal muss man aber nur mal schnell was skripten, damit man einmalig irgendwelche Tasks auf anderen Hosts ausführen kann.
Für Trainings stelle ich oft Linux-Server in public-Clouds bereit, welche initial konfiguriert werden müssen, bevor ich mit Automatismen alle Einstellungen vornehme.
Beim Aufbau einer SSH-Verbindung ist es nicht möglich das Passwort an SSH zu streamen oder es direkt mitzugeben.
Dafür gibt es aber zum Glück ein Tools namens sshpass.
Die Syntax ist ganz einfach:
sshpass [ -p | -f | -e ] ssh user@beispiel.host
Parameter sind:
-p Das Passwort wird mit im Kommando übergeben
-f Das Passwort steht in einer Datei in der ersten Zeile
-e Das Passwort steht in der Environmentvariabel SSHPASS
Beispiele:
sshpass -p passwort ssh user@beispiel.host
--
echo "passwort" > secret.file
sshpass -f secret.file ssh user@beispiel.host
--
SSHPASS=passwort
sshpass -e ssh user@beispiel.host
Dienstag, 9. November 2021
Ändern des Tastaturlayouts
Vielleicht geht es auch genau wie mir. Ihr sitzt vor einem fremden Terminal, zum Beispiel beim Kunden, und das Tastaturlayout ist auf Englisch eingestellt. Mir passiert das häufig bei Kunden in den Niederlanden. Wie kann ich das Layout nun schnell und einfach ändern?
Bei den RedHat basierten Distributionen (RHEL, Centos, Rocky Linux und weitere) geht das zum Glück ganz einfach. Dazu gibt es das Kommando localectl.
Mit localectl status wird euch angezeigt, welches Layout aktiv ist.
System Locale: LANG=de_DE.UTF-8
VC Keymap: de-nodeadkeys
X11 Layout: de
X11 Variant: nodeadkeys
SELinux Booleschiche Werte
SELinux Teil III
Einige SELinux Regeln lassen sich ganz einfach aktivieren oder deaktivieren (0 oder 1 = boolesche Werte). Administratoren können damit sehr einfach Feinabstimmungen vornehmen.
In der Tabelle, aus dem SELinux Teil II Blog, habe ich die passenden Kommandos schon aufgeführt. Sie lauten getsebool, setsebool und semanage boolean.
Das Kommando getsebool -a liefert eine Liste, welche einfach aktiviert/deaktiviert werden können. In dem Beispiel suche ich mir alles raus, was mit httpd zu tun hat:
[root@rocky conf]# getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_dbus_sssd --> off
httpd_dontaudit_search_dirs --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> off
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> off
httpd_run_ipa --> off
httpd_run_preupgrade --> off
httpd_run_stickshift --> off
httpd_serve_cobbler_files --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tmp_exec --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_opencryptoki --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off
[root@rocky conf]#
httpd_enable_homedirs --> off
Montag, 8. November 2021
SELinux Dateikontext
SELinux Teil II
SELinux Kontext
Ordner und Dateien tragen einen SELinux-Label der wie folgt aufgebaut ist:
SELinux_User : Rolle : Type : Level File
Beispiel:
Wir betrachten einmal den Apache-Webserver, welcher mit dem Kontext httpd_t läuft:
ps axZ | grep httpd
system_u:system_r:httpd_t:s0 115777 ? Ss 0:00 /usr/sbin/httpd -DFORGROUND
Dazu werfen wir noch einen Blick das Verzeichnis /var/www/html an:
ls -dZ /var/www/html
system_u:object_r:httpd_sys_content_t:s0 /var/www/html
Wir stellen fest, dass der Apache-Webserver mit dem Kontext httpd_t läuft und das Verzeichnis /var/www/html den Dateikontext httpd_sys_content_t besitzt.
Wenn SELinux aktiv ist, existiert eine Regel, die besagt, dass der httpd-Prozess mit dem Kontext http_t auf das Verzeichnis /var/www/html mit dem Dateikontext httpd_sys_content_t Zugriff hat. Der Webserver darf aber nicht auf das Verzeichnis (Beispiel) /tmp oder /var/tmp mit dem Dateikontext tmp_t zugreifen.
Ein böswilliger Angreifer, der nun irgendwie den httpd-Prozess kompromittiert und damit zumindest die Rechte des Users apache und der Gruppe apache erhält, ist in seinem tun und handeln dennoch stark eingeschränkt. SELinux sei Dank.
Anpassen der SELinux Kontexte
Unser Apache-Webserver soll nun nicht mehr seinen Inhalt unter /var/www/html finden, sondern ganz einfach unter /wwwinhalt. Die Konfigdatei für den Apache wird dementsprechend angepasst und das Verzeichnis angelegt:
mkdir /wwwinhalt
Wir stellen fest, dass der Webserver zwar startet aber beim Versuch die Webseite abzurufen, kommt es zu einem Fehler.
curl http://localhost --> Access denied
Wir schauen uns das Verzeichnis /wwwinhalt nochmal genau an
ls -dZ /wwwinhalt
unconfined_u:object_r:default_t:s0 /wwwinhalt/
und stellen fest, dass der Typkontext (default_t) nicht zum Webserver passt. Der Typkontext muss geändert werden.
Dazu wird zuerst ein Eintrag in der SELinux-Datenbank erzeugt (semange fcontext) und dann dieser Eintrag auf dem Verzeichnis /wwwinhalt angewendet (restorecon):
semange fcontext Befehle:
Option | Beschreibung |
-a , --add | Einen Datensatz hinzufügen |
-l, --list | Datensatz anzeigen |
-d, --delete | Einen Datensatz löschen |
Jetzt wo der Kontext-Typ auf dem Verzeichnis /wwwinhalt auf http_sys_content_t gesetzt ist, darf der Webserver die Dateien lesen und im Web präsentieren.
Das Problem hätte man mit dem Kommando chcon (change context) temporär lösen können. Damit hätte man aber keinen Eintrag in der SELinux-Datenbank erzeugt. Nach einem Reboot wäre das Verzeichnis also wieder mit dem Inhalt dieser Datenbank gelabelt worden und der Webserver hätte seine Berechtigung wieder verloren.
Kommando | Beschreibung |
SELinux Modi verwalten | |
getenforce | Liefert den Betriebsmodus von SELinux zurück |
sestatus | Wie getenforce mit weiteren Informationen |
setenforce | Setzt den SELinux-Modus temporär |
Kontext Verwalten | |
chcon | Ändert den Dateikontext |
restorecon | Ändert den Dateikontext mit den Informationen aus dem /etc/selinux/targeted/contexts/files Verzeichnis |
semange | Ändert den Dateikontext (mit fcontext) |
Verwalten der SELinux Policies | |
seinfo | Informationen über SE-Policy Komponenten |
semanage | Verwalten der Policy-Datenbank |
sesearch | Sucht nach Regeln in der SELinux-Datenbank |
Boolean Verwaltung | |
getsebool | Zeigt Booleans an |
setsebool | Setzt Booleans |
semange | Ändert Booleans in der Policy Datenbank |
Fehlersuche | |
sealert | Suchtool für Fehler |
Weiter geht es mit SELinux im Teil III
Freitag, 5. November 2021
SELinux Modi
SELinux Teil I
Security Enhanced Linux (SELinux) ist eine weitere Schicht in der Systemsicherheit und erweitert die Sicherheitsmechanismen in RHEL basierten Linux Systemen.
SELinux beantwortet in erster Linie die Frage:
Kann ein SUBJEKT etwas AUSFÜHREN auf diesem OBJEKT (engl.: May subject do action to object?)?
Beispiel: Darf der Webserver auf direkt auf die Datenbank zugreifen oder hat der Prozess der Datenbank Zugriff auf das Verzeichnis des Webservers? Nein. Der Webserver darf nur Dateien aus dem Verzeichnis /var/www/html lesen, während die Datenbank nur auf /data/mysql Zugriff bekommt. Sollte es einem Angreifer gelingen Prozessowner vom Webserver oder der Datenbank zu werden, so sind seine Zugriffsrechte dennoch stark eingeschränkt, auch wenn die Elementare Rechtevergabe des Linux-Systems (Datei-/Ordner-Berechtigungen) den Zugriff zulassen würde.
| Quelle: Redhat.com |
SELinux kennt drei Modi:
- Enforcing ist der Defaultmodus und überwacht das ganze System
- Der Permissive-Modus arbeitet wie der Enforcing-Modus, verbietet aber keine Zugriffe. Dieser Modus wird für Debugging-Aufgaben genutzt und ist nicht für Produktivsysteme geeignet.
- Ausgeschaltet (DISABLED). SELinux macht gar nichts.
Einstellen des SELinux-Modus permanent (bleibt auch nach einem Reboot gesetzt)
SELinux Modus während des Bootvorgangs einstellen
enforcing=0 --> Startet das System im Permissiv-Modus
selinux=0 --> Veranlasst den Kernel keine SELinux-Komponenten zu laden
autorelabel=1 --> SELinux wird das ganze System (Ordner, Dateien, Ports ..) durchlaufen und mit den SELinux-Content aus der SELinux Datenbank relabeln.
Das "relabeln" hat folgenden Hintergrund. SELinux merkt natürlich, wenn ein Linux-System nicht in einem anderen Modus gebootet worden ist, als es eigentlich vorgesehen war. Hat man den Bootvorgang zum Beispiel durch ein rd.break als Bootparameter unterbrochen und das root-Passwort neu gesetzt, so wird SELinux davon in Kenntnis gesetzt.
Das kann aber auch bedeuten, dass ein Angreifer sich Zugriff auf das System ermöglicht und Dateien manipuliert hat, indem er SELinux Berechtigungen auf den Daten ändert.
Für jeden Ordner, jede Datei hält SELinux einen Eintrag in einer Datenbank vor, woraus hervorgeht wie die SELinux-Rechte auszusehen haben. Beim relabeln werden diese Rechte auf allen Ordnern und Dateien wieder gesetzt, sodass sämtliche manuellen Änderungen unwirksam werden.
Mittwoch, 3. November 2021
Autofs
Es gibt gute Gründe, warum man sich autofs ansehen sollte. Das einfachste Beispiel sind Benutzer-Verzeichnisse (z.B. /home). Normalerweise hat jeder Server seine eigenes Home-Verzeichnis und jeder Benutzer hat dort Platz um Dateien abzulegen. Wenn sich ein Benutzer aber nun auf einem weiteren Server einloggt, stehen ihm diese Dateien nicht mehr zur Verfügung. Da macht es Sinn, dass man dem User eine NFS-Freigabe konfiguriert, welche auf jedem Server automatisch gemountet wird, sobald sich der User einloggt und darauf zugreift. Der User hat somit seine Dateien überall zur Verfügung, egal wo er angemeldet ist.
Denkbar ist ein solches Szenario auch in einer skalierbaren Umgebung, wo ggf. Server dazu gestartet werden, wenn es zu einem Performance-Engpass kommt. Solche Lösungen werden gerne in public Clouds genutzt.
Natürlich wäre es möglich auch jedem Server die NFS-Freigabe statisch zu mounten (Stichwort fstab), jedoch würde das unnötige Systemressourcen kosten.
Die Einrichtung ist einfach. Zunächst muss man die notwendige Software installieren. Unter RHEL 8 funktioniert das so:
| dnf install autofs |
1. Eine MASTER-Datei unter /etc/auto.master.d/ Die Datei kann einen beliebigen Namen haben, sie muss aber die Endung .autofs haben. In diesem Beispiel verwende ich den Namen firma.autofs:
Unter dem Verzeichnis /firma (aus /etc/auto.master.d/firma.autofs) wird automatisch ein Unterverzeichnis share (aus /etc/auto.firma.autofs) bereit gestellt, welches die Freigabe des NFS-Servers gemounted hat. Der Server bindet die Freigabe also unter /firma/share an. Dabei muss das Unterverzeichnis share nicht existieren. Der Automounter legt es selbst an.
Und jetzt etwas mehr Dynamic bitte
Zuerst sehen wir, dass der Automounter /etc/home.automount aktiv hat. Der Benutzer User1 hat als Home-Verzeichnis /export/home/user1 konfiguriert (passwd). Nachdem sich der Benutzer User1 eingeloggt hat, sehen wir das gemountete Verzeichnis /export/home/user1.
Wenn sich der User wieder abgemeldet hat, verschwindet nach einer Zeit der Mount wieder.
Proxmox Memory Problem mit WIN2012 und SQL Server
In meinen Kundenumgebungen beobachte ich eine sehr hohe Speicherauslastung bei Microsoft SQL Servern. Der Durchschnitt liegt bei >90% Sp...
-
In meinen Kundenumgebungen beobachte ich eine sehr hohe Speicherauslastung bei Microsoft SQL Servern. Der Durchschnitt liegt bei >90% Sp...
-
Hat man eine Applikation in einen Container verpackt und kann diese erfolgreich mit podman laufen lassen, soll diese vermutlich auch bei ein...
-
Ich stecke gerade in einer sehr großen Migration von VMware nach Proxmox. Es gibt viele Anleitungen im Internet, wie das funktionieren kann...