Création rapide d'un serveur sous Linux

Cette page montre par la pratique comment installer rapidement un serveur sous Linux (serveur Web Apache, serveur de fichier FTP et partage de fichiers Samba), comment automatiser la création d'un grand nombre de comptes utilisateur avec leur mot de passe, et comment analyser, diagnostiquer et configurer un réseau TCP/IP. La plupart des commandes utilisées ici se tapent en ligne de commandes et sont disponibles sur toutes les distributions Linux (Ubuntu, Debian, Fedora, Suse, etc.).

Sommaire de cette page :

Création automatisée des comptes utilisateur

Le serveur vsFTP

Le serveur Apache

Le serveur SAMBA

Récapitulatif de la procédure d'automatisation en 8 étapes

Configuration du réseau en ligne de commande

 

Retour au sommaire de cette page

 

Mise en place d'un serveur

 

Création automatisée des comptes utilisateurs par traitement par lot :

Voyons comment créer instantanément 100 nouveaux comptes utilisateur sur le serveur en utilisant la fonction de traitement par lot de Webmin, ainsi qu'un grand nombre d'utilitaires de mise en forme de fichier en ligne de commande.

La ligne de commande suivante crée une liste de 100 utilisateurs (de nom compteXXX avec 1 <= XXX <= 100) dans le fichier liste.txt :

seq -s $'\n'compte 0 1 100 | grep compte > liste.txt

La ligne de commande suivante (ré-utilisée dans la boucle for ci-dessous) permet de générer un mot de passe aléatoire composé de 8 caractères (chiffres, lettres minuscules et lettres majuscules) :

tr -d -c "a-zA-Z0-9" < /dev/urandom | head -c 8

La ligne de commande suivante crée, à partir du fichier des noms d'utilisateurs liste.txt, un nouveau fichier utilisateurs.txt contenant sur chaque ligne le nom d'utilisateur et son mot de passe séparés par le caractère deux points :

for utilisateur in $(cat liste.txt); do echo $utilisateur:$(tr -d -c "a-zA-Z0-9" < /dev/urandom | head -c 8); done > utilisateur.txt

Exemple de ligne contenue dans le fichier utilisateur.txt :

compte87:h3F2udx1

 

Nouveau : voici une application en JavaScipt qui génère en ligne les noms d'utilisateur et mots de passe (fichier utilisateur.txt)

 

La commande suivante affiche le premier champ du fichier utilisateur.txt, soit les noms d'utilisateurs (l'option -d de la commande cut permet de préciser le séparateur des champs, ici le caractère deux points) :

cat utilisateur.txt | cut -d: -f 1

