PROJET AUTOBLOG


IT-Connect

Site original : IT-Connect

⇐ retour index

NAS Asustor : ADM 2.6.3 R7I3 pour plus de sécurité

mardi 19 juillet 2016 à 17:23

Asustor vient de publier une nouvelle mise à jour du système d’exploitation ADM, qui passe désormais en version 2. 6. 3.R7I3, cette mise à jour mineure apporte des améliorations au niveau de la sécurité.

maj-asustor1

– Mise à niveau vers Samba 4.4 pour corriger la vulnérabilité connue sous le nom Badlock est référencée sous la CVE-2016-2118

– Mise à niveau vers OpenSSL 1.0.2h pour patcher plusieurs vulnérabilités : CVE-2016-2105, CVE-2016-2106, CVE-2016-2107, CVE-2016-2108, CVE-2016-2109, CVE-2016-2176

– Support de deux services de notification supplémentaires : Pushbullet et Pushover

– Support de l’authentification en deux étapes (2-step verification)

On notera également la correction de divers bugs, comme un bug qui empêchait d’utiliser Let’s Encrypt avec un nom de domaine contenant un tiret.

Pour ceux qui utilisent le VPN Server et FTP Explorer, vous devrez mettre à jour ces deux apps suite à l’installation de la mise à jour d’ADM, je vous le dis car j’ai eu le cas… 🙂

Un fichier de configuration pour vos scripts bash

lundi 18 juillet 2016 à 09:30

I. Présentation

Dans ce tutoriel, nous allons apprendre à utiliser un fichier de configuration pour les scripts bash (langage de script Linux). L’utilisation d’un fichier de configuration signifie qu’un fichier, extérieur au script, contiendra les variables qui seront utilisées dans le script.

Dans un tel contexte, les scripts bash seront dépourvus de la déclaration des variables principales et utiliseront un fichier de configuration pour récupérer le contenu de ces variables. Les intérêts y sont multiples :

Bref, les apports d’un tel modèle sont multiples, tant en terme d’usage que de sécurité. Passons maintenant à l’action ! 🙂

II. Fonctionnement global

Techniquement, ce n’est pas très compliqué. Il nous faut deux fichiers :

Étant sous Linux, la nomenclature du fichier de configuration import peu. Cependant, il peut être intéressant de la normaliser au sein de votre SI pour une meilleure clarté. Par exemple :

Également, l’intérêt de disposer de plusieurs fichiers de configuration pour un même script, mais contenant des valeurs différentes, propres à chaque environnement ou serveur, comme expliqué précédemment. Ainsi, la nomenclature peut être adaptée :

Imaginons maintenant un scénario pour contextualiser une telle utilisation d’un fichier de configuration. Je souhaite écrire un script qui va faire un backup d’un répertoire, vers un autre répertoire, et qui va ensuite changer les droits de l’archive crée pour rendre cette archive disponible à un autre utilisateur. Je dispose de deux environnements :

Dans tous les cas, j’aurai donc 3 informations :

Le fonctionnement global va donc être le suivant :

Une fois mon script bien conçu, son contenu ne changera pas peut importe l’environnement dans lequel je l’utilise.

Par contre, lorsque je lancerai mon script, je lui indiquerai un fichier de configuration à utiliser et en fonction, il effectuera les actions relatives à l’environnement de production ou de développement.

J’espère que ce contexte est clair, nous allons maintenant voir comment techniquement effectuer cela.

III. Construire son fichier de configuration

Le fichier de configuration n’est rien d’autre qu’un script bash qui déclare des variables, voici un exemple de fichier de configuration :

# fichier de configuration : script.sh
aBackuper="Chemin du répertoire à sauvegarder"
dest="Chemin vers la destination"
owner="utilisateur"

Dans notre contexte, j’aurai donc deux fichiers de configuration (ou plus si nécessaire :). Le premier nommé « config-prod.txt« :

# fichier de configuration : script.sh
aBackuper="/srv/tomcat"
dest="/home/emile/tomcat.zip"*
newOwner="emile"

Le second « config-dev.txt » :

