[CentOS] Permission problem

Tue Jul 7 15:23:41 UTC 2009
Niki Kovacs <contact at kikinovak.net>

Radu-Cristian FOTESCU a écrit :
> 
> http://rofi.roger-ferrer.org/eiciel/?s=2

First of all, thanks for the instant replies. I took a peek at ACLs and 
how they work. But then, being a fervent adept of the KISS (Keep It 
Simple Stupid) principle (I started out with Slackware some eight years 
ago), I decided to shunt the KICK (Keep It Complicated Kiki) principle :o)

More often than not, we do things in a quite complicated manner... 
before ending up finding a simple solution to the problem.

Anyway, here's the solution to my problem, without ACLs, just good old 
plain chown and chgrp. I took some notes, they're in french, but the 
Linux bits are universal :o)

Here goes, for the curious.

--8<-------------------------

La médiathèque de Montpezat compte cinq agents de prêt :

	* Jean-Claude Pascot (jcpascot)
	* Nicolas Kovacs (nkovacs)
	* Chantal Geins (cgeins)
	* Maryse Pascot (mpascot)
	* Renée Marseille (rmarseille)

Les visiteurs de la médiathèque peuvent utiliser l'ordinateur avec un 
compte spécifique :

	* Utilisateur invité (invite)

Jean-Claude Pascot et Nicolas Kovacs doivent pouvoir créer des documents 
et les mettre à disposition dans un répertoire partagé en lecture seule. 
(Remarque: peut-être que chacun aura 'son' répertoire...)

Tous les agents doivent pouvoir échanger des documents dans un 
répertoire partagé accessible en lecture et en écriture.

Les visiteurs ne doivent pas avoir accès aux documents des 
bibliothécaires, même pas en lecture.

Chacun des utilisateurs sera membre du groupe de connexion initial 
'agents', qu'il va donc falloir créer au préalable.

# groupadd agents

Pour voir les caractéristiques de ce nouveau groupe :

# grep agents /etc/group
agents:x:503:

Éventuellement, c'est une bonne idée d'assigner un GID spécifique à ce 
groupe :

# groupmod -g 1000 agents

Pour effacer un groupe, utiliser 'groupdel' :

# groupdel agents

Ensuite on crée les utilisateurs :

# useradd -c "Nicolas Kovacs" -g agents -u 500 -m nkovacs
# useradd -c "Jean-Claude Pascot" -g agents -u 510 -m jcpascot
# useradd -c "Chantal Geins" -g agents -u 520 -m cgeins
# useradd -c "Maryse Pascot" -g agents -u 530 -m mpascot
# useradd -c "Renée Marseille" -g agents -u 540 -m rmarseille
# useradd -c "Utilisateur invité" -u 1000 -m invite

On active les comptes :

# passwd nkovacs
# passwd jcpascot
# passwd cgeins
# passwd mpascot
# passwd rmarseille
# passwd invite

Nicolas Kovacs et Jean-Claude Pascot veulent pouvoir mettre à 
disposition des documents à tous les agents, en lecture seule.

# mkdir -pv /home/pub/{jcpascot,nkovacs}
mkdir: création du répertoire `/home/pub'
mkdir: création du répertoire `/home/pub/jcpascot'
mkdir: création du répertoire `/home/pub/nkovacs'

# chgrp agents /home/pub
# chmod 0750 /home/pub/
# ls -ld /home/pub/
drwxr-x--- 4 root agents 4096 jui  7 16:10 /home/pub/

# chown jcpascot:agents /home/pub/jcpascot/
# chown nkovacs:agents /home/pub/nkovacs
# chmod 0750 /home/pub/*
# ls -l /home/pub/
total 8
drwxr-x--- 2 jcpascot agents 4096 jui  7 16:10 jcpascot
drwxr-x--- 2 nkovacs  agents 4096 jui  7 16:10 nkovacs

Maintenant, Jean-Claude Pascot peut créer des documents dans son 
répertoire public /home/pub/jcpascot :

# su - jcpascot
$ cd /home/pub/jcpascot/
$ echo "Info importante" > info.txt
$ exit

Nicolas Kovacs peut faire de même dans /home/pub/nkovacs :

# su - nkovacs
$ cd /home/pub/nkovacs/
$ echo "Autre info importante" > infobis.txt
$ exit

Un agent peut maintenant accéder aux infos en lecture seule :

# su - cgeins
$ cat /home/pub/jcpascot/info.txt
Info importante
$ cat /home/pub/nkovacs/infobis.txt
Autre info importante

En revanche, il ou elle ne pourra pas modifier le contenu de ces deux
répertoires. Ce droit est réservé aux seuls propriétaires respectifs.

Il ne reste plus qu'à créer un répertoire d'échange où tous les agents
disposent d'un droit de lecture et d'écriture indiscriminé.

# mkdir -v /home/echange
mkdir: création du répertoire `/home/echange'
# chgrp agents /home/echange/
# chmod 3770 /home/echange/
# ls -ld /home/echange/
drwxrws--T 2 root agents 4096 jui  7 16:56 /home/echange/

Explication : Ici, on a défini en même temps le droit SGID pour le 
répertoire, ainsi que le 'sticky bit'. Si l'on crée un fichier dans un 
répertoire qui possède le droit SGID, son groupe sera identique à celui 
du répertoire. La conséquence, c'est que l'ensemble des fichiers du 
répertoire appartiendra au même groupe, ce qui est intéressant pour un 
répertoire accessible à plusieurs personnes.

# su - jcpascot
$ cd /home/echange/
$ echo "Info importante" > info.txt
$ ls -l
total 4
-rw-r--r-- 1 jcpascot agents 16 jui  7 17:01 info.txt
$ exit

Si c'est Nicolas Kovacs qui crée un fichier dans ce même répertoire :

# su - nkovacs
$ cd /home/echange/
$ echo "Autre info importante" > infobis.txt
$ ls -l
total 8
-rw-r--r-- 1 nkovacs  agents 22 jui  7 17:04 infobis.txt
-rw-r--r-- 1 jcpascot agents 16 jui  7 17:01 info.txt

Quant au 'sticky bit', il s'applique à un répertoire et corrige une 
bizarrerie du système. Par défaut, un répertoire accessible en écriture 
à un ensemble d'utilisateurs permet à l'un d'entre eux de détruire les 
fichiers d'un autre utilisateur. Avec le 'sticky bit', il faut être 
propriétaire d'un fichier pour avoir le droit de le détruire. Deux 
exemples :

$ ls -l
total 8
-rw-r--r-- 1 nkovacs  agents 22 jui  7 17:04 infobis.txt
-rw-r--r-- 1 jcpascot agents 16 jui  7 17:01 info.txt
$ whoami
nkovacs
$ rm -f info.txt
rm: ne peut enlever `info.txt': Opération non permise

Inversement :

$ ls -l
total 8
-rw-r--r-- 1 nkovacs  agents 22 jui  7 17:04 infobis.txt
-rw-r--r-- 1 jcpascot agents 16 jui  7 17:01 info.txt
$ whoami
jcpascot
$ rm -f infobis.txt
rm: ne peut enlever `infobis.txt': Opération non permise

Enfin, l'utilisateur 'invite' ne pourra pas accéder aux infos des 
agents, même
pas en lecture seule :

# su - invite
$ cd /home/pub/
-bash: cd: /home/pub/: Permission non accordée
$ cd /home/echange/
-bash: cd: /home/echange/: Permission non accordée

Et voilà.