Flux rss
Collection CommentÇaMarche.net

[Linux] Création environnement OpenSSH-CHROOT

Bookmark Ajouter aux favoris / Partager
Dernière mise à jour le 26 novembre 2007 à 14:43 par lami20j
Publié par lami20j

OpenSSH-CHROOT





Pour encore une fois un grand merci à jipicy pour sa disponibilité et sa patience pour les corrections linguistiques.

I. Installation de openssh-chroot

A. Téléchargement et vérification de la signature


Création d'un répertoire pour le téléchargement des fichiers
$ mkdir /home/lami20j/prisonssh
$ cd /home/lami20j/prisonssh
$ wget ftp://ftp.club-internet.fr/pub/OpenBSD/OpenSSH/portable/openssh-4.3p1.tar.gz*
$ wget http://chrootssh.sourceforge.net/download/osshChroot-4.3p1.diff
 
Il semble que le patch n'est plus disponible à l'adresse indiquée. Regardez plus bas (Chap V. )

Nous sommes dans /home/lami20j/prisonssh et voilà ce que le répertoire contient :
$ ls -1
openssh-4.3p1.tar.gz
openssh-4.3p1.tar.gz.asc
osshChroot-4.3p1.diff
prisonssh.pl
useradd_prisonssh.pl 
prisonssh.pl et useradd_prisonssh.pl sont les 2 scripts Perl que l'on verra plus bas.

Vérification de la signature
$ gpg --keyserver pgp.mit.edu --recv-keys 0x86FF9C48
gpg: requête de la clé 86FF9C48 du serveur hkp pgp.mit.edu
gpg: clé 86FF9C48: nom d'utilisateur en double détecté - fusion accomplie
gpg: clé 86FF9C48: clé publique « Damien Miller (Personal Key) » importée
gpg: aucune clé de confiance ultime n'a été trouvée
gpg: Quantité totale traitée: 1
gpg: importée: 1

$ gpg --fingerprint 86FF9C48
pub 1024D/86FF9C48 2001-02-26
Empreinte de la clé = 3981 992A 1523 ABA0 79DB FC66 CE8E CB03 86FF 9C48
uid Damien Miller (Personal Key) 
sub 2048g/AA2B1C41 2001-02-26

$ gpg --verify openssh-4.3p1.tar.gz.asc openssh-4.3p1.tar.gz
gpg: Signature faite le mer 01 fév 2006 12:34:31 CET avec la clé DSA ID 86FF9C48
gpg: Bonne signature de « Damien Miller (Personal Key) »
gpg: ATTENTION: Cette clé n'est pas certifiée avec une signature de confiance !
gpg: Rien ne dit que la signature appartient à son propriétaire.
Empreinte de clé principale: 3981 992A 1523 ABA0 79DB FC66 CE8E CB03 86FF 9C48 

B. Installation


Suppression des paquetages installés.

Debian :
# apt-get remove --purge ssh 
Mandriva2006 et Fedora :
# for i in $(rpm -qa | grep openssh);do rpm --nodeps -e $i;done 
Dépendances requises : zlib et openssl
Lisez le fichier README pour plus de détails.
$ su
Password:
# cd /usr/local
# tar xzvf /home/lami20j/prisonssh/openssh-4.3p1.tar.gz
# cd openssh-4.3p1/
# patch < /home/lami20j/prisonssh/osshChroot-4.3p1.diff
patching file session.c
# ./configure
# make
# make install

C. Ecriture du script de démarrage pour sshd


Avec votre éditeur de texte préféré, créer le fichier /etc/init.d/sshd
et écrivez le script suivant.
Une fois l'édition du fichier terminé, enregistrez et quittez.
#!/bin/bash

case $1 in
'start' )
        /usr/local/sbin/sshd
        ;;
'stop'  )
        pkill sshd
        ;;
* )
        echo "usage : /etc/init.d/sshd {start|stop}"
        ;;
esac 
 
Etablissez les droits d'accès avec la commande
# chmod -v 0755 /etc/init.d/sshd 
Si l'utilisateur sshd n'existe pas, vous pouvez le créer avec la commande :
# useradd -c 'Privilege-separated SSH' -d /var/empty/sshd -s /sbin/nologin sshd  
Lancer le daemon
# /etc/init.d/sshd start 
Pour que le démarrage du daemon soit pris en compte au démarrage du PC faites :
# update-rc.d sshd start 99 2 3 4 5 . 

II. Création d'un environnement chroot openssh


- le script prisonssh.pl

SYNOPSIS
# perl /chemin/vers/script/prisonssh.pl 
A la demande du répertoire mettez le nom de votre choix.
Le répertoire sera créé dans /home
#! /usr/bin/perl
#
use strict; use warnings;

