« Trucs:Chrooter un utilisateur (ssh, terminal, console, etc...) » : différence entre les versions
Aller à la navigation
Aller à la recherche
Aucun résumé des modifications |
(balises code) |
||
Ligne 2 : | Ligne 2 : | ||
# Préparation de l'utilisateur et son Home :<br /> | # Préparation de l'utilisateur et son Home :<br /> | ||
## Création de l'utilisateur :<br /><br /><code><nowiki># adduser <login></nowiki></ | ## Création de l'utilisateur :<br /><br /><span class="code"><nowiki># adduser <login></nowiki></span><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/<login>/bin/</nowiki></ | ## 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 /> | ||
### 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 /> | ### 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 /> | ||
### Automatiquement : <code><nowiki># ldd /bin/bash | awk '{ print "cp "$3" /home/<login>/lib/" }' | bash</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 /> | ||
<code>/home/<login></ | <span class="code">/home/<login></span><nowiki>; | ||
| | | | ||
|-- bin | |-- bin | ||
Ligne 22 : | Ligne 22 : | ||
|-- libdl.so.2 | |-- libdl.so.2 | ||
`-- libncurses.so.5</nowiki> | `-- libncurses.so.5</nowiki> | ||
## Modification du <code>/etc/passwd</ | ## 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. | ||
# 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</ | # 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 :) | ||
# 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> |
Version du 6 juin 2012 à 11:48
Benjamin Gigon
- Préparation de l'utilisateur et son Home :
- Création de l'utilisateur :
# adduser <login> - 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/<login>/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 :
- 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/ - Automatiquement : # ldd /bin/bash | awk '{ print "cp "$3" /home/<login>/lib/" }' | bashATTENTION : 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 :
- Manuellement :
- Création de l'utilisateur :
/home/<login>;
|
|-- bin
| |
| `-- bash
|
|-- dev
| |
| `-- null
|
`-- lib
|
|-- ld-linux.so.2
|-- libc.so.6
|-- libdl.so.2
`-- libncurses.so.5
- 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.
- Modification du /etc/passwd
- 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 :) - 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. - 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
Important: Pensez à rajouter /bin/chrootuser dans /etc/shells.
Sinon vous ne pourrez pas vous logguer
Idée originale : Anne