- Erreur - 404 -
-La page que vous recherchez n'existe pas ou a été supprimée.
-Que voulez-vous faire ?
- -diff --git a/pr/119/.well-known/mta-sts.txt b/pr/119/.well-known/mta-sts.txt deleted file mode 100644 index 740174fd..00000000 --- a/pr/119/.well-known/mta-sts.txt +++ /dev/null @@ -1,6 +0,0 @@ - -version: STSv1 -mode: enforce -mx: mail.protonmail.ch -mx: mailsec.protonmail.ch -max_age: 1209600 \ No newline at end of file diff --git a/pr/119/.well-known/security.txt b/pr/119/.well-known/security.txt deleted file mode 100644 index 6a418ea6..00000000 --- a/pr/119/.well-known/security.txt +++ /dev/null @@ -1,3 +0,0 @@ -Contact: security@rix.fr -Expires: Wed, 1 Jan 2030 00:00 +0200 -Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/67B08D2BE9C8ACC2C40D28F1F69D39C94B03BD79 diff --git a/pr/119/404.html b/pr/119/404.html deleted file mode 100644 index af039a7c..00000000 --- a/pr/119/404.html +++ /dev/null @@ -1,270 +0,0 @@ - - -
- - - -La page que vous recherchez n'existe pas ou a été supprimée.
-Que voulez-vous faire ?
- -Parce que nous avons évolué au plus près des équipes de développement, nous savons qu'il est essentiel de bien comprendre le métier et d'assimiler ses contraintes.
-Parce que nous sommes issus de l’exploitation nous avons la prétention d’avoir une bonne vision des problématiques de mise en oeuvre d’une application web moderne. Et bien évidemment de son maintien en conditions opérationnelles.
-Spécialistes de l’hébergement des applications PHP/ Symfony métier sur-mesure nous avons au cours de notre expérience été confrontés à beaucoup des situations que vous rencontrez peut-être aujourd’hui.
-«Profile, don't assume !»-
Nous sommes soudés et fiers de l'être depuis de nombreuses années.
-Génération, utilisation et cas pratiques d'utilisation de clés SSH.
-Une clé SSH est un moyen d'authentification vers un serveur SSH reposant sur les principes de cryptographie asymétrique et d'authentification défi / réponse.
-Elle a deux avantages fondamentaux comparativement avec une authentification par couple identifiant/mot de passe:
-La très grande majorité des accès serveurs sont aujourd'hui basés sur leur utilisation, au dela de l'aspect fluidité et sécurité, elle ouvre également la possibilité d'authorisation multiple (sur plusieurs serveurs), de révocation et de signature des accès facilités.
-Secure Shell (SSH)
-- Secure Shell (SSH) est à la fois un programme informatique et un protocole de communication sécurisé. - Le protocole de connexion impose un échange de clés de chiffrement en début de connexion. Par la suite, tous les segments TCP sont authentifiés et chiffrés. Il devient donc impossible d'utiliser un sniffer pour voir ce que fait l'utilisateur. - Le protocole SSH a été conçu avec l'objectif de remplacer les différents protocoles non chiffrés comme rlogin, telnet, rcp et rsh. -
-Génération d'une paire de clés:
-ssh-keygen -t ed25519 -a 150
-Se connecter à un serveur distant
-ssh -i ~/.ssh/id25519 user@server_address
-Le principe de l'authentification par clés repose, comme explicité sur les différents liens ci-dessus, par la création d'une paire de clés asymétriques. -L'une de ces clés sera votre clé publique à déployer sur les machines auxquelles vous avez le droit de vous connecter, l'autre, votre clé privée. Et comme son nom l'indique, celle-ci est à vous et rien qu'à vous ; elle ne se partage pas. JAMAIS.
-Deux notions de base avant de se lancer pour bien comprendre ce que l'on fait:
-Il est recommandé, à la date de rédaction de cet article, d'utiliser l'algorithme Ed25519 qui a plusieurs avantages comparativement à RSA:
-ssh-keygen -t ed25519 -a 150 -C "courriel@example.com"
-
-L'option -C
permet d'ajouter un commentaire à votre clé, pratique notamment pour identifier le propriétaire d'une clé publique coté serveur.
Phrase de passe
-- Bien que facultative, il est « extrêmement vachement recommandé » de disposer d'une phrase de passe sur vos clés SSH (dans le cadre des cours et pour gagner du temps il est possible de s'en passer si vous n'utilisez pas votre clé en dehors de ceux-ci). -
-Cette commande vous aura généré deux fichiers dans le répertoire ~/.ssh/
(sauf si vous l'avez modifié bien évidemment):
id_ed25519.pub
(comme son extension l'indique c'est votre clé publique);id_ed25519
votre clé privée (on remarquera les droits qui lui sont appliqués 0600
, en effet seul votre utilisateur doit y avoir accès).Générer une clé RSA
-
- Ed25519 n'étant de temps en temps pas supporté (surtout par les anciens systèmes) il est parfois nécessaire de générer une paire de clé RSA (on remarquera la longueur de clé de 4096 bits recommandée à date de rédaction de l'article):
- ssh-keygen -t rsa -a 150 -b 4096
-
C'est un peu la finalité.
-Imaginons un serveur pour lequel votre clé est autorisée à se connecter (pour rappel fichier authorized_keys
), nous pouvons initier une connexion à l'aide de la commande:
ssh user@server_address
Cette commande aura donc pour effet « d'ouvrir » une connexion sur un serveur distant via le protocol SSH vous permettant de saisir des lignes de commande directement sur ce serveur et donc de l'administrer.
- -Cette exemple montre l'ouverture d'une session avec l'utilisateur debian
sur le serveur ayant pour adresse IP 146.59.243.95
.
Plusieurs choses à retenir à cette étape:
-~/.ssh
afin de les proposer au serveur auquel vous essayez de vous connecter.Si vous disposez de plusieurs clés SSH et que vous ne souhaitez pas que l'ensemble de vos clés privées soient soumises au serveur distant vous pouvez spécifier quelle clé utiliser en utilisant l'option -i
.
ssh -i ~/.ssh/id25519 debian@146.59.243.95
-Il est possible d'utiliser des syntaxes différentes en fonction de votre fichier de configuration SSH.
-Vous pouvez ainsi agir sur les comportements par défaut de votre client SSH et notamment sur la clé à utiliser en fonction de tel ou tel serveur.
-Avec l'intégration WSL2 de Windows et Docker Desktop, comment utiliser des conteneurs Docker dans une machine virtuelle WSL ?
-Avec l'arrivée de Docker Desktop il est dorénavant aisé de faire « tourner » des conteneurs Docker sous Windows. -Il est par contre moins simple d'utiliser d'autres outils propres au monde UNIX que nous aurons besoin d'utiliser avec le Lazy Ansible de Manala (make par exemple).
-Et comme nous préférons éviter d'installer trop de choses sur les machines hôtes nous opterons pour un fonctionnement qui reste relativement élégant à savoir lancer une machine WSL Debian et y faire tourner notre conteneur Docker. -De cette manière nous disposerons de l'ensemble de l'outillage Linux, sans avoir à l'installer sur notre poste.
-wsl --set-default-version 2
wsl --install -d Debian
Il faudra ensuite renseigner un nom d'utilisateur ainsi qu'un mot de passe (à ne pas perdre de préference). -Vous devriez au final obtenir un shell comme ci-dessous, félicitation vous êtes dans une machine virtuelle Debian WSL !
- -La partie la plus simple, téléchargez et installez le ici: https://docs.docker.com/desktop/windows/wsl/#download
-Il y a quelques options à vérifier / activer pour un bon fonctionnement.
-Il faudra pour cela quitter et relancer (Dans un PowerShell wsl -d Debian
) votre machine virtuelle Debian.
-Une fois à l'intérieur de celle-ci il sera nécessaire de donner les droits à votre utilisateur d'utiliser Docker en l'ajoutant au groupe du même nom.
usermod -a -G docker <username>
-Pour terminer la commande docker ps
devrait vous renvoyer l'écran ci-dessous:
- Une typo ? - Modifier cet article sur Github -
-Apprendre à utiliser le fichier de configuration SSH pour organiser ses options de connexion.
-Si vous vous connectez à plusieurs hôtes distants il y a fort à parier que vous ne mémorisez pas les subtilités de connexion propre à chacun d'entre eux (utilisateur spécifique, port non standard, options spécifiques…).
-On a eu, il est vrai, l'occasion de croiser des façons originales de le faire, notamment à base d'alias Bash mais ça reste assez artisanal alors même que tout est prévu et qu'OpenSSH permet de définir un fichier de configuration propre à chaque utilisateur du système ;)
-Cet article, principalement à destination des étudiant·e·s et des nouveaux arrivants dans le domaine saura sans doute également servir de pense bête aux confirmé·e·s !
-Ils sont plus que pauvre puisqu'un client OpenSSH et une machine distante à laquelle se connecter suffiront.
-Contenu d'un fichier config d'un client SSH pour référence:
-Host *
- User rix
- IdentityFile ~/.ssh/ed_25519.key
- IdentityFile ~/.ssh/id_rsa.key
- IdentitiesOnly yes
- ForwardAgent yes
-Comme abordé dans l'introduction, il existe autant de manières de se connecter à un serveur avec SSH qu'il n'en existe (de serveurs), les principaux bénéfices que l'on peut retirer de cette utilsation:
-En « standard » vous trouverez un dossier appelé .ssh
dans le répertoire utilisateur de votre système (/home/username/
sur un système de type UNIX ou C:\Users\username\
sous Windows). C'est ici que nous allons créé un fichier appelé tout simplement config
(sans extension).
Configuration globale
-
- Il est possible d'appliquer un comportement global au client SSH (C'est à dire pour tous les utilisateurs du système) en utilisant le fichier /etc/ssh/ssh_config
.
-
Si le répertoire .ssh
n'existe pas (il est créé automatiquement lorsque vous créez une nouvelle clé par exemple) vous pouvez le créer comme suit:
mkdir -p ~/.ssh && chmod 0700 ~/.ssh
-Pour ensuite créer le fichier config
touch ~/.ssh/config && chmod 0600 ~/.ssh/config
-Les droits
-
- Attention SSH est très sensible (à juste titre) aux droits appliqués aux fichiers qu'il doit utiliser.
- Le répertoire .ssh
tout comme le fichier config
ne doit être accessible, lisible et modifiable qu'à l'utilisateur propriétaire.
-
Le fichier config
est basé sur un système de paires clé/valeur organisées par section, une structure minimal d'un fichier de configuration pourrait être la suivante:
Host server-hostname-1
- KEY value
- KEY value
-Allons plus loin avec une configuration:
-Host server-hostname-1
- HostName server.tld
- User rix
- IdentityFile ~/.ssh/ed_25519.key
-La directive Host
permet d'indiquer à la fois une nouvelle section mais également le « pattern » qui permettra au client de savoir quand appliquer la configuration.
-Dans ce premier exemple c'est assez simple et spécifique puisque notre bloc s'appliquera à la chaine server-hostname-1
Ainsi lorsque nous taperons ssh server-hostname-1
notre client saura à quel hote se connecter, avec quel utilisateur et quelle clé.
-L'équivalent sans fichier de configuration serait ssh -i ~/.ssh/ed_25519.key rix@server.tld
L'utilisation d'un fichier de configuration prend tout son sens lorsque l'on souhaite appliquer des comportements spécifiques à un ensemble de machines.
-Il est ainsi possible d'utiliser des « pattern » (et de les enchaîner) en utilisant des opérateurs:
-Host *
par exemple s'appliquera à tous les hôtes puisque le caractère *
correspond à aucun ou plusieurs caractères.192.168.140.*
il est possible de composer, dans ce cas vous appliquerez votre configuration à l'ensemble des hôtes dont l'adresse fait partie du sous réseau 192.168.140.0/24
?
permet de restreindre une expression à un seul caractère. Ainsi Host 172.16.1.?
correspondra à tous les hôtes ayant en dernier octet un chiffre compris entre 0 et 9.!
En début de chaîne permet d'exclure une correspondance. Ainsi 172.16.1.* !172.16.1.20
s'appliquera à tous les hôtes du sous réseau 172.16.1.0/24
à l'exception de 172.16.1.20
.Organisation et structure du fichier
-- Le fichier de configuration SSH n'impose pas d'indentation, il est toutefois fortement recommandé de l'organiser afin de faciliter sa lecture et sa maintenance. - Il faut également noter que les instructions sont appliquées dans leur ordre d'apparition il est donc préférable de commencer par les sections très spécifiques et de terminer par les plus génériques. -
-Il est possible en fonction d'où elles sont indiquées de surcharger certaines options de connexion, ainsi votre client SSH considérera par ordre de priorité:
-config
du compte utilisateur (~/.ssh/config
)/etc/ssh/ssh_config
Ainsi en reprendant notre section précédente:
-Host server-hostname-1
- HostName server.tld
- User rix
- IdentityFile ~/.ssh/ed_25519.key
-Il est possible de vous connecter avec un autre utilisateur que celui défini dans votre fichier en surchargeant la clé User
, soit avec ssh root@server-hostname-1
ou encore ssh -o "User=root" server-hostname-1
.
Il est également possible, notamment lorsque le contenu des fichiers devient conséquent ou tout simplement pour organiser ses configurations entre différents contextes (clients, perso, pro...), de séparer la configuration dans plusieurs fichiers.
-Il est ainsi possible d'avoir autant de fichiers de configuration que de contextes pour ensuite les inclure dans notre fichier principal.
-Exemple:
-# Contenu de ~/.ssh/config
-Host server-hostname-1
- HostName server.tld
- User rix
- IdentityFile ~/.ssh/ed_25519.key
-
-Include ~/.ssh/config_alternative
-# Contenu de ~/.ssh/config_alternative
-Host 192.168.140.*
- User debian
- IdentityFile ~/.ssh/id_rsa.key
- AddKeysToAgent yes
- UseKeychain yes
-Le fichier config
supporte nombre d'options de configuration, celles-ci sont consultables ici.
-Il va de soi que dans l'activité quotidienne, les mêmes instructions sont souvent utilisées, ci-dessous une liste des plus courantes:
IdentityFile
: Nous l'avons vu précédemment, elle permet d'indiquer la clé à utiliser pour la section définie;ForwardAgent
: Un grand classique, permet de « faire suivre » comme son nom l'indique au serveur distant, votre clé privée de manière à ce que celui-ci la stocke dans son propre agent SSH. Cette option permet ensuite de se connecter à d'autres serveurs « par rebond », c'est ce principe qui est notamment mis en oeuvre par les « bastions » SSH;IdentitiesOnly
: Important si vous utilisez l'option précédente, permet de ne transmettre que la ou les clé(s) spécifiée(s) avec l'option IdentityFile
précédente, par défaut SSH envoie toutes les clés privées qu'il trouvera dans votre trousseau;StrictHostKeyChecking
: Permet de vérifier la signature du serveur auquel on se connecte, toujours à Yes
sauf dans le cas de figure que l'on présente plus bas.Désactiver StrictHostKeyChecking
- Précaution d'usage, à ne faire que si vous savez réellement ce que vous faites ;) - Le seul exemple qui me vient à l'esprit pouvant nécessiter de désactiver cette option est celui de séances de cours / TP durant lesquelles nous avons souvent besoin de créer / détruire des instances qui peuvent potentillement récupérer les mêmes adresses IPs. -
-Pour éviter d'avoir régulièrement l'erreur, WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
il est possible de spécifier:
StrictHostKeyChecking no
-UserKnownHostsFile /dev/null
-Le principe du multiplexage réside dans le fait de « partager » la même connexion entre les différentes sessions ouvertes sur une même machine. -Cette stratégie permet, dans le cas d'SSH de réutiliser une connexion TCP déjà ouverte vers un serveur distant.
-Le but ? S'épargner le délai d'ouverture d'une connexion TCP ainsi que celui de la réauthentification. -Cette fonctionnalité peut-être particulièrement utile lors du transfert de nombreux fichiers d'une machine à une autre, elle réside principalement en l'utilisation de 3 options de configuration:
-ControlMaster
: Permet d'indiquer à SSH la stratégie à adopter lorsqu'il détecte une possibilité de réutilisation d'une connexion ouverte (Fixée à no
par défaut);ControlPersist
: Permet d'indiquer comment SSH doit gérer la fermeture de la connexion initiale à la machine distante (celle qui a entrainée l'ouverture de la socket partagée);ControlPath
: Le chemin vers la socket utilisée pour le partage de connexion, cette option supporte les tokens %h
%p
et %r
dont la combinaison est très fortement recommandée. Plus d'informations sur les tokens supportés par SSH (https://man.openbsd.org/ssh_config#TOKENS).Host server-hostname-1
- HostName server.tld
- User rix
- IdentityFile ~/.ssh/ed_25519.key
- ControlPath ~/.ssh/controlmasters/%C
- ControlMaster auto
- ControlPersist 10m
-Le token %C
-
- On remarquera son utilisation dans l'exemple ci-dessus. Il s'agit du hash SHA1 des tokens %l%h%p%r (Respectivement le nom d'hôte local (%l
), le nom d'hôte distant (%h
), le port de connexion distant (%p
) et pour finir le nom d'utilisateur distant utilisé (%r
)).
- L'utilisation du token %C
assurant à la fois, l'unicité de la connexion et l'obfuscation de ses détails sur le système de fichiers.
-
- Une typo ? - Modifier cet article sur Github -
-Génération, utilisation et cas pratiques d'utilisation de clés SSH.
-Interprétation pas à pas d'un incident sur infrastructures applicatives, cas pratique d'un incident vécu.
- - -Avec l'intégration WSL2 de Windows et Docker Desktop, comment utiliser des conteneurs Docker dans une machine virtuelle WSL ?
- - -Apprendre à utiliser le fichier de configuration SSH pour organiser ses options de connexion.
- - -Construire une image source Debian à déployer sur Raspberry Pi en remplacement de Raspberry Pi OS (anciennement Raspbian).
- - -Intégrer (relativement) facilement des agendas iCloud à Gnome Calendar
- - -Passer d'OSX à Linux en milieu professionnel, le quotidien, équivalence d'applications, fonctionnement, astuces.
- - -Tour d'horizon de ce qu'on a pour faire de beaux articles. Et quelques bonnes pratiques de rédaction.
- - -Construire une image source Debian à déployer sur Raspberry Pi en remplacement de Raspberry Pi OS (anciennement Raspbian).
-Je vous vois venir ! Quelle idée de vouloir construire sa propre image ? -Alors même que Raspberry fourni un OS ET un utilitaire permettant de créer des cartes SD « bootables » rapidement et quasi sans douleur !
-Pour les opérations à suivre utilisez une Debian Bulleyes (de préférence VM)
-git clone --recursive https://salsa.debian.org/raspi-team/image-specs.git
-cd image-specs
apt install -y vmdb2 dosfstools qemu-utils qemu-user-static debootstrap binfmt-support time kpartx bmap-tools python3
-apt install -y fakemachine
make raspi_4_bullseye.img
;dd if=raspi_4_bullseye.img of=/dev/XXX bs=64k oflag=dsync status=progress
.Oui mais…
-Avant d'aller plus loin il faut savoir que nous utilisons en interne plusieurs Raspberry Pi afin de faire tourner des services qui nous permettent de piloter la gestion du réseau local de nos bureaux et/ou d'y fournir des services basiques et non critiques (Serveurs DNS locaux, VPN, métriques, monitoring…).
-Nous avons également une petite flotte de ces machines qui nous permettent d'aller enseigner « quelques trucs » à des étudiants (du réseau, du provisioning, linux…) en se reposant dessus.
-Alors bien évidemment le besoin ne tombe pas du ciel, et même si l'exercice reste formateur et amusant (si, si) le but n'est bien évidemment pas « juste ludique ». -Raspberry Pi OS a en fait ses limites, particulièrement lorsqu'on va l'utiliser sur d'anciens Raspberry Pi (notamment des 2 ou précédents).
-Pour terminer il faut savoir que Raspbian (dérivé de Debian) a été créé en premier lieu parce que jusqu'à 2018 il n'était pas possible de démarrer un kernel linux sur Raspberry Pi mais également parce que Raspbian arrivait avec des composants non libres contraires à la philosophie Debian.
-On se retrouve notamment par défaut (il est possible d'aller chercher d'autres versions d'OS dans l'utilitaire de création d'images) avec une version de Raspberry Pi OS commune à toutes les versions et donc 32 bits…
-Pour rappel les premières architectures 64 bits des Raspberry Pi sont arrivées avec la version 3. -Debian fait le choix de coller exactement aux différentes archi, mais au prix d'une image pour chacune, celles-ci sont d'ailleurs disponibles ici.
-Version Raspberry Pi | -Debian | -Raspberry Pi OS | -
---|---|---|
0 / 1 | -armel, 32 bit | -armhf, 32 bit | -
2 | -armhf, 32 bit | -armhf, 32 bit | -
3 | -arm64, 64 bit | -armhf, 32 bit | -
4 | -arm64, 64 bit | -armhf, 32 bit | -
Il existe d'autres versions d'OS disponibles en version serveur ou desktop (Ubuntu, Manjaro…) mais comme nous utilisons les roles Ansible du projet Manala pour provisionner l'ensemble de nos machines et afin d'assurer au maximum la compatibilité (et nous éviter de la maintenance), nous préferons rester cohérents et utiliser Debian.
-Pour terminer, les images pré-construites Debian peuvent carrément faire l'affaire mais certains choix de configuration ne nous vont pas et nous avons besoin que nos images soient prêtes à être « provisionnées » et donc disposer:
-Ils sont peu nombreux, tant la construction d'images est rendue très simple par les contributeurs à la version Raspberry Pi de Debian.
-Vous aurez besoin:
-En tout premier lieu, une fois sur votre VM Debian Bullseye, on clone le répertoire d'outils:
-git clone --recursive https://salsa.debian.org/raspi-team/image-specs.git
-cd image-specs
-Nous aurons également besoin de quelques paquets pour la construction:
-apt install -y vmdb2 dosfstools qemu-utils qemu-user-static debootstrap binfmt-support time kpartx bmap-tools python3
-apt install -y fakemachine
-Le fichier makefile fournit vous permet ensuite, au choix:
-De construire une image spécifique à votre Raspberry Pi en utilisant une configuration par défaut:
-make raspi_<model>_<release>.img
<model>
vaut pour la version de votre Raspberry (1,2,3 ou 4 avec 1 utilisé pour les versions Pi 0, 0w and 1);<release>
pour la version de Debian que vous souhaitez construire.Dans notre cas une Bullseye pour un Raspberry Pi 2: make raspi_2_bullseye.img
De construire une image spécifique à partir de VOTRE configuration (et c'est ce choix qui nous intéresse)
-Alors bien évidemment nous ne partirons pas d'une page blanche mais du fichier de configuration généré par l'outil grâce à la commande:
-make raspi_2_bullseye.yaml
Nous obtenons un fichier de configuration par défaut (celui utilisé pour la construction de l'image avec la commande précédente). -Il est possible de l'éditer directement mais préférable de le nommer différemment histoire de ne pas malencontreusement écraser nos prochaines modifications en rejouant la commande précédente.
-cp raspi_2_bullseye.yaml rix_raspi_2_bullseye.yaml
En ce qui nous concerne nous y opérerons plusieurs modifications:
-- chroot: tag-root
- shell: |
- useradd -g100 -Gsudo -m -s /bin/bash rix
-- create-dir: /home/rix/.ssh
- uid: 1000
- gid: 100
-- create-file: /home/rix/.ssh/authorized_keys
- contents: |+
- ssh-ed25519 AAAAC3XXXXXXXXXXXXXXXXXXXX
-- create-file: /etc/sudoers.d/rix-default
- contents: |+
- rix ALL=(ALL) NOPASSWD: ALL
-root
locale sans mot de passe.- # Allow root logins locally with no password
-- sed -i 's,root:[^:]*:,root::,' "${ROOT?}/etc/shadow"
-La directive chroot
- Elle est essentielle dès lors que vous souhaitez exécuter une commande dans le contexte du système en cours de construction. -
-Une fois l'ensemble de nos instructions ajoutées à notre fichier nous pouvons démarrer la construction de notre image:
-vmdb2 --rootfs-tarball=rix_raspi_2_bullseye.tar.gz --output \
-rix_raspi_2_bullseye.img rix_raspi_2_bullseye.yaml --log rix_raspi_bullseye.log
-Cette commande devrait nous donner en sortie 3 fichiers:
-rix_raspi_bullseye.log
rix_raspi_2_bullseye.img
rix_raspi_2_bullseye.tar.gz
L'installation de l'image est ensuite assez standard, une fois votre carte SD montée:
-bmaptool
à partir de l'image compressée;bmaptool copy rix_raspi_2_bullseye.tar.gz /dev/mmcblk0
dd
:dd if=rix_raspi_2_bullseye.img of=/dev/XXX bs=64k oflag=dsync status=progress
- Attention à la « cible » de l'écriture, en cas de mauvais volume sélectionné vous écraserez son contenu. -
-Vous voilà paré·e·s pour déployer du Raspberry Pi en série sur une base Debian !
-Sources:
-- Une typo ? - Modifier cet article sur Github -
-Intégrer (relativement) facilement des agendas iCloud à Gnome Calendar
-Contrairement à ce que certains pensent on peut être utilisateur d'un iPhone (ou d'un iPad) sans avoir de mac.
-Et oui c'est mon cas d'ailleurs ;)
-Autant je ne changerais pas mon iPhone contre un Android (même si j'ai aussi un XPeria avec SailfishOS) autant je n'échangerais pas plus mon Linux contre un OSX.
Oui mais… bien qu'il devrait être très facile de synchroniser ses agendas iCloud avec Gnome (étant donné qu'iCloud propose un format CalDAV), la réalité n'est pas tout aussi simple !
-Petit guide pour épargner les arrachages de cheveux pour y parvenir.
-En tout premier lieu, ouvrez l'onglet « Agenda » (vous serez pas défaut sur la vue « courriel ») une fois sur la partie agenda, créer en un nouveau comme ci-contre.
-Renseignez ensuite vos informations et suivez les étapes ci-contre.
--
Pour terminer, libre à vous d'activer les options afin de rendre vos agendas disponibles hors ligne et de sélectionner votre agenda par défaut.
-ATTENTION
les étapes ci-dessus devront être répétées pour CHACUN
des agendas dont vous disposez, je n'ai pas trouvé mieux pour l'instant.
-Une fois vos agendas synchronisés vous pouvez fermer Evolution, l'agenda de Gnome devrait automatiquement ajouter les agendas que vous venez de configurer.
- Une typo ? - Modifier cet article sur Github -
-Passer d'OSX à Linux en milieu professionnel, le quotidien, équivalence d'applications, fonctionnement, astuces.
-Parce que le choix (ou la nécessité) de changer de système d'exploitation remet en cause notre utilisation quotidienne et nos réflèxes applicatifs, il me parait louable de partager MA façon d'utiliser Linux après de nombreuses années avec OSX et quelles solutions j'ai « trouvé » pour reprendre mes marques notamment en terme d'équivalence d'applications et d'utilisation au quotidien.
-Billet à destination de celles et ceux qui hésitent encore à franchir le pas de peur de se retrouver perdu·e.
-En préambule et pour mieux cerner certaines contraintes que j'ai pu avoir ou choix que j'ai pu faire:
-pro et perso
depuis plus de 20 ans (J'ai commencé avec Debian/Potato);Je ne prêche pour aucune distribution en particulier
, sauf côté serveur, mais ça n'est pas le sujet;
-Gnome
comme environnement graphique;Je séparerai cet article en plusieurs parties en fonction des différentes utilisations:
-Sans plus attendre un premier chapitre qui va se concentrer sur l'utilisation que chacun d'entre nous peut avoir d'une machine.
-L'une des premières utilisation, les courriels !
-J'utilise uniquement les clients de courriel et quasiment jamais un navigateur pour consulter ma messagerie. Avec OSX j'utilisais l'excellent Postbox
.
Du côté de linux j'ai retenu deux candidats:
-Mailspring
qui dispose d'une interface beaucoup plus simple et accessible et fonctionne très bien avec le bridge de chez ProtonMail
.À noter que j'attends la refonte annoncée de Thunderbird avec impatience tant le fonctionnel de Mailspring reste « relativement » limité.
-(Mise à jour du 18 Novembre 2022: Quelques écrans de la nouvelle interface ont fait leur apparition, ils semblent augurer d'un gros et bon travail d'UI.)
Au niveau des messageries j'utilise principalement Signal
et Whatsapp
(pour les proches), les deux disposent d'intégration des clients comme je l'avais sous OSX rien à signaler à ce niveau on est ISO !
Probablement la brique la plus standardisée à l'heure actuelle, on retrouve exactement la même chose côté Linux c'est donc plus l'affinité de chacun qui va jouer.
-De mon côté j'en utilise deux principalement Brave
(sur une base chromium donc) et Librewolf
(sur une base Firefox).
À ces derniers vient se greffer TorBrowser
.
Ah ! La bureautique…
-Point de friction lié principalement à la comptabilité avec les formats propriétaires, je n'ai plus rencontré de « vrai » problème depuis un moment.
-J'utilise OnlyOffice Desktop
pour l'édition de document de type Word et Excel et ça juste marche !
Point plus embêtant si vous avez des imprimantes réseau un peu anciennes il est probable qu'il vous soit compliqué d'imprimer sans faire un effort de configuration (je ne l'ai pas fait, je n'imprime quasiment jamais).
-Du côté des PDFs, le visionneur de documents de Gnome fait très bien le boulot pour de la lecture.
-Au niveau de l'édition c'est un domaine ou il faut encore bricoler par rapport à OSX qui est très bon nativement pour manipuler les PDFs.
-J'utilise donc Xournal++ dès lors que je dois y insérer des images ou autres éléments mais il s'agit d'un projet qui semble être à l'abandon et pour lequel je n'ai pas encore cherché/trouvé d'alternative viable.
Là encore l'offre est plétorique, après avoir pas mal utilisé Lightning
(Thunderbird) je suis revenu sur Gnome Calendar
qui fait le boulot.
ATTENTION toutefois il n'intègre pas la mécanique d'invitations, si vous planifiez beaucoup de réunions il vaut sans doute mieux rester sur Lightning.
-Pour ceux qui disposent d'agendas iCloud (j'en fais partie) leur ajout à Lightning passe par l'utilisation de l'extension TBSync quant à Gnome Calendar il faut passer par une gymnastique assez lourde que je décris ici.
-- Une typo ? - Modifier cet article sur Github -
-Interprétation pas à pas d'un incident sur infrastructures applicatives, cas pratique d'un incident vécu.
-Premier article concernant la résolution d'incidents, toujours à but de formation. -N'ayant jamais vu beaucoup d'articles traitant du sujet il nous parait intéressant d'expliquer et commenter les post-mortems qu'il nous arrive d'envoyer à nos clients. -C'est aussi, à notre avis, une bonne façon (si ce n'est la meilleure) d'expliquer pourquoi le DevOps est important dans les métiers SRE, à quoi il sert et comment nous utilisons les outils que l'on met en place.
-Gardez à l'esprit que chaque applicatif est unique (même si l'on retrouve des comportements type) et que l'un des meilleurs indices d'anomalie et « l'écart par rapport à la moyenne normale », autrement dit un comportement qui diffère fortement de ce que vous avez l'habitude de voir.
-Pour finir, c'est l'exercice le moins « confortable » du métier. -En fonction de sa gravité, l'incident infra peut passer inaperçu comme impacter de manière significative l'activité d'un client, l'expérience des équipes dans ce cas de figure est souvent un facteur clé pour la rapidité de la résolution.
-Le contexte est assez classique pour de l'application web.
-En complément:
-Comme tous les incidents, nous sommes alertés par nos sondes infra:
-Il n'est pas rare d'avoir des alertes isolées dues à une défaillance d'un hyperviseur ou à une panne réseau, dans notre cas de figure l'effondrement de l'infrastructure est très rapide (inférieure à 3 minutes), aucun doute donc sur « un gros pépin ».
-Les alertes infras se terminent par une alerte StatusCake sur le « endpoint » applicatif HTTP configuré.
-Nous notifions à notre client le début de l'incident et le début d'analyse pour remédiation.
-Elles sont systématiques en cas d'incident et consistent en une checklist assez simple:
-En seconde étape nous procédons à une première analyse des « graphs » sur quelques unes des instances applicatives:
- -Pour autant les instances n'apparaissent pas « chargées » outre mesure.
-Sur l'ensemble des instances nous ne constatons pas d'augmentation de la consommation des ressources, de même le traffic n'explose pas, nous ne sommes donc pas dans le cas d'un afflux massif de connexions (légitimes ou non d'ailleurs), ni d'une charge anormale du à un script mal conçu.
-Nous disposons toutefois d'un premier indice au niveau réseau, puisque nous constatons une augmentation des connexions « ouvertes » et une chute flagrante des connexions en attente de fermeture.
-Nous avons également constaté que les médias applicatifs sont bien disponibles et que nous n'avons pas de coupure vers les espaces de stockage distants.
-À ce stade nous avons donc une infra fonctionnelle mais une application « dans les choux ». -Nous tentons une première approche en redémarrant les services PHP-FPM sur l'ensemble des instances, ceux-ci se retrouvent rapidement à nouveau saturés et hors service, comportement qui semble confirmer un souci d'ordre applicatif.
-Il est temps d'aller jeter un oeil aux logs applicatifs qui donnent rapidement un résultat puisque nous avons l'erreur suivante:
-SQLSTATE[HY000]: General error: 2006 MySQL server has gone away at XXXXXXX
-Nous avons donc bien une perturbation au niveau de la connectivité entre les instances applicatives et les instances de base de données, reste à déterminer la raison !
-À ce stade nous prenons contact avec l'équipe de développement applicatif afin de disposer de sa connaissance métier et fonctionnelle.
-Nous poursuivons nos investigations à l'aide de nos métriques infra / applicatif plus spécifiquement sur le réseau privé, zone d'échange entre les instances applives et données pour y trouver ceci:
- - - -Enfin du concret ! On constate à l'aide de ces deux graphs une volumétrie de données d'échange anormalement élevée entre les instances applicatives et les instances de base de données.
-Constat:
-On constate surtout que cette volumétrie vient saturer la bande passante avec un bel « effet plafond » du graph concerné (3).
-Nous avons donc la cause de l'incident à savoir, la saturation de la bande passante entre les instances applicatives et les instances de base de données, ce qui conduit à une grosse attente au niveau PHP-FPM qui se retrouve dans l'incapacité de prendre de nouvelles connexions entrantes.
-Au passage, on voit ici l'importance de « caper » le nombre de connexions maximum que l'on autorise à PHP-FPM, dans le cas ou ce travail n'est pas et/ou mal fait ou si aucun seuil n'est fixé, nous pouvons avoir potentiellement une perte complète de la connectivité à l'instance applicative qui peut impacter de manière significative le temps de rétablissement.
-Nous avons l'origine du blocage, il nous faut à présent comprendre d'où cela vient, nous passons donc du côté serveur de base de données.
-Afin d'identifier d'éventuelles requêtes problématiques nous jouons un SHOW PROCESSLIST
sur notre serveur de base de données et isolons les requêtes en cours d'exécution depuis plusieurs secondes.
-En rejouant l'une de ces requêtes nous constatons qu'elle est anormalement volumineuse (taille supérieure à 5Mo).
Plus spécifiquement elle « ramène » un champ d'une table bien précise et après échange avec les équipes applicatives il correspond à l'ajout d'un « relativement nouveau » fonctionnel, relativement parce qu'il a tout de même quelques semaines mais n'a, à priori pas été utilisé tout de suite par les utilisateurs finaux.
-Le champ en question permet de stocker du contenu libre saisi par l'utilisateur à l'aide d'un éditeur de contenu (À ce moment là, certain(e)s d'entre vous doivent avoir une idée de ce qu'il se passe ;)).
-Nous décidons de passer la publication concernée en « draft »... ce qui est sans influence directe sur la saturation de la bande passante.
-Nous élargissons notre champ de recherche, cette fois-ci en recherchant les lignes disposant d'un champ de contenu dont la taille est supérieure au Mo (SELECT id ... WHERE CHAR_LENGTH(content) > 10000
), pour finalement identifier une centaine de lignes présentant la même problématique.
Vu la gravité de la situation (indisponibilité complète de l'application) et en concertation avec les équipes applicatives nous « dépublions » l'ensemble des contenus problématiques ce qui a pour effet de faire revenir les échanges de données à un seuil normal et de facto rendre à nouveau disponible l'applicatif.
-Dans le même temps les équipes applicatives auront préparé un « quick fix » désactivant la fonctionnalité, le temps de la retravailler.
-Il s'avère que l'application proposait un module de publication à ses utilisateurs embarquant un éditeur de contenus riches qui autorisait l'insertion d'images directement dans les contenus HTML (sans passer par un stockage sur le système de fichiers et donc directement en base de données). -Cerise sur le gateau, nous sommes en 2023 et les images « brutes » pèsent souvent plusieurs Mo.
-Ce cas est une parfaite illustration de ce que l'on peut avoir comme incident avec une application web, bien que l'origine soit assez sournoise, en effet il n'est pas déclenché par une mise à jour récente mais par un fonctionnel développé il y a plusieurs semaines, mais mis en avant que récemment. -De plus, en première lecture, il n'y a pas d'incident apparent, ni charge anormale des instances, ni pépin réseau.
-Les logs applicatifs permettent de s'orienter vers une cause probable de l'indisponibilité mais ne sont pas suffisants pour identifier de manière précise son origine, c'est leur corrélation avec la lecture des métriques qui permet de gagner énormément de temps sur le diagnostic et ainsi cerner le problème.
-Les équipes applicatives sont un renfort précieux, pour dans un premier temps, fournir les informations de dernières mises à jour ou d'arrivée de nouveau fonctionnel (et surtout de mettre en relation un fonctionnel et un schéma de données) et dans un second temps pour corriger (même temporairement) le code, afin d'éviter une rechute inévitable.
-- Une typo ? - Modifier cet article sur Github -
-Tour d'horizon de ce qu'on a pour faire de beaux articles. Et quelques bonnes pratiques de rédaction.
-1 page = 1 titre principal h1
.
Dans le blog, le h1
est le titre de l'article. Dans le corps de l'article, on commence donc par des h2
.
Le sommaire permet d'afficher les h2
et les h3
présents dans l'article. Selon le besoin, précisez le niveau de titre à faire figurer au sommaire.
tableOfContent: true
-# identique à:
-# tableOfContent: 2
-ou
-tableOfContent: 3
-Nous avons des paragraphes, des liens, parfois du code inline
.
--Nous avons aussi des citations. -- Jane Doe
-
Un coup sur deux, on a un style différent de citation, sinon on s'ennuie.
---Quoi ? Un deuxième style de citation ? Eos officia, vel corporis eaque architecto eveniet voluptatibus, ullam impedit excepturi quis quidem sint facere laboriosam harum error esse iusto. Asperiores, placeat. -John Doe
-
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod -tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, -quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo -consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse -cillum dolore eu fugiat nulla pariatur.
-Titre
-
- Nous avons des admonition
pour les informations à faire ressortir.
-
Excepteur sint occaecat cupidatat non -proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-Titre
-- Le même composant dans le style "success". -
-Excepteur sint occaecat cupidatat non -proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-Titre
-- Le même composant dans le style "danger". -
-Une image (qui a du sens, ça n'inclut pas les gifs rigolos) a toujours une légende, et si possible on crédite son auteur·ice.
- -<figure>
- <img src="./../../images/blog/styleguide/photo.png" alt="photo de ...">
- <figcaption>
- <span class="figure__legend">Photo de ...</span>
- <span class="figure__credits">Crédit photo : <a href="">Nom de l'auteur</a></span>
- </figcaption>
-</figure>
-Lorem ipsum, dolor sit amet consectetur adipisicing elit. Non natus laborum optio provident, ad dolore molestiae ea, labore quo mollitia eaque iste accusantium similique fugit voluptatem nisi asperiores facilis consectetur.
-Lorem ipsum, dolor sit amet consectetur adipisicing elit. Non natus laborum optio provident, ad dolore molestiae ea, labore quo mollitia eaque iste accusantium similique fugit voluptatem nisi asperiores facilis consectetur.
-Lorem ipsum, dolor sit amet consectetur adipisicing elit. Non natus laborum optio provident, ad dolore molestiae ea, labore quo mollitia eaque iste accusantium similique fugit voluptatem nisi asperiores facilis consectetur.
-Lorem ipsum, dolor sit amet consectetur adipisicing elit. Non natus laborum optio provident, ad dolore molestiae ea, labore quo.
-<div class="side-image">
- <div class="side-image__content">
- <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Non natus laborum optio provident, ad dolore molestiae ea, labore quo mollitia eaque iste accusantium similique fugit voluptatem nisi asperiores facilis consectetur.</p>
- </div>
- <figure>
- <img src="https://upload.wikimedia.org/wikipedia/commons/b/bc/Juvenile_Ragdoll.jpg">
- <figcaption>
- <span class="figure__legend">Légende</span>
- <span class="figure__credits">Crédit photo</span>
- </figcaption>
- </figure>
-</div>
-ou si l'image n'a pas besoin de légende / crédit :
-<div class="side-image">
- <img src="content/images/blog/styleguide/exemple-image.jpg">
- <div class="side-image__content">
- <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Non natus laborum optio provident, ad dolore molestiae ea, labore quo mollitia eaque iste accusantium similique fugit voluptatem nisi asperiores facilis consectetur.</p>
- <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Non natus laborum optio provident, ad dolore molestiae ea, labore quo.</p>
- </div>
-</div>
-Pour les autres images, utilisez simplement la syntaxe Markdown classique (cf sections suivantes).
-Les images inclues dans un contenu sont automatiquement adaptée et fournies en version rétina et non-rétina lorsque cela le permet.
-![Image d'exemple depuis la racine du projet](content/images/blog/styleguide/exemple-image.jpg)
-![Image d'exemple en relatif](./../../images/blog/styleguide/exemple-image-relative.jpg)
-- Les GIFs ne peuvent être redimensionnés mais peuvent tout de même être référencés -
-![Test gif](./../../images/blog/styleguide/exemple-gif.gif)
-Pensez à préciser dans le markdown le langage dans lequel est votre code, si vous voulez des couleurs ! 🌈
-<html>
- <head></head>
- <body>
- Oups
- </body>
-</html>
-<html>
- <head></head>
- <body>
- C'est mieux
- </body>
-</html>
-Comme toujours, on essaie tant que possible de choisir des photos libres de droit et d'en créditer les auteurs. Quelques sites de photos libres de droit : Unsplash (chouchou ❤️), Pexels, etc.
-Pour créditer l'auteur de la photo de couverture, renseignez la clé credits
dans le header de l'article :
credits: { name: 'Jane Doe', url: 'https://unsplash.com/@janedoe' }
-,
et .
ne sont précédés d'aucune espace ;!
, ?
, ;
, :
, «
, »
sont toujours entourés de deux espaces ;…
et non 3 points à la suite ...
. Sur Mac, ⌥ alt + .« »
. Sur Mac, ⌥ alt + è et ⌥ alt + ⇧ maj + è. Souvent, les abréviations officielles sont assez méconnues. En voici quelques-unes :
-Une abréviation est suivie d’un point, sauf :
-N. B.
Le séparateur de millier est l’espace insécable, le séparateur de décimale est la virgule.
-Exemple : « Le solde est de 3 586,12 euros ».
Les items d'une liste à puces commencent toujours avec une majuscule et finissent par un point-virgule, sauf le dernier qui se termine par un point.
-Exemple :
-Pour se sentir mieux :
N. B. : la règle étant à la base pour l'édition de documents imprimés, il est admis pour les présentations et interfaces web de ne pas surcharger et de ne pas suivre la règle des ponctuations de liste. Mais si vous souhaitez en mettre, c'est cette règle qu'il faut suivre.
-Les items d'une liste numérotée commencent toujours avec une majuscule et finissent par un point.
-Exemple :
-Les valeurs d'Elao sont :
Quand on fait une liste qui se termine par "etc", celui-ci est précédé d'une virgule et suivi d'un point. Il n'est JAMAIS suivi de points de suspension "etc...".
-Exemple : « Pensez à acheter des fruits : pommes, bananes, clémentines, etc. »
.
à un titre ;:
après un titre ou un label
de formulaire, puisqu'ils introduisent toujours leur sujet, c'est redondant ;et
ne doivent jamais être précédés d'une virgule, sauf dans des cas exceptionnels comme l'énumération ;Si vous souhaitez être inclusif·ve dans votre rédaction, voici quelques solutions possibles pour que cela reste lisible en fonction du contexte :
-Exemple 1 : « Chaque employé et employée doit faire sa demande de congés sur Lucca. »
-Exemple 2 : « Bonjour à toutes et à tous ! »
Exemple 1 : « Chaque employé·e doit faire sa demande de congés sur Lucca. »
-Exemple 2 : « Bonjour à tou·te·s ! »
Pour faire un point médian :
-Sur Mac : ⌥ alt + ⇧ maj + F ;
-Sur PC : Alt+0183 ou Alt+00B7.
Exemple 1 : « L'ensemble de l'équipe doit faire sa demande de congés sur Lucca. »
-Exemple 2 : « Bonjour tout le monde ! »
Il est à votre discrétion d'utiliser la formule la plus adaptée en fonction du contexte.
-Quelques ressources intéressantes :
-Commenter
-- Des commentaires ? - - Poursuivons la discussion sur twitter ! - -
- -- Une typo ? - Modifier cet article sur Github -
-Matomo dépose un cookie à l'aide de votre navigateur sur le disque de votre machine, et vous attribue plusieurs identifiants aléatoires et anonymes.
-L'ensemble des documents transmis par nos correspondants sont conservés sur un stockage privé, hébergé par en France.
-Il est possible de chiffrer les correspondances envoyées à contact@rix.fr à l'aide de notre clé publique.
-Elles sont stockées sur nos serveurs, en France, qu'il sagisse de données collectées lors de votre passage sur nos sites, ou de données collectées lors de l'une de nos correspondances.
-Ces données ne sont accessibles que par les employé·e·s Rix.
-Lorsque vous nous envoyez votre candidature, vos coordonnées et les documents que vous nous avez transmis sont conservés le temps du traitement.
-Les données collectées par Matomo sont conservées 24 mois, à l'issue desquels elles sont supprimées.
-Vous disposez bien évidemment du droit de demander la modification et la suppression de l'ensemble des données dont nous pourrions disposer en nous contactant : contact@rix.fr
-
- Une typo ? - Modifier cet article sur Github -
-