Flux rss
Collection CommentCaMarche.net

[Linux] Création environnement OpenSSH-CHROOT

Publié par lami20j, dernière mise à jour le lundi 26 novembre 2007 à 14:43:53 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 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... www.commentcamarche.net/forum/affich-2358615-pb-connexion-reseau-ssh-de-pc-win-vers-linux
Background transparant + 3DSMAX 9 (Résolu) Bonjour, bonjour :) je cherche un tuto ou un guide qui me permet de réaliser la chose suivante : J'ai fais un text animé sur 3DSMAX et je veux l'ajouter à une vidéo en superposition via un logiciel de montage. Le truc c'est que le BG du... www.commentcamarche.net/forum/affich-5477739-background-transparant-3dsmax-9
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... www.commentcamarche.net/forum/affich-7072391-probleme-assassins-creed-image
[Logiciel libre] Installation firefox 2.0+java+flashInstallation firefox 2.0+java+flash en ligne de commande A. INTRODUCTION B. INSTALLATION FIREFOX 1. Création d'environnement 2. Téléchargement et vérification de la signature 3. Installation de firefox 4. Démarrage de l'application C.... www.commentcamarche.net/faq/sujet-4785-logiciel-libre-installation-firefox-2-0-java-flash
[Debian] Debian GNU/Linux 4.0 AMD64 - Installation SkypeDebian GNU/Linux 4.0 AMD64 - Installation Skype 1. Téléchargement 2. Installation 3. Création de l'environnement 4. Observations 1. Téléchargement Cette étape peut être faite en tant que simple utilisateur.mkdir /home/lami20j/src cd... www.commentcamarche.net/faq/sujet-6146-debian-debian-gnu-linux-4-0-amd64-installation-skype
Environnements graphiques 2DEnvironnements graphiques 2D Enlightenment FVWM - Crystal GNOME KDE Xfce Sur le réseau Contrairement à certaines solutions propriétaires (Windows et Mac), GNU/Linux offre nativement la possibilité de choisir son bureau de travail.... www.commentcamarche.net/faq/sujet-5599-environnements-graphiques-2d
Modier une variable d'environnement (Résolu)salut, je viens de faire une recherche sur le net afin de trouver une manière pour modifier une variable environnement. j'ai un logiciel qui s'appelle wget qui marche avec l'invite commende et je souhaite créer une variable pour y... www.commentcamarche.net/forum/affich-8300172-modier-une-variable-d-environnement
[Ada 2006] Environnemnent Adacore (Résolu)Bonjour, Je souhaite développer des programmes et applications en Ada 2006 sous Linux & Windows. Pour cela, j'utilises GNAT GPL 2006, mais comment compiler, construire et créer les executables avec cet environnement. http://www.adacore.com/home/... www.commentcamarche.net/forum/affich-2397105-ada-2006-environnemnent-adacore
Recherche créateur de site internet (Résolu)Bonjour, Je suis en train de créer une entreprise de tourisme environnementale et j'aurais besoin d'une vitrine web pour mon projet. Je cherche donc qqun qui puisse créer un site web simple et pouvant faire un design sympa sur le thème de la... www.commentcamarche.net/forum/affich-5188579-recherche-createur-de-site-internet
Télécharger Visual C++ 2008 ExpressVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C. www.commentcamarche.net/telecharger/telecharger-34056350-visual-c-2008-express
Télécharger Theme Maker Pour obtenir de bons résultats, il faut travailler dans les meilleures conditions et un environnement de travail personnalisé. Theme Maker est un programme qui donne la possibilité de personnaliser, de créer ou de changer vos curseurs, vos icônes et... www.commentcamarche.net/telecharger/telecharger-34055874-theme-maker
Télécharger Driver scanner CanoScan LiDE25Le scanner CanoScan LiDE 25 de Canon est un scanner à plat de bureau. C’est un scanner qui s'intègre à n'importe quel environnement de création. Il est seulement alimenté via la connexion USB. Il nécessite aucun adaptateur secteur. Il intègre la... www.commentcamarche.net/telecharger/telecharger-34056939-driver-scanner-canoscan-lide25
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-achat/creative-live-cam-video-im-658868-fiche-technique
SimCity CreatorDéveloppeur:Maxis, Genre:Simulation, Avis ESRB :Everyone 6+, Other Names:Sim City Creator www.commentcamarche.net/guide-achat/simcity-creator-1131934-fiche-technique
Creative Live! Cam Optia AFUSB, 1600x1200 Pixels, 30 fps, Résolution vidéo maximale:1600x1200 Pixels, Page web du produit:Anglais, Mode photographie, Résolution image fixe:3200x2400, Mise au point:Automatique, Microphone, Logicels inclus:Creative Live!® Cam Center, Cam Manager, Cam www.commentcamarche.net/guide-achat/creative-live-cam-optia-af-921839-fiche-technique
Prix du reportage multimédia : le jury récompense un docu sur le recyclage des CD et DVD(Paris - Relax news) - MSN.fr et Rue89 ont lancé la première édition du concours "Prix du reportage multimédia" avec comme thème cette année l'environnement. Plus d'une centaine de vidéos ont été créées par les internautes. Les prix, qui ont été remis... www.commentcamarche.net/actualites/prix-du-reportage-multimedia-le-jury-recompense-un-docu-sur-le-recyclage-des-cd-et-dvd-5846654-actualite.php3
Faîtes jouer votre animal de compagnieLes jeux inventés par le laboratoire de réalité mixte de Singapour visent à créer un environnement où un joueur réel entre en interaction avec un joueur virtuel. Dans Mice Arena, le joueur réel n'est pas moins qu'un hamster, navigant dans une cage... www.commentcamarche.net/actualites/faites-jouer-votre-animal-de-compagnie-2210666-actualite.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
SQL - Création de tableLe SQL, comportant un langage de définition de données (LDD), permet de créer des tables. Pour cela, il utilise le couple de mots clés CREATE TABLE. La création de tables Le création de tables se fait à l'aide du couple de mots-clés CREATE... www.commentcamarche.net/contents/sql/sqlcreate.php3