# fichier de configuration : script.sh
aBackuper="/opt/tomcat"
dest="/home/john/tomcat.zip"
newOwner="john"

Voila, maintenant que nos différents fichiers de configuration sont prêts, nous pouvons les utiliser !

IV. Import dans le script bash et utilisation

Très simplement, voici le script bash utilisé pour mon opération :

#!/bin/bash

# Archivage du répertoire
zip -r $dest $source

# Changement du propriétaire
chown $newOwner:$newOwner $dest

Pour importer un fichier de configuration, j’utiliserais la commande « source » dans mon script :

#!/bin/bash
source config-prod.txt

# Archivage du répertoire
zip -r $dest $aBackuper

# Changement du propriétaire
chown $newOwner:$newOwner $dest

Selon l’utilisation, ce fichier peut être hardcodé (écrit en dur, comme ci-dessus) ou variabilisé. La seule variable à passer à notre script sera donc le nom du fichier de configuration à utiliser :

#!/bin/bash
source $1

# Archivage du répertoire
zip -r $dest $source

# Changement du propriétaire
chown $newOwner:$newOwner $dest

Pour utiliser mon fichier de configuration, j’utiliserais la commande suivante, par exemple pour l’environnement de production

./script.sh config-prod.txt

Ainsi, si je pointe vers config-prod.txt, c’est le répertoire /srv/tomcat qui sera sauvegardé dans /home/emile/tomcat.zip. Si je pointe vers le fichier config-dev.txt, c’est le répertoire /opt/tomcat qui sera sauvegardé dans /home/john/tomcat.zip. Tout cela, sans changer le contenu de notre script !

Également, il est possible de faire en sorte que si aucune fichier de configuration n’est précisé en paramètre, un fichier de configuration « par défaut » sera chargé. Ce qui permet une utilisation rapide :

#!/bin/bash

if [ -z "$1" ]
then
    source config-prod.txt
else
    source $1

# Archivage du répertoire
zip -r $dest $source

# Changement du propriétaire
chown $newOwner:$newOwner $dest

Ici, si aucun fichier de configuration n’est passé en paramètre, alors le fichier « par défaut » config-prod.txt est utilisé. Si un fichier de configuration est passé en paramètre (« $1« ), alors il sera utilisé !

Je vous dois un petit mot sur la commande « source« , native sous Linux, qui nous permet d’effectuer tout cela.

La commande source permet de charger un fichier bash dans le shell actuel. Les opérations, et notamment nos fameux fichiers de configuration, qui ne sont rien d’autres que des fichiers bash définissant des variables. La commande source est souvent mise en comparaison avec le « . » utilisé pour lancé un script habituellement, exemple :

. monscript.sh

La différence majeur entre « . » et « source » est donc que « . » fait naître un nouveau shell (processus enfant) alors que « source » exécute le bash dans le shell actuel. Nous pouvons donc nous en servir dans un script pour importer des variables ou des fonctions ! 🙂

L’exemple ici présenté ne contient que quelques variables et lignes. Pour des scripts plus complexes dans lesquels les variables sont déclarées un peu partout, un tel fichier de configuration peut être d’une grande aide.

Les processus zombies

mercredi 13 juillet 2016 à 09:30

I. Présentation

Au cours de leurs échanges avec le système et les programmes, les processus sont amenés à modifier leur état pour indiquer leur disponibilité. Ces changements sont le plus souvent dus à un besoin en ressources mémoire ou matérielle, à l’écriture de données ou encore à une attente (comme une action utilisateur).

Les états les plus connus sont l’état R (en cours d’exécution), S (en sommeil), T (stoppé) ou encore Z (zombie). Ce dernier est particulier, car il désigne un processus qui, bien qu’ayant terminé son exécution, reste présent sur le système, en attente d’être pris en compte par son père.

II. Comment les processus zombies apparaissent ?

Quand un processus se termine normalement, le système désalloue les ressources qui lui avaient été attribuées (code, données, pile d’exécution) tout en conservant son bloc de contrôle. Le système va ensuite attribuer l’état TASK_ZOMBIE au processus fils, qui se traduira par l’état Z (Zombie) que l’on peut observer avec la commande ps. Le processus père sera ensuite prévenu, à l’aide du signal SIGCHLD, que son fils vient de finir sa tâche.

