RHEL System Roles: sshd
In Teil 4 meiner losen Reihe über die RHEL System Roles stelle ich die Ansible-Rolle sshd vor. Diese dient der Konfiguration des OpenSSH-Servers, einem der wichtigsten Dienste in Linux- und UNIX-Systemen.
Wer die ersten Teile dieser Reihe gelesen hat, ist inzwischen mit der grundsätzlichen Anwendung dieser Ansible-Rollen vertraut. Die Rolle sshd bildet hier keine Ausnahme. Wendet man die Rolle ohne weitere Konfiguration auf Ziel-Systeme an, konfiguriert sie den OpenSSH-Server entsprechend der Standard-Konfiguration des jeweiligen Betriebssystems. Es werden alle Optionen der sshd_config(5) unterstützt.
Ein Wort der Warnung: Mit dieser Rolle konfiguriert ihr den SSH-Dienst der Zielsysteme. Wenn dabei ein Fehler passiert, könnt ihr euch und euren Ansible-Controller aussperren und verliert ggf. den Zugriff auf die Systeme. Behaltet dies bitte im Hinterkopf und sorgt ggf. für alternative Zugänge, wie z.B. über eine lokale Konsole.
Bei der Konfiguration meiner Server ist mir persönlich wichtig, dass
- der Benutzer root sich nur mittels SSH-Public-Key-Verfahren anmelden kann,
- die Public-Key-Authentifizierung aktiviert ist,
- die Passwort-Authentifizierung deaktiviert ist und
- in der Datei
.ssh/authorized_keys
des jeweiligen Benutzers nach dem SSH-Public-Key gesucht wird.
Darüber hinaus möchte ich alle Git-bezogenen Umgebungsvariablen (GIT_*
) nutzen. Die übrigen Einstellungen möchte ich auf den Standard-Werten des jeweiligen Betriebssystems belassen.
Im Folgenden beschreibe ich, wie sich diese mit der RHEL System Role sshd umsetzen lässt.
Voraussetzungen
Wie bei allen RHEL System Roles müssen auch hier die Pakete ansible-core
und rhel-system-roles
inkl. ihrer Abhängigkeiten auf dem Ansible-Controller installiert sein. Der Ansible-Controller muss die Ziel-Hosts über SSH erreichen können und über einen Benutzer mit sudo-Berechtigungen verfügen.
Das Playbook
Es werden bereits zwei Beispiel-Playbooks mitgeliefert, die sich im Pfad /usr/share/doc/rhel-system-roles/sshd/
befinden. Diese heißen:
example-accept-env-playbook.yml
undexample-root-login-playbook.yml
.
Aus diesen beiden Beispieldateien habe ich das folgende Playbook für meine Labor-Umgebung erstellt:
---
- hosts: all
tasks:
- name: Configure sshd to accept some useful environment variables
include_role:
name: rhel-system-roles.sshd
vars:
sshd:
PermitRootLogin: without-password
PasswordAuthentication: no
PubkeyAuthentication: yes
AuthorizedKeysFile: .ssh/authorized_keys
# there are some handy environment variables to accept
AcceptEnv:
LANG
LS_COLORS
EDITOR
GIT_*
Wie zu sehen ist, habe ich mich entschieden, noch ein paar weitere Umgebungsvariablen zu konfigurieren. Diese habe ich aus dem Beispiel example-accept-env-playbook.yml
übernommen.
Testlauf in Labor-Umgebung
Auch dieses Playbook habe ich in meiner Labor-Umgebung, bestehend aus einem RHEL8-Ansible-Controller und jeweils einem rhel{7..9}-Client laufen lassen. Mit den Optionen -C -D
ist die Ausgabe 707 Zeilen lang, weswegen der folgende Code-Block nur den Aufruf und das Ergebnis zeigt.
[root@ansible-ctrl ansible]# ansible-playbook sshd_config.yml -C -D
PLAY [all] ************************************************************************************************************
[...]
PLAY RECAP *******************************************************************************************************************************
ansible-pctrl : ok=20 changed=2 unreachable=0 failed=0 skipped=13 rescued=0 ignored=0
rhel7 : ok=20 changed=2 unreachable=0 failed=0 skipped=13 rescued=0 ignored=0
rhel8 : ok=20 changed=2 unreachable=0 failed=0 skipped=13 rescued=0 ignored=0
rhel9 : ok=21 changed=2 unreachable=0 failed=0 skipped=12 rescued=0 ignored=0
Zusammenfassung
Die RHEL System Role sshd wurde kurz vorgestellt und genutzt, um meine bevorzugten Einstellungen für den OpenSSH-Dienst in meiner Labor-Umgebung zu konfigurieren. Alle Optionen in der sshd_config(5), welche ich nicht explizit über die Ansible-Rolle konfiguriert habe, werden auf die Standardwerte des Betriebssystems eingestellt. Es ist also ggf. Vorsicht geboten, wenn Systeme mit bestehender Konfiguration bearbeitet werden.
Selbstverständlich schützt ein einmaliger Playbook-Lauf nicht davor, dass ein Benutzer mit root-Berechtigungen lokale Änderungen an der Datei /etc/ssh/sshd_config
vornimmt. Dies mag vorübergehend für Tests auch so gewollt sein. Damit die Konfiguration nicht dauerhaft vom SOLL-Zustand abweicht, kann man das Playbook regelmäßig durch cron(8) ausführen lassen, um evtl. Abweichungen zu korrigieren.