Docker – Registry avec GitLab

La registry est un dépôt d’images docker. Son utilisation est centrale dans l’architecture que je veux metttre en place comme indiqué dans Docker – un pas vers la registry. Il restait le choix d’utiliser Gitlab en tant que Registry ou bien l’implementation conteneur registry de docker même.

Sauvegarde et sécurité

Le registry sera un élément de l’infrastructure et en tant que tel il devra être sauvegardé. Or le service Gitlab est déjà defini avec un mapping vers le systèmes de fichier hôte. Sauvegarder ce montage permet de sauvegarder toutes les données de Gitlab: sources et registry !

De plus l’utilisation du registery impose de s’y connecter en HTTPS. Le client docker (docker CLI) est configuré ainsi par défaut. Je vais garder ce paramétrage qui sera fort utile dans le cas où je voudrais déplacer mon registry ailleur que sur localhost.

Il faut donc mettre en place un frontal pour faire le TLS, or mon service gitlab est déjà dernier un proxy SSL.

Enfin mon besoin de limiter les droits des accès de la production et de la préprod en lecture au registry et dépôt de source est déjà pris en charge par des mécanismes de clé et de jeton de déploiement.

Toutes ces considérations me font choisir l’utilisation du registry intégré à Gitlab.

Mise en oeuvre

Sa mise en oeuvre est très simple. Le fichier docker-compose.yml devient:

version: "3.7"
services:

 web:
   image: 'gitlab/gitlab-ce:latest'
   restart: always
   hostname: 'gitlab.bressure.net'
   environment:
     GITLAB_OMNIBUS_CONFIG: |
       external_url '//gitlab.bressure.net'
       nginx['listen_port'] = 80
       nginx['listen_https'] = false

       registry_external_url '//registry.bressure.net'
       registry_nginx['listen_portex'] = 80
       registry_nginx['listen_https'] = false
       # Add any other gitlab.rb configuration here, each on its own line

       gitlab_rails['gitlab_shell_ssh_port'] = 2222
   ports:
      - '8080:80'    
      - '2222:22'
      
   volumes:
     - '/srv/gitlab/config:/etc/gitlab'
     - '/srv/gitlab/logs:/var/log/gitlab'
     - '/srv/gitlab/data:/var/opt/gitlab'

Il suffit déclarer l’url externe du registry pour que gitlab affiche le lien dans l’interface du projet. Voici le schéma d’architecture :

Il permet l’utilisation suivante:

  1. sur la machine hôte on développe avec un éditeur
  2. COMMIT en local
  3. exécute en local et dans le cas particulier qui me concerne on lance un conteneur dit de DEV en local
  4. on verifie le fonctionnement attendu (test)
  5. on pousse les source sur GitLab par un PUSH
  6. on pousse eventulement l’image dans le registry

On remarque la mise à disposition de la preprod et à la prod des livrables se fait par 2 biais selon le type de livrable:

  • repository Git (Gitlab) pour les applications afin d’obtenir leur composition en terme de services ie en terme d’images. Il s’agit concrètement récupérer les fichiers docker-compose.yml
  • registry docker (Gitlab) pour les images. Je fais finir par y arriver quand les images actuelles ne me suffiront plus…

CI /CD

On remarque que les étapes 3,4 et 6 pourraient être effectuées par l’Integration Continue (IC). En effet une fois poussée sur Gitlab, le code doit passer des tests. Si ces derniers sont concluants, un livrable doit être produit (jar, ear, image docker….) et dans la cas d’application on peut même déployer directement en preprod.

Cela ouvre la voie vers l’exploration de la construction.

A suivre dans le prochain billet

Ransomware Linux

Il est loin le temps où avoir une machine  sous Linux protégeait des attaques des Virus. Quand j’ai commencé à héberger mon site web, au début des années 2000 j’avais utilisé un serveur Web dédié  (Savant Web serveur) sur Windows et j’avais été très étonné de constater le nombre de tentative  d’accès à des répertoires système de L’OS.  Ces tentatives échouaient car le serveur Web n’était pas IIS….

Depuis j’ai passé toutes mon informatique personnelle en GNU/Linux et je n’ai jamais été confronté à des attaques…. jusqu’à la semaine dernière.

Les pirates ciblent désormais également les machines Linux. Ainsi mes fichiers de disques de VM se sont mis à être renommés avec des suffixes .enc ! Ce que je pensais être un problème d’espace dans ma VM était bel et bien une attaque d’un virus de type ransomware. Tous mes fichiers personnels ainsi que la configurations apache et celle du serveur DNS étaient cryptées.

