Crypter un mot de passe comme dans /etc/shadow

Petit test pour crypter un mot de passe comme dans le fichier /etc/shadow avec Python! Vous pouvez crypter une chaîne de caractères en utilisant le même SALT, à savoir la clé de cryptage.

Dans une chaine du fichier /etc/shadow, voici un exemple de ligne:

sroze:$6$jWp7fotG$ikvxu3kvwbn36XvznP1FHnokYpY/MScI6QjYz.vJJ1r/klF2Nwiv3lkuSvs8hz4fZ08v7OAANFKfOaotPsjL50:15224:0:99999:7:::

Ici, on peut voir que mon mot de passe personnel est $6$jWp7fotG$ikvxu3kvwbn36XvznP1FHnokYpY/MScI6QjYz.vJJ1r/klF2Nwiv3lkuSvs8hz4fZ08v7OAANFKfOaotPsjL50. Cette chaine signifie que l’encodage utilisé est le numéro 6 ($6$) à savoir le SHA-2, le SALT est jWp7fotG. Vous pouvez retrouver plus d’informations à ce sujet ici.

En utilisant la même clé, on peut donc retrouver le mot de passe, comme ceci!

# python -c "import crypt, getpass, pwd; print crypt.crypt('-PASSWORD-', '\$6\$jWp7fotG\$')"
$6$jWp7fotG$ikvxu3kvwbn36XvznP1FHnokYpY/MScI6QjYz.vJJ1r/klF2Nwiv3lkuSvs8hz4fZ08v7OAANFKfOaotPsjL50

On vérifie la correspondance:

# cat /etc/shadow | grep sroze | cut -d":" -f2
$6$jWp7fotG$ikvxu3kvwbn36XvznP1FHnokYpY/MScI6QjYz.vJJ1r/klF2Nwiv3lkuSvs8hz4fZ08v7OAANFKfOaotPsjL50

:-)

C: Régler le problème des defunct process

Lorsque vous développez une application, il est parfois très intéressant d’utiliser des threads ou plusieurs processus pour exécuter plusieurs tâches simultanément. Nous allons ici voir un problème qui arrive lors que l’on utilise plusieurs processus, via un fork(). En effet, en C, la fonction fork permet de créer un nouveau processus, qui devient fils du processus appelant le fork.

Processus zombies (defunct)

Par défaut, lorsque le processus père s’arrête, tous les processus fils s’arrête. À l’inverse, lorsqu’un processus fils s’arrête – via un exit(0); par exemple -, sa mémoire est libérée, il devient un processus zombie (seul le bloc de contrôle reste présent) et le processus père continue de fonctionner.

Ainsi, l’on peut voir de nombreuses lignes marquées par un defunct lorsque l’on liste les processus avec un ps:

root      9175  0.0  0.0 136380  1100 ?        Sl   Jun30   0:00 /[...]/relay
root      9629  0.0  0.0      0     0 ?        Z    Jun23   0:00 [relay] <defunct>
root      9853  0.0  0.0      0     0 ?        Z    Jun30   0:00 [relay] <defunct>
root      9884  0.0  0.0      0     0 ?        Z    Jun30   0:00 [relay] <defunct>

C’est parce que le processus père n’écoutes pas le signal SIGCHLD, qui est envoyé par le fils lors de son extinction. Ainsi, en écoutant le signal, le père peut libérer son bloc de contrôle. En C, c’est la fonction waitpid qui nous sera utile.

Une ligne à ajouter

