27 juin 2017

CentOS 7 : désactiver firewalld et réactiver iptables

toolsEn plus de systemd, RHEL 7 et CentOS 7 disposent d'une nouvelle interface de pare-feu : firewalld. Bien qu'il fasse plutôt bien le boulot, je me suis trouvé dans des cas où j'avais du mal à lui faire faire ce que je voulais. En fait dès l'instant où j'ai commencé à jouer avec des interfaces tun, des zones et de la retransmission de paquets, j'ai commencé à avoir des difficultés. En attendant de les résoudre, j'ai noté que je pouvais revenir au fonctionnement précédent, et piloter iptables directement.

Désactivation de firewalld

Commençons par arrêter firewalld, et s'assurer qu'il est bien coupé :

[root@test ~]# systemctl stop firewalld.service
[root@test ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

Jun 27 10:27:00 test.anotherhomepage.org systemd[1]: Starting firewalld - dynamic firewall daemon...
Jun 27 10:27:00 test.anotherhomepage.org systemd[1]: Started firewalld - dynamic firewall daemon.
Jun 27 10:27:25 test.anotherhomepage.org systemd[1]: Stopping firewalld - dynamic firewall daemon...
Jun 27 10:27:25 test.anotherhomepage.org systemd[1]: Stopped firewalld - dynamic firewall daemon.

Bien sûr, cela veut dire qu'à partir de maintenant, la machine n'est plus protégée par le pare-feu.

Ensuite, on désactive son démarrage automatique :

[root@test ~]# systemctl disable firewalld.service

Si vraiment on ne souhaite plus pouvoir démarrer firewalld par accident, on peut le masquer :

[root@test ~]# systemctl mask firewalld.service
Created symlink from /etc/systemd/system/firewalld.service to /dev/null.

Maintenant c'est pas tout, mais faut remettre un pare-feu.

Activation d'iptables

Pour activer iptables, c'est très simple, commençons par installer le paquet "iptables-services" :

[root@test ~]# yum -y install iptables-services
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.imt-systems.com
 * extras: mirror.netcologne.de
 * updates: mirror.ratiokontakt.de
Resolving Dependencies
--> Running transaction check
---> Package iptables-services.x86_64 0:1.4.21-17.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================================================================================================================================================================================
 Package                                                         Arch                                                 Version                                                       Repository                                          Size
=============================================================================================================================================================================================================================================
Installing:
 iptables-services                                               x86_64                                               1.4.21-17.el7                                                 base                                                50 k

Transaction Summary
=============================================================================================================================================================================================================================================
Install  1 Package

Total download size: 50 k
Installed size: 24 k
Downloading packages:
iptables-services-1.4.21-17.el7.x86_64.rpm                                                                                                                                                                            |  50 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : iptables-services-1.4.21-17.el7.x86_64                                                                                                                                                                                    1/1
  Verifying  : iptables-services-1.4.21-17.el7.x86_64                                                                                                                                                                                    1/1

Installed:
  iptables-services.x86_64 0:1.4.21-17.el7

Complete!

Ensuite, on l'active dans systemd :

[root@test ~]# systemctl enable iptables
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

On peut alors le lancer :

[root@test ~]# systemctl start iptables

Comme pour RHEL 6 et CentOS 6, la configuration se trouve dans le fichier /etc/sysconfig/iptables, et dispose d'un jeu de règles n'ouvrant la voie qu'au ping et à SSH. La machine est, à partir de cet instant, de nouveau protégée par un pare-feu.

Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !

Crédit photo : velacreations - tools.

19 juin 2017

Redirection de ports vers localhost sous Linux

Il m'est arrivé récemment de lancer des services uniquement sur la boucle locale d'une machine, par exemple un serveur web. On peut douter du bien-fondé de la démarche, mais je trouve cela intéressant à deux titres : - d'abord, si la configuration du service nécessite une adresse IP, cela sera 127.0.0.1, et n'aura pas besoin d'être modifiée en cas de copie sur une autre machine ; - ensuite, si jamais pour une raison ou une autre le pare-feu vient à être inactif, le service ne sera pas exposé.

Bien sûr, cela ajoute une contrainte, celle d'effectuer une redirection de port en plus de l'ouverture de flux. De plus, je ne sais pas si cela a une influence réelle en terme de performance. Je pourrais tester cela à l'occasion, et en faire un article, tiens :)

Donc me voilà en train d'installer un serveur web, de le lancer sur localhost, je fais ma petite configuration à grands coups d'iptables, et là c'est le drame : le trafic ne passe pas. Quelques recherches plus tard, j'apprends qu'en fait par défaut, le noyau Linux considère que ce n'est pas normal qu'un paquet vienne de l'extérieur et ait comme destination 127.0.0.1. Ce comportement peut être modifié depuis la version 3.6, grâce à un paramètre sysctl :

# sysctl -w net.ipv4.conf.all.route_localnet=1

Bien entendu, pour un résultat permanent, il faut penser à éditer /etc/sysctl.conf.

Petit détail sympathique, activer la retransmission de paquets (le fameux ip_forward) n'est pas nécessaire.

Source : Super User.

Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !

22 mai 2017

systemd : reconfigurer une unité de service

bricolage bumperDans le billet précédent, j'ai abordé haveged et je terminais sur le fait que certains paramètres pouvaient être accessibles. Cela ne semble pas forcément évident, car si on regarde la liste des fichiers du paquet RPM, on n'y trouve aucun fichier de configuration :

$ rpm -ql haveged
 /usr/lib/systemd/system/haveged.service
 /usr/lib64/libhavege.so.1
 /usr/lib64/libhavege.so.1.1.0
 /usr/sbin/haveged
 /usr/share/doc/haveged
 /usr/share/doc/haveged/AUTHORS
 /usr/share/doc/haveged/COPYING
 /usr/share/doc/haveged/ChangeLog
 /usr/share/doc/haveged/README
 /usr/share/doc/haveged/havege_sample.c
 /usr/share/man/man8/haveged.8.gz

De plus, si on regarde le processus lancé, on remarque que certaines options sont précisées sur la ligne de commande :

$ ps auxwww | grep haveged | grep -v grep
root     22470  0.0  0.7  12132  3824 ?        Rs   May16   0:00 /usr/sbin/haveged -w 1024 -v 1 --Foreground

Allons un peu plus loin, le paquet contient un fichier "haveged.service" :

$ cat /usr/lib/systemd/system/haveged.service
[Unit]
Description=Entropy Daemon based on the HAVEGE algorithm
Documentation=man:haveged(8) http://www.issihosts.com/haveged/

[Service]
Type=simple
ExecStart=/usr/sbin/haveged -w 1024 -v 1 --Foreground
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Il ne faut pas succomber à la tentation de modifier directement ce fichier, car une possibilité plus propre existe : la documentation officielle RHEL 7 nous apprend ainsi comment créer un fichier de configuration pour le service.

Dans ce cas précis, je souhaite augmenter la valeur de l'argument -w à 2048. Pour l'anecdote, cette option permet d'augmenter l'utilisation de haveged en définissant une taille minimale du réservoir d'entropie. Nous allons donc d'abord créer un répertoire de configuration de service systemd, puis le fichier lui-même :

# mkdir /etc/systemd/system/haveged.service.d/
# vi /etc/systemd/system/haveged.service.d/custom_args.conf

Bon, peu importe le nom du fichier tant qu'il a pour extension ".conf", mais il est malgré tout préférable de lui donner un nom explicite (en clair, faites ce que je dis, pas ce que je fais).

Nous allons dans ce fichier redéfinir la directive ExecStart, puisque c'est celle qui définit l'option à modifier. Par contre, petite subtilité, cette directive doit être vidée pour être redéfinie. Le fichier a donc cette allure :

[Service]
ExecStart=
ExecStart=/usr/sbin/haveged -w 2048 -v 1 --Foreground

Il faut maintenant recharger les unités avant de redémarrer le service haveged :

# systemctl restart haveged.service
Warning: haveged.service changed on disk. Run 'systemctl daemon-reload' to reload units.
# systemctl daemon-reload
# systemctl restart haveged.service
# ps auxwww | grep haveged | grep -v grep
root     23074  2.4  0.7  12132  3836 ?        Ss   04:02   0:00 /usr/sbin/haveged -w 2048 -v 1 --Foreground

Le démon haveged est alors lancé avec une valeur de 2048 pour l'option -w.

Dernier petit détail, SELinux. J'ai testé cette manipulation sur un système configuré en "enforcing", l'édition du fichier s'est donc faite dans le bon contexte. Au cas où certains se demandent comment sont les labels, les voici :

# ll -Z -d /etc/systemd/system/haveged.service.d
drwxr-xr-x. root root unconfined_u:object_r:systemd_unit_file_t:s0 /etc/systemd/system/haveged.service.d
# ll -Z /etc/systemd/system/haveged.service.d/custom_args.conf
-rw-r--r--. root root unconfined_u:object_r:systemd_unit_file_t:s0 /etc/systemd/system/haveged.service.d/custom_args.conf

Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !

Crédit photo : Katie Hargrave - bricolage bumper.

18 mai 2017

Haveged : ajouter de l'entropie à son VPS Linux

EntropyEntre deux bidouilles NetBSD, je me suis retrouvé à des bidouilles Linux. Plus particulièrement en jetant un œil à une certaine documentation utile, j'ai pu lire :

Les clés doivent être générées dans un contexte où la source d’aléa est fiable, ou à défaut dans un environnement où suffisamment d’entropie a été accumulée.

Et là, on commence à se poser des questions : qu'est-ce que l'entropie ? Pourquoi faut-il une source fiable ? Comment avoir une meilleure entropie ?

Entropie et aléa

Pour résumer, disons que l'entropie c'est la qualité de la génération de nombres aléatoires. C'est un raccourci assez grossier j'en conviens, mais cela évitera d'écrire ou de paraphraser des pavés mathématiques.

Mais alors, pourquoi générer des nombres aléatoires ? Tout simplement parce que cela fait partie de nombreuses bases d'outils cryptographiques, comme par exemple la génération de clés SSH. C'est d'ailleurs l'occasion d'aborder la question du risque qu'on prend si on ne génère pas assez d'aléa dans notre exemple : il devient possible de générer deux fois le même couple de clés SSH, et par conséquent, que quelqu'un soit en mesure de se connecter à une machine à laquelle il ne devrait pas avoir accès.

Si vous pensez que cela n'arrive jamais, il suffit de se rappeler la vulnérabilité OpenSSH Debian. En 2008, la version Debian d'OpenSSL s'est trouvée modifiée, et a eu pour conséquence un très faible nombre de possibilités pour générer des clés SSH. La preuve ? On peut trouver sur cette page l'intégralité des clés DSA (1024 et 2048 bits) et RSA (1024 à 4096 bits) possibles via cette version vulnérable. J'admets volontiers que c'est un cas extrême, mais il a le mérite d'être assez parlant.

Bref, tout ça pour dire que plus on a d'entropie, mieux c'est.

Mesurer la qualité de l'entropie

Pour mesurer la qualité de l'entropie, c'est très simple :

$ cat /proc/sys/kernel/random/entropy_avail
175

On voit que cela renvoie un nombre, qui désigne la quantité de nombres aléatoires générés. On dit que ce nombre est la taille de notre réservoir d'entropie. Et donc, plus il est grand, mieux c'est. Sauf que là, 175 sur une VM Vagrant CentOS 7, bein c'est pas glorieux.

Une autre manière de mesurer l'entropie consiste à utiliser l'outil rngtest (disponible dans le paquet rng-tools pour CentOS). Celui-ci va lancer un certain nombre de tests utilisant le standard FIPS-140.

Par exemple :

$ cat /dev/random | rngtest -c 1000
rngtest 5
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 96
rngtest: FIPS 140-2 successes: 0
rngtest: FIPS 140-2 failures: 0
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 0
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=0.000; avg=0.000; max=0.000)bits/s
rngtest: FIPS tests speed: (min=0.000; avg=0.000; max=0.000)bits/s
rngtest: Program run time: 21307295 microseconds