Heureusement que j’ai des sauvegardes… mais le désagrément causé est certain: rupture de service, éventuelle perte de données (de quand date la dernière sauvegarde?). On ne pense jamais assez aux sauvegardes ! La première chose à faire façe à une infection que l’on ne peut pas éradiquer (manque de littérature et désintérêt des éditeurs) est de limiter la casse. Arrêter le système car le virus à réussi à obtenir les droits root ou du groupe root puisqu’il chiffre des fichiers en écriture à root. Donc arrêter le système puis débrancher le câble d’alimentation ! Ensuite démarrer depuis une clé usb de type live-cd pour récupérer ce qui peut l’être. Enfin réinstaller le système complètement.

Après l’incident il faut également cherchez à s’en prémunir. Comment une telle infection à pu survenir ? Il y a 2 ou 3 semaines mon  serveur n’a pas redémarré sur échec de montage d’un Volume logique. Suite à cet étrange incident je n’avais trouvé comme solution que de démarrer sur un kernel précédent: coïncidence ou la première étape de l’attaque ? M’obliger à utiliser un kernel ancien contenant des failles ?

Ne jamais utiliser de kernel non à jour !

Leçon à retenir: Linux n’est plus sous les radars. Il faut donc s’équiper d’antivirus et d’antispam. Les solutions existent:clamav et spamassasin.

Juste pour le plaisir… CC-BY-SA

Une distribution libre et humanitaire: Emmabuntüs

Dans ma quête de la distribution libre et peu gourmande en ressource, je suis arrivé à la conclusion que Debian/LXDE est pour moi le couple idéal pour faire fonctionner mes machines sans avoir à me soucier de changer de processeur tous les 2 ans ni d’augmenter la quantité de mémoire vive tous les 4 ans. Je trouve en effet que c’est une bêtise de consommer 800Mo de RAM juste pour afficher le bureau… Cette solution est tellement économique en ressource que je peux faire fonctionner un portable de 2008 acheté en occasion et sur lequel j’ai dû malheureusement supprimer le système privateur installé par le reconditonneur.

Le bureau LXDE encore moins gourmand que XFCE s’avère être un choix de premier plan pour toutes les machines d’occassion. L’utilisation de matériel reconditionné n’est pas seulement une contrainte économique mais également un acte écologique et politique. Il ne manquait plus qu’une distribution dans ce sens à l’opposé de la surenchère de puissance que l’on constate dans les magasins en cette période de débauches festives où l’Hommo-economicus perd la raison. Cette distribution s’appelle Emmabuntüs disponible sur sourceforge

Ubuntu a-t-il mal vieilli ?

Je conseillais jusque là Ubuntu comme distribution linux pour débutant à cause de sa simplicité d’utilisation mais j’avais arrêté de mettre à jour mon système restant sur une LTS il y a 2 ou 3 ans. En effet l’interface Unity, de plus en plus gourmande ne m’intéressait plus. Finalement j’ai migré vers Debian il y a quelque mois. A vrai dire le couple Debian/LXDE me donne entièrement satisfaction !

On m’a demandé récemment quelle distribution pour un windosien ? J’ai répondu Ubuntu car c’est celle qui m’avait permis d’introduire Linux à la maison en 2006. Mais Ubuntu a mal vieilli. Le windosien est revenu vers moi, complètement perdu pas l’interface Unity, dérouté pas les explications et conseil du magazine Ubuntu dans lequel il avait eu des CD d’installation de la toute derniére version 14.10.

Si certains défauts sont classiques, comme celui de la dalle LCD de résolution non standard que l’installeur ne pourra configurer tout seul, d’autres posent problême lors du passage de windows à ubuntu. Celui qui est habitué à de vieux windows (Menu démarrer, Mes Programmes etc) risque d’être perdu par Unity. La présence d’une icône Amazon chantre du commerce electronique et producteur de la liseuse qui efface vos livres peut dérouter celui à qui on vanté les vertues du libre et de sa gratuité de fait. Le gestionnaire d’application d’ubuntu sélectionne également certaines applications pour effectuer des tâches données: quid de la liberté de l’utilisateur ?

Est-ce pour autant des défauts ? Ubuntu permet de choisir un bureau différent tel que LXDE pour celui qui comme moi préfère une interface vieillote. Le choix de Canonical de mettre en avant certains logiciels peut être mis sur le compte de la cohérence d’ensemble. Cela est le rôle du fournisseur de la distribution. Pour autant le gestionnaire de paquet synaptic permettra d’installer tous les paquets issus de Debian.

