« Trucs:Chrooter un utilisateur (ssh, terminal, console, etc...) » : différence entre les versions

De Lea Linux
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
 
Ligne 1 : Ligne 1 :
= Chrooter un utilisateur (ssh, terminal, console, etc...) =
<div class="leapar">Prae<prae@lea-linux.org></div>


<div class="leapar">Benjamin Gigon</div>
# Préparation de l'utilisateur et son Home :<br /> 
 
## Création de l'utilisateur :<br /><br /><code><nowiki># adduser <login></nowiki></code><br /> 
# Préparation de l'utilisateur et son Home :<br />
## Préparation de son home :<br /><br /><div class="code"><nowiki># cd /home/<login></nowiki><br /> # mkdir bin dev lib</div><br /><br /> Nous allons y copier le binaire "bash", qui se trouve dans /bin/bash<br /><br /><code><nowiki># cp /bin/bash /home/&ltlogin>/bin/</nowiki></code><br /><br /> Ce programme est dynamique, donc nous allons déterminer ses dépendances de librairies<br /><br /><div class="code"><nowiki># ldd /bin/bash</nowiki><br />    libncurses.so.5 => /lib/libncurses.so.5 (0x40026000)<br />    libdl.so.2 => /lib/libdl.so.2 (0x40064000)<br />    libc.so.6 => /lib/libc.so.6 (0x40068000)<br />    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)</div><br /><br /> Nous constatons que <code>/bin/bash</code> est dépendant de <code>/lib/libncurses.so.5</code>, <code>/lib/libdl.so.2</code>, <code>/lib/libc.so.6</code> et de <code>/lib/ld-linux.so.2</code>.<br /><br /> Nous allons les copier tout simplement dans l'arborescence chrootée :<br />
## Création de l'utilisateur :<br /><br /><span class="code"><nowiki># adduser <login></nowiki></span><br />
### Manuellement :<br /><br /><div class="code"><nowiki># cd /home/<login></nowiki><br /> # cp /lib/libncurses.so.5 ./lib/<br /> # cp /lib/libdl.so.2 ./lib/<br /> # cp /lib/libc.so.6 ./lib/<br /> # cp /lib/ld-linux.so.2 ./lib/</div><br /><br /> 
## Préparation de son home :<br /><br /><div class="code"><nowiki># cd /home/<login></nowiki><br /> # mkdir bin dev lib</div><br /><br /> Nous allons y copier le binaire "bash", qui se trouve dans /bin/bash<br /><br /><span class="code"><nowiki># cp /bin/bash /home/<login>/bin/</nowiki></span><br /><br /> Ce programme est dynamique, donc nous allons déterminer ses dépendances de librairies<br /><br /><div class="code"><nowiki># ldd /bin/bash</nowiki><br />   libncurses.so.5 => /lib/libncurses.so.5 (0x40026000)<br />   libdl.so.2 => /lib/libdl.so.2 (0x40064000)<br />   libc.so.6 => /lib/libc.so.6 (0x40068000)<br />   /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)</div><br /><br /> Nous constatons que <span class="code">/bin/bash</span> est dépendant de <span class="code">/lib/libncurses.so.5</span>, <span class="code">/lib/libdl.so.2</span>, <span class="code">/lib/libc.so.6</span> et de <span class="code">/lib/ld-linux.so.2</span>.<br /><br /> Nous allons les copier tout simplement dans l'arborescence chrootée :<br />
### Automatiquement : <code><nowiki># ldd /bin/bash | awk '{ print "cp "$3" /home/<login>/lib/" }' | bash</nowiki></code><br /><br /><div class="note">ATTENTION : N'oubliez pas de remplacer <login> par le bon login...</div><br />   Le répertoire <code>dev</code> devrait notamment servir à stocker les devices.<br /> Notamment le plus important : <code>/dev/null</code>, mais celui ci n'est pas indispensable. Si vous souhaitez quand même créer ce device, faites comme ceci :<br /><br /><code><nowiki># mknod /home/<login>/dev/null c 1 3 -m 666</nowiki></code><br /><br /> Voici l'arborescence après coup :<br />
### Manuellement :<br /><br /><div class="code"><nowiki># cd /home/<login></nowiki><br /> # cp /lib/libncurses.so.5 ./lib/<br /> # cp /lib/libdl.so.2 ./lib/<br /> # cp /lib/libc.so.6 ./lib/<br /> # cp /lib/ld-linux.so.2 ./lib/</div><br /><br />
         <code>/home/<login></code><nowiki>;
