Généralités sur linux
Ce howto a été écrit au départ pour debian etch puis a été adapté pour debian lenny. Il reste cependant valable la plupart du temps pour ces deux versions de debian.
Généralités sur linux
Fichiers
Le système de fichier ext3 est principalement destiné aux systèmes basés sur GNU/Linux. Il permet des fichiers ayant un nom jusqu'à 256 caractères. Il ne faut pas perde de vue que, sous linux, tous les caractères ASCII sont différenciés, ce qui implique notamment la différenciation majuscule/minuscule : PoF.txt et pof.txt seront deux fichiers différents ! Chaque fichier à des attributs (des droits). Cette partie est traité dans la partie 3. Droits, permissions des fichiers et dossiers. Le système de fichier ext4 est le successeur de ext3. Ce nouveau système de fichier gère les partitions jusqu'à 1 024 pébioctets (soit <math>2^{50}</math> octets) et a une meilleur gestion de la fragmentation que son prédécesseur.
L'arborescence
Sous linux, l'arborescence part d'une origine commune qu'on appel "root" (racine en français) ou "/". L'organisation standard des répertoires est décrite dans le Filesystem Hierarchy Standard. Le respect de cette hiérarchie assure compatibilité et portabilité des systèmes linux.
Droits, permissions des fichiers et dossiers
A propos des permissions et des droits
On peut différencier trois catégories de permissions :
- user (u) qui défini les permissions du propriétaire du fichier.
- group (g) qui défini les permissions du groupe auquel appartient le fichier.
- other (o) qui défini les permissions de tous les autres utilisateurs du serveur.
Chaque fichier et chaque dossier appartient à un user (son propriétaire) et à un group.
On peut ensuite voir les trois types de permissions s'appliquant pour les trois catégories : - read (r) qui défini le droit de lecture du fichier et d'affichage (listing) du dossier. - write (w) qui défini le droit en écriture dans le fichier ou le dossier (écriture et suppression). - execute (x) qui défini le droit d'exécution du fichier et l'autorisation d'entrer dans un dossier.
Les permissions peuvent être changés de deux manières : soit en utilisant les lettres (r, w et x), soit en utilisant les bits de permission. Le tableau suivant résume les permissions :
User (u) | Group (g) | Other (o) |
---|---|---|
read write exec | read write exec | read write exec |
400 200 100 | 40 20 10 | 4 2 1 |
Les permissions maximales sont donc rwxrwxrwx, ou 777.
Petit exemple : Soit un utilisateur blah ayant ses fichiers dans /home/blah/. Tous ses fichiers appartiennent à l'utilisateur blah et au groupe blah et sont en permission 750. Ses fichiers ne seront donc accessible que par lui même et par les membres du groupe blah. Pour qu'un autre utilisateur ait accès aux fichiers de blah, il faudra donc que cet autre utilisateur appartienne au groupe blah.
Pour changer les permissions d'un fichier/dossier:
$ chmod u+rwx plop : ajoute les permissions rwx à user pour le fichier/dossier plop <br /> $ chmod g+rwx plop : ajoute les permissions rwx au group pour le fichier/dossier plop <br /> $ chmod o+rwx plop : ajoute les permissions rwx a other pour le fichier/dossier plop
Vous pouvez changer les permissions d'un dossier et de tout ses sous-répertoires en ajoutant l'option -R :
$ chmod -R o+r dir/
Dans ce cas, vous aurez peut-être besoin de différencier les droits des fichiers et des dossiers (par exemple : les dossier devront être +x, mais pas les fichier). chmod
gère cela : les lettres r w x en minuscules indiquent des fichiers, et les lettres R W X en majuscule indiquent des dossier. Par exemple:
chmod -R o-x+X dir/
Il existe des permissions d'accès spéciales. Elles ne peuvent être attribués que par le propriétaire du fichier (ou par root). Leurs valeurs octales sont 1000, 2000 et 4000. Les bits setuid et setgid sont ce qu'on appel les permissions étendues : ils permettent de donner temporairement à un utilisateur les droits qui sont normalement ceux du propriétaire du fichier.
- setuid : il faut utiliser la commande
chmod u+s
(ou chmod 4xxx). Un programme exécutant un tel fichier/dossier peut alors s'exécuter sous le nom d'un autre utilisateur. Par exemple, si un fichier appartenant à root est setuidé, tout utilisateur exécutant ce fichier peut effectuer ses tâches avec les permissions associés à root. - setgid : il faut utiliser la commande
chmod g+s
(ou chmod 2xxx). C'est le même principe que setgid, mais appliqué au groupe. - sticky bit : il faut utiliser la commande
chmod u+t
(ou chmod 1xxx). Pour les dossiers : lorsque ce droit est positionné, il empêche la suppression des fichiers du dossier à tout utilisateur n'étant pas le propriétaire du fichier. Cependant, un utilisateur ayant le droit d'écrire dans le fichier pourra toujours le modifier (et donc, le vider complètement s'il le veut !). Pour les fichiers : le positionnement de ce droit indique que le fichier devra rester en mémoire même après son exécution. Le but était d'éviter de charger/décharger trop souvent les fichiers souvent utilisés et d'améliorer ainsi les performances.
L'umask
La commande umask
permet de définir pour chaque utilisateur avec quelles permissions seront créées les fichiers et dossiers.
Pour calculer l'umask à appliquer, il faut soustraire les permissions voulues aux permissions totales (777).
Pour que les fichiers/dossiers soient créées avec les droits 755, il faudra mettre l'umask à 22 :
$ umask 0022
Selon moi, un umask a 0027 est l'idéal. Cela permet de ne jamais créer de fichiers/dossiers accessibles par other.
$ umask 0027
Il faut cependant redéfinir l'umask à chaque fois que vous vous reloguez (connexion ssh, ouverture d'un terminal). Pour éviter d'avoir à redéfinir l'umask à chaque fois, vous pouvez ajouter la ligne suivante dans le fichier .bash_profile
situé dans le home de chaque utilisateur :
umask 0027
Pour automatiser la définition de l'umask lors de la création d'un utilisateur, vous pouvez ajouter cette même ligne dans le fichier /etc/skel/.bash_profile
N'oubliez pas de définir l'umask de votre utilisateur root dans /root/.bash_profile
Les droits de /home
Vous aurez peut-être remarqué que, lorsqu'un utilisateur se logue, il peut lister les répertoires de /home. Même s'il ne peut pas voir les fichiers des autres utilisateurs, il se peut que vous trouviez gênant qu'un utilisateur connaisse les logins des autres utilisateurs. Vous pouvez régler ce problème en enlevant le droit en lecture pour other de /home comme suit :
$ chmod o-r /home
Il en ira de même si vous ne voulez pas qu'un utilisateur puisse voir l'arborescence située dans /
uid et le gid d'un utilisateur et modification du groupe
L'uid (user ID) d'un utilisateur est son identifiant numérique. Il est unique à chaque utilisateur. Il est généralement supérieur à 1000.
Le gid (group ID) d'un groupe est son identifiant numérique. Il est unique à chaque groupe et est généralement supérieur à 1000.
Pour récupérer l'uid, le gid et les groupes d'un utilisateur, vous pouvez utiliser la commande id
:
$ id uid=1000(pfoo) gid=1000(pfoo) groupes=1000(pfoo)
Le gid correspond au groupe principal de l'utilisateur. Tous les autres groupes listés après sont dits secondaires.
Pour ajouter l'utilisateur pfoo dans le groupe audio, tapez :
$ usermod -G audio pfoo
Pour changer le groupe principal de l'utilisateur pfoo, tapez :
$ usermod -g legroupe pfoo
Les liens
Sous linux chaque fichier est repéré physiquement sur le disque par un inode (c'est en quelque sorte le vrai nom des données sur le disque). Le nom de fichier (filename) est ce qu'on appel une étiquette et pointe sur l'inode.
Hard link
On créé un hardlink avec la commande ln
. Ils permettent de créer une nouvelle étiquette pointant vers un inode. Une fois un hardlink créé, on peut accéder au fichier aussi bien avec le nom d'origine qu'avec le nom que l'on vient de créer. Si on efface le nom d'origine, le fichier reste accessible par le hardlink.
Notez que les hardlinks doivent être situé sur le même disque physique.
Pour créer un hardlink :
$ ln source nouveau_nom
source est le nom du fichier pour lequel vous voulez créer un hardlink, et nouveau_nom est le nom du lien
symbolic link
Un lien symbolic est une nouvelle étiquette pointant cette fois vers un nom de fichier. Si on efface le fichier d'origine, le lien ne signifie plus rien.
Pour créer un lien symbolique :
$ ln -s source destination
source est le nom du fichier pour lequel vous voulez créer un hardlink, et destination est le nom du lien
Ajouter et supprimer des utilisateurs
Pour ajouter un groupe il faut utiliser la commande groupadd :
$ groupadd -g GID GROUPE
GID est le numéro du groupe. GROUPE est le nom du groupe.
Pour ajouter un utilisateur il faut utiliser la commande useradd :
$ useradd -g GID -u UID LOGIN -d home_dir -m
GID est le numéro du groupe principal de l'utilisateur.
UID est le numéro de l'utilisateur. LOGIN est le login de l'utilisateur.
home_dir est le répertoire de l'utilisateur. Généralement /home/LOGIN.
L'option -m précise qu'il faut créer le répertoire personnel de l'utilisateur.
Le patch kernel grsecurity et la restriction des droits de /proc
Le patch grsecurity pour le noyau linux permet d'augmenter la sécurité de votre machine. Cependant, la restriction des droits qu'il peut imposer sur certains répertoires peut être quelque-peut gênante, notamment pour les services utilisant l'ipv6. Si le kernel est bien configuré il a attribué les répertoires dont il a durcit les privilèges à un groupe (défini par la directive de configuration CONFIG_GRKERNSEC_PROC_GID). Si certains services posent des problèmes au lancement (c'est le cas par exemple pour postfix ou bind9 lorsqu'on les configure pour gérer l'ipv6) ajoutez les simplement au groupe des sous-répertoires de /proc/.
Si vous utilisez snmpd, il faut modifier la ligne de lancement dans /etc/default/snmpd
en ajoutant l'option -g GID
où GID est le groupe défini par CONFIG_GRKERNSEC_PROC_GID.
Le programme tar
Généralités sur debian
Le lancement automatique au boot
Quand vous installez des serveurs sous debian, un fichier permettant de le lancer, de l'arrêter, et plus rarement de reloader sa configuration est créé dans /etc/init.d/ Lorsque vous lancez votre serveur, certains services devront être lancé automatiquement. Ce lancement est effectué grâce à des fichiers situés dans /etc/rc?.d/ Le point d'interrogation (?) représente un chiffre contenu entre 0 et 6. Ce chiffre représente l'init. L'init par défaut qui est exécuté au boot est défini dans le fichier /etc/inittab Chez moi par exemple, j'ai la ligne suivante dans mon /etc/inittab :
id:2:initdefault:
Celà signifie que lorsque je démarre mon serveur, il passe directement en init 2. C'est donc les fichiers situés dans /etc/rc2.d/ qui seront utilisés pour lancer les services.
Il est bon de noter que les fichiers situés dans /etc/rc2.d/ sont en fait des liens virtuels pointant vers le lanceur situé dans /etc/init.d/ Si on supprime l'un de ces lignes virtuels, le service en question ne sera plus lancé automatiquement. Si on ajoute un lien, le service correspondant sera alors automatiquement lancé aut boot.
Vous avez peut-être remarqué que les liens ne sont pas nommé uniquement par le nom du service qu'ils lancent, mais qu'ils sont préfixés d'une lettre et de deux chiffres. Un lien commençant par un S sera lancé, alors qu'un lien commençant par un K sera stoppé (K comme Kill) Le nombre suivant la lettre S ou K définit la priorité de lancement ou d'arrêt.
Vous pouvez changer l'init actuel avec la commande telinit suivit du numéro de l'init voulu. L'init 0 correspont a l'arrêt du serveur. L'init 6 correspond au reboot. L'init 1 est généralement utilisé pour un système single-user, et les init 2 à 5 pour un système multi-user.
A titre d'information, voici comment créer un lien virtuel pour ajouter un service au lancement automatique :
# ln -s /etc/init.d/exemple /etc/rc2.d/S20exemple
Notez tout de même que beaucoup de serveurs (apache, proftpd, ...) proposent dans leur fichier /etc/default/ de définir s'ils doivent se lancer ou non au boot. Celà permet de ne pas toucher aux fichiers de /etc/rc?.d/