Et là, ce n'est toujours pas glorieux, car j'ai arrêté l'exécution faute de patience.

Avant de remédier à ce problème, comparons avec une machine physique notre premier indicateur :

$ cat /proc/sys/kernel/random/entropy_avail
3217

On peut aussi constater que le problème d'entropie affecte particulièrement les machines virtuelles. Cela s'explique surtout par le fait qu'elles disposent de beaucoup moins d'éléments qu'une machine physique, et donc moins d'éléments à lire pour espérer y trouver de l'aléa.

Bon, ce n'est pas tout, mais il est temps de remédier à ce problème d'entropie sur cette VM !

Haveged : générateur d'entropie en espace utilisateur

Haveged est un logiciel qui se présente sous la forme d'un démon qui reste en espace utilisateur. Il tire son nom de l'algorithme qu'il utilise, HAVEGE (HArdware Volatile Entropy Gathering and Expansion).

Côté installation, rien de plus simple, il suffit, pour CentOS, d'avoir accès au dépôt Fedora EPEL. Une fois que c'est fait, un simple yum -y install haveged suffit à disposer du logiciel.

Comme il s'agit d'un démon, il faut le démarrer. Sous CentOS 7, cela se fait via systemd :

# systemctl start haveged.service

Et voilà ! Bon d'accord, cela fait peu. Maintenant, vérifions que notre entropie augmente :

