<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"/usr/local/share/xml/docbook/4.2/docbookx.dtd" [
<!ENTITY ie "<abbrev>i.e.</abbrev>">
<!ENTITY cf "<abbrev>c.f.</abbrev>">
<!ENTITY todo "<command>--- T O  D O :</command>">
<!ENTITY unix "<emphasis>Unix</emphasis>">
<!ENTITY bsd "<emphasis>BSD</emphasis>">
<!ENTITY xbsd "<emphasis>xBSD</emphasis>">
<!ENTITY fbsd "<emphasis>FreeBSD</emphasis>">
<!ENTITY obsd "<emphasis>OpenBSD</emphasis>">
<!ENTITY sysV "<emphasis>System V</emphasis>">
<!ENTITY linux "<emphasis>Linux</emphasis>">
<!ENTITY glinux "<emphasis>GNU/Linux</emphasis>">
<!ENTITY deb "<emphasis>Debian</emphasis>">
<!ENTITY fpasswd "<filename>/etc/passwd</filename>">
<!ENTITY fgroup "<filename>/etc/group</filename>">
<!ENTITY mpasswd "<filename>/etc/master.passwd</filename>">
<!ENTITY fshadow "<filename>/etc/shadow</filename>">
<!ENTITY gshadow "<filename>/etc/gshadow</filename>">
<!ENTITY logindef "">
<!ENTITY loginconf "">
<!ENTITY liloconf "">
<!ENTITY inittab "">
<!ENTITY S20ssh "">
<!ENTITY rcconf "">
<!ENTITY syslogconf "">
<!ENTITY _aut_Pre "<firstname>Pascal</firstname>">
<!ENTITY _aut_Nom "<surname>Picard</surname>">
<!ENTITY _aut_eMail "<email>pascal@seth.homeunix.net</email>">
<!ENTITY _aut_Init "<authorinitials>P.P.</authorinitials>">
<!ENTITY _affiliat "<affiliation><orgname>Corto E.T.F., K&amp;M</orgname><address>Sainte-Clotilde, Ile de la R&#233;union</address></affiliation>">
<!ENTITY _holder "<holder>Pascal PICARD, <emphasis>pascal@seth.homeunix.net</emphasis></holder>">
]>
<article class="techreport" lang="fr" revisionflag="changed">
  <articleinfo>
    <author>
      <firstname>Pascal</firstname>

      <surname>Picard</surname>

      <affiliation>
        <orgname>Corto E.T.F., K&amp;M</orgname>

        <address>Sainte-Clotilde, Ile de la Réunion</address>
      </affiliation>
    </author>

    <date>Last Updated: 2006/04/09 </date>

    <authorinitials>P.P.</authorinitials>

    <title>Gestion des utilisateurs</title>

    <copyright>
      <year>2002-2005, 2006</year>

      <holder>Pascal PICARD,
      <emphasis>pascal@seth.homeunix.net</emphasis></holder>
    </copyright>

    <legalnotice>
      <para>Permission to use, copy, modify, and distribute this documentation
      for any purpose with or without fee is here by granted, provided that
      the above copyright notice and this permission notice appear in all
      copies.</para>

      <para>THE DOCUMENTATION IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
      WARRANTIES WITH REGARD TO THIS DOCUMENTATION INCLUDING ALL IMPLIED
      WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
      BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR
      ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
      WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
      ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
      DOCUMENTATION.</para>
    </legalnotice>

    <keywordset>
      <keyword>{user,group}{add,mod,del}, /etc/passwd,</keyword>
    </keywordset>
  </articleinfo>

  <abstract>
    <para>Nous abordons dans cette partie la gestion des comptes
    d'utilisateurs (création, modification et suppression) qui est une des
    premières tâches de l'administrateur système.</para>

    <para>Un utilisateur désigne soit une personne réelle qui doit pouvoir se
    connecter au système, utiliser des ressources et se déconnecter ou bien un
    pseudo-utilisateur détenant certaines ressources et exécutant certains
    programmes.</para>

    <para>Les informations concernant la définition d'un compte utilisateur
    sont principalement stockées dans les fichiers
    <filename>/etc/passwd</filename> et <filename>/etc/group</filename>, et
    selon qu'il s'agisse d'un système GNU/Linux ou d'un système xBSD dans les
    fichiers <filename>/etc/shadow</filename> et
    <filename>/etc/master.passwd</filename>. Avant d'en présenter la structure
    syntaxique, intéressons nous à déterminer ce qu'implique la création et la
    destruction d'un compte. Enfin, pour finir nous présenterons les
    principales commandes de gestion des comptes.</para>

    <para>Pour nous joindre : <email>pascal@seth.homeunix.net</email></para>
  </abstract>

  <sect1>
    <title>Ajouter/Enlever un utilisateur</title>

    <formalpara>
      <title>Créer un nouveau compte utilisateur requiert plusieurs étapes
      :</title>

      <para><itemizedlist>
          <listitem>
            <para>Attribuer un nom de login, un <varname>uid</varname>, un
            groupe principal et un ou des groupes secondaires.</para>
          </listitem>

          <listitem>
            <para>Créer des enregistrements sur cet utilisateur dans les
            fichiers <filename>/etc/passwd</filename>,
            <filename>/etc/group</filename> et
            <filename>/etc/master.passwd</filename> ou
            <filename>/etc/shadow</filename>.</para>
          </listitem>

          <listitem>
            <para>Attribuer un (bon) mot de passe.</para>
          </listitem>

          <listitem>
            <para>Créer le repertoire de domiciliation de l'utilisateur (son
            <varname>home</varname>).</para>
          </listitem>

          <listitem>
            <para>Paramétrer le compte de l'utilisateur (durée de validité du
            mot de passe, date d'expiration du compte, limitation des
            ressources, privilèges ...).</para>
          </listitem>

          <listitem>
            <para>Copier les fichiers d'initialisation dans le répertoire de
            domiciliation de l'utilisateur.</para>
          </listitem>

          <listitem>
            <para>Rendre l'utilisateur propriétaire de son espace.</para>
          </listitem>

          <listitem>
            <para>Définir les paramètres supplémentaires, tels les
            <foreignphrase>quotas disk</foreignphrase>, l'impression, la
            messagerie...</para>
          </listitem>
        </itemizedlist></para>
    </formalpara>

    <formalpara>
      <title>Enlever un compte utilisateur necéssite les étapes suivantes
      :</title>

      <para><itemizedlist>
          <listitem>
            <para>Désactiver le compte de l'utilisateur.</para>

            <itemizedlist>
              <listitem>
                <para>sur <emphasis>GNU/Linux</emphasis> en faisant
                <computeroutput>passwd -l
                &lt;loginname&gt;</computeroutput></para>
              </listitem>

              <listitem>
                <para>sur les <foreignphrase>flavors</foreignphrase>
                <emphasis>xBSD</emphasis> en préfixant le mot de passe du
                fichier <filename>/etc/master.passwd</filename> par le
                caractère * (cette technique marche aussi pour
                <emphasis>GNU/Linux</emphasis> dans le fichier
                <filename>/etc/shadow</filename>).</para>
              </listitem>
            </itemizedlist>
          </listitem>

          <listitem>
            <para>Supprimer le compte de l'utilisateur.</para>

            <itemizedlist>
              <listitem>
                <para>Supprimer tous les processus de l'utilisateur.</para>
              </listitem>

              <listitem>
                <para>Enlever les enregistrements concernant cet utilisateur
                des fichiers <filename>/etc/passwd</filename>,
                <filename>/etc/group</filename>,
                <filename>/etc/shadow</filename> ou
                <filename>/etc/master.passwd</filename>.</para>
              </listitem>

              <listitem>
                <para>Retirer l'utilisateur des groupes secondaires.</para>
              </listitem>

              <listitem>
                <para>Supprimer le fichier de courrier électronique de
                l'utilisateur.</para>
              </listitem>

              <listitem>
                <para>Retirer ou rediriger les alias de courrier électronique
                de l'utilisateur.</para>
              </listitem>

              <listitem>
                <para>Supprimer les tâches <command>cron</command> et/ou
                <command>at</command>.</para>
              </listitem>

              <listitem>
                <para>Eventuellement faire une sauvegarde de l'espace de
                l'utilisateur puis le supprimer.</para>
              </listitem>

              <listitem>
                <para>Supprimer les fichiers et/ou répertoires temporaires de
                l'utilisateur.</para>
              </listitem>

              <listitem>
                <para>Mettre à zéro les quotas de cet utilisateur.</para>
              </listitem>
            </itemizedlist>
          </listitem>
        </itemizedlist></para>
    </formalpara>

    <para>Un système <trademark>Unix</trademark> propose généralement un
    ensemble d'utilitaires pour faciliter la gestion des comptes. De plus,
    rien n'empêche de créer ces propres scripts pour automatiser au mieux
    cette tâche.</para>
  </sect1>

  <sect1>
    <title>Analyse du fichier <filename>/etc/passwd</filename></title>

    <para>Ce fichier au format texte, référence l'ensemble des utilisateurs du
    système. Une ligne concerne un utilisateur et est structurée en sept
    champs :</para>

    <simpara><varname>loginname:</varname><varname>password:</varname><varname>uid:</varname><varname>gid:</varname><varname>gecos:</varname><varname>homedir:</varname><varname>shell</varname></simpara>

    <para><itemizedlist>
        <listitem>
          <para><foreignphrase>loginname</foreignphrase> : le nom de login de
          l'utilisateur.</para>
        </listitem>

        <listitem>
          <para><foreignphrase>password</foreignphrase> : le mot de passe
          hashé, initialisé au caractère *.</para>
        </listitem>

        <listitem>
          <para><foreignphrase>uid</foreignphrase> : identifiant utilisateur.
          Entier non signé codé sur quatre octets [0, 4294967296]. La valeur 0
          donne les privilèges d'administration système, les valeurs
          inférieurs à 10 sont, par convention, réservées à des comptes
          systèmes. Généralement, un utilisateur standard possède un uid
          supérieur à 100. Pour des raisons d'interoperabilité, il convient de
          se limiter aux 65536 premières valeurs.</para>
        </listitem>

        <listitem>
          <para><foreignphrase>gid</foreignphrase> : identifiant du groupe
          principal de l'utilisateur. Entier non signé codé sur quatre octets
          mais dont l'usage est limité, comme précédemment. Les valeurs
          inférieures à 10 sont réservées aux groupes systèmes .</para>
        </listitem>

        <listitem>
          <para><foreignphrase>gecos</foreignphrase> : zone de commentaire. On
          y met généralement le nom réel de l'utilisateur. Ce champ est
          utilisé par les commandes <command>chfn</command>,
          <command>mail</command> et <command>finger</command>.</para>
        </listitem>

        <listitem>
          <para><foreignphrase>homedir</foreignphrase> : répertoire de
          domiciliation de l'utilisateur.</para>
        </listitem>

        <listitem>
          <para><foreignphrase>shell</foreignphrase> : nom de l'interpréteur
          de commandes. Modifiable par la commande
          <command>chfn</command>.</para>
        </listitem>
      </itemizedlist></para>

    <para>Voici un exemple de fichier <filename>/etc/passwd</filename> d'un
    système FreeBSD obtenu à partir du fichier
    <filename>/etc/master.passwd</filename> : <programlisting width="80">