A. Les processus zombies contrôlés

Lorsque le système envoie le signal SIGCHLD au processus père, ce dernier va récupérer, à l’aide des primitives wait() ou waitpid(), le code de retour de son fils terminé. Le père cumulera alors les statistiques de son fils avec les siennes et supprimera son entrée de la table des processus, le fils pourra alors totalement être effacé du système.

En temps normal, l’état zombie d’un processus ne pose aucun problème sur le système tant que le programme a été pensé pour que le père puisse réceptionner l’état de ses fils terminés.

B. Les processus zombies errants

Si le processus père n’a pas été conçu pour réceptionner le code de retour de chaque processus fils qu’il crée, ces derniers resteront à l’état zombies pendant toute sa durée d’exécution, ce qui peut être problématique si le père engendre à intervalle régulier des fils et s’il n’a pas été conçu pour être arrêté (un serveur, une tâche de fond, …).

Sans cette prise en compte les processus fils zombies disposeront toujours d’un PID et occuperont la table des processus et resteront ainsi présent sur le système.

C. Comment se débarrasser des processus zombies ?

On ne peut pas… Ils sont déjà morts… La commande kill n’a aucun effet sur eux.

Le seul recours possible est de directement mettre un terme au processus père, avec par exemple la commande kill. Les processus fils zombies seront alors adoptés par init et ce dernier se chargera de les supprimer de la table des processus.

On pourrait penser, à tort, que les processus zombies ne sont pas gênant en soit puisqu’ils ne consomment aucune ressource et qu’ils ont terminé leur tâche. Le problème est que la quantité de processus qu’un système peut créer est limitée et un trop grand nombre de mauvaises synchronisations entre pères et fils entraînera à terme une saturation de la table des processus et bloquera tout le système qui ne pourra plus en créer de nouveaux.

IV. Comment créer une invasion zombie ?

Si vous aimez The Walking Dead je vous propose un script en C qui permet d’étudier les processus Zombies. C’est un script très simple, conçu exprès pour facilement les observer avec l’aide de la commande ps -aux, à lancer dans un autre terminal à intervalles réguliers.

A. Script en C pour créer des processus zombies

Ce script permet de générer des processus zombies, il est possible, entre autres, de paramétrer le nombre de zombies à créer et leur durée de vie (temps d’attente).

#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>

main()
{
        int pid;
        int i = 1;
        int nbre  = 5;   //** Nombre de zombies à créer 
        int vcrea = 2;   //** Vitesse de création des zombies, en seconde
        int vdest = 5;   //** Vitesse de destruction des zombies, en seconde
        int tpsZ  = 20;  //** Temps d'attente pour observer les zombies, en seconde
        int tpsP  = 5;   //** Temps d'attente pour observer le père, en seconde

        printf ("------------------------------------------------------------------------\n");
        printf ("--                     Lancement de l'invasion                        --\n");
        printf ("------------------------------------------------------------------------\n");

        for (i; i <= nbre; i++)
        {
                pid = fork();

                if (pid == 0) // processus fils
                {
                        printf("* Zombie %d dit : Ceeeervau.....\n", i);
                        exit(1);
                }
                else // processus pere
                {
                        sleep(vcrea);
                }
        }

        printf ("------------------------------------------------------------------------\n"     );
        printf ("  Vous avez %d processus zombies qui se baladent sur votre système.     \n", i-1);
        printf ("  Ils vont errer pendant %d sec, vous pouvez les observer avec ps -aux. \n",tpsZ);
        printf ("------------------------------------------------------------------------\n"     );

        // Temps d'attente, en seconde, pour observer les zombies
        sleep(tpsZ);

        // Le père fait ensuite appel à wait() et récupère ces fils terminés
        for (i; i > 1; i--)
        {
                sleep(vdest);
                wait(0);
                printf("* Le zombie %d a disparu \n", i-1);
        }

        printf ("------------------------------------------------------------------------\n");
        printf ("  L'invasion zombie est terminé.\n"                                        );
        printf ("  Le processus père est encore observable %d secondes.\n", tpsP            );
        printf ("------------------------------------------------------------------------\n");

        // Le père reste encore x secondes pour l'observer
        sleep(tpsP);


        // Fin du script, le père se termine

}