La commande suivante affiche le second champ du fichier utilisateur.txt, soit les mots de passe (l'option -f de la commande cut permet de préciser le numéro du champ à afficher, ici le deuxième) :

cat utilisateur.txt | cut -d: -f 2

La ligne de commande suivante crée, à partir du fichier des noms d'utilisateurs liste.txt, un nouveau fichier webmin.txt au format du traitement par lot de Webmin. Chaque ligne contient :

for utilisateur in $(cat liste.txt); do echo create:$utilisateur:$(tr -d -c "a-zA-Z0-9" < /dev/urandom | head -c 8)::::/home/gecif/$utilisateur:/bin/sh:::::; done > webmin.txt

Exemple de ligne contenue dans le fichier webmin.txt :

create:compte87:h3F2udx1::::/home/gecif/compte87:/bin/sh:::::

Le fichier webmin.txt ainsi obtenu permet de créer instantanément les 100 comptes utilisateur en utilisant la création automatique de comptes par traitement par lot de Webmin.

La syntaxe exacte des fichiers de traitement par lot de Webmin est la suivante :

create:nom_utilisateur:mot_de_passe:uid:gid:nom_reel:repertoire_personnel:interpreteur:min:max:averti:inactif:expire

modify:ancien_nom_utilisateur:nom_utilisateur:mot_de_passe:uid:gid:nom_reel:repertoire_personnel:interpreteur:min:max:averti:inactif:expire

delete:nom_utilisateur

Dans les lignes create, si le champ uid est laissé vide, Webmin affecte un UID automatiquement. Si le champ gid est vide, Webmin crée un nouveau groupe du même nom que l'utilisateur. Les champs nom_utilisateur, repertoire_personnel et interpreteur doivent être renseignés pour chaque utilisateur. Il est permis de laisser vides tous les autres champs. Si le champ mot_de_passe est vide, aucun mot de passe n'est affecté à l'utilisateur. S'il contient juste la lettre x, le compte est verrouillé. Autrement, le texte contenu dans le champ est considéré comme le mot de passe en clair puis chiffré. En enrichissant la boucle FOR ci-dessus qui a créé le fichier webmin.txt il est donc possible de compléter les paramètres d'un utilisateur, comme par exemple ajouter un nom réel ou un groupe particulier.

Dans les lignes modify, un champ vide sera considéré comme signifiant que l'attribut de l'utilisateur correspondant n'est pas à modifier.

Enfin pour supprimer un lot d'utilisateur, les lignes delete ne doivent contenir que le nom d'utilisateur. Par exemple la ligne de commande suivante crée, à partir du fichier des noms d'utilisateurs liste.txt, un nouveau fichier supprimer.txt permettant de supprimer l'ensemble des comptes utilisateur par le traitement par lot de Webmin :

for utilisateur in $(cat liste.txt); do echo delete:$utilisateur ; done > supprimer.txt

Exemple de ligne contenue dans le fichier supprimer.txt :

delete:compte87

Remarque : l'ensemble des lignes de commande (création du fichier des utilisateurs liste.txt, boucle for, etc.) peuvent être tapées dans le module Autres > Commande shell de Webmin. Les fichiers créés sont alors créés dans le répertoire /root du serveur. Les commandes de traitement par lot peuvent être simplement redirigées vers la sortie standard (et non dans un fichier webmin.txt) puis seront insérées dans le traitement par lot de Webmin par un simple copier/coller.

 

Mais Webmin n'est ni indispensable ni la seule solution pour la création ou la supression d'un grand nombre de comptes utilisateur par traitement par lot. Il est en effet parfaitement possible de créer ou supprimer un grand nombre de comptes utilisateur en utilisant les commandes de base de Linux useradd et userdel en ligne de commande.

Remarques :

Voyons comment créer puis supprimer 100 comptes utilisateur en ligne de commande à partir des fichiers liste.txt et utilisateur.txt.

Rappel concernant les fichiers liste.txt et utilisateur.txt :

seq -s $'\n'compte 0 1 100 | grep compte > liste.txt

 

La création automatisée des utilisateurs Linux en ligne de commande va se faire en 2 étapes :

 

Création des utilisateurs sans mot de passe en ligne de commande :

La ligne de commande suivante crée un nouvel utilisateur compte87 sans mot de passe en configurant son répertoire personnel :

useradd -d /home/gecif/compte87 compte87

Remarque : si aucun interpréteur de commande n'est précisé, useradd configure automatiquement le shell /bin/sh comme shell par défaut de l'utilisateur

La ligne de commande suivante crée les 100 comptes utilisateur (sans mot de passe) inscrits dans le fichier liste.txt :

for utilisateur in $(cat liste.txt); do useradd -d /home/gecif/$utilisateur $utilisateur; done

 

Configuration des mots de passe en ligne de commande :

La ligne de commande suivante donne le mot de passe h3F2udx1 à l'utilisateur compte87 :

printf "h3F2udx1\nh3F2udx1\n" | passwd compte87

Remarque : passwd peut lire les mots de passe sur son entrée standard, ce qui permet d'automatiser la création d'un grand nombre de mots de passe à partir d'un fichier et sans être obligé de les saisir manuellement au clavier

La ligne de commande suivante donne un mot de passe aux 100 comptes utilisateur inscrits dans le fichier utilisateur.txt en prenant les mots de passe dans ce même fichier utilisateur.txt et en les redirigeant vers l'entrée standard de passwd :

for util in $(cat utilisateur.txt); do printf "$(echo $util | cut -d: -f 2 | head -c 8)\n$(echo $util | cut -d: -f 2 | head -c 8)\n" | passwd $(echo $util | cut -d: -f 1); done

 

Listage des comptes utilisateur Linux en ligne de commande :

Dans un système Linux, le fichier /etc/passwd contient l'ensemble des utilisateurs sans mot de passe, et le fichier /etc/shadow contient les mots de passe des utilisateurs cryptés en MD5.

Exemple de ligne contenue dans le fichier /etc/passwd :

compte87:x:1088:1088::/home/gecif/compte87:/bin/sh

Exemple de ligne contenue dans le fichier /etc/shadow dans le cas où le compte utilisateur ne possède pas de mot de passe (il y a un point d'exclamation dans le second champ, indiquant que le compte n'a pas de mot de passe) :

compte87:!:15326:0:99999:7:::

Exemple de ligne contenue dans le fichier /etc/shadow dans le cas où le compte utilisateur possède un mot de passe (il est alors crypté en MD5 dans le second champ) :

compte87:$6$zfnSxIOx$kCvJJeqm8eYOKJqu/IDpp8qlgfFTp7EJ8MuRY0NOAEJRYbSwK3JVdvTmt3pwtgsjJBiFZc34n2Ayw.Vg/ldPT1:15326:0:99999:7:::

Remarque : avec ou sans mot de passe la ligne est la même dans le fichier /etc/passwd.

Parmi les différences entre le fichier /etc/passwd et le fichier /etc/shadow il faut savoir que le fichier /etc/passwd est accessible en lecture pour tous les utilisateurs, alors que le fichier /etc/shadow n'est pas accessible à un utilisateur classique.

Pour obtenir la liste des utilisateurs nous allons demander un affichage filtré du fichier /etc/passwd. La ligne de commande suivante affiche l'intégralité du fichier /etc/passwd :

cat /etc/passwd

La ligne de commande suivante affiche seulement le 1er champ du fichier /etc/passwd (le login des utilisateurs) :

cat /etc/passwd  | cut -d: -f 1

La ligne de commande suivante affiche seulement les utilisateurs contenant le mot "compte" dans leur login :

cat /etc/passwd  | cut -d: -f 1 | grep compte

 

Suppression des utilisateurs en ligne de commande :

La ligne de commande suivante supprime l'utilisateur compte87 :

userdel compte87

La ligne de commande suivante supprime les 100 comptes utilisateur inscrits dans le fichier liste.txt :

for utilisateur in $(cat liste.txt); do userdel $utilisateur; done

 

Conclusion : l'automatisation de la création ou de la suppression d'un grand nombre d'utilisateurs Linux peut se faire aussi bien avec Webmin (en utilisant le traitement par lot de Webmin) qu'en ligne de commande (en utilisant une boucle FOR).

 

Retour au sommaire de cette page

 

Le serveur FTP vsFTP :

Installation : sous Ubuntu 10.04 il suffit d'installer le paquet vsftpd :

apt-get install vsftpd

Démarrage du serveur : le serveur vsFTP se démarre avec la commande service, et non directement avec la commande vsftpd :

service vsftpd start

Etat du serveur :

service vsftpd status

Arrêt du serveur :

service vsftpd stop

Après l'installation et le démarrage de vsFTP, tous les utilisateurs locaux Linux peuvent accéder à leur répertoire personnel à distance grâce à un simple client FTP.

Problème : un utilisateur se connectant par FTP à un serveur vsFTP a le pouvoir de visiter tout le système de fichier Linux, bien au delà se son propre répertoire personnel !

Solution : pour renfermer un utilisateur dans son répertoire personnel et lui interdire de visiter toute l'arborescence du disque dur Linux il faut :

 

Problème : un utilisateur se connectant par FTP à un serveur vsFTP n'a pas le pouvoir en écriture, ou les fichiers qu'il créer ne sont pas visibles par les autres utilisateurs

Solution : pour donner les droits en écriture à un utilisateur et donner les droits en lecture à tous les autres (pour tous les fichiers et répertoires créés dans le client FTP) il faut :

 

Retour au sommaire de cette page

Le serveur HTTP Apache :

Installation : sous Ubuntu 10.04 il faut installer le paquet apache2-mpm-prefork (avec ses dépendences) :

apt-get install apache2-mpm-prefox

Démarrage du serveur : le serveur Apache se démarre avec la commande service (et non directement avec la commande httpd) :

service apache2 start

Etat du serveur :

service apache2 status

Arrêt du serveur :

service apache2 stop

 

Problème : Après l'installation et le démarrage d'Apache2, le répertoire racine du serveur est par défaut le répertoire /var/www. Comment personnalmiser le répertoire racine du serveur afin que les utilisateurs possédant un identifiant (compte Linux + accès FTP) puisse voir leur site Internet hébergé sur le serveur et enregistrés dans le répertoire /home/gecif (par exemple) ?

Solution : pour modifier la racine du serveur il faut remplacer toutes les occurences de /var/www par le nouveau répertoire racine (par exemple /home/gecif) dans le fichier de configuration /etc/apache2/sites-available/default (puis relancer le serveur)

Remarque : la directive ServerRoot du fichier /etc/apache2.conf représente le répertoire de configuration d'Apache2, et non la racine des sites web hébergés par le serveur.

Retour au sommaire de cette page

Le serveur de partage de fichiers SAMBA :

Samba permet de partager les répertoires personnels des utilisateurs Linux sur le réseau : les répertoires personnels sont alors accessibles en écriture dans le voisinage réseau de Windows, après une identification de l'utilisateur par son mot de passe.

Installation de Samba : sous Ubuntu 10.04 il faut installer le paquet samba (avec ses dépendences) :

apt-get install samba

Pour configurer Samba, 3 solutions sont possibles :

Chacune de ces 3 solutions présente au moins un avantage par rapport aux deux autres, les 3 solutions sont donc à connaître et chaque technique sera tôt au tard utilisée.

Pour installer SWAT et Webmin sous Ubuntu 10.04 il suffit d'installer les paquets de même nom (avec leur dépendences) :

apt-get install swat webmin

 

Procédure pour que chaque utilisateur Linux accède à son répertoire personnel à partir de Windows :

1 - pour chaque répertoire à partager il faut créer une section dans le fichier /etc/samba/smb.conf :

[compte87]
      path=/home/gecif/compte87
      valid users=compte87
      writable=YES

Pour créer un nouveau partage Samba les 3 solutions sont possibles :

Dans le cas d'un grand nombre de partages à créer, l'écriture directe dans le fichier de configuration /etc/samba/smb.conf permet d'automatiser la création des partages en ligne de commande sous Linux :

La ligne de commande suivante crée une liste de 100 utilisateurs (de nom compteXXX avec 1 <= XXX <= 100) dans le fichier liste.txt :

seq -s $'\n'compte 0 1 100 | grep compte > liste.txt

La ligne de commande suivante ajoute au fichier smb.conf une section pour chaque utilisateur du fichier liste.txt :

for utilisateur in $(cat liste.txt); do printf "[$utilisateur]\n\t path=/home/gecif/$utilisateur\n\t valid users=$utilisateur\n\t writable=YES\n"; done >> /etc/samba/smb.conf

Remarque : printf est préférable à echo afin d'écrire facilement les retours à la ligne \n et les tabulations \t

2 - pour chaque utilisateur Linux il faut créer un utilisateur Samba en recryptant son mot de passe. En effet, les mots de passe Linux sont cryptés en MD5 (dans le fichier /etc/shadow de Linux), alors que les mots de passe Samba (et Windows) sont cryptés en MD4. Pour cette raison il est impossible de créer les mots de passe Samba en lisant simplement le fichier /etc/shadow de Linux : lors de la création des utilisateurs Samba il faut obligatoirement saisir les mots de passe en clair afin de les crypter en MD4.

Pour créer un nouvel utilisateur Samba en ligne de commande sous Linux il faut utiliser la commande smbpasswd :

smbpasswd -a compte87

La création manuelle d'un nouvel utilisateur Samba peut aussi se faire en utilisant Swat ou Webmin, toujours en saisissant le mot de passe en clair.

Pour automatiser la création d'un grand nombre d'utilisateurs Samba on pourra utiliser l'option -s de smbpasswd qui lit directement les mots de passe en clair sur l'entrée standard :

printf "h3F2udx1\nh3F2udx1\n" | smbpasswd -a compte87 -s

Remarque : printf envoie sur sa sortie standard 2 fois le mot de passe en clair (séparé par un retour à la ligne \n) à smbpasswd, qui le récupère sur son entrée standard et le crypte immédiatement en MD4.

 

Exemple concret de création automatique des utilisateurs Samba :

Imaginons que l'on dispose d'un fichier utilisateur.txt contenant sur chaque ligne les identifiants en clair de 100 utilisateurs : un login de la forme comptexxx et un mot de passe sur 8 caratères, les deux étant séparés par le caractère deux points.

Exemple de ligne contenue dans le fichier utilisateur.txt :

compte87:h3F2udx1

Voyons comment créer automatiquement les 100 utilisateurs Samba à partir du fichier utilisateur.txt.

Quelques rappels avant de créer les utilisateurs Samba par traitement par lot en ligne de commande :

seq -s $'\n'compte 0 1 100 | grep compte > liste.txt

for utilisateur in $(cat liste.txt); do echo $utilisateur:$(tr -d -c "a-zA-Z0-9" < /dev/urandom | head -c 8); done > utilisateur.txt

cat utilisateur.txt

cat utilisateur.txt | cut -d: -f 1

cat utilisateur.txt | cut -d: -f 2 | head -c 8

for util in $(cat utilisateur.txt); do echo "L'utilisateur $(echo $util | cut -d: -f 1) a pour mot de passe $(echo $util | cut -d: -f 2 | head -c 8)\n"; done

 

Question : Comment créer automatiquement les 100 utilisateurs Samba à partir du fichier utilisateur.txt ?

Réponse : La ligne de commande suivante crée automatiquement les 100 utilisateurs Samba en codant les mots de passe en MD4 grâce à smbpasswd :

for util in $(cat utilisateur.txt); do printf "$(echo $util | cut -d: -f 2 | head -c 8)\n$(echo $util | cut -d: -f 2 | head -c 8)\n" | smbpasswd -a $(echo $util | cut -d: -f 1) -s; done

Conclusion : l'automatisation de la création d'un grand nombre de partages et d'utilisateurs Samba se fait en ligne de commande sous Linux, Webmin ne possédant pas la fonction de traitement par lot pour Samba (contrairement à la création des utilisateurs Linux).

 

Les autres serveurs :

Cette dernière partie donnera prochainement des informations sur la mise en place rapide d'autres serveurs sous Ubuntu (NFS, DNS, LDAP, MySQL, SendMail, etc.)

Retour au sommaire de cette page

Résumé des 8 étapes pour créer automatiquement 1000 comptes Samba

Ce paragraphe récapitule les 8 étapes pour créer en ligne de commande 1000 nouveaux comptes sur un serveur Samba sous Linux. Chaque étape se résume à une ligne de commande à taper dans un shell Linux, et n'utilise pas le traitement par lot de Webmin. La procédure complète se divise en 4 phases principales (2 étapes par phase) :

Voici un rappel des lignes de commande à taper en root dans un shell Linux :

 

Phase 1 : création des fichiers texte contenant les identifiants (en 2 étapes)

Etape 1 : création du fichier liste.txt contenant les 1000 identifiants (de site1 à site1000)

seq -s $'\n'site 0 1 1000 | grep site > liste.txt

 

Etape 2 : création du fichier utilisateur.txt contenant les 1000 mots de passe de 6 caractères

for utilisateur in $(cat liste.txt); do echo $utilisateur:$(tr -d -c "a-kp-z2-9" < /dev/urandom | head -c 6); done > utilisateur.txt

Remarque : les mots de passe sont composés ici de 6 caractères, sans majuscules, et ne contiennent aucun des caractères suivants : 0 1 l m n o (afin de ne pas confondre le o et le 0, ou encore le 1 et le l)

 

Phase 2 : création des comptes utilisateur Linux (en 2 étapes)

Etape 3 : création des utilisateurs Linux sans mot de passe (commande useradd)

for utilisateur in $(cat liste.txt); do useradd -d /home/http/eleves/$utilisateur $utilisateur; done

 

Etape 4 : ajout d'un mot de passe à chaque utilisateur Linux (commande passwd)

for util in $(cat utilisateur.txt); do printf "$(echo $util | cut -d: -f 2 | head -c 6)\n$(echo $util | cut -d: -f 2 | head -c 6)\n" | passwd $(echo $util | cut -d: -f 1); done

Remarque : après ces étapes 3 et 4 les comptes Linux sont bien créés, ils possède chacun leur mot de passe et sont associés à un répertoire personnel. Mais les répertoires personnels des utilisateurs n'ont pas été créés physiquement sur le disque dur : il seront créés et configurés manuellement aux étapes 7 et 8.

 

Phase 3 : création des comptes Samba (en 2 étapes)

Etape 5 : création des utilisateurs Samba (commande smbpasswd)

for util in $(cat utilisateur.txt); do printf "$(echo $util | cut -d: -f 2 | head -c 6)\n$(echo $util | cut -d: -f 2 | head -c 6)\n" | smbpasswd -a $(echo $util | cut -d: -f 1) -s; done

 

Etape 6 : création des partages Samba par écriture directe dans le fichier /etc/samba/smb.conf

for utilisateur in $(cat liste.txt); do printf "[$utilisateur]\n\t path=/home/gecif/$utilisateur\n\t valid users=$utilisateur\n\t writable=YES\n"; done >> /etc/samba/smb.conf

Remarque : printf est préférable à echo afin d'écrire facilement les retours à la ligne \n et les tabulations \t

 

Phase 4 : création des répertoires utilisateur sur le disque dur (en 2 étapes)

Etape 7 : création des 1000 répertoires utilisateur sur le disque dur

for utilisateur in $(cat liste.txt); do mkdir /home/http/eleves/$utilisateur; done

 

Etape 8 : changement du propriétaire pour chacun des 1000 répertoires

for utilisateur in $(cat liste.txt); do chown -R $utilisateur /home/http/eleves/$utilisateur; done

Remarque : après ces 8 étapes les 1000 nouveaux utilisateurs peuvent accéder à leur répertoire personnel en tapant \\nessi dans l'explorateur Windows et en s'identifiant avec leur mot de passe à 6 caractères.

C'est cette procédure en 8 étapes qui a été utilisée sur le serveur NESSI le 05 juin 2012 pour y ajouter 1800 nouveaux comptes de site Internet accessibles par Samba. Webmin a été utilisé seulement pour bénéficier d'un shell Linux à distance permettant d'exécuter ces 8 lignes de commande sur le poste Windows par un simple copier/coller. Mais le traitement par lot de Webmin n'est pas utilisé ici : il est remplacé par une simple boucle FOR sur la ligne de commande.

Avec les 200 comptes créés en Mars 2011 par le traitement par lot de Webmin, le serveur NESSI possède désormais 2000 comptes de sites Internet personnels.

Enfin, l'exécution de ces 8 lignes de commande permet d'ajouter à tout moment et en quelques minutes plusieurs milliers de nouveaux comptes utilisateur.

Nouveau : voici une application en JavaScipt qui génère en ligne les noms d'utilisateur et mots de passe (fichier utilisateur.txt)

 

Retour au sommaire de cette page

Analyse et configuration du réseau

Ce paragraphe rappelle les commandes de base à taper dans la ligne de commande de Linux pour observer l'environnement réseau de la machine courante.

Question : Quelle est mon adresse IP ?

Réponse : La commande ifconfig renvoie l'adresse IP de chacune des interfaces (des "cartes réseau") du système.

 

Question : Quelle est l'adresse MAC de ma carte réseau eth0 ?

Réponse : La commande ifconfig eth0 renvoie un ensemble de renseignement concernant la carte réseau eth0, dont l'adresse MAC qui est noté HWaddr dans les information renvoyées par ifconfig. Grâce à la commande grep il est possible de filtrer les informations renvoyées par ifconfig afin de ne garder que la ligne contenant l'adresse MAC :

ifconfig eth0 | grep HWaddr

 

Question : Quelles sont les adresses IP utilisées sur mon réseau ?

Réponse : La commande nmap -sS 192.168.1.1-50 teste toutes les adresses IP de 192.168.1.1 à 192.168.1.50 et renvoie seulement les adresses utilisées actuellement sur le réseau en précisant pour chacune d'entre elles les ports ouverts et l'adresse MAC des cartes réseau.


Voyons maintenant les commandes élémentaires permettant de modifier la configuration réseau. Contrairement à l'analyse de la configuration qui pouvait se faire avec un compte limité, certaines commandes de cette partie nécessitent les droits d'éccès de l'administrateur (compte root).

Question : Comment donner à mon ordinateur une adresse IP particulière ?

Réponse : La commande ifconfig eth0 192.168.1.6 donne à l'interface réseau eth0 l'adresse IP 192.168.1.6.

Retour au sommaire de cette page