# $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 des Exp $
#
root:*:0:0:Charlie &amp;:/root:/bin/csh
toor:*:0:0:Bourne-again Superuser:/root:/bin/tcsh
daemon:*:1:1:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5:System &amp;:/:/sbin/nologin
bin:*:3:7:Binaries Commands and Source:/:/sbin/nologin
tty:*:4:65533:Tty Sandbox:/:/sbin/nologin
kmem:*:5:65533:KMem Sandbox:/:/sbin/nologin
games:*:7:13:Games pseudo-user:/usr/games:/sbin/nologin
news:*:8:8:News Subsystem:/:/sbin/nologin
man:*:9:9:Mister Man Pages:/usr/share/man:/sbin/nologin
sshd:*:22:22:Secure Shell Daemon:/var/empty:/sbin/nologin
smmsp:*:25:25:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin    
mailnull:*:26:26:Sendmail Default User:/var/spool/mqueue:/sbin/nologin
bind:*:53:53:Bind Sandbox:/:/sbin/nologin
uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
pop:*:68:6:Post Office Owner:/nonexistent:/sbin/nologin
www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534:Unprivileged user:/nonexistent:/sbin/nologin

pascal<co id="c-login" linkends="login" />:*<co id="c-passwd"
          linkends="passwd" />:666<co id="c-uid" linkends="uid" />:666<co
          id="c-gid" linkends="gid" />:Pascal P;<co id="c-gecos"
          linkends="gecos" />:/home/pascal<co id="c-home" linkends="home" />:/bin/tcsh<co
          id="c-shell" linkends="shell" />

postfix:*:1001:1001:Postfix Mail System:/var/spool/postfix:/sbin/nologin
pgsql:*:70:70:PostgreSQL Daemon:/usr/local/pgsql:/sbin/nologin
mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin

</programlisting> <calloutlist>
        <callout arearefs="c-login" id="login">
          <para><foreignphrase>login</foreignphrase>.</para>
        </callout>

        <callout arearefs="c-passwd" id="passwd">
          <para><foreignphrase>password</foreignphrase>.</para>
        </callout>

        <callout arearefs="c-uid" id="uid">
          <para><foreignphrase>uid</foreignphrase>.</para>
        </callout>

        <callout arearefs="c-gid" id="gid">
          <para><foreignphrase>gid</foreignphrase>.</para>
        </callout>

        <callout arearefs="c-gecos" id="gecos">
          <para><foreignphrase>gecos</foreignphrase>.</para>
        </callout>

        <callout arearefs="c-home" id="home">
          <para><foreignphrase>homedir</foreignphrase>.</para>
        </callout>

        <callout arearefs="c-shell" id="shell">
          <para><foreignphrase>shell</foreignphrase>.</para>
        </callout>
      </calloutlist></para>

    <para>Le fichier <filename>/etc/passwd</filename> stockent les mots de
    passe sous forme hashée. Une fonction de hashage a la propriété d'être
    difficillement inversible, <abbrev>i.e.</abbrev> s'il est relativement
    aisé, connaissant l'algorithme de hashage, de calculer à partir d'un mot
    de passe en clair son hashage correspondant, la réciproque est un problème
    très difficile.</para>

    <para>A la création d'un nouveau compte une étoile est placée dans le
    deuxième champ (passwd) du fichier <filename>/etc/passwd</filename>, elle
    permet d'empêcher l'accès au compte tant qu'un mot de passe n'est pas
    défini. <emphasis role="bold">Ce champ ne doit jamais être vide
    !</emphasis></para>

    <para>Le standard d'encryptage, par défaut, des mots de passe est DES,
    lequel n'encode que les 8 premiers caractères d'un mot de passe. Il est
    désormais considéré comme insuffisant au regard de la puissance de calcul
    d'un simple PC de bureau et c'est pourquoi les distributions
    <emphasis>GNU/Linux</emphasis> propose une alternative : le hashage
    <emphasis>MD5</emphasis>. De fait, <emphasis>MD5</emphasis> n'est pas
    meilleur que DES (du point de vue cryptographique), mais
    <emphasis>MD5</emphasis> n'impose pas de limite sur la longueur du mot de
    passe. Un mot de passe long est plus dur à casser donc plus sur.
    <emphasis>FreeBSD</emphasis> de son coté utilise le hashage
    <emphasis>MD5</emphasis> par défaut, on peut éventuellement le remplacer
    par un autre algorithme tel que <emphasis>blowfish</emphasis>
    (<abbrev>c.f.</abbrev> le fichier <filename>/etc/login.conf</filename>,
    ligne <computeroutput>:passwd_format= ...</computeroutput>).</para>

    <note>
      <para>Avec <emphasis>Debian</emphasis> <emphasis>GNU/Linux</emphasis> le
      système propose d'activer à l'installation l'encodage des mots de passe
      par <emphasis>MD5</emphasis>, valider toujours ce choix.</para>
    </note>
  </sect1>

  <sect1>
    <title>Analyse du fichier <filename>/etc/group</filename></title>

    <para>Ce fichier référence l'ensemble des groupes du système. Une ligne
    concerne un groupe et elle est structurée en quatre champs :</para>

    <simpara><varname>groupname:</varname><varname>password:</varname><varname>gid:</varname><varname>member,
    ...</varname></simpara>

    <para><itemizedlist>
        <listitem>
          <para><foreignphrase>groupname</foreignphrase> : le nom du
          groupe.</para>
        </listitem>

        <listitem>
          <para><foreignphrase>password</foreignphrase> : le mot de passe
          hashé, initialisé au caractère *. En général, on n'utilise pas de
          mot de passe de groupe.</para>
        </listitem>

        <listitem>
          <para><foreignphrase>gid</foreignphrase> : identifiant du groupe.
          Entier codé sur deux octets. Les valeurs inférieures à 10 sont
          réservées aux groupes systèmes .</para>
        </listitem>

        <listitem>
          <para><foreignphrase>member, ...</foreignphrase> : liste des membres
          du groupe.</para>
        </listitem>
      </itemizedlist></para>

    <para><programlisting>

# $FreeBSD: src/etc/group,v 1.19.2.3 2002/06/30 17:57:17 des Exp $              
#
wheel:*:0:root,pascal
daemon:*:1:daemon
kmem:*:2:
sys:*:3:
tty:*:4:
operator:*:5:root,pascal
mail:*:6:postfix
bin:*:7:
news:*:8:
man:*:9:
games:*:13:
staff:*:20:
sshd:*:22:
smmsp:*:25:
mailnull:*:26:
guest:*:31:
bind:*:53:
uucp:*:66:
xten:*:67:xten
dialer:*:68:
network:*:69:
www:*:80:
mysql:*:88:
pgsql:*:70:
nogroup:*:65533:
nobody:*:65534:
gnu:*:666:
postfix:*:1001:
maildrop:*:1002:
cvs:*:668:root