La primitive fork() permet de créer un processus fils, le PID du processus fils est envoyé au père et la valeur 0 est envoyé au processus enfant. La primitive exit() quand à elle met fin à un processus et le système va désallouer les ressources auparavant attribuées, sauf l’entrée dans la table des processus. Enfin, l’appel à wait() permet au processus père d’attendre et de récupérer la terminaison de son fil via le signal SIGCHLD envoyé par le système lors de la terminaison d’un processus.

B. Compilation

Pour compiler la source du script, intitulé ici ZombieInvader.c, vous pouvez utiliser cette commande :

gcc -o ZombieInvader ZombieInvader.c

Pour le lancer à partir d’un terminal :

./ZombieInvader

Vous devriez voir ceci :

------------------------------------------------------------------------
-- Lancement de l'invasion --
------------------------------------------------------------------------
* Zombie 1 dit : Ceeeervau.....
* Zombie 2 dit : Ceeeervau.....
* Zombie 3 dit : Ceeeervau.....
* Zombie 4 dit : Ceeeervau.....
* Zombie 5 dit : Ceeeervau.....
------------------------------------------------------------------------
Vous avez 5 processus zombies qui se baladent sur votre système.
Ils vont errer pendant 20 sec, vous pouvez les observer avec ps -aux.
------------------------------------------------------------------------

Après 20 sec, le script fera appel à wait() et les processus zombies seront supprimés.

C. Observation avec ps

En lançant, dans un autre terminal, la commande ps -aux au cours de l’exécution du script, on peut observer le statut Z des 5 processus enfants ainsi que l’annotation <defunct> en fin de ligne.

Ps -aux

F  UID   PID   PPID  PRI  NI  VSZ    RSS   WCHAN   STAT  TTY     TIME    COMMAND
[...]
0  1000  4974  3738  20   0   4200   672   hrtime  S+    pts/0   0:00    ./ZombieInvader 
1  1000  4975  4974  20   0      0     0   -       Z+    pts/0   0:00    [ZombieInvader] <defunct>
1  1000  4976  4974  20   0      0     0   -       Z+    pts/0   0:00    [ZombieInvader] <defunct>
1  1000  4977  4974  20   0      0     0   -       Z+    pts/0   0:00    [ZombieInvader] <defunct>
1  1000  4978  4974  20   0      0     0   -       Z+    pts/0   0:00    [ZombieInvader] <defunct>
1  1000  4979  4974  20   0      0     0   -       Z+    pts/0   0:00    [ZombieInvader] <defunct>
[...]

Il est aussi possible avec les options axjf de voir les processus de façon arborescente :

Ps -axjf

PPID  PID   PGID  SID   TTY     TPGID STAT UID   TIME  COMMAND
[...]
1611  3728  1363  1363  ?         -1  Rl   1000  0:54  \_ gnome-terminal
3728  3737  1363  1363  ?         -1  S    1000  0:00     \_ gnome-pty-helper
3728  3738  3738  3738  pts/0   4974  Ss   1000  0:00     \_ bash
3738  4974  4974  3738  pts/0   4974  S+   1000  0:00     |  \_ ./ZombieInvader
4974  4975  4974  3738  pts/0   4974  Z+   1000  0:00     |    \_ [ZombieInvader] <defunct>
4974  4976  4974  3738  pts/0   4974  Z+   1000  0:00     |    \_ [ZombieInvader] <defunct>
4974  4977  4974  3738  pts/0   4974  Z+   1000  0:00     |    \_ [ZombieInvader] <defunct>
4974  4978  4974  3738  pts/0   4974  Z+   1000  0:00     |    \_ [ZombieInvader] <defunct>
4974  4979  4974  3738  pts/0   4974  Z+   1000  0:00     |    \_ [ZombieInvader] <defunct>
3728  3755  3755  3755  pts/12  4373  Ss   1000  0:00     \_ bash
3755  4373  4373  3755  pts/12  4373  S+   1000  0:01     |   \_ vim ZombieInvader.c
3728  3880  3880  3880  pts/19  4980  Ss   1000  0:00     \_ bash
3880  4980  4980  3880  pts/19  4980  R+   1000  0:00     |   \_ ps -axjf
[...]

