juin 25 2008

Debian weather est de retour !

Tag: Actualités, Debian GNU/LinuxSylvain @ 12:58

Debian Weather est un service non-officiel de Debian permettant d'avoir une indication sur la bonne santé de sa distribution préférée. Cette bonne santé, exprimée en %, est calculée simplement en divisant le nombre de paquets cassés (où toutes les dépendances ne sont pas satisfaites) par le nombre de paquets disponibles (uniquement la section « main »). Ce calcul est effectué chaque jour pour chaque distribution et pour chaque architecture, les résultats étant présentés sous forme d'icônes météo :

: % de paquets cassés <= 1%

: % de paquets cassés <= 2%

: % de paquets cassés <= 3%

: % de paquets cassés <= 4%

: % de paquets cassés <= 100%

Sources :


mai 29 2008

Faire du SFTP dans un chroot avec scponlyc

Tag: Debian GNU/Linux, SystèmeSylvain @ 06:39

Commençons tout d'abord par expliquer les quelques termes alambiqués du titre de ce billet pour les néophytes :

  • SFTP signifie « Secure File Transfer Program », c'est un programme permettant de transférer des fichiers en utilisant une liaison chiffrée par SSH (Secure SHell) ; attention à ne pas confondre SFTP avec FTPS qui signifie pour sa part « File Transfer Protocol over SSL » !
  • chroot est un programme permettant de changer le répertoire racine d'un processus afin que ce dernier n'ai accès qu'à une partie limitée de l'arborescence.
  • scponlyc est un shell limité destiné uniquement aux transferts de fichiers dans un chroot.

Le but du jeu est donc de permettre à un utilisateur de transférer des fichiers sur un serveur de manière sécurisée sans qu'il n'obtienne pour autant un shell et sans qu'il lui soit permit de voir l'arborescence du serveur. Nous utiliserons pour l'exemple, la version 4.7 d'OpenSSH livrée avec Debian Testing.

Démarrons par l'installation du paquet scponly :

root@gnusquad:~# aptitude install scponly

Un script permettant de créer un compte utilisateur destiné au SFTP chrooté a été installé dans le répertoire « /usr/share/doc/scponly/setup_chroot/ », exécutons le en utilisant les réponses par défaut aux questions :

root@gnusquad:~# cd /usr/share/doc/scponly/setup_chroot/
root@gnusquad:/usr/share/doc/scponly/setup_chroot# gunzip setup_chroot.sh.gz
root@gnusquad:/usr/share/doc/scponly/setup_chroot# chmod +x setup_chroot.sh
root@gnusquad:/usr/share/doc/scponly/setup_chroot# ./setup_chroot.sh

Next we need to set the home directory for this scponly user.
please note that the user's home directory MUST NOT be writeable
by the scponly user. this is important so that the scponly user
cannot subvert the .ssh configuration parameters.

for this reason, a writeable subdirectory will be created that
the scponly user can write into.

Username to install [scponly]
home directory you wish to set for this user [/home/scponly]
name of the writeable subdirectory [incoming]

creating  /home/scponly/incoming directory for uploading files

Your platform (Linux) does not have a platform specific setup script.
This install script will attempt a best guess.
If you perform customizations, please consider sending me your changes.
Look to the templates in build_extras/arch.
 - joe at sublimation dot org

please set the password for scponly:
Enter new UNIX password:
Retype new UNIX password:
passwd : le mot de passe a été mis à jour avec succès
if you experience a warning with winscp regarding groups, please install
the provided hacked out fake groups program into your chroot, like so:
cp groups /home/scponly/bin/groups

Un compte utilisateur contenant les fichiers nécessaires au chroot a été créé dans « /home/scponly/ », celui-ci est presque complet, il ne lui manque que le fameux « /dev/null » que nous allons créer à la main :