Heureusement dans le monde du libre, le choix n’est pas un vain mot. On pourra se retourner vers une distribution plus soucieuse de l’éthique telle que Debian ou pour les puristes gNewSense ou Trisquel adoubées par la FSF.

Statistique Dollar Universe ou Baby Perl

Je n’apprends de nouveau langage que si nécessaire…. ainsi il y a 4 ans j’ai appris le python qui fut un véritable plaisir ou bien le WLangage (avec moins de plaisir….). Hier je devais produire des statistiques d’exécution de batch lancés par l’ordonnanceur Dollar Universe (connu aussi sous le nom $U), un outil obsolète, propriétaire dont la fonction statistique est vraiment minimaliste.

En effet la commande obscure livrée avec $U permet d’avoir sous forme textuelle, l’état de chaque batch avec la date d’exécution, l’heure de début et l’heure de fin. Quid des traitements qui démarrent avant minuit et finissent après… on aurait aimé avoir la date de fin également, mais bon $U est un outils basique et payant, n’en demandons pas trop.

Afin d’agréger le résultats par batch et faire quelques statistiques (max, min, moyenne dans un premier temps), un petit programme Perl semblait tout indiqué. Voilà ce que cela donne après avoir lu 2 livres: Modern Perl et Impatient Perl , du baby perl tout craché! Le couteaux suisse de l’administrateur Unix/Linux ne dément pas sa réputation: il fait le boulot !

Le script suivant prend en entrée le résultat de la commande d’état des batchs de $U et recrache sur la sortie standard un CSV. Alternativement on peut lui passer en argument le fichier issu de $U et le fichier de sortie CSV.

#!/usr/bin/env perl
use warnings;
use DateTime::Format::Strptime;
use Text::CSV;

my %batch_stat = ();

sub get_input{
    my $num_arg =  $#ARGV + 1;
    unless ($num_arg==0) {
    open my  $input_fd , '<', $ARGV[0]
        or die "Impossible d'ouvrir le fichier $ARGV[0]";
    return $input_fd
    } 
    my $input = STDIN;
    return $input;
}

sub get_output {
  my $num_arg =  $#ARGV + 1;
    unless ($num_arg < 2) {
    open my  $output_fd , '>', $ARGV[1]
        or die "Impossible d'ouvrir le fichier $ARGV[1]";
    $output_fd -> autoflush(1);        
    return $output_fd;

    }
    my $output = STDOUT;
    return $output;
}

sub handle_line {
    my ($line) = @_;
    my $date_format = qr/\d{2}\/\d{2}\/\d{4}/;
    my $heure_format = qr/\d{4}/;
    if (  $line =~ /TERMINE\s*(?<date_exec>$date_format)\s(?<heure_debut>$heure_format)\s(?<heure_fin>$heure_format)/) {
    my @splitted = split(/\s+/,substr($line,19, length($line)));
    my $batch =  $splitted[0];
    my $date =  "$+{date_exec}";
    my $heure_debut =  "$+{heure_debut}";
    my $heure_fin =  "$+{heure_fin}";
    #print "$batch $date $heure_debut $heure_fin\n";

    my $analyseur = DateTime::Format::Strptime ->new (pattern => '%d/%m/%Y %H%M');
    my $dt_debut = $analyseur -> parse_datetime ($date .  ' ' .  $heure_debut);
    my $dt_fin = $analyseur -> parse_datetime ($date . ' ' .  $heure_fin);
    # la commande de stat de dollar univers ne précise pas la date de fin
    # mais uniquement l'heure de fin
    if ($dt_fin < $dt_debut){
        my $un_jour = DateTime::Duration -> new (days => 1);
        $dt_fin -> add_duration($un_jour);
    }
    my $duree = $dt_fin - $dt_debut;
    my $duree_minutes = $duree -> in_units('minutes');

    unless(exists($batch_stat{$batch})){
        #my %info = qw (min 0 max 0 moyenne 0 nb 0);
        $batch_stat{$batch}= {
        min => $duree_minutes,
        max => $duree_minutes,
        moyenne => 0,
        nb => 0        
        };
        #print "nouveau stat de batch cree \n";
    }
    my $current_nb = $batch_stat{$batch}{nb};
    $batch_stat{$batch}{nb} = $current_nb + 1;
        $batch_stat{$batch}{'min'} = $duree_minutes if $duree_minutes < $batch_stat{$batch}{'min'};
        $batch_stat{$batch}{'max'} = $duree_minutes if $duree_minutes > $batch_stat{$batch}{'max'};
    $batch_stat{$batch}{'moyenne'} = ( $batch_stat{$batch}{'moyenne'} * $current_nb + $duree_minutes ) / $batch_stat{$batch}{nb};

    }

}

