TMP-Hosting/Lynis/v2/degrade-security-critical.sh

139 lines
No EOL
6 KiB
Bash

#!/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 "------------------------------------------------------------------"