Quelques astuces diverses, onzième
J’ai stocké tout ça un peu trop longtemps et il est temps que je partage une nouvelle fournée de bricoles qui vous sauve une journée de boulot, ou un weekend un peu trop accaparé par des soucis ou des maintenances d’infras persos, quand ce n’est pas un dépannage lors d’un PSL 🙂
Coreutils 8.24 et suivants : dd qui cause !
J’ai découvert ça en toute fin d’année, après la finalisation du dernier épisode (et Pierre m’en a reparlé début février quand je suis retourné à la Cité des Sciences). Avec un coreutils récent (Debian Stretch, Ubuntu 16.04, Manjaro/Arch), dd a maintenant un mode verbeux pour dire où il en est, et ça c’est cool :
1 2 |
[seboss666@seboss666-ltp ~/Téléchargements ]$ dd if=manjaro-cinnamon-17.0.6-stable-x86_64.iso of=mcin.iso status=progress 1770226176 bytes (1,8 GB, 1,6 GiB) copied, 14 s, 126 MB/s |
Pratique quand on sait que les copies sur clé USB peuvent parfois prendre de longues minutes, surtout avec une clé USB poussive.
Rot13 « quick and dirty » en bash
Lors d’un petit délire sur un challenge de sécurité informatique, l’auteur a trouvé le moyen de s’amuser en ajoutant une petite étape à base de rot13. Quand on est pressé, qu’on a pas forcément le temps de chercher un outil tout fait, y’a moyen de le faire en bash (attention, tr
est fourni avec coreutils, merci Exagone313) :
1 |
echo 'messagealacon' | tr '[A-Za-z]' '[N-ZA-Mn-za-m]' |
Connexion SFTP avec un client OpenSSH récent et proftpd/mod_sftp
Récemment, le prestataire d’un client rencontrait des difficultés pour se connecter en SFTP à la plateforme de ce dernier. Après vérification, et un énième juron quand aux satanés fanatiques des ordinateurs fruités, il s’avère que le souci venait de proftpd qu’on utilise pour proposer justement la connectivité chiffrée. La solution tient à la modification des Digests :
1 |
SFTPDigests hmac-md5 hmac-sha1 hmac-sha2-256 hmac-sha2-512 hmac-ripemd160 hmac-sha1-96 |
Exporter les utilisateurs d’un vieux MySQL pour l’importer dans MySQL 5.7
Situation : on me demande de migrer d’un MySQL 5.5 vers MySQL 5.7. Oracle ne supporte que les upgrades de point à point, donc il me faudrait passer par MySQL 5.6. Pas ouf, et comme les bases de ce serveur de dev ne sont pas compliquées, je veux passer par des dumps bases et users à importer ensuite. Problème, Sur les dernières révisions de MySQL 5.7, la création d’utilisateur avec la syntaxe GRANT ... TO <user> IDENTIFIED BY ...
ne fonctionne plus. Petite routine maison pour contourner ce problème :
1 2 3 |
MYSQL_CONN="-uroot -ppassword" mysql ${MYSQL_CONN} --skip-column-names -A -e "SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') AS query FROM mysql.user WHERE user NOT IN ('root','pma','phpmyadmin','debian-sys-maint')" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql sed -i.bak 's/GRANT USAGE ON \*\.\* TO/CREATE USER/g' MySQLUserGrants.sql |
Et paf, ça fait des Chocapic.
Tunnel SSH en ligne de commande pour connexion MySQL distante
Pour chiffrer une connexion MySQL (qui est en clair par défaut, il faut le souligner), vous avez deux solutions principalement : mettre en place du TLS au niveau de MySQL, mais c’est pas évident, ou, pour du one shot, un tunnel SSH. Sous linux, rapidement :
1 |
ssh -L 3306:127.0.0.1:3306 user@server_with_mysql |
Il suffit ensuite de se connecter avec le client mysql en tapant sur son port local :
1 |
mysql -h 127.0.0.1 -S 3306 -uuser -p |
HTTPS, SNI, et Curl sont dans un bateau…
En procédant à des tests sur la bonne installation d’un certificat X509 sur un vhost dont le domaine ne pointe pas encore sur le serveur en question, plutôt que de bricoler du fichier hosts, j’ai préféré utiliser curl, mais il était récalcitrant avec les paramètres « habituels » :
1 2 3 4 5 6 7 |
root@vox:~# curl -Iv -H "Host: blog.seboss666.info" https://127.0.0.1 * Rebuilt URL to: https://127.0.0.1/ * Hostname was NOT found in DNS cache * Trying 127.0.0.1... * Connected to 127.0.0.1 (127.0.0.1) port 443 (#0) (...) curl: (51) SSL: certificate subject name 'xxxx.mariz.ovh' does not match target host name '127.0.0.1' |
Pas grand chose à voir avec mon vhost. En fait, c’est parce que de cette manière, Curl n’envoie pas d’entête SNI pour indiquer le nom qui doit être validé par le certificat, et dans un contexte avec plusieurs vhosts, cet entête permet de chercher à sélectionner le bon certificat en fonction de l’hôte. Curl sait le faire :
1 2 3 4 5 6 7 8 |
root@vox:~# curl -Iv --resolve blog.seboss666.info:443:127.0.0.1 https://blog.seboss666.info * Added blog.seboss666.info:443:127.0.0.1 to DNS cache * Rebuilt URL to: https://blog.seboss666.info/ * Hostname was found in DNS cache * Trying 127.0.0.1... * Connected to blog.seboss666.info (127.0.0.1) port 443 (#0) (...) HTTP/1.1 200 OK |
Il ne lui manque que la fonction café en fait à curl…
Une meilleure détection de l’état de santé d’un backend dans haproxy
Contexte : par défaut, les checks basiques d’haproxy ne servent qu’à détecter s’il y a toujours un port en écoute au niveau des serveurs de la ferme. Si vous avez deux serveurs et que l’un des deux est à moitié pété (ça écoute toujours mais l’application ne répond plus), vous avez une réponse sur deux qui n’est pas bonne. Pour optimiser ça, on peut faire un peu mieux au niveau de la configuration :
1 2 3 4 5 6 |
backend mon-backend option httpchk GET /check HTTP/1.1rnHost: www.mondomaine.com <span class="">http-check expect status 200</span> default-server inter 3s fall 3 rise 2 server srv1 10.0.0.1: 80 check server srv2 10.0.0.2: 80 check |
Au passage on voit aussi comment modifier les intervalles de vérification pour réellement limiter la visibilité du problème et des dégâts que ça pourrait provoquer.
Curl et Docker : tester un service Swarm en local
J’ai eu le tour sur mon propre cluster ainsi que sur les plateformes de tests fournies lors de ma formation par Treeptik. Une fois mon service déployé, j’essaie de le tester avec curl depuis le nœud où il est déployé, mais ça répond pas. En fait, les deux environnements en question sont paramétrés avec une ipv6, mais le service au sein de docker n’écoute qu’en v4, et ça aussi, curl est capable de s’en accommoder :
1 |
curl -4 http://127.0.0.1:8080/ |
Si vous devez tester/forcer en ipv6, utilisez -6
, mais dans mon cas ça ne fonctionnait pas.
Terminator en plein écran dès le lancement
C’est un problème récurrent/chiant que j’ai souvent, le gestionnaire de fenêtres n’enregistre pas les positions des fenêtres quand je les ferme, si bien que je dois les repositionner à chaque lancement (il n’ya guère que Thunderbird qui « tient le coup »). Pour ma machine virtuelle Linux du boulot (et maintenant sur ma grosse bertha à la maison), je lance principalement Terminator, et j’aime bien du coup qu’il prenne toute la place. Après quelques errements liés notamment au fait que je ne connais apparemment pas assez l’anglais, j’ai trouvé la solution en modifiant la commande dans le raccourci :
1 |
terminator --maximise |
Oui, je m’attendais à devoir utiliser --maximize
, et apparemment les deux orthographes sont correctes…
Et bien que j’attende généralement une dizaine d’astuces avant de publier, ça fait trop longtemps donc tant pis s’il n’y en a que 9. On essaiera de revenir dans les clous au prochain épisode 🙂
tr est fourni avec GNU coreutils, pas avec bash 😛
C’est dommage d’utiliser md5 ou sha1 maintenant …
J’ai constaté que les serveurs ne vérifiaient pas si le domaine passé avec SNI est le même que celui donné avec Host. TLS et HTTP sont gérés séparément. Je me rappelle avoir testé au moins avec nginx.
C’est difficile de faire autre chose que de l’IPv4 avec 127.0.0.1 🙂
Niveau algorithmes,
hmac-sha1-96
, c’est du SHA-1 (donc faible) mais tronqué donc encore moins solide, ethmac-ripemd160
, c’est un peu le même combat que SHA-1 a priori, il y a moins d’attaques mais aussi moins d’efforts publics pour essayer de le casser a priori. Idéalement, il ne faudrait faire que du SHA-2 parmi la liste donnée…Quand tu vois qu’on se bat encore pour faire désactiver SSLv3 sur certains clients, je t’assure que le choix des algos est pas une priorité. Quand on vient te gueuler dessus parce que le hipster sait pas se connecter, tu cherches au plus pressé, donc que ça marche. Et ça sans péter les accès des autres personnes ayant les droits pour se connecter au bousin (parce que ça m’est déjà arrivé de casser un truc en voulant faire plus propre, notamment sur du TLS, et devine ce que c’était : du monitoring…).
Yo,
Tu es sur Terminator depuis combien de temps ? Tu parlais de Guake il y a encore pas très longtemps. Je suis passé sur Terminator depuis 2 mois mais l’avenir c’est Tilix.
Tcho !
j’utilise Terminator principalement au boulot (pratique pour bosser sur plusieurs serveurs avec le même onglet, en plus des trois écrans), et là c’était pour ma VM Linux de mon pc de jeu pour lequel j »ai pas besoin de guake, puisqu’elle ne sert presque qu’à ça. Il est aussi installé sur le laptop, c’est rare que je l’utilise, mais ça arrive.
Sinon guake forever qu’est-ce que tu crois 😀
Pour dd il existait une alternative avec pv (progress viewer) :
$ (sudo) dd if=fichier | pv | dd of=destination
Pour
dd
, il existe aussikill
(etpkill
) pour lui demander où il en est, avec par exemplepkill -x -USR1 dd
qui envoie le signal USR1 (demande d’information pourdd
, mais ça peut stopper d’autres processus) à tous les processdd
en cours sur la machine.Oui alors, l’USR1 (et l’USR2) faut faire attention parce que c’est absolument pas consistant pour tous les utilitaires, c’est un signal « custom » que les outils peuvent utiliser pour différents besoins. Ici plutôt que de faire quelque chose de propre dès le départ, à savoir montrer la progression, on a préféré coller un signal système qui s’appelle avec la commande kill (c’est vrai c’est tellement évident comme fonctionnement), avec les risques que ça comporte. À la limite la bidouille pv était moins affreuse (j’ai du la présenter dans un épisode précédent si je ne m’abuse).
Bah… pour dd depûis des années il y a dcfldd >> sudo apt install dcfldd
et : # dcfldd if=/ toto.iso of=/dev/sdX
et la on a la progression en direct etc etc
Bah… pour dd depûis des années il y a dcfldd >> sudo apt install dcfldd
et :
# dcfldd if=/ toto.iso of=/dev/sdX
et là on a la progression en direct etc ..etc