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