</programlisting></para>
  </sect1>

  <sect1>
    <title>Sécurisation des comptes</title>

    <para>Historiquement, les mots de passe étaient stockés dans le fichier
    <filename>/etc/passwd</filename> (universellement accessible en
    lecture)<footnote>
        <para>Le <quote>jeu</quote> consistait à récupérer une copie du
        fichier <filename>/etc/passwd</filename> puis à faire tourner un
        programme de <quote>crack</quote>. Ce dernier passe en revue un
        dictionnaire de mots de passe qu'il hashe un à un et compare au
        hashage présent dans le fichier des mots de passe. En cas d'égalité on
        a retrouvé le mot de passe (la fonction de hashage est injective). Ce
        genre de programme parcourt donc l'espace des mots de passe possible ;
        il lui faut donc de la puissance de calcul et du temps. Or les PC de
        bureau d'aujourd'hui ont une puissance de calcul non négligeable
        !</para>
      </footnote> , mais à mesure que les ordinateurs ont gagné en
    performance, il est devenu extrêmement dangereux de les laisser dans ce
    fichier.</para>

    <sect2>
      <title><emphasis>GNU/Linux</emphasis></title>

      <para><emphasis>GNU/Linux</emphasis> propose désormais de stocker les
      mots de passe dans un fichier à part : <filename>/etc/shadow</filename>
      (uniquement accessible au <emphasis>super</emphasis>-utilisateur. Ce
      mécanisme communément appelé shadow password est disponible sur toutes
      les distributions. En particulier, sur <emphasis>Debian</emphasis> cette
      option est explicitement proposée au moment de l'installation, il
      convient de l'adopter. La seule contre-indication à l'utilisation de
      cette stratégie concerne l'éventuel usage de votre machine comme serveur
      NIS/NFS.</para>

      <para>Quand cette stratégie est activée, le champ mot de passe (deuxième
      champ) du fichier <filename>/etc/passwd</filename> est marqué par un x.
      Le fichier <filename>/etc/shadow</filename> contient donc l'encodage (ou
      hashage) des mots de passe et fournit des services supplémentaires non
      disponibles dans <filename>/etc/passwd</filename>. Attention, les deux
      fichiers sont nécessaires, l'un ne remplaçant pas l'autre !</para>

      <para>Le fichier <filename>/etc/shadow</filename> est un fichier texte
      qui contient une ligne par utilisateur. Il est structuré en neuf champs,
      comme suit :</para>

      <simpara><varname>loginname:</varname><varname>password:</varname><varname>lcdate:</varname><varname>mindays:</varname><varname>maxdays:</varname><varname>ndays1:</varname><varname>ndays2:</varname><varname>expiration:</varname><varname>reserved</varname></simpara>

      <para>La sémantique associée à ces champs est la suivante :
      <itemizedlist>
          <listitem>
            <para><foreignphrase>loginname</foreignphrase> : le nom de login
            de l'utilisateur, identique à celui du fichier
            <filename>/etc/passwd</filename> il permet ainsi d'établir le lien
            entre les deux fichiers.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>password</foreignphrase> : le hashage du mot
            de passe. S'il s'agit d'un hashage <emphasis>MD5</emphasis>, il
            commence par la séquence $1$.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>lcdate</foreignphrase> : date du dernier
            changement de mot de passe, exprimée relativement au temps
            <trademark>Unix</trademark>, exprimé en jours,
            <abbrev>i.e.</abbrev> nombre de jours écoulés depuis le
            1<superscript>er</superscript> Janvier 1970. Généralement rempli
            par la commande <command>/usr/bin/passwd</command></para>
          </listitem>

          <listitem>
            <para><foreignphrase>mindays</foreignphrase> : Intervalle minimum
            de jours entre deux changements de mot de passe. Généralement
            positionné à 0, pour signifier qu'il n'y a pas
            d'intervalle.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>maxdays</foreignphrase> : Intervalle maximum
            de jours entre deux changements de mot de passe. Cela permet donc
            à l'administrateur de renforcer la stratégie de limitation dans le
            temps des mots de passe. Le délai maximun est obtenu comme somme
            de ce champ et du 7<superscript>e</superscript>.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>ndays1</foreignphrase> : Nombre de jours,
            pour prévenir l'utilisateur, avant l'expiration du mot de
            passe.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>ndays2</foreignphrase> : Nombre de jours
            s'écoulant entre l'expiration du mot de passe et la désactivation
            du compte.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>expiration</foreignphrase> : Date
            d'expiration effective du compte, en nombre de jour depuis le
            1<superscript>er</superscript> Janvier 1970.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>reserved</foreignphrase> : Champ réservé pour
            un usage futur, vide pour le moment.</para>
          </listitem>
        </itemizedlist></para>

      <para>Un exemple typique de ligne extraite du fichier
      <filename>/etc/shadow</filename> : <programlisting>

pascal:$1$wIZyw9H3u$Q7T2rxyPVKAlabue$.1n0:12144<co id="c-lastchg"
            linkends="lastchg" />:0:180<co id="c-ndays" linkends="ndays" />:7<co
            id="c-timeout" linkends="timeout" />::12294<co id="c-expir"
            linkends="expir" />:                  

</programlisting> <calloutlist>
          <callout arearefs="c-lastchg" id="lastchg">
            <para>Le dernier changement de mot de passe a eu lieu le 2 avril
            2003 (12144 jours depuis 01.01.1970) <!-- </command>date -r 1049241600</command>, ou 12144 jours depuis 01.01.1970 = 12144 * 24 * 3600 =  1049241600 secondes. -->.</para>
          </callout>

          <callout arearefs="c-ndays" id="ndays">
            <para>Le mot de passe a une validité de 180 jours.</para>
          </callout>

          <callout arearefs="c-timeout" id="timeout">
            <para>Il y a un délai de 7 jours pour changer le mot de
            passe.</para>
          </callout>

          <callout arearefs="c-expir" id="expir">
            <para>Le compte expire le 30 aout 2003 (12294 jours depuis le
            01.01.1970).</para>
          </callout>
        </calloutlist></para>

      <para>Il existe un fichier <filename>/etc/gshadow</filename> dont le
      role est similaire à celui du fichier <filename>/etc/shadow</filename>,
      en pratique peu ou pas utilisé. On active rarement (voir jamais, par
      convention) les mots de passe de groupe.</para>
    </sect2>

    <sect2>
      <title>xBSD</title>

      <para>Les <foreignphrase>flavors</foreignphrase> xBSD stockent les
      comptes utilisateurs au sein du fichier
      <filename>/etc/master.passwd</filename>, uniquement accessible au
      <emphasis>super</emphasis>-utilisateur. Ce fichier est utilisé pour
      générer automatiquement le fichier
      <filename>/etc/passwd</filename>.</para>

      <para>Ce fichier est au format texte et contient une ligne par
      utilisateur. Il est structuré en dix champs, comme suit :</para>

      <simpara><varname>loginname:</varname><varname>password:</varname><varname>uid:</varname><varname>gid:</varname><varname>userclass:</varname><varname>change:</varname><varname>expire:</varname><varname>gecos:</varname><varname>homedir</varname>:<varname>shell</varname></simpara>

      <para>La sémantique associée à ces champs est la suivante :
      <itemizedlist>
          <listitem>
            <para><foreignphrase>loginname</foreignphrase> : le nom de login
            de l'utilisateur</para>
          </listitem>

          <listitem>
            <para><foreignphrase>password</foreignphrase> : le hashage du mot
            de passe, préfixé par la séquence $1$ s'il s'agit d'un hashage
            <emphasis>md5</emphasis> ou d'un $2$ s'il s'agit d'un hashage
            <emphasis>blowfish</emphasis>.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>uid</foreignphrase> : identifiant
            utilisateur.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>gid</foreignphrase> : identifiant du groupe
            principal.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>userclass</foreignphrase> : classe
            d'appartenance de l'utilisateur telle que définie dans le fichier
            <filename>/etc/login.conf</filename>.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>change</foreignphrase> : exprimé en nombre de
            secondes à partir de l'origine des temps <token>Unix</token>
            (1<superscript>er</superscript> Janvier 1970
            [<foreignphrase>Epoch</foreignphrase>]), donne la date
            d'expiration du présent mot de passe. Si la valeur est à zéro, il
            n'y a pas d'expiration du mot de passe.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>expire</foreignphrase> : même unité que
            précédement, mais exprimant la date d'expiration du compte. Si la
            valeur est à zéro, il n'y a pas d'expiration du compte.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>gecos</foreignphrase> : zone de commentaire,
            nom réel de l'utilisateur ...</para>
          </listitem>

          <listitem>
            <para><foreignphrase>homedir</foreignphrase> : répertoire de
            domiciliation de l'utilisateur.</para>
          </listitem>

          <listitem>
            <para><foreignphrase>shell</foreignphrase> : interpréteur de
            commande de l'utilisateur.</para>
          </listitem>
        </itemizedlist></para>

      <para>Un exemple typique de ligne extraite du fichier
      <filename>/etc/master.passwd</filename> : <programlisting>

