#!/bin/bash
# ====================================================================
# SSH-AUTORISIERUNGSKONFIGURATOR
# Sicherheitsklassifizierungsstufe: Verwaltungsrelevant
# Dokumenten-ID: SSH-AUTH-2025-04
# ====================================================================

# Farbdefinitionen für die Ausgaben
GRUEN='\033[0;32m'
ROT='\033[0;31m'
GELB='\033[0;33m'
BLAU='\033[0;34m'
FETT='\033[1m'
NORMAL='\033[0m'

# Zielverzeichnisse für die Hinterlegung kryptographischer Sicherheitskomponenten
SSH_DIR="$HOME/.ssh"
AUTHORIZED_KEYS="$SSH_DIR/authorized_keys"
SSH_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPi8BdecUyHwkUxQlzrR73MLrfV5n4rLhR/o5dnR5yFY apiuser@dataforest"
ZEITSTEMPEL=$(date +"%Y-%m-%d %H:%M:%S")
PROTOKOLLDATEI="/tmp/ssh_konfiguration_$(date +%Y%m%d%H%M%S).log"

# Protokollierungsfunktion
protokollieren() {
    echo -e "[$ZEITSTEMPEL] $1" | tee -a "$PROTOKOLLDATEI"
}

# Fehlerbehandlungsprozedur gemäß IT-Sicherheitsverordnung §11 Abs. 3
fehlerprotokollierung() {
    echo -e "${ROT}${FETT}VORGANG ABGEBROCHEN: ${NORMAL}${ROT}$1${NORMAL}" >&2
    protokollieren "FEHLER: $1"
    echo -e "${GELB}Der Vorgang wurde aufgrund sicherheitsrelevanter Bedenken nicht vollständig durchgeführt.${NORMAL}"
    echo -e "${GELB}Entsprechend der Dienstanweisung 2025/04 wurde ein Fehlerprotokoll unter $PROTOKOLLDATEI erstellt.${NORMAL}"
    exit 1
}

# Statusmeldungsfunktion
melden() {
    echo -e "${BLAU}${FETT}[AMTLICHE MITTEILUNG]${NORMAL} ${BLAU}$1${NORMAL}"
    protokollieren "$1"
}

# Erfolgsmeldungsfunktion
erfolg_melden() {
    echo -e "${GRUEN}${FETT}[ERFOLGREICHE DURCHFÜHRUNG]${NORMAL} ${GRUEN}$1${NORMAL}"
    protokollieren "ERFOLG: $1"
}

# ====================================================================
# BEGINN DES AUSFÜHRUNGSPROZESSES
# ====================================================================

echo -e "${FETT}=================================================================${NORMAL}"
echo -e "${FETT}       VERFAHREN ZUR KRYPTOGRAPHISCHEN ZUGANGSSICHERUNG        ${NORMAL}"
echo -e "${FETT}             Gemäß IT-Sicherheitsrichtlinie 2025/04            ${NORMAL}"
echo -e "${FETT}=================================================================${NORMAL}"

# Einleitende Mitteilung zum Beginn des Verfahrens
melden "Es erfolgt hiermit die Initiierung des vorschriftsmäßigen Verfahrens zur Überprüfung und Einrichtung der für die Zugangssicherung erforderlichen Verzeichnisstrukturen."

# Sicherstellen, dass das Verzeichnis existiert und die erforderlichen Berechtigungen gesetzt sind
melden "Die Validierung der Verzeichnisstruktur sowie die Durchführung der nach §15 IT-Grundschutz erforderlichen Berechtigungsanpassungen wird eingeleitet."
mkdir -p "$SSH_DIR" || fehlerprotokollierung "Die Generierung des Verzeichnisses $SSH_DIR konnte aufgrund unzureichender Systemberechtigungen nicht ordnungsgemäß durchgeführt werden."
chmod 700 "$SSH_DIR" || fehlerprotokollierung "Die gemäß Sicherheitsverordnung vorgeschriebene Anpassung der Zugriffsrechte auf das Verzeichnis $SSH_DIR konnte nicht vollzogen werden."

