Aller au contenu principal

Par définition, la version Sid de la distribution Debian n’est pas stable. Sa mise à jour peut provoquer quelques difficultés et nécessite d’avoir du temps devant soit.

Or de nos jours, les mises à jour sécurités sont presque quotidiennes. Heureusement il existe un outil, debsecan, qui permet de ne mettre à jour que les paquets qui corrigent des failles de sécurité.

Une fois ce paquet installée, la ligne de commande magique est la suivante :

aptitude install $(debsecan --suite sid --only-fixed --format packages)

Pour les personnes sous Ubuntu et Debian, même avec un shell bash encore vulnérable, c’est le shell dash qui est utilisé par défaut pour les appels systèmes. Ceci permet de réduire grandement le périmètre des attaques potentielles.

Pour vérifier que dash est bien le shell par défaut, la commande ls -l /bin/sh devrait afficher /bin/sh -> dash. Si c’est /bin/sh -> bash qui s’affiche, il faut alors installer dash et répondre positivement à la question «Use dash as the default system shell (/bin/sh)?».

Si dash est déjà installé mais qu’il n’est pas le shell par défaut, alors lancer dpkg-reconfigure dash pour effectuer le changement de shell par défaut.

You are using emacs and you want to write text or code with nice little characters like: «♥∫♬‡☮✭∏ψ♻ℵ»? So this post is for you. The other 99.999% of the population can pass their way with no regret.

First learn a little bit about Abbrev in the emacs manual. Then download this file. At least edit the abbrev-table with M-x edit-abbrevs and insert the downloaded file, under the (global-abbrev-table) line.

That’s it! Now you can type in all the symbols presents on the following pages (thanks to their respective authors):

Each symbol is accessible with its name, following by an 0. So you can easily write alpha and α in the same phrase.

PS: Some characters are useless for me, because I can get them directly with my keyboard, configured as an international layout. I keep them because the file is generated automatically.

Après avoir installé, ou commandé, une machine sous debian, voici les dix actions supplémentaires que je trouve indispensables d’effectuer avant de commencer à utiliser sa machine.

1. Réglage des locales

J’ai eu la surprise, après la commande d’une dédibox, de voir les locales par défaut en français. J’aime bien cette langue, mais en informatique, l’anglais est de rigueur. Un petit dpkg-reconfigure locales et le problème est réglé.

2. Configuration d’apt

Ensuite je configure apt pour qu’il ne m’installe pas automatiquement les paquets recommandés:

$ cat /etc/apt/apt.conf.d/00-recommend
APT::Install-Recommends "false";

Apparemment je ne suis pas le seul à faire ainsi.

3. Installation de paquets supplémentaires

J’installe les paquets suivants, non fournis par défaut:

  • screen
  • sshfs
  • git-core
  • ethtool
  • openssh-server
  • less
  • rsync
  • iproute
  • mtr-tiny
  • bind9-host
  • iputils-ping
  • mlocate
  • rsync
  • etckeeper
  • chrony
  • tree
  • emacs23-nox

4. Configuration etckeeper

Le logiciel etckeeper permet de garder un historique des modifications dans le répertoire /etc. C’est très pratique pour annuler des interventions, pour vérifier ce qu’on a fait, ou ce qu’un autre administrateur a fait. Mais par défaut le logiciel commit automatiquement les modifications présentes dans le répertoire, soit une fois par jour, soit à chaque appel d’aptitude (ou apt-get) qui installe ou supprime un logiciel. C’est pourquoi je dois le configurer pour empêcher ces commits automatiques.

AVOID_DAILY_AUTOCOMMITS=1
AVOID_COMMIT_BEFORE_INSTALL=1

5. Configuration du démon ssh - première partie

Je blinde ensuite le démon ssh. Voici les lignes que je modifie:

X11Forwarding no

PermitRootLogin no

PasswordAuthentication no

AllowUsers admin etc…