root@gnusquad:/usr/share/doc/scponly/setup_chroot# cd ~scponly
root@gnusquad:/home/scponly# mkdir dev
root@gnusquad:/home/scponly# mknod -m 666 dev/null c 1 3

Dernière étape avant que ça ne fonctionne : pour pouvoir utiliser le programme « scponlyc », il faut que celui-ci soit exécuté avec les droits root ; pour cela, il faut placer le « sticky bit » sur l'exécutable « scponlyc » :

root@gnusquad:/home/scponly# chmod u+s $(which scponlyc)

Il est maintenant temps de tester notre compte chrooté : nous allons créer un fichier et l'envoyer à l'utilisateur « scponly » grâce au répertoire accessible en écriture « incoming » :

root@gnusquad:/home/scponly# cd
root@gnusquad:~#  echo "coucou" > test.txt
root@gnusquad:~#  scp test.txt scponly@localhost:incoming
scponly@localhost's password:
test.txt                                                           100%    7     0.0KB/s   00:00

Vérifions maintenant que le chroot fonctionne bien en utilisant « sftp » :

root@gnusquad:~# sftp scponly@localhost
Connecting to localhost...
scponly@localhost's password:
sftp> ls
bin       dev       etc       incoming  lib       usr
sftp> cd incoming
sftp> ls
test.txt
sftp> quit

Voilà, tout fonctionne correctement ! Notez cependant que toute cette procédure ne sera bientôt plus nécessaire avec les futures releases d'OpenSSH qui inclueront la possibilité de définir des chroot directement dans le fichier de configuration ce qui évitera par la même occasion de devoir mettre à jour son chroot lors de mise à jour de sécurité touchant les fichiers de celui-ci si l'on s'intéresse un tant soit peu à la sécurité ! :-)

Source :


mai 20 2008

Problème de tâche planifiée : méfiez-vous de run-parts

Tag: Debian GNU/Linux, SystèmeSylvain @ 12:51

J'ai créé, il y a quelques temps, un petit script répondant au doux nom de « bonne_bouffe.sh » (m'avertissant par mail lorsqu'il y a de la pizza succulente à la brasserie du coin ;-) ) que je voulais exécuter une fois par semaine ; j'ai donc créé une tâche planifiée (un « cron job ») en créant un lien symbolique vers mon script dans le répertoire « /etc/cron.weekly », jusque là tout va bien sauf qu'au bout de quelques semaines je n'avais toujours rien reçu !

Aujourd'hui, je décide donc d'aller jeter un œil dans les logs sans y trouver de traces d'exécution de mon script alors que ses petits copains dans le répertoire étaient eux, bien exécutés !

Que diable se passe t-il ? Pour le savoir, il faut chercher la manière dont sont lancées ces tâches planifiées. Un petit tour dans le fichier « /etc/crontab » nous montre ceci :

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Nous voyons donc que les tâches sont exécutées grâce à la commande « run-parts ». Intéressons-nous au manuel de cette commande : « man run-parts ».

run-parts exécute tous les fichiers exécutables situés dans répertoire, et dont le nom satisfait les contraintes décrites ci-dessous. Les autres fichiers sont ignorés.

Si ni l’option --lsbsysinit ni l’option --regex n’est pas utilisée, alors les noms ne doivent être constitués que de lettres minuscules ou majuscules, de chiffres, de tirets de soulignement (« underscore ») ou de tirets.

Le problème apparaît alors clairement : notre lien symbolique, reprenant le nom du script, contient un point et n'est donc pas exécuté !

Deux solutions s'offrent alors à nous pour résoudre ce problème :

  • ajouter l'option « --lsbsysinit » à « run-parts » pour les 4 lignes présentes dans « /etc/crontab »
  • renommer le lien symbolique « bonne_bouffe.sh » en « bonne_bouffe »

Personnellement, j'ai choisi la seconde solution afin de coller à la façon de faire de Debian ;-)


mai 06 2008

