Téléverser les fichiers vers "/"
This commit is contained in:
1 parent
a46d8ce222
commit
fee5b06fd8
1 file changed
+232
@@ -0,0 +1,232 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# post-install.sh - Personnalisation d'une installation Debian fraîche
|
||||||
|
#
|
||||||
|
# Actions :
|
||||||
|
# - mise à jour du système et installation de curl, wget, git, sudo, locales,
|
||||||
|
# unattended-upgrades (activé)
|
||||||
|
# - création d'un utilisateur sudo et copie des clés SSH de root
|
||||||
|
# - changement du port SSH (via un fichier drop-in)
|
||||||
|
# - fail2ban (optionnel : question posée, ou option -f) avec jail SSH
|
||||||
|
# - alias de confort dans .bashrc (root et utilisateur)
|
||||||
|
# - fuseau horaire et locale
|
||||||
|
#
|
||||||
|
# Usage : sudo ./post-install.sh [-u utilisateur] [-p port_ssh] [-f] [-h]
|
||||||
|
#
|
||||||
|
# Le script est idempotent : il peut être relancé sans dupliquer la config.
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# --- Configuration (surchargeable par variables d'environnement ou options) ---
|
||||||
|
NEW_USER="${NEW_USER:-ldfa}"
|
||||||
|
SSH_PORT="${SSH_PORT:-50822}"
|
||||||
|
TIMEZONE="${TIMEZONE:-Europe/Paris}"
|
||||||
|
LOCALE="${LOCALE:-fr_FR.UTF-8}"
|
||||||
|
INSTALL_FAIL2BAN="${INSTALL_FAIL2BAN:-ask}" # ask (question), 1 (oui), 0 (non)
|
||||||
|
|
||||||
|
# --- Fonctions utilitaires ---
|
||||||
|
log() { printf '\033[1;32m[+]\033[0m %s\n' "$*"; }
|
||||||
|
warn() { printf '\033[1;33m[!]\033[0m %s\n' "$*" >&2; }
|
||||||
|
die() { printf '\033[1;31m[x]\033[0m %s\n' "$*" >&2; exit 1; }
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF
|
||||||
|
Usage : sudo $0 [options]
|
||||||
|
|
||||||
|
Options :
|
||||||
|
-u NOM Utilisateur à créer (défaut : ${NEW_USER})
|
||||||
|
-p PORT Port SSH (défaut : ${SSH_PORT})
|
||||||
|
-f Installe fail2ban sans poser la question (ou INSTALL_FAIL2BAN=1)
|
||||||
|
-h Affiche cette aide
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
check_prerequisites() {
|
||||||
|
[[ $EUID -eq 0 ]] || die "Ce script doit être exécuté en root (sudo)."
|
||||||
|
[[ -r /etc/debian_version ]] || die "Ce script est prévu pour Debian."
|
||||||
|
[[ $SSH_PORT =~ ^[0-9]+$ ]] && (( SSH_PORT >= 1 && SSH_PORT <= 65535 )) \
|
||||||
|
|| die "Port SSH invalide : ${SSH_PORT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Étapes ---
|
||||||
|
update_system() {
|
||||||
|
log "Mise à jour du système"
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
apt-get update
|
||||||
|
apt-get -y dist-upgrade
|
||||||
|
apt-get -y install curl wget git sudo locales unattended-upgrades
|
||||||
|
apt-get -y autoremove
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_unattended_upgrades() {
|
||||||
|
local conf=/etc/apt/apt.conf.d/20auto-upgrades
|
||||||
|
if [[ -f $conf ]] && grep -q 'Unattended-Upgrade "1"' "$conf"; then
|
||||||
|
log "unattended-upgrades déjà activé"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
log "Activation des mises à jour de sécurité automatiques"
|
||||||
|
cat > "$conf" <<'EOF'
|
||||||
|
APT::Periodic::Update-Package-Lists "1";
|
||||||
|
APT::Periodic::Unattended-Upgrade "1";
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
create_user() {
|
||||||
|
if id "$NEW_USER" &>/dev/null; then
|
||||||
|
log "L'utilisateur ${NEW_USER} existe déjà"
|
||||||
|
else
|
||||||
|
log "Création de l'utilisateur ${NEW_USER} (mot de passe demandé)"
|
||||||
|
adduser --gecos "" "$NEW_USER"
|
||||||
|
fi
|
||||||
|
usermod -aG sudo "$NEW_USER"
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_ssh_keys() {
|
||||||
|
local src=/root/.ssh/authorized_keys
|
||||||
|
local home dest
|
||||||
|
home="$(getent passwd "$NEW_USER" | cut -d: -f6)"
|
||||||
|
dest="${home}/.ssh/authorized_keys"
|
||||||
|
|
||||||
|
if [[ ! -f $src ]]; then
|
||||||
|
warn "${src} introuvable : clés SSH non copiées"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
if [[ -f $dest ]]; then
|
||||||
|
log "${dest} existe déjà : on n'y touche pas"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
log "Copie des clés SSH vers ${NEW_USER}"
|
||||||
|
install -d -m 700 -o "$NEW_USER" -g "$NEW_USER" "${home}/.ssh"
|
||||||
|
install -m 600 -o "$NEW_USER" -g "$NEW_USER" "$src" "$dest"
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_ssh() {
|
||||||
|
local conf=/etc/ssh/sshd_config.d/10-custom-port.conf
|
||||||
|
log "Configuration du port SSH : ${SSH_PORT}"
|
||||||
|
|
||||||
|
[[ -d /etc/ssh/sshd_config.d ]] || die "/etc/ssh/sshd_config.d absent (Debian < 11 ?)"
|
||||||
|
printf 'Port %s\n' "$SSH_PORT" > "$conf"
|
||||||
|
|
||||||
|
# Vérifie la configuration AVANT de redémarrer pour éviter de se couper l'accès
|
||||||
|
sshd -t || { rm -f "$conf"; die "Configuration sshd invalide, modification annulée"; }
|
||||||
|
|
||||||
|
# Sur les Debian récentes, ssh.socket impose le port : on revient à ssh.service
|
||||||
|
if systemctl list-unit-files ssh.socket &>/dev/null; then
|
||||||
|
systemctl disable --now ssh.socket 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
systemctl enable ssh.service
|
||||||
|
systemctl restart ssh.service
|
||||||
|
systemctl --no-pager status ssh.service || true
|
||||||
|
|
||||||
|
warn "Ouvrez le port ${SSH_PORT} dans votre pare-feu si nécessaire."
|
||||||
|
warn "Testez la connexion dans un NOUVEAU terminal avant de fermer cette session."
|
||||||
|
}
|
||||||
|
|
||||||
|
install_fail2ban() {
|
||||||
|
if [[ $INSTALL_FAIL2BAN == ask ]]; then
|
||||||
|
if [[ -t 0 ]]; then
|
||||||
|
read -r -p "Installer et configurer fail2ban ? [o/N] " answer
|
||||||
|
[[ $answer =~ ^[oOyY]$ ]] && INSTALL_FAIL2BAN=1 || INSTALL_FAIL2BAN=0
|
||||||
|
else
|
||||||
|
INSTALL_FAIL2BAN=0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ $INSTALL_FAIL2BAN != 1 ]]; then
|
||||||
|
log "fail2ban ignoré"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
log "Installation de fail2ban"
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get -y install fail2ban
|
||||||
|
|
||||||
|
# La jail sshd surveille le port 22 par défaut : on l'aligne sur le port choisi
|
||||||
|
cat > /etc/fail2ban/jail.d/sshd-custom.conf <<EOF
|
||||||
|
[sshd]
|
||||||
|
enabled = true
|
||||||
|
port = ${SSH_PORT}
|
||||||
|
EOF
|
||||||
|
systemctl enable fail2ban
|
||||||
|
systemctl restart fail2ban
|
||||||
|
}
|
||||||
|
|
||||||
|
add_shell_aliases() {
|
||||||
|
local file="$1"
|
||||||
|
local marker="# >>> post-install aliases >>>"
|
||||||
|
|
||||||
|
[[ -f $file ]] || touch "$file"
|
||||||
|
if grep -qF "$marker" "$file"; then
|
||||||
|
log "Alias déjà présents dans ${file}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
log "Ajout des alias dans ${file}"
|
||||||
|
cat >> "$file" <<'EOF'
|
||||||
|
|
||||||
|
# >>> post-install aliases >>>
|
||||||
|
export LS_OPTIONS='--color=auto'
|
||||||
|
eval "$(dircolors)"
|
||||||
|
alias ls='ls $LS_OPTIONS'
|
||||||
|
alias ll='ls $LS_OPTIONS -lah'
|
||||||
|
alias l='ls $LS_OPTIONS -lA'
|
||||||
|
# <<< post-install aliases <<<
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_bashrc() {
|
||||||
|
local home
|
||||||
|
home="$(getent passwd "$NEW_USER" | cut -d: -f6)"
|
||||||
|
add_shell_aliases /root/.bashrc
|
||||||
|
add_shell_aliases "${home}/.bashrc"
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_timezone() {
|
||||||
|
log "Fuseau horaire : ${TIMEZONE}"
|
||||||
|
if command -v timedatectl &>/dev/null; then
|
||||||
|
timedatectl set-timezone "$TIMEZONE"
|
||||||
|
else
|
||||||
|
ln -sf "/usr/share/zoneinfo/${TIMEZONE}" /etc/localtime
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
configure_locale() {
|
||||||
|
log "Locale : ${LOCALE}"
|
||||||
|
sed -i "s/^# *\(${LOCALE} UTF-8\)/\1/" /etc/locale.gen
|
||||||
|
locale-gen
|
||||||
|
update-locale LANG="$LOCALE"
|
||||||
|
}
|
||||||
|
|
||||||
|
ask_reboot() {
|
||||||
|
log "Terminé."
|
||||||
|
if [[ -t 0 ]]; then
|
||||||
|
read -r -p "Redémarrer maintenant ? [o/N] " answer
|
||||||
|
if [[ $answer =~ ^[oOyY]$ ]]; then
|
||||||
|
reboot
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Un redémarrage est recommandé pour appliquer la locale."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
while getopts ":u:p:fh" opt; do
|
||||||
|
case $opt in
|
||||||
|
u) NEW_USER="$OPTARG" ;;
|
||||||
|
p) SSH_PORT="$OPTARG" ;;
|
||||||
|
f) INSTALL_FAIL2BAN=1 ;;
|
||||||
|
h) usage; exit 0 ;;
|
||||||
|
*) usage >&2; exit 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
check_prerequisites
|
||||||
|
update_system
|
||||||
|
enable_unattended_upgrades
|
||||||
|
create_user
|
||||||
|
copy_ssh_keys
|
||||||
|
configure_ssh
|
||||||
|
install_fail2ban
|
||||||
|
configure_bashrc
|
||||||
|
configure_timezone
|
||||||
|
configure_locale
|
||||||
|
ask_reboot
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Reference in new issue
Block a user