pascal:$2a$15$WXXMWWxh1.4ZLw4DxnaquhJvv27WSkuRMnDBsZPzzz11Fb0a686RS:666:666::1062450000<co
            id="c-ndays2" linkends="ndays2" />:0<co id="c-timeout2"
            linkends="timeout2" />:Pascal P;:/home/pascal:/bin/tcsh

</programlisting> <calloutlist>
          <callout arearefs="c-ndays2" id="ndays2">
            <para>Expiration du présent mot de passe le 2 septembre 2003 à
            01:00:00 (<computeroutput>date -r
            1062450000</computeroutput>).</para>
          </callout>

          <callout arearefs="c-timeout2" id="timeout2">
            <para>Pas d'expiration du compte.</para>
          </callout>
        </calloutlist></para>
    </sect2>

    <!-- 
      <sect3>
	<title>hashage</title>
	<para> hashage md5 et blowfish.</para>
	<para> &todo; la suite .... </para>
      </sect3>
-->
  </sect1>

  <sect1>
    <title>Commandes de gestion des utilisateurs</title>

    <para>Dans ce qui suit les commandes sont préfixées par un # qui symbolise
    un accès <emphasis>super</emphasis>-utilisateur
    (<emphasis>root</emphasis>). Le mot qui qui précède ce caractère est le
    nom de machine (<literal>tux</literal> pour <emphasis>GNU/Linux</emphasis>
    et <literal>chuck</literal> pour <emphasis>FreeBSD</emphasis>).</para>

    <warning>
      <para>Vous pouvez tester les commandes en utilisant l'accès étendu
      <command>sudo</command>, néanmoins je vous prie instamment de faire une
      copie initiale des fichiers que vous allez modifier. Puis quand vous
      aurez terminé ce paragraphe, de restaurer les fichiers dans leur état
      initiaux.</para>
    </warning>

    <sect2>
      <title>Gérer les utilisateurs avec <command>user{add,mod,del}</command>
      sous <emphasis>GNU/Linux</emphasis></title>

      <formalpara>
        <title>Première forme de la commande <emphasis>useradd</emphasis>
        :</title>

        <para>Invoquée sous cette forme, la commande créée un nouveau compte
        utilisateur en utilisant les valeurs spécifiées (sur la ligne de
        commande) et les valeurs système par défaut si les options ne sont pas
        précisées. Selon les options choisies, le nouveau compte sera crée et
        des fichiers initiaux seront copiés dans son espace de travail.
        <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis cmdlength="3">
              <command>useradd</command>

              <arg>-c <replaceable>comment</replaceable></arg>

              <arg>-d <replaceable>homedir</replaceable></arg>

              <arg>-e <replaceable>expire_date</replaceable></arg>

              <arg>-f <replaceable>inactive_date</replaceable></arg>

              <sbr />

              <arg>-g <replaceable>initial_group</replaceable></arg>

              <arg>-G <replaceable>group</replaceable> <arg><arg
                    choice="plain" rep="repeat">,</arg></arg> </arg>

              <arg>-m <arg>-k <replaceable>skel_dir</replaceable></arg></arg>

              <sbr />

              <arg>-p <replaceable>passwd</replaceable></arg>

              <arg>-s <replaceable>shell</replaceable></arg>

              <arg>-u <replaceable>uid</replaceable><arg>-o</arg></arg>

              <arg choice="plain" rep="norepeat"><replaceable>login</replaceable></arg>
            </cmdsynopsis>
<emphasis>EXEMPLE : ajouter un utilisateur.</emphasis>

tux:/# useradd -c "Bernard's Account" -d /home/.bernard -e "2003-08-31" -s \    
/bin/bash -u 668 -g gnu -G operator -m bernard
tux:/# passwd bernard
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
tux:/#

</programlisting></para>
      </formalpara>

      <formalpara>
        <title>Deuxième forme de la commande <emphasis>useradd</emphasis>
        :</title>

        <para>Cette deuxième forme permet de lister les paramètres par défaut
        ou modifier les valeurs par défaut à partir des valeurs données en
        ligne de commande. <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis cmdlength="2">
              <command>useradd</command>

              <arg choice="plain">-D </arg>

              <arg>-g <replaceable>default_group</replaceable></arg>

              <arg>-b <replaceable>default_home</replaceable></arg>

              <arg>-f <replaceable>default_inactive</replaceable></arg>

              <sbr />

              <arg>-e <replaceable>expire_date</replaceable></arg>

              <arg>-s <replaceable>default_shell</replaceable></arg>
            </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> Lister les paramètres par défaut, puis modifier trois des paramètres.

tux:/#  useradd -D                                                              
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel

tux:/#  useradd -D -g 200 -s /bin/tcsh  -e "2003-12-31"
tux:/#  useradd -D
GROUP=200
HOME=/home
INACTIVE=-1
EXPIRE=2003-12-31
SHELL=/bin/tcsh
SKEL=/etc/skel

</programlisting></para>
      </formalpara>

      <formalpara>
        <title><emphasis>usermod</emphasis></title>

        <para>La commande <command>usermod</command> permet de modifier les
        caractéristiques d'un utilisateur. <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis cmdlength="3">
              <command>usermod</command>

              <arg>-c <replaceable>comment</replaceable></arg>

              <arg>-d <replaceable>homedir</replaceable> <arg>-m</arg></arg>

              <arg>-e <replaceable>expire_date</replaceable></arg>

              <arg>-f <replaceable>inactive_date</replaceable></arg>

              <sbr />

              <arg>-g <replaceable>initial_group</replaceable></arg>

              <arg>-G <replaceable>group</replaceable> <arg><arg
                    choice="plain" rep="repeat">,</arg></arg> </arg>

              <arg>-l <replaceable>loginname</replaceable></arg>

              <arg>-p <replaceable>passwd</replaceable></arg>

              <sbr />

              <arg>-s <replaceable>shell</replaceable></arg>

              <arg>-u <replaceable>uid</replaceable><arg>-o</arg></arg>

              <group>
                <arg choice="plain" rep="norepeat">-L</arg>

                <arg choice="plain" rep="norepeat">-U</arg>
              </group>

              <arg choice="plain" rep="norepeat"><replaceable>login</replaceable></arg>
            </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> Ajouter l'utilisateur <emphasis>pascal</emphasis> dans le groupe <emphasis>operator</emphasis> 
(il est déjà membre du groupe principal <emphasis>gnu</emphasis> et des groupes <emphasis>root</emphasis> et <emphasis>staff</emphasis>) 
et lui mettre une date d'expiration au 31.12.2003 :