### Automatiquement : <span class="code"><nowiki># ldd /bin/bash | awk '{ print "cp "$3" /home/<login>/lib/" }' | bash</nowiki></span><br /><br /><div class="note">ATTENTION : N'oubliez pas de remplacer <login> par le bon login...</div><br />   Le répertoire <span class="code">dev</span> devrait notamment servir à stocker les devices.<br /> Notamment le plus important : <span class="code">/dev/null</span>, mais celui ci n'est pas indispensable. Si vous souhaitez quand même créer ce device, faites comme ceci :<br /><br /><span class="code"><nowiki># mknod /home/<login>/dev/null c 1 3 -m 666</nowiki></span><br /><br /> Voici l'arborescence après coup :<br />
         <span class="code">/home/<login></span><nowiki>;
                 |
                 |
                 |-- bin
                 |-- bin
Ligne 24 : Ligne 22 :
                     |-- libdl.so.2
                     |-- libdl.so.2
                     `-- libncurses.so.5</nowiki>
                     `-- libncurses.so.5</nowiki>
## Modification du <span class="code">/etc/passwd</span><br /> Editez le fichier <span class="code">/etc/passwd</span> (ou bien votre serveur central, cf: LDAP) et modifiez les informations "shell" par :<br /><span class="code">/bin/chrootuser</span><br /> Exemple :<br /> Avant : <span class="code">chroot:x:1003:1003:,,,:/home/chroot:/bin/bash</span><br /> Après : <span class="code">chroot:x:1003:1003:,,,:/home/chroot:/bin/chrootuser</span><br /> Mais qu'est ce programme <span class="code">chrootuser</span> ?<br /> Tout simplement un script bash avec quelques commandes.  
## Modification du <code>/etc/passwd</code><br /> Editez le fichier <code>/etc/passwd</code> (ou bien votre serveur central, cf: LDAP) et modifiez les informations "shell" par :<br /><code>/bin/chrootuser</code><br /> Exemple :<br /> Avant : <code>chroot:x:1003:1003:,,,:/home/chroot:/bin/bash</code><br /> Après : <code>chroot:x:1003:1003:,,,:/home/chroot:/bin/chrootuser</code><br /> Mais qu'est ce programme <code>chrootuser</code> ?<br /> Tout simplement un script bash avec quelques commandes.  
# Création du programme Wrapper<br /> Dans un fichier shell, mettez ceci :<br /><br /><div class="code"><nowiki>#!/bin/bash</nowiki><br /> exec -c /usr/sbin/chroot_suid /home/$USER /bin/bash</div><br /><br /> Pour ma part, je l'ai enregistré dans <span class="code">/bin/chrootuser</span><br /> Et mettez ses droits en exécution pour tous mais en écriture que pour le root :<br /><br /><span class="code"><nowiki># chmod 755 /bin/chrootuser</nowiki></span><br /> Copiez maintenant le programme /usr/sbin/chroot en le nommant par exemple /usr/sbin/chroot_suid, et attribuez lui des droits SUID, comme cela : <span class="code">chmod 4755 /usr/sbin/chroot_suid</span>. <br /> Sitôt terminé, vous pouvez vous connecter :)  
# Création du programme Wrapper<br /> Dans un fichier shell, mettez ceci :<br /><br /><div class="code"><nowiki>#!/bin/bash</nowiki><br /> exec -c /usr/sbin/chroot_suid /home/$USER /bin/bash</div><br /><br /> Pour ma part, je l'ai enregistré dans <code>/bin/chrootuser</code><br /> Et mettez ses droits en exécution pour tous mais en écriture que pour le root :<br /><br /><code><nowiki># chmod 755 /bin/chrootuser</nowiki></code><br /> Copiez maintenant le programme /usr/sbin/chroot en le nommant par exemple /usr/sbin/chroot_suid, et attribuez lui des droits SUID, comme cela : <code>chmod 4755 /usr/sbin/chroot_suid</code>. <br /> Sitôt terminé, vous pouvez vous connecter :)  
# Premiers essais<br /><br /> Notre première connection SSH :)<br /><br /><div class="code"><nowiki># ssh <login>@localhost</nowiki><br /> <login>@localhost's password: <password><br /> Linux #1 ven jan 17 22:00:45 CET 2003 i686 unknown<br /> bash-2.05a$</div><br /><br /> Si vous remarquez bien, aucune commande n'est disponible (hormis commande interne bash). Si vous souhaitez rajouter ces programmes, vous faites comme pour "bash", en copiant les programmes et les librairies dépendantes.  
# Premiers essais<br /><br /> Notre première connection SSH :)<br /><br /><div class="code"><nowiki># ssh <login>@localhost</nowiki><br /> <login>@localhost's password: <password><br /> Linux #1 ven jan 17 22:00:45 CET 2003 i686 unknown<br /> bash-2.05a$</div><br /><br /> Si vous remarquez bien, aucune commande n'est disponible (hormis commande interne bash). Si vous souhaitez rajouter ces programmes, vous faites comme pour "bash", en copiant les programmes et les librairies dépendantes.  
# Automatiser tout ceci :<br /><br /> Voici un script qui automatise tout cela :<br /><div class="code"> #!/bin/bash<br /><br /> if [ "$#" != 1 ];<br /> then<br />   echo "Usage : $0 <login>"<br />   exit 255;<br /> fi<br /><br /> LOGIN=$1<br /> GROUP=chroot<br /><br /> echo "-- Création du groupe \"${GROUP}\""<br /> groupadd "${GROUP}" > /dev/null 2>&1<br /><br /> echo "-- Création de l'utilisateur \"${LOGIN}\""<br /> useradd \<br />   -c "User chrooted" \<br />   -d "/home/${LOGIN}/" \<br />   -g "${GROUP}" \<br />   -s "/bin/chrootuser" \<br />   "${LOGIN}"<br /><br /> echo "-- Son mot de passe : "<br /> passwd "${LOGIN}" > /dev/null<br /><br /> echo "-- Création de l'arborescence de son homedir"<br /> mkdir /home/${LOGIN}/ \<br />   /home/${LOGIN}/bin/ \<br />   /home/${LOGIN}/lib/ \<br />   /home/${LOGIN}/dev/<br /> chmod 700 \<br />   /home/${LOGIN}/ \<br />   /home/${LOGIN}/bin/ \<br />   /home/${LOGIN}/lib/ \<br />   /home/${LOGIN}/dev/<br /><br /> cp /bin/bash /home/${LOGIN}/bin/bash<br /> ldd /bin/bash | awk -v "LOGIN=$LOGIN" '{ print "cp "$3" /home/"LOGIN"/lib/" }' | bash<br /> mknod /home/${LOGIN}/dev/null c 1 3 -m 666<br /> chown -R "${LOGIN}:${GROUP}" /home/${LOGIN}<br /><br /> echo ">> Utilisateur \"${LOGIN}\" chrooté"<br /><br /> echo "-- Création du programme /bin/chrootuser"<br /> cat < /bin/chrootuser<br /> #!/bin/bash<br /> exec -c /usr/sbin/chroot /home/\$USER /bin/bash<br /> EOF<br /> chmod 555 /bin/chrootuser </div>  
# Automatiser tout ceci :<br /><br /> Voici un script qui automatise tout cela :<br /><div class="code"> #!/bin/bash<br /><br /> if [ "$#" != 1 ];<br /> then<br />    echo "Usage : $0 <login>"<br />    exit 255;<br /> fi<br /><br /> LOGIN=$1<br /> GROUP=chroot<br /><br /> echo "-- Création du groupe \"${GROUP}\""<br /> groupadd "${GROUP}" > /dev/null 2>&1<br /><br /> echo "-- Création de l'utilisateur \"${LOGIN}\""<br /> useradd \<br />    -c "User chrooted" \<br />    -d "/home/${LOGIN}/" \<br />    -g "${GROUP}" \<br />    -s "/bin/chrootuser" \<br />    "${LOGIN}"<br /><br /> echo "-- Son mot de passe : "<br /> passwd "${LOGIN}" > /dev/null<br /><br /> echo "-- Création de l'arborescence de son homedir"<br /> mkdir /home/${LOGIN}/ \<br />    /home/${LOGIN}/bin/ \<br />    /home/${LOGIN}/lib/ \<br />    /home/${LOGIN}/dev/<br /> chmod 700 \<br />    /home/${LOGIN}/ \<br />    /home/${LOGIN}/bin/ \<br />    /home/${LOGIN}/lib/ \<br />    /home/${LOGIN}/dev/<br /><br /> cp /bin/bash /home/${LOGIN}/bin/bash<br /> ldd /bin/bash | awk -v "LOGIN=$LOGIN" '{ print "cp "$3" /home/"LOGIN"/lib/" }' | bash<br /> mknod /home/${LOGIN}/dev/null c 1 3 -m 666<br /> chown -R "${LOGIN}:${GROUP}" /home/${LOGIN}<br /><br /> echo ">> Utilisateur \"${LOGIN}\" chrooté"<br /><br /> echo "-- Création du programme /bin/chrootuser"<br /> cat < /bin/chrootuser<br /> #!/bin/bash<br /> exec -c /usr/sbin/chroot /home/\$USER /bin/bash<br /> EOF<br /> chmod 555 /bin/chrootuser </div>  
 
 
Important: Pensez à rajouter /bin/chrootuser dans /etc/shells.<br/>
Sinon vous ne pourrez pas vous logguer


