commit c1dd470e3417982712c788fdfeb3d6e6d70c3132 Author: deads Date: Wed Jun 24 07:16:19 2026 +0000 deploy.sh hinzugefügt diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..3cadd69 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,108 @@ +#!/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." \ No newline at end of file