use File::Basename;
my (@lib,@ldd,%listreplib);
# création de répertoire
print "Entrez le nom de repertoire : ";
chomp(my $chroot_rep=<STDIN>);
mkdir '/home/'.$chroot_rep
or die "Impossible de créer le répertoire : $!";
# Les applications d'environement chroot
#
# Assurez vous que le chemin des applications mentionnées correspond 
#
# Par exemple la commande id
# sous Debian et Fedora5 on la trouve dans /usr/bin
#
# sous Mandriva 2006 dans /bin
#
# à vous d'ajouter ou enlever des applications
# et bien sûr de modifier le script
#
# les applications (/bin) 
my @apps0=qw ( 
              /bin/bash
              /bin/ls
              /bin/mkdir
              /bin/mv 
              /bin/pwd 
              /bin/rm
              /bin/sh 
              /bin/echo 
              /bin/cp 
              /bin/cat 
              /bin/ln 
              /bin/chown
              /bin/chmod 
              /bin/grep 
              /bin/more 
              /bin/tar
              /bin/gzip 
              /bin/true 
              /bin/false
              /bin/ping 
              /bin/egrep
              /bin/hostname
);

# les applications (/usr/bin, etc...)

my @apps1=qw ( 
              /usr/local/bin/scp 
              /usr/bin/env 
              /usr/bin/clear 
              /usr/bin/wc 
              /usr/bin/perl 
              /usr/bin/id 
              /usr/local/bin/ssh
              /usr/bin/du
              /usr/bin/less
              /usr/bin/bzip2
              /usr/bin/tset
);

# le subsystem sftp
my @sftp_server=qw ( /usr/local/libexec/sftp-server );

# récupérer les bibliothéques
foreach (@apps0,@apps1,@sftp_server){
    my $ldd=`ldd $_`;
    my @temp=split /\n/, $ldd;
    push @ldd,@temp;
}

