139 lines
No EOL
6 KiB
Bash
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 "------------------------------------------------------------------" |