En gros:

  • je désactive l’envoi de session X11;
  • je désactive l’authentification par mot de passe - seul la connexion par clé reste possible;
  • j’explicite précisément les utilisateurs autorisés à se connecter.

6. Désactiver l’affichage des versions des logiciels

Bon, je sais, la sécurité par l’obscurité c’est pas bien. Mais mon côté parano me dit que cela ne peut pas faire de mal non plus. Ce n’est pas la peine de tendre le bâton pour être battu, même si une personne motivée trouvera un bâton de toute façon.

Apache

Dans le fichier conf.d/security j’active les balises suivantes:

ServerTokens Prod
ServerSignature Off

Sshd: deuxième partie de la configuration du démon ssh

Les dernières version de ssh permettent d’éviter l’affichage de la version de debian par le démon ssh. Il suffit pour cela d’ajouter la directive suivante:

DebianBanner no

7. En vrac: configuration des logiciels

Ensuite je configure un certains nombres de logiciels dont la configuration par défaut ne me convient pas.

Par exemple screen:

$ cat /etc/screenrc
escape ^Oo

Je choisis aussi emacs comme éditeur par défaut: update-alternatives --config editor.

8. Desinstaller portmap

Qui utilise encore NFS? Pas moi.

9. S’inscrire à la liste de debian sécurité

Si cela n’est pas encore fait, c’est le moment de s’inscrire à la liste debian security announce.

S’inscrire aussi sur les listes de chaque logiciel installé manuellement, spécialement les logiciels web.

10. Vérification nmap

Dans le doute, on vérifie une nouvelle fois que la maison est bien fermée à clé:

nmap -sT my-server
nmap -sU my-server

Foaf est une spécification XML permettant de décrire une personne (nom, prénom, email, etc.), et ses connaissances. C’est en quelque sort le web social 2.0 standardisé - comprendre utilisé uniquement par les geeks rêvant d’un monde ouvert, interopérable et conforme que personnes d’autres n’utilisent. J’en fais partie. Il me fallait donc un fichier foaf.

Après avoir parcouru les outils disponibles pour générer un fichier Foaf, j’ai jeté mon dévolu sur Morla, aux fonctionnalité attrayantes. Hélas, à cause de l’éternel problème de licence SSL non compatible avec la licence GPL, Morla n’est pas dans Debian. Et j’ai passé l’âge, mes machines surtout, de compiler moi même des logiciels.

Je me résigne à installer java pour utiliser foafme. Hélas, encore une fois, le fichier généré est ridiculement maigre d’informations. Finalement j’utilise deux outils en ligne, foafdrive et foaf-a-matic, à base de javascript, dont je compile les résultats pour obtenir la première mouture d’un fichier acceptable.

Ensuite je m’inspire d’autres fichiers trouvé sur le web pour ajouter des informations supplémentaires:

  • des dc:title un peu partout;
  • un élément vCard:ADR
  • des foaf:pastProject
  • et des foaf:currentProject

Pour finir je vérifie que mon fichier foaf est bien valide.

Prochaine étape: ajouter des contacts, en utilisant l’export foaf de Facebook.

La classe suivante permet de valider, dans symfony, une liste d’emails, entrée par l’utilisateur dans un champs de type textarea. Elle s’appuie sur le travail de la classe sfValidatorEmail.

class sfValidatorEmails extends sfValidatorBase
{

  public function __construct($options = array(), $messages = array()) 
  {
    parent::__construct(array_merge($options, array('trim' => true)), $messages);
  }