Il n’y a qu’une seule ligne (ainsi qu’un #include) à ajouter à votre code C pour que les processus zombies soient “ramassés” par votre processus père. De temps en temps – l’idéal étant la boucle principale s’il y a -, exécutée cette ligne ci:

while (waitpid(WAIT_ANY, NULL, WNOHANG) != 0);

Les arguments sont les suivants:

  • WAIT_ANY est la constante permettant de dire que l’on souhaite attendre n’importe quel des processus fils de ce processus. À la place, nous aurions pu mettre le pid d’un processus particulier.
  • NULL permet de ne pas récupérer d’informations de statut du processus.
  • WNOHANG est une option permettant d’exécuter waitpid en mode non-bloquant.

N’oubliez pas d’inclure l’en-tête des fonctions et constantes ainsi:

#include <sys/wait.h>

Ainsi, il ne restera plus de processus zombie, ou defunct.

Varnish en reverse-proxy: le problème des adresses locales

Si vous utilisez nginx ou Apache derrière Varnish, vous aurez remarqué que l’adresse IP du client récupérée est l’adresse locale (ou bien l’adresse du serveur hébergeant Varnish). Cela est le cas parce-que c’est Varnish qui créé la connexion TCP à nginx/apache, et non le client directement. Pour cela, nous allons tout simplement installer un module sur votre serveur Web, pour qui va utiliser une en-tête (X-Forwarded-For) pour connaitre l’IP du client.

Pour nginx

Il nous faut nginx compilé avec le module Real-IP (--with-http_realip_module), ce qui est le cas par défaut dans les paquets CentOS et Debian. Dans le fichier de configuration /etc/nginx/nginx.conf, dans la catégorie http {...}, ajoutez ça:

    set_real_ip_from 127.0.0.1;
    real_ip_header X-Forwarded-For;

Redémarrez le serveur nginx, et c’est bon.

Pour Apache

Pour Apache, il faut installer le module RPAF2. Je vous invite à lire l’article très intéressant de wiki.tyk.nu.

Tunnel SSH sur le port 80, utilisant le reverse proxy Varnish

Dans un article précédent, nous avons vu comment créer une connexion SSH à travers un tunnel HTTP, mais le problème est que vous ne pouviez pas utiliser le port 80 si votre serveur hébergeait un serveur HTTP! Nous allons maintenant voir comment mettre en place Varnish, l’un des meilleurs reverse-proxy (qui peut également servir de système de cache), pour utiliser à la fois httptunnel et votre serveur Web.

Mise en place de Varnish

Nous allons commencer par mettre en place Varnish de la façon suivante:

Pour cela, nous allons installer varnish depuis les dépôts. Pour CentOS:

# yum install varnish

Pour commencer, nous allons modifier le fichier de configuration de Varnish, afin de configurer les différents backends. Nous supposer ceci:

  • Votre serveur Web écoute sur le port 8001
  • Le serveur hts écoute sur le port 8002
    Note: vous pourrez modifier la configuration de votre serveur Web à la fin, si vous souhaitez avoir un minimum de downtime.

Continue reading

MyOnlineSSH: Mise à jour

Le service MyOnlineSSH a été mis à jour. Pour rappel, lors de mon précédent article sur MyOnlineSSH, je vous présentait ce service comme un client SSH Web: vous pouvez vous connecter sur un serveur SSH et utiliser votre navigateur comme terminal, ce qui est extrêmement pratique lorsque vous êtes à un endroit où vous pouvez pas utiliser le port 22 à l’exterieur de votre réseau, et que vous ne souhaitez pas mettre en place un tunnel HTTP par exemple.

Change-log

  • Le Flash Player n’est maintenant plus requis, seules des requêtes GET et POST sont envoyées.
  • Vous pouvez créer plusieurs terminaux simultanés
  • Rapidité beaucoup plus importante.

Si vous avez une quelconque suggestion ou question, n’hésitez pas à me contacter ou à laisser un commentaire sur cet article.

Le service ne prend pas en charge chkconfig

Sous RedHat ou CentOS, vous avez peut-être créé des scripts de démarrage d’applications, mais parfois, il y a un problème, c’est que l’utilitaire chkconfig n’accepte pas de le configurer et nous retourne un message du genre:

# chkconfig monappli on
Le service monappli ne prend pas en charge chkconfig

Pour qu’il marche, il suffit juste d’ajouter en tête de votre fichier placé dans /etc/init.d, ces quelques lignes:

# chkconfig: 2345 55 25
# description: My Application daemon
#
# processname: monappli
# pidfile: /var/run/monappli.pid

La ligne la plus importante est la ligne commençant par # chkconfig; qui permet de définir les levels auxquelles vous voulez que votre fichier d’initialisation soit appelé.

Ensuite, vous pouvez utiliser chkconfig.

Installation d’un serveur mail SMTP Postfix avec PostgreSQL sous CentOS

Nous allons installer un serveur SMTP en utilisant Postfix, ce qui permettra l’envoi de mail depuis ce serveur. Ce petit guide pour permettra de pouvoir envoyer et recevoir des emails sur votre propre serveur. Par la suite, il sera très intéressant d’installer un serveur IMAP (article à venir) pour pouvoir consulter les mails reçus.
Nous allons stocker les domaines, comptes utilisateurs et aliases dans une base de données gérée par PostgreSQL, pour pouvoir créer de nouveaux compte extrêmement facilement.

Installation de Postfix

Avant tout, nous allons installer postfix depuis les paquets de CentOS mais en utilisant le dépôt CentOS Plus qui nous permet d’avoir un postfix compilé avec le support de MySQL et PostgreSQL, ce qui nous intéresse ici.

Éditez donc le fichier /etc/yum.repos.d/CentOS-Base.repo. Pour activer le dépôt CentOS Plus, changez la ligne suivante dans la partie précédentée par [centosplus]:

[centosplus]
...
enabled=1
...

Ajoutez dans [base] et [updates] la ligne suivante:

exclude=postfix-*

Cette ligne permet de forcer yum à utiliser le dépôt CentOS Plus pour les paquets postfix.

Ensuite, il nous reste simplement à installer Postfix grâce à yum:

# yum install postfix

Par mesure de précaution, on désactive sendmail, s’il est activé.

# chkconfig sendmail off
# service sendmail stop

On choisi de démarrer postfix en même temps que le système:

chkconfig postfix on

On créé ensuite le répertoire qui contiendra les mails:

# mkdir /home/mail/{data,queue,spool}
# chown -R postfix:postfix /home/mail

Continue reading

Monitoring nginx avec Zabbix

En complément de l’article sur le monitoring de PostgreSQL avec Zabbix, voici un nouvel article pour monitorer un serveur Nginx grâce à l’agent Zabbix.

Pour cela, nous avons besoin d’avoir ZTC (Zabbix Template Collection) d’installé: voyez le premier chapitre de l’article précédent sur ZTC.

Configuration d’Nginx

Pour pouvoir récupérer des statistiques sur le serveur Nginx, vous devez l’avoir compilé avec le module HTTPStubStatus, c’est-à-dire avec l’option --with-http_stub_status_module.

Ensuite, il y a uniquement à configurer l’accès aux statuts depuis l’hôte local de Nginx. Si vous n’avez pas créé d’hôte local pour Nginx, il vous suffit d’en créer un.
Ensuite, ajoutez ces quelques lignes de configuration suivantes dans votre server local:

    location /server-status {
        stub_status on;
        access_log off;
    }

Elle permettent de dire qu’à l’adresse http://localhost/server-status, Nginx doit confier la réponse HTTP au module HTTPStubStatus, qui fournira des statistiques sur le serveur qui seront récupérées par l’agent.

N’oubliez pas de recharger la configuration du serveur HTTP:

# /etc/init.d/nginx reload

Vous pouvez vérifier la configuration depuis votre serveur grâce à wget:

$ wget http://localhost/server-status

Si le code réponse est bien 200, la configuration est correct.

Configuration de l’agent Zabbix

Avec la même configuration de l’agent Zabbix décrit dans l’article sur PostgreSQL, nous allons activer le template pour Nginx:

# cd /etc/zabbix-agent.d/enabled
# ln -s ../available/pgsql.conf pgsql.conf

Maintenant, nous allons modifier la configuration de l’agent ZTC pour Nginx, à savoir le fichier /etc/ztc/nginx.conf. Remplacez les lignes suivantes:

host=localhost
port=80

L’agent ZTC est maintenant configuré, nous allons le tester:

$ /opt/ztc/bin/nginx.py requests

Vous devriez avoir comme retour un nombre supérieur à zéro. Si c’est le cas, tout fonctionne !

Importation dans le serveur Zabbix

Pour finir, importez le modèle Nginx de ZTC (vous trouverez tous les modèles dans le dépôt ZTC), que vous pouvez télécharger ici:

Maintenant, configurez le(s) hôte(s) que vous avez configuré(s) comme ayant le modèle Template_app_nginx. Vous aurez ainsi les statistiques Nginx!

Monitoring PostgreSQL avec Zabbix

Avant tout, il faut installer ZTC (Zabbix Template Collection), qui contient un grand nombre de templates (côté agent) Zabbix qui récupèrent des données sur différentes applications, comme Apache, Nginx, MySQL, PostgreSQL, Slony, …

Note: si vous n’avez pas installé Zabbix, vous pouvez lire le guide sur comment installer Zabbix 1.8 avec PostgreSQL sur CentOS 5.

Installation de ZTC

Vous pouvez télécharger les sources ou des paquets (pour le moment uniquement RPM) dans le gestionnaire de dépôt de ZTC. Nous allons ici installer la dernière version en date, la 10.11:

$ wget https://bitbucket.org/rvs/ztc/downloads/ztc-10.11-1.noarch.rpm
# rpm -Uvh ztc-10.11-1.noarch.rpm

Voilà, ZTC est installé et a créé des fichiers de configuration pour les différentes applications dans le dossier /etc/zabbix-agent.d. Par défaut, tous les fichiers sont dans ce dossier. Ce que je vous propose, c’est de ne pas tous les activer sur l’agent, car cela risquerait de le charger inutilement. C’est pourquoi, on nous créer deux dossiers: enabled et available qui contiendrons les fichiers de configuration, un peu comme les configurations de modules Apache.

# mkdir /etc/zabbix-agent.d/{available,enabled}
# mv /etc/zabbix-agent.d/*.conf /etc/zabbix-agent.d/available

Nous allons également configurer l’agent Zabbix pour charger les fichiers de configuration activés: dans le fichier /etc/zabbix/zabbix_agentd.conf, ajoutez cette ligne:

Include=/etc/zabbix-agent.d/enabled/

Continue reading

Installer Zabbix 1.8.x avec PostgreSQL sur CentOS 5

Zabbix est une application de monitoring. Elle permet de surveiller votre parc de serveurs, d’applications et de sites Web. Elle se compose d’un serveur ainsi que d’agents (facultatifs, mais qui permettent de récupérer plus d’informations locales que SNMP) sur chacune des machines à monitorer.

Nous allons voir comment installer le serveur Zabbix ainsi que son front-end Web écrit en PHP, sous CentOS 5.

Installation du serveur Zabbix

Installation des dépendances

Avant tout, nous allons installer les dépendances de Zabbix, à savoir les librairies zlib, curl, openssl, net-snmp et openIPMI, pour pouvoir utiliser au maximum les fonctionnalités de Zabbix. Nous allons également installer un système de gestion de base de données, pour stocker toutes les données: PostgreSQL.

# yum install zlib-devel glibc-devel curl-devel gcc automake libidn-devel openssl-devel net-snmp-devel rpm-devel OpenIPMI-devel postgresql84-devel

Nous allons maintenant initialiser la nouvelle base de données PostgreSQL:

# /etc/init.d/postgresql initdb

Important: si vous avez déjà une base de données PostgreSQL sur votre serveur, n’initialisez pas la base! Vous pouvez également voir comment installer PostgreSQL 8.x sous Debian.

Installation du serveur

Maintenant, nous allons télécharger les sources de Zabbix pour l’installer. Vous trouverez les archives des sources sur la page de téléchargement du site Web de Zabbix.

$ wget http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/1.8.4/zabbix-1.8.4.tar.gz/download -O zabbix.tar.gz
$ tar -xzf zabbix.tar.gz
$ cd zabbix-*

Maintenant, nous allons commencer le processus de compilation en utilisant le programme ./configure avec nos options:

$ ./configure --enable-server --with-pgsql --with-net-snmp --with-libcurl --with-openipmi --enable-agent --enable-ipv6

Si toutes les dépendances sont satisfaites, vous devriez avoir ce message:

Enable server: yes
Server details:
With database: PostgreSQL
WEB Monitoring via: cURL
Native Jabber: no
SNMP: net-snmp
IPMI: openipmi
SSH: no

[...]
Enable agent: yes
Agent details:
Linker flags: -rdynamic
Libraries: -lm -lresolv

LDAP support: no
IPv6 support: yes

Ensuite, il nous reste à compiler Zabbix:

# make

À ce moment, vous pouvez installer Zabbix sur votre système comme ceci:

# make install

Note: Vous pouvez également créer un paquet de Zabbix avec cette configuration grâce au programme checkinstall.

Continue reading