#!/bin/bash
# 실습 #5 ③ — ssh-agent + 서버 sshd_config 하드닝
# - agent : 패스프레이즈 한 번만 입력 → 메모리에 캐시 → 이후 자동
# - 서버측: PasswordAuthentication no · PermitRootLogin no · MaxAuthTries 3
# - 운영 적용 전 반드시 `sshd -t` 로 문법 검증
set -e

# 1) ssh-agent 실행 (이미 떠 있으면 그 PID 사용)
if [ -z "$SSH_AUTH_SOCK" ] || ! ssh-add -l >/dev/null 2>&1; then
    eval "$(ssh-agent -s)"
fi

# 2) 가장 흔한 키 후보들을 agent 에 추가 (있는 것만)
for k in ~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_ecdsa; do
    [ -f "$k" ] && ssh-add "$k" 2>/dev/null || true
done

echo "=== agent 등록된 키 ==="
ssh-add -l || echo "(등록된 키 없음 — setup_01 먼저 실행)"

# 3) .bashrc 에 agent 자동 시작 블록 추가 (멱등)
BASHRC="$HOME/.bashrc"
if ! grep -q "# === ssh-agent autostart ===" "$BASHRC" 2>/dev/null; then
    cat >> "$BASHRC" <<'EOF'

# === ssh-agent autostart ===
if [ -z "$SSH_AUTH_SOCK" ]; then
    eval "$(ssh-agent -s)" >/dev/null
    [ -f "$HOME/.ssh/id_ed25519" ] && ssh-add "$HOME/.ssh/id_ed25519" 2>/dev/null
fi
EOF
    echo "→ .bashrc 에 agent autostart 추가"
fi

# 4) 서버 측 sshd 하드닝 적용 (drop-in 방식 — /etc/ssh/sshd_config 본체 안 건드림)
DROPIN=/etc/ssh/sshd_config.d/99-lab-hardening.conf
SRC="$(dirname "$0")/configs/03_sshd_hardening.conf"

if [ ! -d /etc/ssh/sshd_config.d ]; then
    echo "→ sshd_config.d/ 없음 — 본 머신 sshd 가 구식. 수동 적용 필요."
    exit 0
fi

sudo cp "$SRC" "$DROPIN"
sudo chmod 644 "$DROPIN"
echo
echo "=== drop-in 설정 적용: $DROPIN ==="
sudo cat "$DROPIN"

# 5) 문법 검증 — 운영에 반드시 필요. 통과해야만 restart.
echo
echo "=== sshd -t (문법 검증) ==="
if sudo sshd -t; then
    echo "→ OK. 적용:  sudo systemctl reload ssh   (또는 sshd)"
    echo
    echo "주의: 본 스크립트는 자동 reload 하지 않습니다."
    echo "      현재 세션이 비밀번호 인증으로 들어와 있다면 reload 후 새 세션이 거부될 수 있습니다."
    echo "      반드시 별도 터미널에서 키 인증으로 들어와 있는 것을 확인 후 reload 하세요."
else
    echo "→ 문법 오류! drop-in 제거하고 다시 시도:"
    echo "      sudo rm $DROPIN"
    exit 1
fi
