Webmin
Cas pratiques
Configurations
Exemple 1: Netfilter
Nous
allons maintenant faire le parallèle entre une configuration
simple du filtre de paquets Netfilter en mode console et la
même configuration via Webmin. Cette configuration
rudimentaire ne permet un accès que sur quelques ports en
entrée sur la machine. L'utilisateur souhaite effectuer les
actions suivantes :
- Effacer ou « Flusher » les règles Iptables de la machine locale.
- Accepter les connexions entrantes déjà établies.
- Accepter les connexions entrantes ssh.
- Accepter les connexions entrantes http (port 80).
- Accepter les connexions entrantes pour administrer webmin (port 10000).
- Insérer en deuxième ligne les connexions sur la boucle locale.
- Définir la politique par défaut pour les connections entrantes à « DROP ».
- Lister l'ensemble des règles.
Voici les 8 commandes à entrer respectivement en mode console pour cet exemple :
sudo iptables -F
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 10000 -j ACCEPT
sudo iptables -I INPUT 2 -i lo -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables -L -v
Considérons
maintenant que nous voulions faire cette même configuration
via l'interface de Webmin. L'ajout d'une règle se fait par
les menus suivants :
- Réseaux
- Linux Firewall
- Ajouter une règle
Voici
comment remplir le formulaire proposé par Webmin pour
créer la régle « Accepter les
connections entrantes http (port 80) »
- Cocher l'action accepter
- Définir le protocole réseaux égal à TCP
- Définir le port réseaux égal à 80
- Sauvegarder la règle
L'avantage réside dans le fait que l'ensemble des paramètres de configuration d'une règle Iptables est proposé dans le formulaire. Ceci permet alors à l'utilisateur de n'en oublier aucun. Notons que le menu principal de ce module « Linux Firewall » rappel l'ensemble des règles Iptables de la machine. Les autres règles vues ci-dessus doivent alors être entrée via ce formulaire de la même façon.
Illustration 2: Le menu ajouter une règle iptables
Exemple 2: Protéger un répertoire dans Apache
Pour
protéger l'accès à ses
répertoires, Apache fournit un outil permettant de
générer des mots de passe cryptés
(aussi bien sous Windows que sous Unix). Il s'agit de l'utilitaire
htpasswd accessible dans le sous-répertoire bin d'Apache.
Ainsi l'utilisateur devra saisir un nom d'utilisateur et un mot de
passe valides pour accèder aux répertoires
protégés. La
syntaxe de cet utilitaire est la suivante :
Pour
créer un nouveau fichier de mots de passe dans le
répertoire à protéger :
htpasswd -c {chemin du fichier de mot de passe} utilisateur
Pour
ajouter un nouvel utilisateur/mot de passe à un fichier
existant dans le répertoire à protéger
:
htpasswd {chemin du fichier de mot de passe} utilisateur
Le mot de passe sera demandé en ligne de commande avec une confirmation.
Voici l’analogie sous Webmin, via les menus :
- Serveurs
- Apache
- serveur par défaut
- répertoire.
Puis dans le menu : contrôle d’accès. Il faut renseigner les champs suivants :
- Nom du royaume d'authentification
- Répertoire du fichier texte d'authentification
Maintenance du système
Exemple 1: Consulter les logs d'Apache
Pour un système donné, Webmin permet la consultation d'une quinzaine de fichiers de log (en français : journaux). Voici les menus pour y accèder:
- Système
- Journaux système
Pour la consultation des accès sur le serveur web Apache, nous allons utiliser le formulaire suivant qui permet d'ajouter un journal dans Webmin:
Illustration 3: Le menu ajouter
un journal système
Il est conseillé de choisir un journalisation non active pour les journaux qui changent souvent afin d'économiser des ressources. Après quelques temps d'utilisation, voici des extraits d'attaques "bateau" qui peuvent être recencées dans ce fichier access.log en filtrant par exemple sur le mot « 404 » :
Premier extrait: Attaque sur le serveur par recherche de l'interpréteur de commande Windows218.92.71.31 - - [15/Oct/2006:05:27:20 +0200] "GET
/scripts/root.exe?/c+dir" 404 338 "-" "-"
218.92.71.31 - - [15/Oct/2006:05:27:21 +0200] "GET
/msadc/..%c0%2f..%c0%2f..%c0%2f../winnt/system32/cmd.exe?/c+dir" 404
365 "-" "-"
218.92.71.31 - - [15/Oct/2006:05:27:26 +0200] "GET
/msadc/..%c0%2f../..%c0%2f../..%c0%2f../winnt/system32/cmd.exe?/c+dir"
404 371 "-" "-"
218.92.71.31 - - [15/Oct/2006:05:27:27 +0200] "GET
/msadc/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir" 404
365 "-" "-"
218.92.71.31 - - [15/Oct/2006:05:27:28 +0200] "GET
/msadc/..%c0%af../..%c0%af../..%c0%af../winnt/system32/cmd.exe?/c+dir"
404 371 "-" "-"
218.92.71.31 - - [15/Oct/2006:05:27:30 +0200] "GET
/msadc/..%c1%1c..%c1%1c..%c1%1c../winnt/system32/cmd.exe?/c+dir" 404
365 "-" "-"
2ème
extrait: Attaque par recherche de dossier inexistant sur le serveur :
"GET
/gl HTTP/1.1" 404 323 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr;
rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7"
90.3.114.133 - - [15/Oct/2006:17:55:59 +0200] "GET /gl HTTP/1.1" 404
323 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7)
Gecko/20060909 Firefox/1.5.0.7"
90.3.114.133 - - [15/Oct/2006:17:56:03 +0200] "GET /dawa HTTP/1.1" 404
325 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7)
Gecko/20060909 Firefox/1.5.0.7"
90.3.114.133 - - [15/Oct/2006:17:56:25 +0200] "GET /liens.php$
HTTP/1.1" 404 331 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr;
rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7"
90.3.114.133 - - [15/Oct/2006:17:56:33 +0200] "GET /projet HTTP/1.1"
404 327 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7)
Gecko/20060909 Firefox/1.5.0.7"
90.3.114.133 - - [15/Oct/2006:17:56:39 +0200] "GET /alfresco HTTP/1.1"
404 329 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7)
Gecko/20060909 Firefox/1.5.0.7"
90.3.114.133 - - [15/Oct/2006:17:58:42 +0200] "GET /Dawa HTTP/1.1" 404
325 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7)
Gecko/20060909 Firefox/1.5.0.7"
Cette simple recherche sur le code d'erreur 404 « file note
found » du protocole http met assez souvent en
lumière les accès indésirables
effectués sur un serveur web. D'une manière
générale, Webmin offre un accès
ergonomique aux journaux système ce qui se
révèle être un vrais plus par rapport
à la ligne de commande.
Exemple 2: Panne du serveur Web Apache ou d’un MTA (Serveur de mail)
En
cas d'arrêt du serveur Web, Webmin devient inaccessible. Pour
reprendre son contrôle, il faudra donc obligatoirement se connecter en
console. Tout
d'abord l'administrateur pourra vérifier les processus
actifs avec la
commande : ps -ax
puis chercher les processus Apache : 4843
?
Ss 0:00 /usr/sbin/apache2 -k
start -DSSL. Une excellente idée serait
ensuite de rechercher les erreurs eventuelles dans les
journaux : /var/log/messages
et /var/log/apache2/error.log.
Enfin il pourra tenter de redémarrer Apache avec la commande
: /etc/init.d/apache
restart.
Pour un autre serveur, par exemple un serveur de mail Postfix ou le démon DHCP en panne, les menus de Webmin aiderons à la résolution du problème:
- Suivi des processus: menu Sytème > Gestionnaire de processus
- Vérification de l’état du module: menu Serveurs
- Consultation des logs: menu Sytème > Journaux Sytème
Développer ses modules pour Webmin
Webmin est conçu selon un principe modulaire. Voici un schéma représentant l’organisation des modules dans cette architecture:Illustration 4: Schéma des modules de Webmin
Chacun peut écrire un module et l'intégrer dans
le module principal car l'ensemble des API de base sont fournies. Le serveur web et
tous ses scripts cgi sont écrits pour Perl 5 et n'utilisent
aucun module externe. Ainsi, seul le binaire Perl est
nécessaire pour exécuter Webmin, ce qui fait de lui toute sa portabilité. Pour la création d'un
module, il est possible de gérer différentes
langues et différentes configurations pour les plates-formes
supportées. Voici les règles qu'il faut respecter pour créer un nouveau module :
- Créer un répertoire du nom du module dans le répertoire de base de Webmin
- Les images du modules doivent être dans un répertoire « images » L'icône du module doit s'appeler « icon.gif » et doit être de 48 x 48 pixels
- Un fichier « module.info » doit être crée et il doit renseigner les champs suivants :
- nom du module
- description du module
- catégorie (quel menu et sous menu de Webmin)
- La première page du module s'appel « index.cgi »
- Les fichiers de langue doivent se trouver dans un répertoire « lang »
- Ajouter au fichier /etc/webmin/webmin.acl
- Ajouter le module créé aux utilisateurs qui y auront accès
- Créer un répertoire du nom du module dans /etc/webmin avec les fichiers « config » et « admin.acl »
- « admin.acl » doit rester vide
- « config.acl » contient des variables qui peuvent être utilisées depuis les programmes Perl des modules.
- Les programmes Perl suivent certaines règles :
- Appel à une librairie webmin. C'est ce qui leur permettra d'utiliser l'API fournie.
- Appel à la fonction « init_config » de l'API Webmin
- conseillé : Appel à une librairie
propre au
module créé. Cette librairie devrait s'appeler
<module>-lib.pl. Par exemple : oracle-lib.pl.
#!/usr/bin/perl
do '../web-lib.pl';
&init_config();
require './oracle-lib.pl';