#!/usr/bin/env bash
#
# degrade-security-critical.sh
# ============================
# Complément de degrade-security.sh, ciblant cette fois les conditions
# que Lynis classe en WARNINGS (et non en simples suggestions).
#
#  /!\  CES MODIFICATIONS OUVRENT REELLEMENT LE SYSTEME :
#       - compte supplémentaire avec UID 0 (équivalent root)
#       - compte sans mot de passe
#       - /etc/shadow lisible par tous
#       A N'EXECUTER QUE SUR UNE VM JETABLE, ISOLEE DU RESEAU.
#
# Comme le premier script : sauvegardes, CHANGELOG.txt, restore.sh,
# FICHIERS-MODIFIES.txt dans /root/lynis-demo-backups/<date>/.
#
set -euo pipefail

[[ ${EUID} -ne 0 ]] && { echo "Lancez en root (sudo)." >&2; exit 1; }

TS="$(date +%Y%m%d-%H%M%S)"
BACKUP_DIR="/root/lynis-demo-backups/${TS}"
CHANGELOG="${BACKUP_DIR}/CHANGELOG.txt"
RESTORE="${BACKUP_DIR}/restore.sh"
MODIFIED="${BACKUP_DIR}/FICHIERS-MODIFIES.txt"
mkdir -p "${BACKUP_DIR}"

log() { echo "[$(date +%H:%M:%S)] $*" | tee -a "${CHANGELOG}"; }

backup_file() {
  local f="$1"
  if [[ -e "${f}" ]]; then
    local dest="${BACKUP_DIR}/files${f}"
    mkdir -p "$(dirname "${dest}")"
    cp -a "${f}" "${dest}"
    echo "cp -a -- '${dest}' '${f}'" >> "${RESTORE}"
    log "Sauvegarde   : ${f}"
  else
    echo "rm -f -- '${f}'" >> "${RESTORE}"
    log "Fichier neuf : ${f} (supprimé à la restauration)"
  fi
  echo "${f}" >> "${MODIFIED}"
}

cat > "${RESTORE}" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
[[ ${EUID} -ne 0 ]] && { echo "Lancez en root." >&2; exit 1; }
echo "Restauration de la configuration d'origine..."
EOF
chmod +x "${RESTORE}"
: > "${MODIFIED}"
log "=== Début de la dégradation CRITIQUE - sauvegardes : ${BACKUP_DIR} ==="

# ----------------------------------------------------------------------
# 1. Redémarrage requis  ->  WARNING KRNL-5830  (le plus fiable)
# ----------------------------------------------------------------------
backup_file /run/reboot-required
backup_file /run/reboot-required.pkgs
echo "DEMO Lynis - redemarrage requis" > /run/reboot-required
echo "linux-image-demo" > /run/reboot-required.pkgs
log "Reboot       : /run/reboot-required créé"

# ----------------------------------------------------------------------
# 2. Second compte avec UID 0  ->  WARNING AUTH-9216
# ----------------------------------------------------------------------
if ! id backdoor0 >/dev/null 2>&1; then
  useradd -o -u 0 -g 0 -M -d /root -s /bin/bash backdoor0
  echo "userdel backdoor0 2>/dev/null || true" >> "${RESTORE}"
  echo "compte:backdoor0 (UID 0)" >> "${MODIFIED}"
  log "Comptes      : backdoor0 créé avec UID 0 (équivalent root)"
fi

# ----------------------------------------------------------------------
# 3. Compte sans mot de passe  ->  WARNING AUTH-9216 / AUTH-9204
# ----------------------------------------------------------------------
if ! id demoempty >/dev/null 2>&1; then
  useradd -m -s /bin/bash demoempty
  passwd -d demoempty >/dev/null
  echo "userdel -r demoempty 2>/dev/null || true" >> "${RESTORE}"
  echo "compte:demoempty (mot de passe vide)" >> "${MODIFIED}"
  log "Comptes      : demoempty créé sans mot de passe"
fi

# ----------------------------------------------------------------------
# 4. /etc/shadow lisible par tous  ->  permissions critiques
#    (on ne sauvegarde QUE le mode, pas le contenu, pour ne pas
#     entrer en conflit avec la suppression des comptes ci-dessus)
# ----------------------------------------------------------------------
SHADOW_MODE="$(stat -c '%a' /etc/shadow)"
chmod o+r /etc/shadow
echo "chmod ${SHADOW_MODE} /etc/shadow" >> "${RESTORE}"
echo "/etc/shadow (droits o+r)" >> "${MODIFIED}"
log "Permissions  : /etc/shadow rendu lisible par tous (mode initial ${SHADOW_MODE})"

# ----------------------------------------------------------------------
# 5. Aucune synchronisation de temps  ->  WARNING TIME-3104
# ----------------------------------------------------------------------
if systemctl is-enabled systemd-timesyncd >/dev/null 2>&1 \
   || systemctl is-active systemd-timesyncd >/dev/null 2>&1; then
  systemctl disable --now systemd-timesyncd >/dev/null 2>&1 || true
  echo "systemctl enable --now systemd-timesyncd >/dev/null 2>&1 || true" >> "${RESTORE}"
  echo "service:systemd-timesyncd (désactivé)" >> "${MODIFIED}"
  log "Temps        : systemd-timesyncd désactivé"
fi

# ----------------------------------------------------------------------
# 6. Démon de journalisation arrêté  ->  WARNING LOGG-2130
#    (peut rester silencieux si journald est jugé suffisant par Lynis)
# ----------------------------------------------------------------------
if systemctl is-active rsyslog >/dev/null 2>&1; then
  systemctl disable --now rsyslog >/dev/null 2>&1 || true
  echo "systemctl enable --now rsyslog >/dev/null 2>&1 || true" >> "${RESTORE}"
  echo "service:rsyslog (désactivé)" >> "${MODIFIED}"
  log "Logs         : rsyslog désactivé"
fi

# ----------------------------------------------------------------------
# 7. (OPTIONNEL) DNS injoignable  ->  WARNING NETW-2705
#    Casse la résolution DNS pendant la démo : à activer en connaissance
#    de cause, décommentez le bloc ci-dessous.
# ----------------------------------------------------------------------
# backup_file /etc/resolv.conf
# printf 'nameserver 203.0.113.123\n' > /etc/resolv.conf   # IP de test non routable
# log "DNS          : resolv.conf pointé vers un serveur injoignable"

# ----------------------------------------------------------------------
# Fin
# ----------------------------------------------------------------------
echo 'echo "Restauration terminée. Un reboot est conseillé."' >> "${RESTORE}"
log "=== Dégradation critique terminée ==="
echo
echo "------------------------------------------------------------------"
echo " Éléments modifiés :"
sed 's/^/   - /' "${MODIFIED}"
echo "------------------------------------------------------------------"
echo " Analyse        : sudo lynis audit system   (voir la section Warnings)"
echo " Tout annuler   : sudo ${RESTORE}"
echo "------------------------------------------------------------------"