Application web Flask d'administration d'utilisateurs, groupes, fichiers, tâches cron, ACL et pare-feu sur un serveur Linux. Interface unique en français pour exécuter les opérations système courantes, avec authentification, protection CSRF et journal d'audit.
Cette application modifie le système réel (comptes, permissions, pare-feu). Déployez-la uniquement sur un serveur administré, derrière HTTPS, avec des règles
sudostrictement limitées. Tout accès admin équivaut à un accès root.
- Utilisateurs : création, suppression, verrouillage/déverrouillage, expiration, shell, home, nom complet (GECOS), mots de passe, politique
chage - Groupes : création, suppression, renommage, GID, ajout/retrait de membres, accès
sudo - Consultations : liste paginée des utilisateurs/groupes, groupes d'un user, membres d'un groupe, sessions actives, dernières connexions
- Fichiers :
chmod,chown, consultationstat, auditausearch - ACL : consultation (
getfacl), ajout (setfacl -m, options défaut/récursif), suppression (-x/-b) - Pare-feu : statut et règles UFW (
allow/deny/delete), règles iptables (INPUT, ACCEPT/DROP/REJECT) - Cron : tâches par utilisateur, fichiers système, ajout (sans écraser l'existant), suppression
- Journaux d'audit : accès protégé par code e-mail à usage unique (5 min)
- Autocomplete : users, groupes, chemins fichiers et format
user:groupsur tous les champs concernés - Bilingue FR/EN : sélecteur dans l'en-tête et sur la page de login, langue mémorisée en session (
utils/i18n.py, sans dépendance externe) - Responsive : sidebar repliable (hamburger) sur mobile, tableaux à défilement horizontal, grilles adaptatives
- Expiration du mot de passe admin configurable, pagination (50/page), overlay de chargement
- Linux avec :
adduser,addgroup,usermod,gpasswd,groupdel,groupmod,userdel,chpasswd,chage,getent,groups,who,crontab,chmod,chown,stat,getfacl/setfacl(paquetacl),ufw,iptables,ausearch(paquetauditd, optionnel),lastlog - Python 3.10+
- Règles
sudoNOPASSWD limitées aux commandes utilisées (liste exacte : page « À propos » de l'app, section 3 du guide Ubuntu)
Les actions
sudosont bloquantes : sans règles NOPASSWD, le serveur demande le mot de passe dans son terminal à chaque action (avec un timeout de 30 s par commande).
Installez les prérequis système (git, venv, ACL) :
sudo apt update
sudo apt install -y git python3 python3-venv python3-pip aclClonez le dépôt puis entrez dedans :
git clone https://github.com/hdmanoach/linux-manager.git
cd linux-managerCréez l'environnement virtuel et installez les dépendances :
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
cp .env.example .envGénérez une clé de session (l'app refuse de démarrer sans FLASK_SECRET_KEY valide) :
python3 -c "import secrets; print(secrets.token_urlsafe(48))"Générez le hash du mot de passe administrateur :
python3 -c "from werkzeug.security import generate_password_hash; print(generate_password_hash('votre-mot-de-passe'))".env minimal :
FLASK_SECRET_KEY=cle-longue-et-aleatoire
ADMIN_USERNAME=admin
ADMIN_PASSWORD_HASH=hash-genere-ci-dessusJournaux par e-mail (optionnel) :
ALLOWED_LOG_EMAILS=admin@example.com
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=admin@example.com
SMTP_PASSWORD=mot-de-passe-applicationExpiration du mot de passe admin (optionnel, 0 = jamais) :
ADMIN_PASSWORD_EXPIRY_DAYS=90
ADMIN_PASSWORD_LAST_CHANGED=2026-01-01T00:00:00python3 app.pyOuvrez http://127.0.0.1:5000. Le mode debug est désactivé par défaut (FLASK_DEBUG=1 pour l'activer en développement uniquement). En production, utilisez Gunicorn derrière Nginx : voir Guide de déploiement Ubuntu.
- Secrets : jamais versionnés (
.envignoré). Démarrage impossible sans vraie clé Flask. - Sessions : cookie
Secure+HttpOnly+SameSite=Lax, expiration après 30 min. Note : en HTTP simple horslocalhost, le navigateur refuse le cookieSecure(login en boucle) — mettezSESSION_COOKIE_SECURE=Falseou, mieux, passez en HTTPS (voir guide Ubuntu). - CSRF : jeton obligatoire sur tous les POST (sauf login).
- Brute-force : 5 tentatives max + cooldown progressif, hash
pbkdf2, expiration MDP configurable. - Injection : aucune commande shell (listes d'arguments uniquement), noms validés par regex, modes
chmod/chownvalidés, séparateur--anti-injection d'options, redirectionnextlimitée aux chemins internes. - En-têtes :
nosniff,DENY,XSS-Protection,Referrer-Policy. - Audit : chaque opération loguée dans
var/log/audit.jsonl(sans secrets).
- UFW à distance : une règle
denymal placée peut couper votre accès SSH — gardez une session de secours. - iptables : les règles sont perdues au reboot sans
iptables-persistent— l'app ne gère pas la persistance. userdelsans-r: le home est conservé (sécurité) — nettoyez avecrm -rf /home/<user>si besoin.- Cron : l'ajout préserve les tâches existantes de l'utilisateur.
app.py Application Flask et routes (~1000 lignes)
templates/ ~45 pages HTML (base, menu, formulaires, affichages)
templates/partials/ Carte de formulaire réutilisable
static/favicon.svg Favicon
utils/logging_utils.py Écriture du journal d'audit
.env.example Modèle de configuration
DEPLOYMENT_UBUNTU.md Procédure de déploiement en production
requirements.txt Dépendances Python
var/log/audit.jsonl Journal d'audit (non versionné)