Se balader efficacement dans les répertoires avec Bash

Tag: Debian GNU/Linux, SystèmeSylvain @ 17:55

Se balader dans les répertoires à partir d'un shell peut vite devenir fastidieux si l'on ne connaît pas quelques raccourcis, en voici quelques-uns qui vous ferons gagner du temps.

Tout d'abord, commençons par un petit rappel pour les plus néophytes d'entre nous : le changement de répertoire. Nous avons ici, respectivement, l'entrée dans le répertoire « test » puis le retour au répertoire parent grâce aux « .. » :

user@gnusquad:~$ cd test
user@gnusquad:~/test: cd ..
user@gnusquad:~$

La base étant rappelée, passons aux astuces plus intéressantes.
Le retour au répertoire utilisateur peut se faire de maintes façons, je vous laisse choisir la plus rapide ;-) :

user@gnusquad:~/test$ cd
user@gnusquad:~$
user@gnusquad:~/test$ cd ~
user@gnusquad:~$
user@gnusquad:~/test$ cd $HOME
user@gnusquad:~$

Comme vous venez de le voir, « ~ » correspond au répertoire personnel de l'utilisateur en cours (en anglais : sa « homedir») ; par extension nous pouvons suffixer ce « ~ » par le login de n'importe quel utilisateur pour atterrir directement dans son répertoire personnel (pour information : cette donnée se trouve, par défaut, dans le 6ème champ du fichier « /etc/passwd ») :

user@gnusquad:~$ cd ~www-data
user@gnusquad:/var/www$
user@gnusquad:~$ cd ~www-data/blog
user@gnusquad:/var/www/blog$

Imaginons maintenant que nous souhaitions revenir dans le répertoire précédent, deux possibilités s'offrent à nous : une, extrêmement simple et rapide et une autre, plus longue, qui à vrai dire, n'est là que pour vous signaler l'existence de la variable « OLDPWD » qui peut être utile lors de l'écriture d'un script :

user@gnusquad:~$ cd /var/www
user@gnusquad:/var/www$ cd -
user@gnusquad:~$
user@gnusquad:~$ cd /var/www
user@gnusquad:/var/www$ cd $OLDPWD
user@gnusquad:~$

Lorsque vous jonglez avec différents répertoires, il peut être pratique de les assigner à des variables pour ne pas devoir les taper systématiquement. Notez que vous pouvez très bien les utiliser en tant qu'arguments (exemple sur le billet « Modifier le contenu d’une révision dans un référentiel Subversion ») :

user@gnusquad:~$ WWW=/var/www
user@gnusquad:~$ SVN=/var/local/lib/svn/blog
user@gnusquad:~$ cd $WWW
user@gnusquad:/var/www$ cd $SVN
user@gnusquad:/var/local/lib/svn/blog$

Pour récupérer le chemin du répertoire courant dans une variable, on utilisera la commande « pwd » dans un sous-shell « $(xxx) ou `xxx` » :

user@gnusquad:/var/local/lib/svn/blog$ BLOG=$(pwd)
user@gnusquad:/var/local/lib/svn/blog$ BLOG=`pwd`

Une dernière astuce pour clôturer ce billet est l'utilisation d'un nouveau shell ce qui permet d'effectuer tout un tas d'opérations puis de retourner instantanément dans le répertoire précédent en appuyant simplement sur CTRL+D (commande « logout ») :

user@gnusquad:~$ bash
user@gnusquad:~$ cd /var/log/
user@gnusquad:/var/log$ ...
user@gnusquad:/var/log$ ^D (CTRL+D)
user@gnusquad:~$

À titre d'information, il existe 3 commandes dédiées aux répertoires que je n'ai pas présenté parce qu'à mon sens, pas très pratiques. Je vous laisse consulter le manuel de « Bash » pour avoir l'aide des fonctions suivantes : « pushd », « popd » et « dirs ».


« Page précédentePage suivante »