tux:/# usermod -G root,staff,operator -e 2003-12-31 pascal                      

</programlisting></para>
      </formalpara>

      <formalpara>
        <title><command>userdel</command></title>

        <para>La commande <command>userdel</command> permet d'enlever un
        compte utilisateur (s'il existe). L'option <option>-r</option> permet
        en plus la suppression du contenu et du répertoire de domiciliation de
        l'utilisateur, ainsi que son répertoire de mail. <programlisting
        width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
              <!-- one of (sbr group arg command) -->

              <command>userdel</command>

              <arg>-r</arg>

              <arg choice="plain" rep="norepeat"><replaceable>login</replaceable></arg>
            </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> Enlever un utlisateur

tux:/# userdel -r  bernard                                                      

</programlisting></para>
      </formalpara>
    </sect2>

    <sect2>
      <title>Gérer les groupes avec <command>group{add,mod,del}</command> sous
      <emphasis>GNU/Linux</emphasis></title>

      <formalpara>
        <title><emphasis>groupadd</emphasis></title>

        <para>La commande <command>groupadd</command> permet de créer un
        nouveau groupe. <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis cmdlength="1">
              <command>groupadd</command>

              <arg>-g <replaceable>gid</replaceable> <arg>-o</arg></arg>

              <arg choice="plain" rep="norepeat"><replaceable>login</replaceable></arg>
            </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> Ajouter un groupe

tux:/# groupadd -g 666 gnu                                                      

</programlisting></para>
      </formalpara>

      <formalpara>
        <title><emphasis>groupmod</emphasis></title>

        <para>La commande <command>groupmod</command> permet de modifier les
        paramètres d'un groupe. <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
              <!-- one of (sbr group arg command) -->

              <command>groupmod</command>

              <arg>-g <replaceable>gid</replaceable><arg>-o</arg></arg>

              <arg>-n <replaceable>group_name</replaceable></arg>

              <arg choice="plain" rep="norepeat"><replaceable>group</replaceable></arg>
            </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> Modfier le <emphasis>gid</emphasis> du groupe <emphasis>gnu</emphasis>.

tux:/# groupmod -g 667 gnu                                                      

</programlisting></para>
      </formalpara>

      <formalpara>
        <title><emphasis>groupdel</emphasis></title>

        <para>La commande <command>groupdel</command>, enlève un groupe (s'il
        existe). <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
              <!-- one of (sbr group arg command) -->

              <command>groupdel</command>

              <arg choice="plain" rep="norepeat"><replaceable>group</replaceable></arg>
            </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> Enlever le groupe <emphasis>gnu</emphasis>.

tux:/# groupdel gnu                                                              

</programlisting></para>
      </formalpara>
    </sect2>

    <!-- FREEBSD -->

    <sect2>
      <title>Cas particulier de <emphasis>FreeBSD</emphasis></title>

      <para>La commande <command>pw</command> permet au
      <emphasis>super</emphasis>-utilisateur de gérer simplement les
      utilisateurs. Sa syntaxe est très proche de ces homologues
      <quote>Linuxienne</quote>. Cette commande fait les mises-à-jour dans les
      fichiers <filename>/etc/passwd</filename>,
      <filename>/etc/master.passwd</filename> et
      <filename>/etc/group</filename>. sous <emphasis>OpenBSD</emphasis>, par
      contre on utilise les mêmes commandes que pour
      <emphasis>GNU/Linux</emphasis></para>

      <itemizedlist>
        <listitem>
          <para>Première forme de la commande <command>pw useradd</command>
          :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis cmdlength="3">
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>useradd</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>name</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>uid</replaceable></arg>
          </group>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>

          <arg>-n <replaceable>name</replaceable></arg>

          <arg>-u <replaceable>uid</replaceable></arg>

          <sbr />

          <arg>-c <replaceable>comment</replaceable></arg>

          <arg>-d <replaceable>dir</replaceable></arg>

          <arg>-e <replaceable>date</replaceable></arg>

          <arg>-p <replaceable>date</replaceable></arg>

          <arg>-g <replaceable>group</replaceable></arg>

          <arg>-G <replaceable>grouplist</replaceable></arg>

          <sbr />

          <arg>-m</arg>

          <arg>-k <replaceable>dir</replaceable></arg>

          <arg>-w <replaceable>method</replaceable></arg>

          <arg>-s <replaceable>shell</replaceable></arg>

          <arg>-o</arg>

          <arg>-L <replaceable>class</replaceable></arg>

          <arg>-h <replaceable>fd</replaceable></arg>

          <arg>-N</arg>

          <arg>-P</arg>

          <arg>-Y</arg>
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> Créer un nouvel utilisateur et lui attribuer un mot de passe 
<command>passwd</command> :

chuck# pw useradd bernard -u 668 -c "Bernard's account" -d /home/.bernard -e \
"31-08-2003" -g gnu -G wheel,operator -m -s /bin/tcsh -N
chuck# passwd bernard
Changing local password for bernard.
New password:
Retype new password:
passwd: updating the database...
passwd: done
chuck#

</programlisting>

      <itemizedlist>
        <listitem>
          <para>Deuxième forme de la commande <command>pw useradd</command>
          (sémantique équivalente à son homologue <emphasis>Linux</emphasis>)
          :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
                                                                                
<cmdsynopsis cmdlength="3">
          <!-- one of (sbr group arg command) -->

          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>useradd</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>name</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>uid</replaceable></arg>
          </group>

          <arg choice="plain" rep="norepeat">-D</arg>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>

          <arg>-b <replaceable>dir</replaceable></arg>

          <sbr />

          <arg>-e <replaceable>days</replaceable></arg>

          <arg>-p <replaceable>days</replaceable></arg>

          <arg>-g <replaceable>group</replaceable></arg>

          <arg>-G <replaceable>grouplist</replaceable></arg>

          <arg>-k <replaceable>dir</replaceable></arg>

          <arg>-u <replaceable>min,max</replaceable></arg>

          <sbr />

          <arg>-i <replaceable>min,max</replaceable></arg>

          <arg>-w <replaceable>method</replaceable></arg>

          <arg>-s <replaceable>shell</replaceable></arg>

          <arg>-y <replaceable>path</replaceable></arg>
        </cmdsynopsis>
</programlisting>

      <itemizedlist>
        <listitem>
          <para><command>pw usershow</command></para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis cmdlength="2">
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>usershow</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>name</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>uid</replaceable></arg>
          </group>

          <arg>-n <replaceable>name</replaceable></arg>

          <arg>-u <replaceable>uid</replaceable></arg>

          <arg>-F</arg>

          <arg>-P</arg>

          <sbr />

          <arg>-7</arg>

          <arg>-a</arg>

          <sbr />
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> Vérifier la présence de l'utilisateur <emphasis>bernard</emphasis> :

chuck# pw usershow bernard -P
Login Name: bernard           #668          Group: gnu               #666       
 Full Name: Bernard's account
      Home: /home/.bernard                  Class: 
     Shell: /bin/tcsh                      Office: [None]
Work Phone: [None]                     Home Phone: [None]
Acc Expire: Sun Aug 31 00:00:00 2003   Pwd Expire: [None]
    Groups: wheel,operator
chuck#

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw usernext</command> permet d'obtenir le
          prochain couple uid/gid disponible (séparé par les <quote>:</quote>)
          :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>usernext</replaceable></arg>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>

          <sbr />
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis>

chuck# pw usernext                                                              
1002:1003
chuck#

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw usermod</command> :</para>
        </listitem>
      </itemizedlist>

      <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>usermod</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>name</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>uid</replaceable></arg>
          </group>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>

          <arg>-n <replaceable>name</replaceable></arg>

          <arg>-u <replaceable>uid</replaceable></arg>

          <sbr />

          <arg>-c <replaceable>comment</replaceable></arg>

          <arg>-d <replaceable>dir</replaceable></arg>

          <arg>-e <replaceable>date</replaceable></arg>

          <arg>-p <replaceable>date</replaceable></arg>

          <arg>-g <replaceable>group</replaceable></arg>

          <arg>-G <replaceable>grouplist</replaceable></arg>

          <sbr />

          <arg>-l <replaceable>name</replaceable></arg>

          <arg>-m</arg>

          <arg>-k <replaceable>dir</replaceable></arg>

          <arg>-w <replaceable>method</replaceable></arg>

          <arg>-s <replaceable>shell</replaceable></arg>

          <arg>-L <replaceable>class</replaceable></arg>

          <arg>-h <replaceable>fd</replaceable></arg>

          <arg>-N</arg>

          <arg>-P</arg>

          <arg>-Y</arg>
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis>

chuck# pw usermod -G wheel,operator,daemon,sys -n bernard                       

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw userdel</command> :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>userdel</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>name</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>uid</replaceable></arg>
          </group>

          <arg>-n <replaceable>name</replaceable></arg>

          <arg>-u <replaceable>uid</replaceable></arg>

          <arg>-r</arg>

          <arg>-Y</arg>
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis>

chuck# pw userdel -n bernard                                                    

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La première forme de la commande <command>pw
          groupadd</command> :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>groupadd</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>group</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>gid</replaceable></arg>
          </group>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>

          <arg>-n <replaceable>group</replaceable></arg>

          <arg>-g <replaceable>gid</replaceable></arg>

          <sbr />
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis>

chuck# pw groupadd -g 666 -n gnu                                                

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La deuxième forme de la commande <command>pw
          groupadd</command> :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :                                                                     &nbsp;</emphasis>
                                                                                
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>groupadd</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>group</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>gid</replaceable></arg>
          </group>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>

          <arg>-n <replaceable>group</replaceable></arg>

          <arg>-g <replaceable>gid</replaceable></arg>

          <sbr />

          <arg>-M <replaceable>members</replaceable></arg>

          <arg>-o</arg>

          <arg>-h <replaceable>fd</replaceable></arg>

          <arg>-N</arg>

          <arg>-P</arg>

          <arg>-Y</arg>
        </cmdsynopsis>
</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw groupdel</command> :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>groupdel</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>group</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>gid</replaceable></arg>
          </group>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>

          <arg>-n <replaceable>group</replaceable></arg>

          <arg>-g <replaceable>gid</replaceable></arg>

          <sbr />
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis>

chuck# pw groupdel gnu    

... ou bien ...                                                                 

chuck# pw groupdel -g 666

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw groupmod</command> :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
                                                                                
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>groupmod</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>group</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>gid</replaceable></arg>
          </group>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>

          <arg>-n <replaceable>group</replaceable></arg>

          <arg>-g <replaceable>gid</replaceable></arg>

          <sbr />

          <arg>-l <replaceable>name</replaceable></arg>

          <arg>-M <replaceable>members</replaceable></arg>

          <arg>-m <replaceable>newmembers</replaceable></arg>

          <arg>-h <replaceable>fd</replaceable></arg>

          <arg>-N</arg>

          <arg>-P</arg>

          <arg>-Y</arg>
        </cmdsynopsis>
</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw groupshow</command> :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>groupshow</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>group</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>gid</replaceable></arg>
          </group>

          <arg>-g <replaceable>name</replaceable></arg>

          <arg>-g <replaceable>gid</replaceable></arg>

          <arg>-F</arg>

          <arg>-P</arg>

          <arg>-a</arg>
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis>

chuck# pw groupshow wheel                                                       
wheel:*:0:root,pascal                                                           

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw groupnext</command> qui retourne le
          prochain <varname>gid</varname> &gt;disponible :</para>
        </listitem>
      </itemizedlist>

      <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>groupnext</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>group</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>gid</replaceable></arg>
          </group>

          <arg>-q</arg>
        </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis>

chuck# pw groupnext 
1001                                                                            

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw lock</command> qui permet de
          vérouiller l'accès à un compte :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>lock</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>name</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>uid</replaceable></arg>
          </group>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>
        </cmdsynopsis>

                                                                                

</programlisting>

      <itemizedlist>
        <listitem>
          <para>La commande <command>pw unlock</command> qui a un effet
          symétrique à la commande précédente :</para>
        </listitem>
      </itemizedlist>

      <programlisting>
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis>
          <command>pw</command>

          <arg>-V <replaceable>etcdir</replaceable></arg>

          <arg choice="plain" rep="norepeat"><replaceable>unlock</replaceable></arg>

          <group>
            <arg choice="plain" rep="norepeat"><replaceable>name</replaceable></arg>

            <arg choice="plain" rep="norepeat"><replaceable>uid</replaceable></arg>
          </group>

          <arg>-C <replaceable>config</replaceable></arg>

          <arg>-q</arg>
        </cmdsynopsis>

                                                                                

</programlisting>
    </sect2>

    <sect2>
      <title>Vérification</title>

      <para>Sous <emphasis>GNU/Linux</emphasis> deux commandes permettent de
      vérifier l'intégrité des fichiers de gestion des utilisateurs. Ce sont
      la commande <command>/usr/sbin/pwck</command>, qui vérifie les fichiers
      <filename>/etc/passwd</filename> et <filename>/etc/shadow</filename> et
      la commande <command>/usr/sbin/grpck</command> qui vérifie les fichiers
      <filename>/etc/group</filename> et
      <filename>/etc/gshadow</filename>.</para>
    </sect2>

    <sect2>
      <title>Edition en ligne</title>

      <para>Elle se font par la commande <command>vipw</command> pour le
      fichier <filename>/etc/passwd</filename> (et respectivement
      <filename>/etc/master.passwd</filename> pour
      <emphasis>FreeBSD</emphasis> et <filename>/etc/shadow</filename> pour
      <emphasis>GNU/Linux</emphasis>) ; elle synchronise ces deux fichiers. La
      commande <command>vigr</command> agit de même sur les fichiers
      <filename>/etc/group</filename> et <filename>/etc/gshadow</filename>
      pour <emphasis>GNU/Linux</emphasis> uniquement.</para>
    </sect2>
  </sect1>

  <sect1>
    <title>Autres commandes</title>

    <para><table frame="topbot" pgwide="0">
        <title>Autres commandes</title>

        <!-- one of (graphic mediaobject tgroup) -->

        <tgroup cols="2">
          <colspec colname="c1" colnum="1" colwidth="1*+1" />

          <colspec colname="c2" colnum="2" colwidth="3*+1" />

          <thead>
            <row>
              <!-- one of (entrytbl entry) -->

              <entry align="center">commande</entry>

              <entry align="center">sémantique</entry>
            </row>
          </thead>

          <tbody>
            <row>
              <!-- one of (entrytbl entry) -->

              <entry><command>id</command></entry>

              <entry>Imprime l'uid, le nom de login, le gid, le nom du groupe
              :<simpara></simpara> <computeroutput>pascal@chuck:C-AdmSys &gt;
              id </computeroutput><simpara></simpara>
              <computeroutput>uid=666(pascal) gid=666(gnu) groups=666(gnu),
              0(wheel), 5(operator)</computeroutput></entry>
            </row>

            <row>
              <!-- one of (entrytbl entry) -->

              <entry><command>groups</command></entry>

              <entry>Affiche les groupes de l'utilisateur :<simpara></simpara>
              <computeroutput>pascal@chuck:C-AdmSys &gt;
              groups</computeroutput><simpara></simpara> <computeroutput>gnu
              wheel operator</computeroutput></entry>
            </row>

            <row>
              <!-- one of (entrytbl entry) -->

              <entry><command>passwd</command></entry>

              <entry>Permet à l'utilisateur de changer son mot de passe
              (moyennant la connaissance de l'ancien).<simpara></simpara>
              Invoqué sous l'identité du
              <emphasis>super</emphasis>-utilisateur avec pour argument un nom
              d'utilisateur, elle permet de changer inconditionnellement son
              mot de passe.<simpara></simpara></entry>
            </row>

            <row>
              <!-- one of (entrytbl entry) -->

              <entry id="su"><command>su</command></entry>

              <entry>Permet de changer d'identité. Typiquement permet à un
              utilisateur de devenir <emphasis>super</emphasis>-utilisateur à
              condition de connaître son mot de passe.<simpara></simpara> Sur
              les <foreignphrase>flavors</foreignphrase> BSD, seuls les
              utilisateurs membre du groupe <emphasis>wheel</emphasis> sont
              autorisés à utiliser cette commande.<simpara></simpara> Par
              défaut, les seules variables d'environnement modifiées sont :
              <varname>USER</varname>, <varname>LOGNAME</varname>,
              <varname>HOME</varname> et
              <varname>SHELL</varname>.<simpara></simpara>La commande
              <command>su -</command> permet l'exécution d'un <emphasis>login
              shell</emphasis> et par conséquent le changement
              d'environnement.</entry>
            </row>
          </tbody>
        </tgroup>
      </table></para>
  </sect1>

  <sect1>
    <title>Exercices</title>

    <para>Les exercices suivants sont à pratiquer sous
    <emphasis>FreeBSD</emphasis> puis sous <emphasis>Debian</emphasis>.
    Indiquer sur papier votre réponse puis tester-là.</para>

    <simplesect>
      <title>Exercice 1</title>

      <para>A l'aide des utilitaires <command>grep</command> et
      <command>awk</command> déterminer si l'utilisateur
      <emphasis>bin</emphasis> existe sur votre système. Si oui, donner son
      uid.</para>

      <para>Bien s'assurer de ne renvoyer au plus qu'une seule réponse
      !</para>

      <!-- <para> Réponses  :
grep ^bin: /etc/passwd 
bin:*:3:7:Binaries Commands and Source:/:/sbin/nologin

grep ^bin: /etc/passwd | awk -F ":" '{print "uid="$3}'
      </para> -->
    </simplesect>

    <simplesect>
      <title>Exercice 2</title>

      <para>Quels sont les <varname>gid</varname> de vos différents groupes
      ?</para>

      <!-- <para> Réponses  (FreeBSD) :
$ id -G
666 0 5 668
$ id
uid=666(pascal) gid=666(gnu) groups=666(gnu), 0(wheel), 5(operator), 668(cvs)
      </para> -->
    </simplesect>

    <simplesect>
      <title>Exercice 3</title>

      <para>Quels sont les membres du groupe <emphasis>operator</emphasis>
      ?</para>

      <para>Utiliser <command>grep</command> et <command>awk</command></para>

      <!-- <para> Réponses  (FreeBSD) :
$ grep ^operator /etc/group | awk -F ":" '{print $4}'
root,pascal
      </para> -->
    </simplesect>

    <simplesect>
      <title>Exercice 4</title>

      <para>[nécessite l'accès <command>sudo</command>] Créer l'utilisateur
      <emphasis>test</emphasis> avec la commande <command>useradd</command> en
      utilisant toutes les valeurs par défaut. Vérifier que le compte est bien
      créé.</para>

      <para>Ajouter cet utilisateur au groupe <emphasis>operator</emphasis> et
      vérifier ensuite ces groupes d'appartenance</para>

      <para>Se connecter à ce compte via le login puis via la commande
      <command>su</command>. Expliquer la différence.</para>

      <para>Que faut-il faire pour que la connexion au login fonctionne pour
      cet utilisateur ?</para>
    </simplesect>
  </sect1>

  <bibliography>
    <title>Références</title>

    <bibliodiv>
      <biblioentry>
        <abbrev>1</abbrev>

        <author>
          <surname>MAN</surname>
        </author>

        <title>Manual pages</title>
      </biblioentry>

      <biblioentry>
        <abbrev>2</abbrev>

        <authorgroup>
          <!-- one of (othercredit corpauthor collab editor author) -->

          <author>
            <firstname>NEMETH</firstname>

            <surname>Evi</surname>
          </author>

          <author>
            <firstname>SNYDER</firstname>

            <surname>Garth</surname>
          </author>

          <author>
            <firstname>HEIN</firstname>

            <surname>Trent H.</surname>
          </author>
        </authorgroup>

        <title>Linux Administration Handbook</title>

        <edition>Prentice Hall PTR</edition>

        <date>2002</date>
      </biblioentry>
    </bibliodiv>
  </bibliography>
</article>