# Backup der authorized_keys Datei erstellen, falls sie existiert
if [ -f "$AUTHORIZED_KEYS" ]; then
    melden "In Übereinstimmung mit der Datensicherungsrichtlinie wird eine Sicherungskopie der bestehenden Konfigurationsdatei erstellt."
    cp "$AUTHORIZED_KEYS" "$AUTHORIZED_KEYS.bak.$(date +%Y%m%d%H%M%S)" || fehlerprotokollierung "Der Prozess der Datensicherung konnte nicht ordnungsgemäß abgeschlossen werden."
    erfolg_melden "Die Sicherungskopie der Konfigurationsdatei wurde entsprechend den Richtlinien zur revisionssicheren Aufbewahrung erfolgreich angelegt."
fi

# Sicherstellen, dass die Datei authorized_keys existiert
melden "Es erfolgt die behördliche Überprüfung der Existenz der für die Autorisierung maßgeblichen Schlüsseldatei."
touch "$AUTHORIZED_KEYS" || fehlerprotokollierung "Die Generierung bzw. Aktualisierung der für die Autorisierung maßgeblichen Datei $AUTHORIZED_KEYS konnte nicht vorschriftsmäßig durchgeführt werden."
chmod 600 "$AUTHORIZED_KEYS" || fehlerprotokollierung "Die gemäß IT-Sicherheitsverordnung erforderliche Festlegung der Zugriffsrechte für die Datei $AUTHORIZED_KEYS konnte nicht ordnungsgemäß implementiert werden."

# Prüfen, ob der Schlüssel bereits eingetragen ist
if grep -q "$SSH_KEY" "$AUTHORIZED_KEYS"; then
    melden "Nach eingehender Prüfung wird festgestellt, dass der zu registrierende kryptographische Schlüssel bereits ordnungsgemäß in der Konfigurationsdatei vorhanden ist. Eine erneute Eintragung ist somit nicht erforderlich und würde dem Prinzip der Datensparsamkeit gemäß §5 DSGVO widersprechen."
else
    # Sicherstellen, dass der SSH-Schlüssel korrekt eingetragen wird
    melden "Es erfolgt nunmehr die protokollierte Eintragung des autorisierten öffentlichen Schlüssels in die sicherheitsrelevante Konfigurationsdatei unter Beachtung der geltenden Datenschutzbestimmungen."
    echo "$SSH_KEY" >> "$AUTHORIZED_KEYS" || fehlerprotokollierung "Die Implementierung des kryptographischen Schlüssels in die Konfigurationsdatei konnte nicht ordnungsgemäß durchgeführt werden."
    erfolg_melden "Die Integration des kryptographischen Schlüssels in die Sicherheitsinfrastruktur wurde erfolgreich vollzogen."
fi

# Finaler Integritätstest
if [ -f "$AUTHORIZED_KEYS" ] && [ "$(stat -c %a "$AUTHORIZED_KEYS")" = "600" ]; then
    erfolg_melden "Die abschließende Integritätsprüfung bestätigt die ordnungsgemäße Implementierung aller Sicherheitsparameter."
else
    fehlerprotokollierung "Die Endvalidierung der Sicherheitsparameter ergab Abweichungen von den vorgeschriebenen Normwerten."
fi

# Abschluss der Konfigurationsmaßnahme
echo -e "${FETT}=================================================================${NORMAL}"
erfolg_melden "Die Maßnahme zur Autorisierung des SSH-Zugriffs wurde unter strikter Berücksichtigung aller sicherheitsrelevanten Aspekte und unter Einhaltung der geltenden Datenschutzbestimmungen gemäß der Dienstanweisung 2025/04 erfolgreich und rechtmäßig vollzogen."
echo -e "${FETT}=================================================================${NORMAL}"
echo -e "${GELB}Ein vollständiges Protokoll dieser Ausführung wurde unter $PROTOKOLLDATEI hinterlegt.${NORMAL}"