Idée originale : Anne
Idée originale : Anne
[[Catégorie:Trucs Administration systeme]]
[[Catégorie:Trucs_Administration]]

Dernière version du 25 octobre 2016 à 18:55

Prae<prae@lea-linux.org>
  1. Préparation de l'utilisateur et son Home :
     
    1. Création de l'utilisateur :

      # adduser <login>
       
    2. Préparation de son home :

      # cd /home/<login>
      # mkdir bin dev lib


      Nous allons y copier le binaire "bash", qui se trouve dans /bin/bash

      # cp /bin/bash /home/&ltlogin>/bin/

      Ce programme est dynamique, donc nous allons déterminer ses dépendances de librairies

      # ldd /bin/bash
         libncurses.so.5 => /lib/libncurses.so.5 (0x40026000)
         libdl.so.2 => /lib/libdl.so.2 (0x40064000)
         libc.so.6 => /lib/libc.so.6 (0x40068000)
         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


      Nous constatons que /bin/bash est dépendant de /lib/libncurses.so.5, /lib/libdl.so.2, /lib/libc.so.6 et de /lib/ld-linux.so.2.

      Nous allons les copier tout simplement dans l'arborescence chrootée :
      1. Manuellement :

        # cd /home/<login>
        # cp /lib/libncurses.so.5 ./lib/
        # cp /lib/libdl.so.2 ./lib/
        # cp /lib/libc.so.6 ./lib/
        # cp /lib/ld-linux.so.2 ./lib/


         
      2. Automatiquement : # ldd /bin/bash | awk '{ print "cp "$3" /home/<login>/lib/" }' | bash

        ATTENTION : N'oubliez pas de remplacer <login> par le bon login...

          Le répertoire dev devrait notamment servir à stocker les devices.
        Notamment le plus important : /dev/null, mais celui ci n'est pas indispensable. Si vous souhaitez quand même créer ce device, faites comme ceci :

        # mknod /home/<login>/dev/null c 1 3 -m 666

        Voici l'arborescence après coup :
        /home/<login>;
                 |
                 |-- bin
                 |   |
                 |   `-- bash
                 |
                 |-- dev
                 |   |
                 |   `-- null
                 |
                 `-- lib
                     |
                     |-- ld-linux.so.2
                     |-- libc.so.6
                     |-- libdl.so.2
                     `-- libncurses.so.5
    1. Modification du /etc/passwd
      Editez le fichier /etc/passwd (ou bien votre serveur central, cf: LDAP) et modifiez les informations "shell" par :
      /bin/chrootuser
      Exemple :
      Avant : chroot:x:1003:1003:,,,:/home/chroot:/bin/bash
      Après : chroot:x:1003:1003:,,,:/home/chroot:/bin/chrootuser
      Mais qu'est ce programme chrootuser ?
      Tout simplement un script bash avec quelques commandes.
  1. Création du programme Wrapper
    Dans un fichier shell, mettez ceci :

    #!/bin/bash
    exec -c /usr/sbin/chroot_suid /home/$USER /bin/bash


    Pour ma part, je l'ai enregistré dans /bin/chrootuser
    Et mettez ses droits en exécution pour tous mais en écriture que pour le root :

    # chmod 755 /bin/chrootuser
    Copiez maintenant le programme /usr/sbin/chroot en le nommant par exemple /usr/sbin/chroot_suid, et attribuez lui des droits SUID, comme cela : chmod 4755 /usr/sbin/chroot_suid.
    Sitôt terminé, vous pouvez vous connecter :)
  2. Premiers essais

    Notre première connection SSH :)

    # ssh <login>@localhost
    <login>@localhost's password: <password>
    Linux #1 ven jan 17 22:00:45 CET 2003 i686 unknown
    bash-2.05a$


    Si vous remarquez bien, aucune commande n'est disponible (hormis commande interne bash). Si vous souhaitez rajouter ces programmes, vous faites comme pour "bash", en copiant les programmes et les librairies dépendantes.
  3. Automatiser tout ceci :

    Voici un script qui automatise tout cela :
    #!/bin/bash

    if [ "$#" != 1 ];
    then
       echo "Usage : $0 <login>"
       exit 255;
    fi

    LOGIN=$1
    GROUP=chroot

    echo "-- Création du groupe \"${GROUP}\""
    groupadd "${GROUP}" > /dev/null 2>&1

    echo "-- Création de l'utilisateur \"${LOGIN}\""
    useradd \
       -c "User chrooted" \
       -d "/home/${LOGIN}/" \
       -g "${GROUP}" \
       -s "/bin/chrootuser" \
       "${LOGIN}"

    echo "-- Son mot de passe : "
    passwd "${LOGIN}" > /dev/null

    echo "-- Création de l'arborescence de son homedir"
    mkdir /home/${LOGIN}/ \
       /home/${LOGIN}/bin/ \
       /home/${LOGIN}/lib/ \
       /home/${LOGIN}/dev/
    chmod 700 \
       /home/${LOGIN}/ \
       /home/${LOGIN}/bin/ \
       /home/${LOGIN}/lib/ \
       /home/${LOGIN}/dev/

    cp /bin/bash /home/${LOGIN}/bin/bash
    ldd /bin/bash | awk -v "LOGIN=$LOGIN" '{ print "cp "$3" /home/"LOGIN"/lib/" }' | bash
    mknod /home/${LOGIN}/dev/null c 1 3 -m 666
    chown -R "${LOGIN}:${GROUP}" /home/${LOGIN}

    echo ">> Utilisateur \"${LOGIN}\" chrooté"

    echo "-- Création du programme /bin/chrootuser"
    cat < /bin/chrootuser
    #!/bin/bash
    exec -c /usr/sbin/chroot /home/\$USER /bin/bash
    EOF
    chmod 555 /bin/chrootuser

Idée originale : Anne