Ces deux commandes peuvent être lancées à tous moments et plusieurs fois lors de l’exécution du script. On remarquera aussi que les processus fils ont bien tous le même PPID (ici 4974), soit le PID le leur père.

Test du mini clavier RT-MWK01

mardi 12 juillet 2016 à 10:30

Il est courant de vouloir gérer son NAS, son mini-PC de salon ou son Raspeberry-Pi multimédia avec un clavier/souris depuis son canapé. Je vous présente aujourd’hui le RT-MWK01.

Il s’agit d’un mini clavier, avec souris intégrée, qui permet de gérer simplement un périphérique (le plus souvent multimédia) en un minimum de place. Voyez plutôt :

RTMKX01_02

Ce RT-MWK01, qui fait la taille d’une télécommande de télévision, communique en bluetooth avec un dongle à plugger sur le système à gérer. D’après mes tests, on trouve un fonctionnement plus que correcte à une distance de plus de 10 mètres.

On retrouve donc toutes les touches qu’un clavier doit posséder, et également la souris qui se gère via un pad situé sur la droite de l’appareil :

RTMKX01_03

Ce pad intégré au clavier s’avère très pratique pour ce type d’utilisation, malgré quelques signes de faiblesse détectés durant mes tests en fin de batterie, je note quelle fonctionne relativement bien après une première charge assez longue une fois le produit déballé 🙂

Côté connectique, on retrouve un câble USB qui permet de recharger l’appareil, on pourra retrouver une batterie pleine après une heure de recharge environs :

RTMKX01_01

Avec ce clavier, il devient donc facile de gérer son NAS ou son Raspberry-Pi branché sur sa télé depuis son canapé, c’est d’ailleurs son rôle principal. Également, on peut imaginer l’utilisation de cet appareil pour une intervention rapide sur des serveurs qui, habituellement, ne disposent pas de clavier/souris continuellement branchés dessus.

On pourra noter le fait que celui-ci est en QWERTY, bien que d’autres modèles existent. Vous pourrez retrouver celui-ci sur le lien suivant : Clavier RT-MWK01

Oukitel K7000, le secret de sa batterie 7000 mAh dévoilé !

mardi 12 juillet 2016 à 09:00

Le constructeur Oukitel avait fait parler de lui lors de la sortie du K10000 qui embarquait une batterie de 10 000 mAh pour une autonomie énorme, mais ceci et c’est logique, se répercute sur le gabarit du smartphone (9 mm d’épaisseur).

Néanmoins avec le K7000, Oukitel a réussi à proposer une batterie énorme de 7000 mAh sur un smartphone de 4 millimètres d’épaisseur seulement !

oukitel-k7000-1

Mais ne rêvez pas, contrairement à ce que l’on peut croire, la batterie intégrée à l’appareil ne fait pas 7000 mAh, mais elle en fait 2000 mAh. Les 5000 mAh manquants sont fournis par une coque-batterie qui sera livrée gratuitement avec l’Oukitel K7000 et qui pourra servir accessoirement à recharger d’autres appareils. Cette coque-batterie sans-fil de 5000 mAh permet à l’appareil d’être fin et léger malgré tout. Il est à noter que cet accessoire peut servir aussi de coque de protection pour votre appareil ou de station pour poser le smartphone lorsque vous souhaitez, par exemple, regarder un film.

oukitel-k7000-2

L’Oukitel K7000 est prévu pour le mois de juillet 😉

Pour les caractéristiques :

– Écran HD 5″
– RAM : 2 Go
– CPU : MediaTek MTK 6737
– 16 Go de stockage
– Caméras : 5 Mpx à l’avant et 13 Mpx à l’arrière
– OS : Android 6.0
– Capteur d’empreintes

oukitel-k7000-3