# récupérer le chemin de chaque bibliothèque
foreach(@ldd){
    if ( $_=~/(?:\/?.*=>\s*)?(\/.*)\b\s*\(/ ){
        print "$1\n";
        push @lib,$1 if $1 !~ /^\s*$/;
    }
}

# les répertoires à créer (/lib,/usr/lib,etc...)
foreach(@lib){
    my $replib=dirname($_);
    $listreplib{$replib} +=1;
}

# création des répertoires dans l'environement chroot
foreach (keys %listreplib){
    system "mkdir","-p","/home/$chroot_rep/$_";
}

# création du répertoire bin dans l'environement chroot
mkdir "/home/$chroot_rep/bin";

my @rep=qw { 
            home usr/bin
            usr/lib/locale
            usr/share/locale
            tmp
            dev/pts
            etc/pam.d
            usr/local/libexec
};

foreach (@rep) {
    system "mkdir", "-p", "/home/$chroot_rep/$_";
}

# copier les applications dans le répertoire /bin d'environnement chroot
foreach(@apps0){
    system "cp","-p","$_","/home/$chroot_rep/bin";
}

# copier les applications dans répertoire /usr/bin d'environnement chroot
foreach(@apps1){
    next if /.*sftp-server.*/i;
    system "cp","-p","$_","/home/$chroot_rep/usr/bin";
}

# copier sftp-server
system "cp","-p","/usr/local/libexec/sftp-server","/home/$chroot_rep/usr/local/libexec";

# copier les bibliothèques
foreach (@lib){
    my $rep_lib=dirname($_);
    system "cp","-p","$_","/home/$chroot_rep/$rep_lib";
}

opendir (LIBNSS,"/lib")
        or die "Impossible d'ouvrir le répertoire : $!";
while (defined (my $libnss = readdir(LIBNSS))) {
    next unless $libnss=~/libnss.*/;
    system "cp","-p","/lib/$libnss","/home/$chroot_rep/lib";
} 

#
system "cp","-RPp","/usr/share/terminfo","/home/$chroot_rep/usr/share";

#
system "mknod","-m","0666","/home/$chroot_rep/dev/null","c","1","3";
system "mknod","-m","0666","/home/$chroot_rep/dev/zero","c","1","5";
system "mknod","-m","0444","/home/$chroot_rep/dev/urandom","c","1","9";
system "mknod","-m","0666","/home/$chroot_rep/dev/tty","c","5","0";
system "mknod","-m","0666","/home/$chroot_rep/dev/ptmx","c","5","2";

#
my @etc_conf=qw(
                nsswitch.conf host.conf resolv.conf bashrc termcap 
                hosts localtime login.defs profile tsocks.conf
);

foreach (@etc_conf){
    system "cp","/etc/$_","/home/$chroot_rep/etc";
}

#
system "cp","-R","/usr/lib/perl5","/home/$chroot_rep/usr/lib";

#
my @pamd=qw(
            other
);

foreach (@pamd){
    system "cp","/etc/pam.d/$_","/home/$chroot_rep/etc/pam.d";
}

# Création des fichiers par défaut
{
open ETCPASSWD,"> /home/$chroot_rep/etc/passwd"
        or die "Impossible de créer le fichier : $!\n";

print ETCPASSWD "root:x:0:0::/:/bin/bash\n";

open ETCGROUP,"> /home/$chroot_rep/etc/group"
        or die "Impossible de créer le fichier : $!\n";

print ETCGROUP "root:x:0:\n"
}

III. Création d'utilisateurs


-le script useradd_prisonssh.pl

SYNOPSIS
# perl /chemin/vers/script/useradd_prisonssh.pl nom_utilisateur répertoire 
Pour le répertoire utilisez le nom du répertoire que vous avez créé avec le script prisonssh.pl (sans arborescence)
#! /usr/bin/perl 
#
use strict;use warnings;

die "Usage: \n\t$0 nom_utilisateur chroot-dir\n" unless @ARGV == 2;

my $user = $ARGV[0];
my $chroot = "/home/$ARGV[1]";

system "groupadd", "$user";
system "useradd", "-d", "$chroot/./home/$user", "-g", "$user", "-m", "-s", "/bin/bash", "$user";

open PASSWD,">>$chroot/etc/passwd"
        or die "E/S : $!\n";

#
my ($u) = grep { /$user/ } `cat /etc/passwd`;
$u =~ s/[^:]*\.//;

print PASSWD $u;

#
open GROUP,">>$chroot/etc/group"
         or die "E/S : $!\n";

print GROUP grep { /$user/ } `cat /etc/group`;

#
chmod 0700, "$chroot/home/$user";
system "chown", "-R", "$user:$user", "$chroot/home/$user";

#
print "Entre le mot de passe pour $user\n";

system "passwd", "$user";

print "L'utilisateur < $user > à été créé avec succés.\n";
 

IV. Les mains dans les cambouis ou un coup d'oeil sous le capot


Que ce passe-t-il en fait ?

Le patch qu'on applique à openssh permet de créer cet environnement qu'on peut appeler une prison.

Il s'agit en fait d'une mini arborescence linux qui se trouvera dans le répertoire /home.
Cette arborescence contient les répertoires et les programmes nécessaires pour l'ouverture d'une connexion ne permettant pas de sortir de la prison (/home/prison)

Donc une fois connecté vous êtes emprisonné dans /home/prison qui est la racine / pour notre mini environnement grâce au patch qu'on a utilisé.

Si vous regardez le vrai fichier /etc/passwd vous allez remarquer que les utilisateurs créés avec le script useradd_prison.pl ont le répertoire home écrit avec la syntaxe suivante : /home/prison/./home/utilisateur.

Vous pouvez tester la connexion avec ssh -v utilisateur@localhost

Pour l'instant le fichier de configuration ( /usr/local/etc/sshd_config )
n'est pas modifié donc l'authentification se fera avec le mot de passe.

Si vous voulez une authentification par clé privée/publique
à vous de modifier le fichier de configuration.

Tout ce que j'ai décrit a été testé sous les distributions GNU/Linux :
Mandriva2006, Fedora5 et Debian Sarge 3.1 avec Perl version 5.8.4 et supérieure
 

V. Le patch osshChroot-4.3p1.diff


--- openssh-4.3p1/session.c	2005-12-24 04:59:12.000000000 +0100
+++ openssh-4.3p1-chroot/session.c	2006-02-02 13:39:03.000000000 +0100
@@ -59,6 +59,8 @@
 #include "kex.h"
 #include "monitor_wrap.h"
 
+#define CHROOT
+
 #if defined(KRB5) && defined(USE_AFS)
 #include <kafs.h>
 #endif
@@ -1251,6 +1253,11 @@
 void
 do_setusercontext(struct passwd *pw)
 {
+#ifdef CHROOT
+       char *user_dir;
+       char *new_root;
+#endif /* CHROOT */
+
 #ifndef HAVE_CYGWIN
 	if (getuid() == 0 || geteuid() == 0)
 #endif /* HAVE_CYGWIN */
@@ -1308,6 +1315,27 @@
 			restore_uid();
 		}
 #endif
+
+#ifdef CHROOT
+       user_dir = xstrdup(pw->pw_dir);
+       new_root = user_dir + 1;
+
+       while((new_root = strchr(new_root, '.')) != NULL) {
+               new_root--;
+               if(strncmp(new_root, "/./", 3) == 0) {
+                       *new_root = '\0';
+                       new_root += 2;
+
+                       if(chroot(user_dir) != 0)
+                               fatal("Couldn't chroot to user's directory %s", user_dir);
+                       pw->pw_dir = new_root;
+                       break;
+               }
+
+               new_root += 2;
+       }
+#endif /* CHROOT */
+
 # ifdef USE_PAM
 		/*
 		 * PAM credentials may take the form of supplementary groups.

VI. Le patch osshChroot-4.5p1.diff


Original patch by Ricardo Cerqueira <rmcc@clix.pt>

Updated by Pierre Schiesser <pierre.schiesser@gmail.com> for OpenSSH-4.5p1

A patch to cause sshd to chroot when it encounters the magic token
'/./' in a users home directory. The directory portion before the
token is the directory to chroot() to, the portion after the
token is the user's home directory relative to the new root.

Patch source using: patch -p0 < /path/to/patch

Systems with a bad diff (doesn't understand -u or -N) should use gnu diff.
Solaris may store this as gdiff under /opt/sfw/bin. I can't say much about
other systems (unless you email me your experiences!).

================================================================================
--- openssh-4.5p1/session.c	2006-10-23 19:01:56.000000000 +0200
+++ openssh-4.5p1-chroot/session.c	2006-11-07 21:33:12.000000000 +0100
@@ -88,6 +88,8 @@
 #include "kex.h"
 #include "monitor_wrap.h"
 
+#define CHROOT
+
 #if defined(KRB5) && defined(USE_AFS)
 #include <kafs.h>
 #endif
@@ -1287,6 +1289,11 @@
 void
 do_setusercontext(struct passwd *pw)
 {
+#ifdef CHROOT
+       char *user_dir;
+       char *new_root;
+#endif /* CHROOT */
+
 #ifndef HAVE_CYGWIN
 	if (getuid() == 0 || geteuid() == 0)
 #endif /* HAVE_CYGWIN */
@@ -1344,6 +1351,27 @@
 			restore_uid();
 		}
 #endif