$ cat /proc/sys/kernel/random/entropy_avail
 1779

Voilà qui est mieux. Vérifions aussi avec rngtest :

$ cat /dev/random | rngtest -c 1000
rngtest 5
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 1000
rngtest: FIPS 140-2 failures: 0
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 0
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=2.057; avg=17.351; max=25.915)Mibits/s
rngtest: FIPS tests speed: (min=44.564; avg=139.836; max=161.640)Mibits/s
rngtest: Program run time: 1237535 microseconds

Dans ce dernier cas, la récupération des informations fut quasi-instantanée ! On peu d'ailleurs noter le nombre de tests réalisés avec succès, qui correspond mieux à nos attentes.

Pour ce qui est d'activer haveged au démarrage, il ne faut pas oublier la commande systemctl qui va bien :

# systemctl enable haveged.service
 Created symlink from /etc/systemd/system/multi-user.target.wants/haveged.service to /usr/lib/systemd/system/haveged.service.

Selon les distributions, certains paramètres supplémentaires sont accessibles, mais cela fera l'objet d'un autre article ;)

Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !

Crédit photo : teatimer - Entropy

9 mai 2017

Xen : installation d'un invité domU NetBSD

the handlerDans le billet précédent, j'ai abordé la création d'un hyperviseur Xen (dom0) NetBSD. Il est donc temps de s'occuper du système invité NetBSD, le domU.