  public function doClean($value) 
  {
    $i = 0;
    $emails = explode("
", $value);
    $validator = new sfValidatorEmail($this->options, $this->messages);
    
    $cleaned_emails = array();

    try {
      foreach ($emails as $email) {
        ++$i;
        $cleaned_emails[] = $validator->clean($email);
      }
    } catch (Exception $e) {
        throw new sfValidatorError($this, 'invalid',
                                   array('line' => $i, 'bad_email' => $email));
    }
    return implode("
",$cleaned_emails);
  }

}

Les premiers fichiers du projet Libre Entreprise Mediawiki Skin viennent d’être mis en ligne. Ce modeste projet fournit un thème, une apparence, pour les sites réalisés avec le célèbre Mediawiki. Le thème fourni est celui des trois sites du réseau Libre Entreprise.

Les objectifs de ce thème étaient :

  • Être totalement différent du thème par défaut de Mediawiki, pour que l’utilisation du logiciel mediawiki ne soit pas manifeste ;
  • Simplifier, voire supprimer, la boîte à outil, trop complexe, contenant des liens inutiles pour la plupart des sites ;
  • Simplifier et alléger de la même façon le contenu du pied de page ;
  • Être lisible sur un eeepc 701, sans défilement horizontal, ou presque.

La documentation pour utiliser et configurer le thème est disponible en ligne.

Il est courant qu’un formulaire web nécessite des validateurs dynamiques, c’est à dire dépendant de certaines valeurs du formulaire lui même. Dans une des applications que j’ai écrite récemment une case à côcher permet à l’utilisateur de tester le formulaire et de ne pas enclencher l’action normale. Ainsi lorsque cette case à côcher est validée, un champs du formulaires n’est plus obligatoire, et un autre le devient.

Pour résoudre ce problème, une des solutions connue consiste à surcharger la méthode bind de la classe du formulaire, dérivée de sfForm, et de changer à la volée les validateurs.

Pour ma part je préfère exécuter ce changement dynamique de validateur dans le preValidator. Voici ce que cela donne:

 public function configure()
 {
   [...]
   $this->validatorSchema->setPreValidator(
     new sfValidatorCallback (
       array('callback' => array($this, 'isTest'))));
 }
 public function isTest($validator, $values)
 {
   if (isset($values'is_test')) {
     $this->validatorSchema['email_recipients']->addOption('required', false);
     $this->validatorSchema['test_recipient']->addOption('required', true);
   } else {
     $this->validatorSchema['email_recipients']->addOption('required', true);
     $this->validatorSchema['test_recipient']->addOption('required', false);
   }
   return $values;
 }

Le code est plus facile à maintenir: tout ce qui concerne la validation s’exécute uniquement dans des validateurs, sans passer par une méthode, bind qui n’a rien à voir avec ce processus.

Il est parfois utile que certaines tâches appartiennent à une application et soient exécutées dans un environnement donné. Ceci pour leur permettre d’accéder aux variables de configuration du fichier app.yml de l’application en question.

Pour obtenir ce résultat, il faut déclarer un argument 'application' et une option 'env', initialisés respectivement à l’application et à l’environnement souhaités. Cela une fonction configure qui commence ainsi:

class doHelloWorldTask extends sfBaseTask
{
 protected function configure()
 {
    $this->addOptions(array(
      new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name', 'backend'),
      new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
    ));
    [...]
 }

Ensuite il est alors possible d’accéder aux données du fichier app.yml de l’application en question. Exemple dans la fonction execute:

 protected function execute($arguments = array(), $options = array())
 {
   $conn_id = @ftp_connect(sfConfig::get('app_ftp_server_host')); 
   [...]
 }

L’inconvénient de cette méthode est qu’elle ne permet pas de figer l’application dans la tâche.

Les logs, sous MySQL, c'est quand même bien pratique pour voir ce qui se passe sur un serveur et pour tracer les requêtes qui plantent. Et lorsqu'on vient de changer de version de serveur MySQL pour passer à la version 5.1 pour profiter des dernières nouveautés, il est déplaisant de voir les logs disparaître.

Heureusement la solution est disponible sur le site MySQL: il s'agit d'une nouvelle option dans le fichier my.conf:

 #log dans les tables et dans le fichier
 log-output = FILE,TABLE
 
 #log dans un fichier uniquement
 log-output = FILE