+
+#ifdef CHROOT
+       user_dir = xstrdup(pw->pw_dir);
+       new_root = user_dir + 1;
+
+       while((new_root = strchr(new_root, '.')) != NULL) {
+               new_root--;
+               if(strncmp(new_root, "/./", 3) == 0) {
+                       *new_root = '\0';
+                       new_root += 2;
+
+                       if(chroot(user_dir) != 0)
+                               fatal("Couldn't chroot to user's directory %s", user_dir);
+                       pw->pw_dir = new_root;
+                       break;
+               }
+
+               new_root += 2;
+       }
+#endif /* CHROOT */
+
 # ifdef USE_PAM
 		/*
 		 * PAM credentials may take the form of supplementary groups.

PB compile openssh 4.3 erreur libcrypto ?? bonjou, J'essais de reinstaller mon serveur ssh via les sources en suivant ce tuto : linux creation environnement openssh chroot mais j'ai cette erreur aux "./configure" checking if openpty correctly handles controlling tty... yes checking whether... www.commentcamarche.net/forum/affich-2480433-pb-compile-openssh-4-3-erreur-libcrypto
Openssh chrooter avec nxserver free bonjour, 1- J'ai installé openssh avec un environnement chrooter via ce tuto : linux creation environnement openssh chroot pas de problème de ce coté :) l'environnement se trouve dans /home/serveur_ssh/home/"comptes-utilisateurs" tout fonctionne... www.commentcamarche.net/forum/affich-2423997-openssh-chrooter-avec-nxserver-free
PB connexion reseau ssh de PC win vers linux (Résolu) bonjour, j'ai un problème de connexion distante sur mon serveur linux (ubuntu) qui à été crée en ssh à partir de ce tuto : linux creation environnement openssh chroot Tout le déroulement de l'installation s'est bien passé, le reseau est accessible à... www.commentcamarche.net/forum/affich-2358615-pb-connexion-reseau-ssh-de-pc-win-vers-linux
[Bash] La variable d'environnement PATHLa variable d'environnement PATH I. Préambule II. C'est quoi le shell ? III. Définition IV. Séance de dissection V. Ajouter un répertoire à la variable PATH VI. Et puis... I. Préambule Sous les systèmes GNU/Linux qu'on le veuille ou... www.commentcamarche.net/faq/sujet-3585-bash-la-variable-d-environnement-path
[MSN Messenger] Créer une adresse MSNPour créer une adresse MSN (@msn.com) ou faire une adresse hotmail (@hotmail.fr), il suffit de créer un compte .NET passport en procédant à l'inscription via l'adresse suivante... www.commentcamarche.net/faq/sujet-3785-msn-messenger-creer-une-adresse-msn
Créer une adresse HotmailPour créer un compte hotmail (@hotmail.fr), il suffit de créer un compte .NET passport en procédant à l'inscription via l'adresse suivante : https://accountservices.passport.net/reg.srf?id=9&cbid=956&sl=1&lc=1036 Des informations personnelles... www.commentcamarche.net/faq/sujet-6144-creer-une-adresse-hotmail
Probleme assassins creed image (Résolu)Salut, Jai installé exactement hier assassin's creed Et tout s'est bien dérouler. Sauf que quand jai commencer a jouer tout allais bien jusqua ce que je commence a voir le personnage et son environnement . A vrai dire je ne voyais rien puisque qu'il y... www.commentcamarche.net/forum/affich-7072391-probleme-assassins-creed-image
[Batch] créer une variableBonjour, je souhaite créer une variable locale dans un fichier .bat Comment m'y prendre ? Merci de votre aide www.commentcamarche.net/forum/affich-1793294-batch-creer-une-variable
Créer un pétitionBonjour, pouvez vous m'expliquer toutes les manipulations à faire pour créer une pétition qui pourrait être signée par chacun et me revenir ensuite pour être envoyée aux ministres. il s'agit de demander au ministre de l'environnement que les eco-taxes... www.commentcamarche.net/forum/affich-3836946-creer-un-petition
Télécharger LC ISO CreatorLC ISO Creator est très simple: Il permet de créer un fichier .ISO à partir de vos CD. Cela vous permet ensuite d'utiliser ces fichiers ISO pour les graver, utiliser un logiciel d'émulation de CD (pour ne plus avoir à utiliser le CD original) ou... www.commentcamarche.net/telecharger/telecharger-3673478-lc-iso-creator
Télécharger The Logo CreatorThe Logo Creator est un logiciel de création de logo. Il fait pour tout le monde : entreprise, association, webdesigner, etc. Le logiciel propose une création rapide de logo à partir des différentes modèles déjà intégrés. Ces derniers sont de qualité... www.commentcamarche.net/telecharger/telecharger-34056782-the-logo-creator
Télécharger ArcSoft Print CreationsPrint Creation est comme son nom l'indique, un assistant d'impression en tout genre. Il comprend le dernier cri d'application d'impression d'ArcSoft's avec des fonctions toutes aussi épatantes. A partir de la page d'accueil, vous pourrez accéder à... www.commentcamarche.net/telecharger/telecharger-34056325-arcsoft-print-creations
Creative Live Cam Video IMUSB, 800x600 Pixels, 30 fps, Compatibilité:Windows 98SE/Me/2000/XP, Couleur: , Divers:The Live! Cam Video IM includes a Creative hands-free headset, Images par seconde:30 Fps, Interface:USB, Logicels inclus: , Microphone: , Mise au... www.commentcamarche.net/guide/658868-creative-live-cam-video-im
Nancy Drew: Creature of Kapu CaveOther Names:Nancy Drew Mystery #15, The 3D Adventures of Nancy Drew: Creature of Kapu Cave, Genre:Adventure, Avis ESRB:Everyone 6+, Développeur:Her Interactive, Description:  www.commentcamarche.net/guide/1003912-nancy-drew-creature-of-kapu-cave
SimCity CreatorDéveloppeur:Maxis, Genre:Simulation, Avis ESRB :Everyone 6+, Other Names:Sim City Creator www.commentcamarche.net/guide/1131934-simcity-creator
Créer un réseau localPourquoi mettre en place un réseau local? Lorsque vous disposez de plusieurs ordinateurs, il peut être agréable de les connecter afin de créer un réseau local (en anglais LAN, abréviation de Local Area Network). La mise en place d'un tel réseau... www.commentcamarche.net/contents/pratique/lan.php3
Variables d'environnementVariables d'environnement Une variable d'environnement est une valeur dynamique, chargée en mémoire, pouvant être utilisée par plusieurs processus fonctionnant simultanément. Sur la plupart des systèmes d'exploitation, les emplacement de certaines... www.commentcamarche.net/contents/systemes/variables-environnement.php3
PHP - Les variables d'environnementNotion de variable d'environnement Les variables d'environnement sont, comme leur nom l'indique, des données stockées dans des variables permettant au programme d'avoir des informations sur son environnement. L'environnement, dans le cas du script... www.commentcamarche.net/contents/php/phpenv.php3