Création du domU Xen

Pour créer notre domU, nous avons besoin de 3 éléments présents sur le dom0 :

  • un fichier de disque dur (on pourrait utiliser LVM ou une partition, mais cela est moins flexible) ;
  • dans le cas de NetBSD, un fichier de noyau ;
  • et un fichier de configuration.

D'abord, le fichier de disque dur. Pour le créer, il suffit d'utiliser la commande dd. La taille de ce fichier déterminera la taille du disque dur de la machine virtuelle. Créons un fichier de 4 Go (4096 blocs d'1 Mo) :

root@rogue:~# dd if=/dev/zero of=/srv/xen/images/disk/netbsd.img bs=1m count=4096

On peut remarquer que cet exemple remplit notre fichier de zéros, et ne crée pas de fichier sparse. Il semble que la gestion des fichiers sparse ne soit pas parfaite sous NetBSD, d'après le tutoriel officiel.

Ensuite, récupérons les fichiers noyau :

root@rogue:~# mkdir -p /srv/xen/images/kernels/NetBSD/NetBSD-7.1/amd64/
root@rogue:~# cd /srv/xen/images/kernels/NetBSD/NetBSD-7.1/amd64/
root@rogue:/srv/xen/images/kernels/NetBSD/NetBSD-7.1/amd64 # ftp http://cdn.netbsd.org/pub/NetBSD/NetBSD-7.1/amd64/binary/kernel/netbsd-INSTALL_XEN3_DOMU.gz
root@rogue:/srv/xen/images/kernels/NetBSD/NetBSD-7.1/amd64 # ftp http://cdn.netbsd.org/pub/NetBSD/NetBSD-7.1/amd64/binary/kernel/netbsd-XEN3_DOMU.gz

On récupère deux fichiers de noyau, car l'un d'entre eux ne sert que pour l'installation. Une fois celle-ci terminée, il faut penser à configurer notre domU avec le noyau "classique".

Nous pouvons enfin créer notre fichier de configuration, /usr/pkg/etc/xen/netbsd :

root@rogue:/usr/pkg/etc/xen# grep -v ^# netbsd | grep -v ^$
name = "netbsd"
uuid = "d0f3e8d3-2f54-11e7-b035-00301bbde894"
kernel = "/srv/xen/images/kernels/NetBSD/NetBSD-7.1/amd64/netbsd-INSTALL_XEN3_DOMU.gz"
memory = 256
vcpus = 1
vif = [ 'bridge=bridge0,mac=00:16:3E:00:00:02' ]
disk = [ '/srv/xen/images/disk/netbsd.img,raw,xvda,rw' ]

Les directives du fichier de configuration sont assez explicites, néanmoins il convient de préciser certaines choses :

  • d'abord, le nom de la machine virtuelle ("name") doit être unique ;
  • et en passant, l'uuid aussi (généré via uuidgen), mais il n'est pas obligatoire, la directive peut être vide ;
  • la mémoire est spécifiée en méga-octets ;
  • on peut spécifier plusieurs interfaces réseau ou disques durs.

On peut ajouter bien d'autres options, mais il est préférable de commencer par un fichier simple, qui démarrera une machine en mode texte, avant d'aller plus loin.

Maintenant que notre fichier de configuration est prêt, démarrons notre domU :

root@rogue:/usr/pkg/etc/xen# xl create -c netbsd

L'option -c permet d'attacher la console locale de la machine virtuelle en mode texte, et donc de pouvoir interagir avec (pour, par exemple, effectuer une installation).

Installation de NetBSD dans le domU

L'installation se passe de manière similaire à ce qui est présenté dans le guide officiel, mais à une différence près : une fois l'installation terminée, il faut quitter l'installeur (au lieu de redémarrer), puis éteindre la machine virtuelle :

# shutdown -p now

De retour dans le dom0, il faut alors changer le fichier de noyau pour un démarrage "classique" :

root@rogue:/usr/pkg/etc/xen# vi netbsd
kernel = "/srv/xen/images/kernels/NetBSD/NetBSD-7.1/amd64/netbsd-XEN3_DOMU.gz"

On peut ensuite démarrer notre machine virtuelle, dans l'exemple suivant sans attacher la console locale de celle-ci :

root@rogue:/usr/pkg/etc/xen# xl create netbsd

On est vraiment obligé de spécifier sur le noyau ?

Dans le domU d'exemple du billet précédent, le système OpenWrt était démarré grâce à pygrub, un chargeur de démarrage pour Xen. Celui-ci n'est hélas pas capable de lire le système de fichiers FFS utilisé par NetBSD. Cela n'est pas non plus possible pour pv-grub, qui n'est de toute façon pas disponible dans les paquets Xen pkgsrc.

Quelles sont alors les possibilités ? La première consiste à créer une partition /boot en ext2/3/4 au début du disque virtuel, et d'y placer noyau et configuration Grub, comme l'indique ce tutoriel. Une autre consiste à compiler soi-même une version de Grub2, qui semble maintenant gérer Xen, tout du moins d'après ce billet du blog officiel Xen, daté de janvier 2015.

Autres actions possibles

Démarrer sa machine virtuelle, c'est bien, pouvoir effectuer d'autres actions et vérifications, c'est mieux ! Voici donc, en vrac, quelques commandes utiles pour gérer ses domU :

  • xl shutdown <chemin vers le fichier de configuration> permet d'arrêter proprement celui-ci ;
  • besoin d'appuyer sur le bouton Off comme un gros barbare ? xl destroy <nomdudomU> ;
  • lister les domU en fonctionnement : xl list ;
  • et pour avoir cette liste en temps réel, présentée à la manière d'un top, on peut utiliser xl top.

D'autres commandes et paramètres sont disponibles dans la page de manuel de la commande xl.

Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !

Crédit photo : ColonelMustard - the handler''

Propulsé par Dotclear