my $real_input = get_input();

while (<$real_input>)
{
    handle_line($_);

}
#print Dumper \%batch_stat;

my $real_output = get_output();

my @entetes = ('batch','nb_exec','temp_min','temp_max','temp_moy');

$csv = Text::CSV -> new();
$csv -> print($real_output, \@entetes);
$real_output -> say();

foreach my $batch_name (keys(%batch_stat)) {
    my @column = ($batch_name,  $batch_stat{$batch_name}{nb}, $batch_stat{$batch_name}{min}, $batch_stat{$batch_name}{max}, $batch_stat{$batch_name}{moyenne} );
    $csv -> print($real_output, \@column);
    $real_output -> say();
}

Passons à TLS

Bien que SSL soit supplanté par son successeur TLS, il reste quand même encore utilisable car bien des serveurs le garde comme protocole au cas où un client ne supporterait pas TLS. L’enfer est pavé de bonnes intentions…. si SSLv2 est aujourd’hui considéré comme défaillant, ce n’est pas le cas de SSLv3 qui reste encore dans les bonnes grâces de la configuration de apache2 sous Debian 7. En effet dans le fichier /etc/apache2/mods-enabled/ssl.conf on trouve:

SSLProtocol all -SSLv2

Ce qui indique l’utilisation possible de  TLS et de SSLv3. Malheureusement une information parue sur le site américain NVD qui recense les vulnérabilités des logiciels, SSL est intrinsèquement vulnérable (y compris SSLv3) à l’attaque de l’homme du milieu. Cela veut dire qu’il faut absolument ne plus utiliser SSL mais son successeur TLS.

La mise en place du banissement de SSL dans nos serveurs web consiste à le supprimer de la liste des protocoles utilisables par apache. Dans le fichier ssl.conf il suffit de mettre:

SSLProtocol all -SSLv2 -SSLv3

On pourra également en profiter pour hausser si n’est déjà fait le niveau de cryptage (algorithmes utilisés) que le serveur accepte de faire. Le monde libre (et donc gratuit) ne laisse aucune excuse au client qui n’utilise pas un logiciel récent et supportant les algorithmes de chiffrement les plus sûrs. Toujours dans le fichier ssl.conf il suffit de mettre:

SSLCipherSuite HIGH:!ADH:!MD5

Debian dans les heures sombres du libre | hidden.bressure.net

L’orateur, Stefano Zacchiroli, nous explique quelles sont les motivations qui lui ont fait adhérer au libre et pourquoi l’adoption du libre est selon lui à un tournant. En cause le cloud, contre lequel Stallman propose le rejet mais Zacchiroli préfère poser la question de la solution que peut apporter Debian (et les développeurs de distributions) pour offrir une solution libre au moins équivalente aux cloud privateurs de liberté.

 Debian_in_the_Dark_Ages_of_Free_Software

 

 

Billet posté initialement sur mon blog caché avec Tor:Debian dans les heures sombres du libre | hidden.bressure.net.

Introduction au logiciel libre et la libération du cyberespace

La vidéo suivante montre l’intervention de Richard Stallman, l’inventeur du logiciel libre, lors d’une conférence à Genève en avril dernier. Stallman montre en un peu plus d’une dizaine de minute les concepts clés dernière le logiciel libre:

  • liberté des utilisateurs contre le développeur
  • liberté de diffusion
  • liberté de modification
  • choix éclairé pour protéger sa propre liberté
TEDxGE2014_Stallman05_LQ
Richard Stallman à Genève en Avril 2014

La lecture des livres suivants permet d’aller plus loin dans la réflexion:

  1. Free as in freedom
  2. Free Software Free society

Plus de 6300 relais Tor actifs | hidden.bressure.net

L’usage de Tor grandit de jour en jour. Le nombre de relais en service s’est encore accru. Il y a en a plus de 6000 maintenant (observé le 2 septembre) . Tor est un réseau de machine qui permet d’anonymiser au sens de l’adresse IP le client (ex: navigateur web) par rapport au serveur (le serveur ne connait pas qui est le client réellement) et inversement d’anonymiser le serveur au sens de l’adresse IP (ex: un serveur web) par rapport aux clients (qui ne connaissent pas qui est le serveur). C’est un puissant outil pour braver la censure, plus d’info sur la promotion de tor tor challenge ou en lisant mon billet.

relais-tor

Plus de 6300 relais Tor actifs | hidden.bressure.net.