first commit

This commit is contained in:
Yann Verry 2022-04-24 14:21:15 +02:00
commit c96aef4500
Signed by: yann
GPG key ID: EB9E679A66B8C7A1
33 changed files with 1576 additions and 0 deletions

5
.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
public
themes
resources/_gen
.DS_Store
.hugo_build.lock

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "themes/PaperMod"]
path = themes/PaperMod
url = https://github.com/adityatelange/hugo-PaperMod.git

6
archetypes/default.md Normal file
View file

@ -0,0 +1,6 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

138
config.yaml Normal file
View file

@ -0,0 +1,138 @@
baseURL: "https://yann.verry.org"
title: There is no magic, only unread error messages
paginate: 5
theme: PaperMod
defaultContentLanguage: fr
languages:
en:
languageName: ":uk:"
languageAltTitle: English
title: "Yann Verry | My blog"
homeInfoParams:
Title: "Hi there \U0001F44B"
Content: There is no magic, only unread error messages
fr:
languageName: ":fr:"
languageAltTitle: French
title: "Yann Verry | Mon blog"
homeInfoParams:
Title: "Bonjour à vous \U0001F44B"
Content: "Il n'y a pas de magie, seulement des messages d'erreurs. Voici mon blog personnel sans prétention"
enableRobotsTXT: true
buildDrafts: false
buildFuture: false
buildExpired: false
minify:
disableXML: true
minifyOutput: true
params:
env: production # to enable google analytics, opengraph, twitter-cards and schema.
title: Yann Verry
description: "Blog Yann Verry"
keywords: [Blog, Yann Verry]
author: Me
# author: ["Me", "You"] # multiple authors
images: ["<link or path of image for opengraph, twitter-cards>"]
DateFormat: "2 January 2006"
defaultTheme: auto # dark, light
disableThemeToggle: false
ShowReadingTime: true
ShowShareButtons: false
ShowPostNavLinks: true
ShowBreadCrumbs: true
ShowCodeCopyButtons: true
disableSpecial1stPost: false
disableScrollToTop: false
comments: false
hidemeta: false
hideSummary: false
showtoc: false
tocopen: true
assets:
# disableHLJS: true # to disable highlight.js
# disableFingerprinting: true
favicon: "<link / abs url>"
favicon16x16: "<link / abs url>"
favicon32x32: "<link / abs url>"
apple_touch_icon: "<link / abs url>"
safari_pinned_tab: "<link / abs url>"
label:
text: "Home"
icon: https://verry.org/images/yverry.webp
iconHeight: 35
# profile-mode
profileMode:
enabled: false # needs to be explicitly set
title: There is no magic, only unread error messages
subtitle: "Yann Verry"
imageUrl: "https://verry.org/images/yverry.webp"
imageWidth: 120
imageHeight: 120
imageTitle: my image
buttons:
- name: Posts
url: posts
- name: Tags
url: tags
# home-info mode
homeInfoParams:
Title: "Hi there \U0001F44B"
Content: There is no magic, only unread error messages
socialIcons:
- name: twitter
url: "https://twitter.com/yverry"
- name: gitea
url: "https://git.verry.org/"
- name: rss
cover:
hidden: true # hide everywhere but not in structured data
hiddenInList: true # hide on list pages and home
hiddenInSingle: true # hide on single page
editPost:
URL: "https://git.verry.org/yann/yann.verry.org/content"
Text: "Suggest Changes" # edit text
appendFilePath: true # to append file path to Edit link
# for search
# https://fusejs.io/api/options.html
fuseOpts:
isCaseSensitive: false
shouldSort: true
location: 0
distance: 1000
threshold: 0.4
minMatchCharLength: 0
keys: ["title", "permalink", "summary", "content"]
menu:
main:
- identifier: tags
name: Tags
url: /tags/
weight: 20
# Read: https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#using-hugos-syntax-highlighter-chroma
# pygmentsUseClasses: true
# markup:
# highlight:
# # anchorLineNos: true
# codeFences: true
# guessSyntax: true
# lineNos: true
# style: monokai
outputs:
home:
- HTML
- RSS
- JSON

View file

@ -0,0 +1,13 @@
+++
author = "Yann Verry"
date = 2021-03-16T22:14:59Z
description = ""
draft = false
slug = "authors"
title = "Author"
+++
It's me!

View file

@ -0,0 +1,13 @@
+++
author = "Yann Verry"
date = 2021-03-16T22:14:59Z
description = ""
draft = false
slug = "authors"
title = "Author"
+++
It's me!

View file

@ -0,0 +1,16 @@
+++
author = "Yann Verry"
categories = ["others"]
date = 2018-10-20T20:32:40Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2018/11/20181013_182524-EFFECTS_min.jpg"
slug = "autumn-is-her-winter-is-coming"
tags = ["others"]
title = "Autumn is her ! Winter is coming !"
+++
Noublies jamais ce que tu es, car le monde ne loubliera pas. Puise là ta force, ou tu ten repentiras comme dune faiblesse. Fais-t-en une armure, et nul ne pourra lutiliser pour te blesser.

16
content/posts/coton.md Normal file
View file

@ -0,0 +1,16 @@
+++
author = "Yann Verry"
date = 2018-06-03T12:05:53Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2018/06/9251674532_91cc053088_o.jpg"
slug = "coton"
title = "Cotton"
+++
{{< figure src="__GHOST_URL__/content/images/2018/06/3932158214_13b108d26c_b.jpg" >}}

81
content/posts/disney.md Normal file
View file

@ -0,0 +1,81 @@
+++
author = "Yann Verry"
date = 2020-05-06T07:42:00Z
description = ""
draft = false
slug = "disney"
title = "Disney+ under the hood"
+++
Le service du petit nouveau est (enfin) sorti malgré un retard à l'allumage suite à SARS-CoV-2.
Petite analyse du fonctionnement de disney+.
## Hébergement
La plateforme de disneyplus est hébergée sur AWS, en mode multi region dans au moins les régions suivantes:
* eu-central-1 (frankfurt)
* us-east-1 (virginie du nord)
* us-west-2 (Oregon)
Ceci est détectable via le header:
> x-bamtech-region
du host global.edge.bamgrid.com (cloudfront)
La géolocalisation est confiée à [onetrust](https://geolocation.onetrust.com/cookieconsentpub/v1/geo/countrycode)
Côté API, graphQL partout avec quasi que: [https://global.edge.bamgrid.com/dust](https://global.edge.bamgrid.com/dust)
Analytics: sanalytics.disneyplus.com (adobe omtrdc)
### Environnement
La plateforme d+ utilise plusieurs environnements:
* La classique dev: *.dev.dssott.com
* de la QA *.qa.dssott.com
* La prod caché du publique: *.prod.dssott.com utile avant le lancement de la plateforme
### Player
Côté player, tout les assets sont chargés depuis playback-certs.bamgrid.com qui est une distribution cloudfront backé derrière un bucket S3 hébergé en us-east-1 avec un bucket S3 répliqué ( x-amz-replication-status : COMPLETED)
Nous avons du M3U8 donc du HLS
Sur la DRM je vois du playready de microsoft
### CDN
J'ai pour ma part obtenu [vod-akc-eu-south-1.media.dssott.com](__GHOST_URL__/p/ef19ebf0-f22c-4e9a-b90d-2aa2936b7fd9/vod-akc-eu-south-1.media.dssott.com) qui est akamai (en ce moment)
La connexion entre le CDN et son origine seffectue en HTTP
> CDN-Origin-Protocol: HTTP
Nous avons du varnish, du nginx et après la couche akamai, les fragments sont conservé en cache pendant 7jours
L'origine est situé à amsterdam, nginx17.vod01.hls.disney.**ams1**.prod.bamtech.co
Quelques certificats indique une dev qui apparaît publiquement le 16/09/2019
Le nom de domaine dssott.com est utilisé depuis le 18/07/2018
Le CSP (Customer Support Portal) est lui géré par servicenow.com
## Divers
Disney utilise les technologies de viptela (sd-wan) Vmanage NMS

View file

@ -0,0 +1,82 @@
+++
author = "Yann Verry"
categories = ["ipv6", "network"]
date = 2020-05-23T14:36:58Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2020/05/fbxserver_v6.jpg"
slug = "freebox-et-ipv6"
tags = ["ipv6", "network"]
title = "Freebox et IPv6 un firewall binaire"
+++
Free via sa freebox est de loin l'équipement qui en france propose pour le _grand public_ le plus grand support d'ipv6. En effet il est possible de router des prefix (jusqu'à 8) très facilement.
Si comme moi vous héberger beaucoup de chose chez vous vous avec le support d'IPv6 actif il vous faut donc un vrai firewalling. Ce que malheureusement la freebox ne propose pas. Actuellement il est binaire: c'est tout rentre et firewall sur chaque machine ou tout est bloqué sans règle possible à faire pour le traffic entrant.
C'est donc gênant, très gênant !
Plusieurs solution possible, voici la mienne.
## Je suis ton routeur
On va donc faire sois même le boulot. Si vous auto-héberger des choses c'est qu'une machine tourne H24 chez vous. Il est donc possible de transformer votre serveur en routeur pour la partie ipv6. Si la machine tombe, l'ipv6 est HS mais le reste en v4 continue de fonctionner (et c'est important pour le [WAF](https://en.wikipedia.org/wiki/Wife_acceptance_factor)).
Tout d'abord on récupère son IPv6 de lien local (quelque chose en fe80:: qui est en [EUI-64](https://en.wikipedia.org/wiki/MAC_address) donc lié à votre MAC). Une fois récupéré se rendre dans l'interface de FreeboxOS, paramètre de la Freebox >> Configuration IPv6 :
{{< figure src="__GHOST_URL__/content/images/2020/05/fbx_ipv6-1.png" caption="Freebox IPv6 setup" >}}
Bien conserver l'ipv6 du lien local de la freebox, car votre serveur passe lui en static.
## Préparation de l'OS
Il faut comme tout routeur indiquer au kernel qu'il va router des paquets. Pour cela ajouter dans sysctl.conf la directive :
```net.ipv6.conf.all.forwarding=1```
Comme la doc l'indique cela supprime aussi l'acceptation des advertisements router. Ca tombe bien il faut aussi fixer de manière static votre configuration réseau. Sous debian par exemple j'ai :
```
iface <mon interface>
inet6 static
address 2a01:e0a:<une ip de mon prefix>
netmask 64
gateway fe80::<l'ip de ma freebox>
```
Il ne faut surtout pas prendre :1 en IP car celle-ci est utilisé par la freebox.
## Eh bien annoncé maintenant !
La freebox n'annonce donc plus le subnet ipv6, il faut donc le faire. Pour cela installer radvd pour _Router Advertisement Daemon._ de votre OS préféré.
```
interface <votre interface> {
AdvSendAdvert on;
AdvDefaultPreference high;
RDNSS 2001:910:800::12 {};
prefix <votre prefix>::/64 {
AdvOnLink on;
AdvAutonomous on;
};
};
```
Dans cette exemple il faut indiquer l'interface réseau ou annoncer, votre prefix et dans la section RDNSS indiquer un serveur récursif (ici celui de FDN).
Activer radvd au boot puis le daemon et voila ! vous avez reproduis ce que fais la freebox mais c'est votre machine qui route les paquets. La priorité est défini à "high" car il y a un [bug](https://dev.freebox.fr/bugs/task/19192) côté freebox qui continue à annoncer sans prefix.
## Firewall
Tout le traffic passe enfin par votre machine, il est donc facile d'activer du firewalling iptables tout ce qu'il y a de plus classique. Bien utiliser les paquets prévu pour:
```
apt install netfilter-persistent iptables-persistent
```
Tout s'éffectue dans la table **FORWARD**.
Enjoy it!

View file

@ -0,0 +1,13 @@
+++
author = "Yann Verry"
date = 2021-09-03T21:22:44Z
description = ""
draft = true
slug = "gpg-avec-une-cle-moderne"
title = "GPG avec une clé moderne"
+++

View file

@ -0,0 +1,91 @@
+++
author = "Yann Verry"
date = 2020-09-19T21:19:57Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2020/09/20200920_122453.jpg"
slug = "home-stuff"
title = "Home stuff"
+++
Inspiré de Zythom sur son [matériel](https://zythom.fr/2020/09/mon-materiel/), voici en retour le descriptif de mon chez moi.Évidemment mon travail modifie très largement ce que je possède.
Le proverbe
> Les cordonniers sont toujours les plus mal chaussés.
ne marche pas du tout ici.
## Physique
Tout le matériel que je possède est aujourd'hui dans une mini baie 19" de 9U 450MM dans mon garage en hauteur, ceci afin de respecter le _Wife Acceptance Factor._
J'y met dedans:
* Freebox
* Switch
* Serveur
* Divers disque externe en 3"5 / 2"5
* Quelques Rpi
* Bridge Hue
* Un onduleur APC en cas de coupure de courant
{{< figure src="__GHOST_URL__/content/images/2020/09/20200908_223725.jpg" >}}
La maison était équipée de prise RJ45 câblé uniquement en RJ11, il a donc fallu acheter des noyau et faire le câblage qui va bien sur chaque prise. Je n'avais pas suffisamment de noyau pour le nombre de prise dans la maison. J'ai donc déplacé la freebox de prise en prise pour identifier chaque extrémité. On a sûrement vu mieux mais ça a le mérite d'avoir fonctionné.
## Connectivité
Débutons par l'accès à ma maison:
* Freebox v6 (révolution) qui va se transformer en Delta une fois le stock rétabli
* Dongle 4G en cas de besoin: huawei-E5783B, c'est pas merveilleux mais dépanne bien en mobilité
Le choix d'une connexion Free n'est pas anodin, j'ai besoin d'une IPv4 fixe fullstack avec l'intégralité des ports ouverts (TCP25/SMTP compris) et plusieurs /64 en IPv6 (free fourni un /61). L'IP public directement sur mon propre serveur/routeur/firewall et pas sur la box.A partir de la il restais plus grand candidat sur des offres grand public
## Réseau Interne
Une fois le routeur passé, je possède un switch de marque unifi (US-8-60W) manageable, PoE et avec des VLAN. Côté wifi même chose une borne UAP-nanoHD alimenté par mon switch. Bien que je n'ai pas beaucoup de besoin j'ai tout de même installé le controlleur.
Trois wifi sont en place: Classique; Guest; IPv6_only
> Astuce: utiliser une CMDB afin de noter tout vos subnet, vlan, machines. Pour ma part j'ai choisi [netbox](https://netbox.readthedocs.io/en/stable/) car je l'utilise déjà au bureau.
J'ai donc en vlan:
* Vlan1: Classique
* Vlan2: Freebox
* Vlan3: Serveur
* Vlan4: Guest
* Vlan5: Managment
* Vlan10: IoT
* Vlan11: IPv6 experimentation
* Vlan100: IPTV Freebox
Chaque réseau est donc étanche. La seul difficulté que j'ai c'est sur le guest qui souhaite utiliser du chromecast ou équivalent mais c'est un moindre mal vs la sécurité que je gagne.
Le backbone va lui bientôt être upgradé pour ajouter à cela un [CRS326-24G-2S](https://mikrotik.com/product/CRS326-24G-2SplusRM) car je manque de port et un routeur/switch qui gère un SFP+ (oui la fibre arrive) du LACP 802.3ad à moins de 200€ il y a une fois de plus peu de choix. On verra quant aux capacité de routage et firewall de la bête (tout ne s'offload pas et le CPU est branché que à 1G).
## Serveurs
Côté serveurs j'ai opté pour un Asrock [DeskMini310](https://www.asrock.com/Nettop/Intel/DeskMini%20310%20Series/index.asp) que j'ai gavé de 2x8Go de RAM, un i3-8100 CPU @ 3.60GHz (le max de TDP) et bien fourni côté stockage (3emplacements) dans un format ultra compact:
* 1 x SATA M2.2280 de 512Go (crucial CT500MX500SSD4)
* 2 x SATA 2"5 de 2To chacun (seagate ST2000LM015-2E81)
Le SATA est en RAID1 formaté en Btrfs. Moins performant mais je suis friant des snapshots sans avoir besoin de RAM ECC (coucou zfs).Point de virtualisation malgré ses capacités, tout est en docker ou LXC. Peut-être un jour quand je souhaiterais jouer avec du *BSD
## IoT / Domotique
J'ai débuté à jouer un peu avec la domotique. Tout d'abord un bridge hue et ses gadgets qui m'ont permis de découvrir Zigbee.Je garde le bridge car il faut une grande fiabilité dans l'utilisation au quotidien.
Très vite j'ai donc acheté une [PiZigate](https://zigate.fr/) que j'ai plug sur mon RPI4 pour gérer plus de chose comme la température. Détection d'ouverture de porte etc via l'achat de capteur [Aqara](https://www.aqara.com/en/home.html) SANS le bridge de Xiaomi car je n'ai aucune confiance.
## Conclusion
On est loin du trivial mais finalement ce genre de segmentation devrais être plus commune. Quand je vois tout ce que ma "smart" TV upload à son constructeur ça donne peur.Je me demande même si il n'y a pas un créneau à prendre plutôt que de laisser tout les devices communiquer n'importe comment à tout le monde.
Et vous, quelles solutions pour vos réseaux/serveurs avez-vous choisies ?

View file

@ -0,0 +1,13 @@
+++
author = "Yann Verry"
date = 2020-10-10T13:22:38Z
description = ""
draft = true
slug = "impression-3d-le-commencement"
title = "Impression 3D, le commencement"
+++
J'ai craqué et je suis l'heureux possesseurs d'une imprimante 3D, l'artillerie X1

View file

@ -0,0 +1,72 @@
+++
author = "Yann Verry"
categories = ["network", "ipv6"]
date = 2020-02-21T23:42:00Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2020/04/ipv6_adopt.jpg"
slug = "ipv6-status"
tags = ["network", "ipv6"]
title = "IPv6 status"
+++
Je test régulièrement de naviguer en "ipv6-only". Bien que cela progresse surtout du côté des GAFAM ce n'est toujours pas glorieux. La faute à qui ? comme d'habitude sans réel volonté du fournisseur ça ne fonctionne pas.
Pourtant professionnellement je tente d'activer ipv6 partout et ce n'est pas un succès, il y a toujours un third party un petit bout d'une API qui ne fonctionne pas et rend le site inopérent. Les CDN propose tous la fonctionnalité dans une checkbox qu'il suffit de cocher (ou terraformer).
Petit état des lieux
## Divertissement en musique
Côté musique c'est simple, mise à part google music qui affiche le site, les contrôle et ... pas de music. Rien ne fonctionne. Bon ce n'est pas mieux voir pire chez les autres: Deezer; spotify; soundcloud; jamendo; apple music ...
{{< figure src="__GHOST_URL__/content/images/2020/02/Screenshot-2020-02-21-at-23.45.45.png" caption="apple music ipv6 only" >}}
Impossible d'écouter de la musique en streaming c'est un échec total.
## OTT
Sur la vidéo c'est mieux sans être la folie. Merci netflix qui fonctionne à 100%, même chose pour google play film, Amazon Prime pas du tout MyCanal rien, un peu de 6play mais sans aboutir à une vidéo qui marche (quand je dis on tente mais #fail).
## Radio
Mise à part celle ou j'en ai la charge, rien ...
## Presse
Tout ce qui est papier ne marche pas, uniquement en ligne mise à part frandroid avec encore des bugs car un sous domaine n'est pas compatible. Je n'ai rien trouvé
## Social
Côté réseaux sociaux, facebook marche. C'est une volonté depuis longtemps affiché, l'ensemble de leurs réseaux interne est v6 only.
{{< figure src="__GHOST_URL__/content/images/2020/02/twitter_overload.jpg" >}}
Twitter est un fail complet
## Jeux
Je ne suis pas un grand joueur, battle.net ne fonctionne juste pas tout comme Steam.
Shadow oui ! cocorrico, bon malheureusement si je met ma CB ça ne marchera pas mais on va dire qu'en régime de croisière oui
## Search Engine
Bon ben la il y a que google et rien d'autre
## Vrac Pro
En vrac pro je n'ai PAS de site web/back office qui fonctionne en v6. Seul FranceIX marche, pas de Orange; Cogent; Zayo (même si ça semblais avoir un semblant ça fini par #fail)
## Telco
Free (Fixe, le mobile c'est KO) comme Orange sont compatible mais pas leurs espace abonnéSFR et Bouygues KO
## Conclusion
Dire qu'il n'y a pas de service accessible en ipv6 est une réalité, on ne peux pas se passer du protocole legacy qu'est ipv4. Quand je vois que même des sites pro orienté réseaux ne sont pas compatible la route est longue
Je vais tenter d'update ce billet avec plus de section mais c'est navrant.

View file

@ -0,0 +1,44 @@
+++
author = "Yann Verry"
categories = ["network"]
date = 2021-04-09T22:21:19Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2021/04/ink-1602896_1920.jpg"
slug = "le-monde-de-limprimante-personnel"
tags = ["network"]
title = "Une imprimante en 2021 c'est toujours aussi pénible"
+++
J'ai toujours été faché avec les imprimantes. Plus jeune les drivers qui fonctionnais aléatoirement et ont toujours été obèse. Il y avait aussi l'arnaque de l'impression qui te demande de remplacer la cartouche de cyan quand tu fais une impression noir&blanc. La cartouche unique avec l'ensemble des couleurs que tu dois jeter si une seul tombe à sec (spoiler: il en restait toujours de toute façon). Tout cela avec un coût hallucinant ! Très vite j'ai joué avec du compatible, ou remplir le réservoir avec une serringue. Les fabricants eux se sont mis à faire n'importe quoi avec de la DRM sur les cartouches.
Ensuite je suis carrément passé à l'imprimante laser si éfficace mais toujours ce problème de toner avec un prix hallucinant. Je n'avais pas un volume important d'impression mais c'était rageant. J'ai même à un moment remplacé l'imprimante à l'identique car le toner était vide. Oui c'était moins couteux qu'un toner, hallucinant. Je crie littéralement au scandal écologique aujourd'hui sur ce genre de pratique ...
Après j'ai abandonné pendant plusieurs années les imprimantes car je le faisais au bureau pour mes trois pages annuel. Me voila dans le besoin d'acquérir une imprimante afin de satisfaire l'appétit des enfants, du travail scolaire à la maison et du télétravail permanent. Après moulte réfléxion je me suis orienté vers une imprimante jet d'encre ayant pour particularité de ne pas posséder de cartouche mais un réservoir: c'est la gamme Epson _EcoTank_ avec comme promesse un coût par page très réduit car grande découverte l'encre ça ne coûte rien si on met le prix qu'une imprimante coûte réellement. Quand je dis rien c'est environ 10€ pour un bidon de 70ml. Pour rappel une cartouche "classique" c'est 3 voir 4ml ! Cerise sur le gâteau l'encre est livrée avec l'imprimante de quoi tenir deux ans sans en acheter.
Premier allumage RAS tout fonctionne du premier coup. Puis semaine suivante c'est le drame l'imprimante semble ne pas se connecter au réseau wifi, je ne vois pas de _DHCP REQUEST_ sur mon serveur, je debug je fais plusieurs tentative RIEN ça ne fonctionne juste pas.
Quel est mon setup si étrange pour que ce genre de chose si grand public ne fonctionne pas chez moi ? Mon setup ? Ok ce n'est pas des plus classique, je possède des bornes unifi avec un controlleur, des paramètres très standard. Partons sur un reset global de l'imprimante. Je refais tout le setup et ça refonctionne. Hummm très étrange comme chose, j'imprime et passe à autre chose.
Semaine suivante, me voila dans un jour sans fin. Même symptôme, même solution. C'est quoi cette imprimante ?? Bon il y a une mise à jour de firmware mais je suis pas super optimiste, et ... en éffet rien toujours la même galère, la maison n'est pas autonome pour ses impressions c'est un problème.
## Comment on debug une imprimante ?
La seul façon d'avoir des informations de debug sur une imprimante c'est de lui faire imprimer des rapports d'état. Sur la connexion j'ai échec signal wifi faible alors que la borne est à 2m grand maximum. Bon ça c'est un indice.
J'ai plusieurs bornes donc je me suis dis, OK l'imprimante à simplement accroché la mauvaise borne. Je setup donc un nouveau SSID disponible uniquement sur la borne proche de l'imprimante. J'ajoute un suffix pour différencier. TADA ça fonctionne super j'ai gagné !!!
.... ou pas car la semaine suivante ? rebelotte !!
Aller, je test le wifi en 5Ghz seulement. C'est un échec l'imprimante n'est compatible qu'en 2.4Ghz, elle ne voit donc pas mon SSID 5G. Ok ben allons-y en 2.4 uniquement ... Toujours rien, je commence à faire plusieurs modifications pour tester "au cas ou". Désactivation de feature avancé tel que le power saving, activation du support des device legacy et j'en passe. J'ai même essayer de définir un mot de passe simple sans caractère complexe dès fois que l'imprimante sauvegarde mal le mot de passe wifi.Mais rien le fonctionnement est aléatoire suivant le jour de la semaine avec parfois un fonctionnement comme attendu, mais le plus souvent rien. L'alternative serais le wifi-direct mais je suis pas super fan de la solution qui est contraignante.
Quand on est bloqué, on repars du début et on décortique: Imprimante **GRAND** public, hummm et moi ? j'ai un setup pas si complexe mais plus quelque chose d'entreprise que pour Mme michu. Je me reconnecte sur mon controlleur et je regarde avec un œil nouveau les paramètres disponibles. J'analyse paramètre par paramètre. Il n'y a vraiment rien de choquant. Partons du principe que l'imprimante est codé avec les pieds et supporte peu de chose. Et la éclair: le controlleur demande périodiquement (dans mon cas chaque nuit) à chaque borne d'analyser son environnement radio pour selectionner le meilleur canal wifi. Ce n'est pas spécifique à unifi ou le monde (semi)pro. Cette fonctionnalité est de plus en plus proposé par les équipementiers réseau grand public un peu haut de gamme.
Néanmoins, l'imprimante est en 2.4Ghz seulement. C'est pas très moderne je me dis donc qu'il faut tester. Je désactive donc la fonctionnalité nommé "Wifi AI" (traduction: wifi avec des _if_ et des _else_) pour ne plus changer de canal wifi régulièrement.
... et l'imprimante fonctionne de manière nominal sans broncher.
Il y a donc dans le code de l'imprimante le canal wifi utilisé et impossible de le changer. La page de debug imprimé indiquait uniquement le SSID mais pas le canal wifi. La piste était donc: signal faible, logique! Il faut se rappeler qu'en wifi 2.4Ghz il n'y a que réellement trois canaux qui ne se chevauche pas (avec une largeur de bande de 20Mhz), le 1; 6 et 11.C'est aussi pour cela qu'un reset fonctionnais car je repartais de zéro. Vous voila prévenu, avec un wifi trop intelligent des dysfonctionnements sur des devices trop à l'ancienne peuvent ne pas fonctionner.

View file

@ -0,0 +1,69 @@
+++
author = "Yann Verry"
categories = ["im"]
date = 2021-02-27T21:12:34Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2021/02/signal_matrix-1.png"
slug = "messagerie-on-reste"
tags = ["im"]
title = "Messagerie instantané, du changement sur la vie privée !"
+++
WhatsApp à provoqué une levée de bouclier impressionnante tout début janvier suite à leurs mise à jour de leurs TOS/CGV et depuis Facebook sors les rames de l'ensemble des galères de la marine romaine pour stopper la polémique.Le nombre de départ définitif est je pense insignifiant en pourcentage mais l'image est bien plus précieuse, il faut donc la conserver.
Excellente nouvelle je me suis servi de cela pour migrer une bonne partie de mes contacts vers signal et c'est un énorme succès ! Au dernier décompte j'avais 50+ contacts disponible alors qu'en décembre je penais à en avoir trois quatre. Le passage du nombre de téléchargement de l'app sur le play store est passé de 10M à +50M en une semaine.
Pour résumer signal déplace la privacy à un super niveau. C'est vraiment une très bonne nouvelle pour tout les utilisateurs. Malheureusement je considère qu'il ne va pas suffisament loin. Je regrette que les solutions comme XMPP n'ont pas suffisamment perçé. Car signal c'est se mettre dans un nouvel écosystème non intéropérable, dommage. Alors il y a des gardes fous avec la fondation, des audit, du code source client/serveur mais on est pas pour autant libéré.
## Le renouveau de Matrix
Un petit fais son bonhomme de chemin c'est [matrix](https://fr.wikipedia.org/wiki/Matrix_(protocole)), je vous laisse lire son histoire. J'ai testé il y a plusieurs année et je n'avais pas été convaincu: car trop lent, la gestion des sessions multiples bancales, le chiffrement pas actif par défaut. Beaucoup de défaut, prometteur mais pas mature du tout.
On est en 2021, le _FOSDEM_ début février était sur matrix! Il était donc l'heure de tester à nouveau pour voir ce que cela donne. Le protocole à évolué dans un _fediverse_ (=fédération).Quelques chose d'essentiel aussi pour une plus large adoption : il faut un client agréable, robuste. C'est le cas avec Element (même si il n'y a pas que lui) qui est pratique, utilisable.
Je l'ai adopté!
Point bonus il y aussi des gateway vers d'autres protocoles comme le propose XMPP. La plus simple, connu et toujours utilisé est IRC
## Self hosting
Passons à l'auto hébergement, j'ai dit que matrix était distribué en un fediverse. Le serveur de référence synapse est écrit en Python et fonctionne avec une BDD PostgreSQL. Sur des serveurs haute charge j'ai un doute pour le python mais pour quelques users aucun problème.
Toute ma stack est basée sur docker-compose, l'intégré est simple modulo une base [postgresql](https://github.com/matrix-org/synapse/blob/master/docs/postgres.md) ayant un _LC_CTYPE / LC_COLLATE_ type _'C'_ ce qui m'empèche d'utiliser ma DB de référence et ses moultes schéma. Je fais le compromis et crée une DB dédiée à synapse en lieu et place d'un schéma dédiée. Car oui on est sur PG pas _MySQL_ ou une database équivaut plus à un schéma.
Chose qui m'embête aussi c'est que par défaut le setup ne me conviens pas car demande le port _8448_, mais pourquoi ??? Dans ce monde full HTTPS c'est pour moi un problème. La documentation indique une solution qu'est le [fédération](https://github.com/matrix-org/synapse/blob/master/docs/delegate.md) et sa déclaration dans un [.well-known/matrix/server](https://verry.org/.well-known/matrix/server) . Je passe donc par cette solution avec un vhost matrix.verry.org en gardant le port _443_ et ça fonctionne !
Ma configuration Caddy :
```
matrix.verry.org {
import headers
import logs
import tls_verry
reverse_proxy http://synapse:8008
}
verry.org {
import headers
import logs
import tls_verry
reverse_proxy /_matrix/* http://synapse:8008
reverse_proxy /_synapse/client/* http://synapse:8008
[...]
}
```
Me voila donc sur matrix avec un nom sympa: **@yann:verry.org** et pas un **@yann:matrix.verry.org** que je trouve moins proche d'un mail (non mon mail n'est pas _yann@mail.verry.org_)
## Conclusion
Il est l'heure de laisser le produit vivre. J'ai actuellement des problèmes avec un nouveau soft que je test: happyDNS. Quel est leurs solution direct de contact ? Matrix! Les choses bougent sans cesse ;-)
Mozilla annonce le même mouvement

30
content/posts/mikrotik.md Normal file
View file

@ -0,0 +1,30 @@
+++
author = "Yann Verry"
date = 2021-10-09T20:47:56Z
description = ""
draft = false
image = "https://images.unsplash.com/photo-1579719558505-ad4a5fee0847?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fG1vbml0b3Jpbmd8ZW58MHx8fHwxNjMzODExOTEx&ixlib=rb-1.2.1&q=80&w=2000"
slug = "mikrotik"
title = "MikroTik 7.1 - Prometheus exporter"
+++
J'ai acheté il y a plusieurs mois un mikrotik (hex S) pour faire toute la partie routage de mon accès internet à la maison. Auparavant c'était mon serveur linux. Très fan du VPN wireguard je l'ai upgrader en version _RouterOS_ 7.1. Maintenant il faut le superviser et grapher ce qu'il s'y passe.
Qui dit équipement réseau dit très souvent _SNMP_ mais ce n'est pas du tout mon mood. Je préfère des choses plus moderne. Bonne nouvelle la version 7.x introduit enfin une [API REST](https://help.mikrotik.com/docs/display/ROS/REST+API) en lieu et place de [l'ancienne](https://help.mikrotik.com/docs/display/ROS/API) un peu freestyle.
Ma stack de monitoring est sous [VictoriaMetrics](https://victoriametrics.com/community.html) (prometheus compatible), il me faut donc un exporter prometheus qui .... n'éxistait pas encore !
J'ai donc codé un petit exporteur en python permettant de récupérer tout ce qui se passe en terme d'interface ainsi que l'utilisation CPU
url="https://git.verry.org/yann/routeros-exporter" title="routeros-exporter" description="RouterOS prometheus exporter with restapi (7.1)" icon="https://git.verry.org/assets/img/logo.svg" author="yann" publisher="gitHome" thumbnail="https://git.verry.org/user/avatar/yann/-1" caption="" >
Si il manque quelque chose les PRs sont les bienvenue !

View file

@ -0,0 +1,6 @@
---
title: "My First Post"
date: 2022-04-23T23:14:52+02:00
draft: true
---

View file

@ -0,0 +1,32 @@
+++
author = "Yann Verry"
categories = ["iot", "hue"]
date = 2018-07-03T19:39:34Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2018/07/ikea_bulb.jpg"
slug = "philips-hue"
tags = ["iot", "hue"]
title = "Philips Hue - TRÅDFRI"
+++
Je possède un bridge hue et souhaitais des ampoules un peu moins chères que ce que propose philips.
Ikea s'est mis à faire un peu d'IOT sous la gamme TRÅDFRI compatible zigbee. La grande question est:
> Est-ce compatible avec mon bridge hue ?
Si on cherche un peu partout sur le net il y a un point qui reviens systématiquement: la version du firmware. En juillet 2018 c'est du passé il reste l'appairage à réaliser.
J'ai lu beaucoup de chose farfelu comme faire la recherche plusieurs dizaines de fois jusqu'a enfin esperer voir ses ampoules apparaîtres sur hue.
Sinon en moins de dix secondes la solution est la suivante :
1. éteindre l'ensemble des ampoules
2. Lancer depuis l'application / API la détection de nouvelles ampoules
3. Allumer votre ampoule TRÅDFRI
Et c'est tout, votre ampoule viens normalement juste d'être reconnu par le bridge hue

View file

@ -0,0 +1,112 @@
+++
author = "Yann Verry"
categories = ["db", "postgres"]
date = 2021-12-06T22:46:52Z
description = ""
draft = false
image = "https://images.unsplash.com/photo-1483736762161-1d107f3c78e1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDJ8fGRhdGFiYXNlfGVufDB8fHx8MTYzODEyOTc3OA&ixlib=rb-1.2.1&q=80&w=2000"
slug = "postgresql-14-upgrade"
tags = ["db", "postgres"]
title = "PostgreSQL 14 upgrade avec une replication logique"
+++
Comme chaque année une nouvelle version majeur de PG est sorti. Nous en sommes à la 14.
L'upgrade _debian mode_ est toujours aussi simple si on a bien clean les dossiers 14 générés
```
pg_ctlcluster 14 main stop
mv /etc/postgresql/14/main /etc/postgresql/14/old
rm -rf /var/lib/postgresql/14/main
pg_upgradecluster 13 main /var/lib/postgresql/14/main
```
On retiens le petit warning, car il va falloir s'en occuper après :
```
WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables
```
Depuis plusieurs années j'utilise aussi côté docker l'image _tianon/postgres-upgrade_ :
```
docker volume create postgres-14
docker run --rm \
-v postgres-13:/var/lib/postgresql/13/data \
-v postgres-14:/var/lib/postgresql/14/data \
tianon/postgres-upgrade:13-to-14
```
Enfin, je met à jour mon _docker-compose.yml_ pour avoir que du 14 :
```
postgres:
image: postgres:14-alpine
volumes:
- postgres-14:/var/lib/postgresql/data
- ssl:/ssl:ro
dns: fd00::3:2
networks:
default:
ipv6_address: 2a01:e0a:49e:2b81::5432
restart: always
```
Je reload et c'est bon!
# Hop hop hop et le warning ?
Facile, facile qu'il disait mais je possède des **_SUBSCRIPTION_** pour répliquer des morceaux de ma base de donnée, notamment la partie powerdns sur l'ensemble de mes slaves (ns2 et ns3). Sur un slave il y a donc du travail en plus. Coupons pdns durant toute l'opération de maintenance. Il est important de ne rien répondre plutôt que d'avoir en cache une absence de réponse (= le backend étant indisponible).
Lors du réimport qui est sous forme de SQL like il y a une tentative de re-création de la souscription de notre réplication logique. Ça ne marche pas comme prévu.
Il faut donc la supprimer puis recréer afin de la réinitialiser n'ayant pas trouvé mieux.
```
yverry=# drop subscription <subscription name> ;
ERROR: could not drop the replication slot "<subscription name>" on publisher
DETAIL: The error was: ERROR: replication slot "<subscription name>" does not exist
```
La solution est de modifier le nom du slot à une valeur _null/none_
```
alter subscription <subscription name> set (slot_name = NONE);
```
Et ensuite la recréer
```
create subscription pdns_ns3 connection 'host=<host> dbname=yverry user=replication_pdns password=<super password> port=5432' publication <subscription name> ;
```
Et voila ! Oui mais non ... Il reste une dernière erreur de duplicate entry, la table étant déjà peuplé j'ai donc un problème de duplicate en atteste le log
```
ERROR: duplicate key value violates unique constraint
```
La solution n'est pas optimal mais j'ai préféré truncate ma table qui ne comporte que quelques centaines de lignes
```
TRUNCATE TABLE domains tb1 CASCADE;
NOTICE: truncate cascades to table "tb2"
NOTICE: truncate cascades to table "tb3"
NOTICE: truncate cascades to table "tb4"
NOTICE: truncate cascades to table "tb5"
```
La réplication essayant sans cesse, un process à très rapidemment rempli les tables recemment vidé :
```
LOG: logical replication table synchronization worker for subscription
```
Et c'est enfin fini ! J'ai relancé mon serveur _PowerDNS._ Testé bien sur que tout étant comme avant.
Ready pour postgres 15 😇

View file

@ -0,0 +1,138 @@
+++
author = "Yann Verry"
categories = ["network"]
date = 2021-04-14T13:47:47Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2021/04/doh-dot-1.jpg"
slug = "resolvons-de-maniere-securise"
tags = ["network"]
title = "Resolvons de manière sécurisé"
+++
Le DNS, brique de base pour Internet évolue à son rythme. Depuis plusieurs années l'ensemble de la toile s'est sécurisé en activant du TLS un peu partout.
Et donc le DNS à suivi. Deux nouvelle façon ont émérgé:
* DNS over TLS
* DNS over HTTPs
Cela restais compliqué à mettre en œuvre, peu de client compatible, mais ça c'était avant. Depuis je dirais 12 à 18mois c'est de plus en plus simple.
## DNS Dist
DNSDist est proposé par powerdns. Ce logiciel est dans la ligné de tout ce que produit powerdns: excellent. Si je fais l'analogie c'est un reverse proxy du DNS.
Pour commencer je me suis donc créé un container à base d'alpine puis installé dnsdist.
On commence donc par lui fournir un backend, ici mon dns resolveur menteur chez moi:
```
newServer({address="2a01:e0a:49e:2b83::2", qps=10})
```
Je souhaite que ce résolveur soit ouvert à tous pour DoT et DoH, pour cela ajoutons une ACL "open bar" :
```
addACL('::/0')
addACL('0.0.0.0/0')
```
Qui dit DNS ouvert il faut se méfier et donc ajouter un peu de ratelimiting
```
addAction(MaxQPSIPRule(50), DropAction())
```
Je le réserve à mon usage personnel et fonction des graphs d'utilisation je verrais pour modifier cela avec une charte et tout ce qui va avec.
### Monitoring & Graphing
Avant de faire DoT & DoH je n'imagine pas utiliser un service sans un minimum d'observabilité avec prometheus. Ici pas besoin d'exporter spécifique c'est natif au serveur web
```
webserver("[::]:8083", "webinterfacepassword", "apipassword", {}, "prometheusIP")
```
J'ai donc un serveur web qui tourne et répond dans `/metrics` il fait plein d'autre chose mais j'aurais la même dans grafana.
La configuration prometheus est aussi simple:
```
- job_name: 'dnsdist'
basic_auth:
username: dontcare
password: mysuperextrapassword
static_configs:
- targets: ['dnsdist:8083']
```
Et me voila avec des metrics \o/
## DNS over TLS (DoT)
Pas de roue réinventé ce qui n'est pas plus mal, ce n'est "que" du TLS ajouté au protocole DNS. Cela impose TCP uniquement, exit donc UDP (peut-être avec h3?)
Sa mise en place côté dnsdist est simple en v4 et v6, forçons un minimum de TLSv1.2:
```
addTLSLocal('::','/ssl/certs/verry.org/fullchain.pem','/ssl/certs/verry.org/privkey.pem', {minTLSVersion: "tls1.2"})
addTLSLocal('0.0.0.0','/ssl/certs/verry.org/fullchain.pem','/ssl/certs/verry.org/privkey.pem', {minTLSVersion: "tls1.2"})
```
dnsdist va donc se mettre à faire du DoT sur le port par défaut à savoir 853/TCP:
```
Listening on [::]:853 for TLS
Listening on 0.0.0.0:853 for TLS
```
Il est compatible nativement sur mon téléphone Android et ça c'est vraiment top, ici sur un samsung par exemple
Paramètres -> Connexions -> Plus de paramètres de connexion :
{{< figure src="__GHOST_URL__/content/images/2021/04/android_dot.png" >}}
Un peu de TCPdump m'indique que mon serveur est utilisé (en plus des metrics)
## DNS over HTTPS (DoH)
Les navigateurs implémentent aussi DoH, car un flux sécurisé c'est bien mais si on indique à notre fournisseur ce qu'on visite il y a comme un petit loupé. C'est la que DoH intervient, il est sur HTTPS donc autorisé partout à contrario de DoT qui utilise un port spécifique et peu donc être bloqué.
Côté dnsdist:
```
addDOHLocal("[::]:8053", nil, nil, "/", { reusePort=true })
```
Et ensuite j'ajoute mon serveur web Caddy
```
doh.verry.org {
import logs
import headers
import tls_verry
reverse_proxy http://dnsdist:8053
}
```
Et ... c'est tout côté serveur. Pour le client firefox le prend en charge, dans les paramètres chercher _DoH_ :
{{< figure src="__GHOST_URL__/content/images/2021/04/firefox_doh.png" >}}
## Conclusion
Il est devenu facile avec dnsdist de se créer son propre serveur DoT et DoH, la compatibilité avec mon téléphone android (coucou l'anti pub) est ce qui m'a motivé à le mettre en place. Le besoin d'utilisation de mon vpn wireguard est vraiment remis en question car l'utilité première était la confidentialité, dans un hôtel (ahahah), en vadrouille (re hahahaha) deviens quasi nul.

128
content/posts/rpz.md Normal file
View file

@ -0,0 +1,128 @@
+++
author = "Yann Verry"
categories = ["dns"]
date = 2022-01-15T23:27:45Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2022/01/lie_to_me.png"
slug = "rpz"
tags = ["dns"]
title = "DNS RPZ: Mentir proprement"
+++
Faire un DNS menteur ce n'est pas quelque chose de nouveau. Ça éxiste depuis très longtemps. Des épisodes très connu par la loi avec la célèbre main rouge à rendu public cette pratique. Une liste est fourni aux quatre plus gros ISP français.On entend régulièrement parler de cette mesure "de protection" à chaque mesure de blocage demandé par des majors, association, terrorisme ...
## Mais sinon, on peut en faire des choses pour nous servir à nous ?
Oui biensur ! comme filtrer en amont tout ce qui publicité, tracker de pub, télémétrie un peu trop bavarde ou encore la communication de votre caméra estampillé chinoisium à 15€ acheté chez aliexpress qui est bien bien trop bavarde sur un truc qui fini en _.cn._ Ok, ok, taper sur la chine est si facile mais vous avez compris l'idée.
Ce n'est pas une solution magique loin de là. Les sites ou vous êtes le produit ne se font pas bloquer car le contenu est directement servi par les serveurs de pub.
# Sous le capot
Tout d'abord il faut posséder son propre serveurs récursif chez sois. C'est facile avec un mini ordinateur, une VM sur votre freebox delta ou même en local sur votre ordinateur.
Plusieurs méthodes éxistent comme l'override de la zone mais ça casse _DNSSEC_ ce qui est mal.Dans unbound on va forcer un/des enregistrements via les options _local-data_ ou _local-zone_.Une zone complète ou j'avais plusieurs milliers de lignes :
```
wc -l /etc/unbound/unbound-nxdomain.blacklist
33073 /etc/unbound/unbound-nxdomain.blacklist
```
avec dedans des choses comme ceci :
```
local-zone: "ibs.lgappstv.com" always_nxdomain
local-zone: "eic-ngfts.lge.com" always_nxdomain
local-zone: "s.sh" always_nxdomain
local-zone: "m2.ai" always_nxdomain
local-zone: "cw.nu" always_nxdomain
local-zone: "6m.pl" always_nxdomain
local-zone: "ip.ro" always_nxdomain
local-zone: "rs.sh" always_nxdomain
```
Mais c'est pas ouf non ? Non, pas du tout.
Il est donc l'heure d'avoir quelque chose de plus solide, standard qui va fonctionner partout. Une pointure s'y colle côté [IETF](https://datatracker.ietf.org/doc/html/draft-ietf-dnsop-dns-rpz-00) pour faire le boulot, à savoir Paul Vixie (entre autres).
L'idée est donc de créer une zone DNS presque classique qui va contenir tout ce qu'on souhaite modifier avec la possibilité de renvoyer du _NXDOMAIN_, une réponse de notre choix comme _::1_ ou le legacy _127.0.0.1_ pour par exemple éviter des messages d'erreur comme le fait ma TV LG. C'est donc modulable en fonction de ce qu'on souhaite
Si on fait les choses bien on va catégoriser plusieurs listes et les aligner une à une dans la configuration.
Cette zone elle se matérialise comment ?Voici la zone en question, un petit clin d'œil :
```
; Beginning of the zone, some mandatory values
$TTL 1H
@ SOA lie.to.me. red.pills (42 2h 30m 30d 1h)
NS blue.pills.
lgtvsdp.com CNAME .
*.lgtvsdp.com CNAME .
```
On va donc ici dire de répondre **_NXDOMAIN_** grâce au points final.
Comment distribuer cette zone au plus grand nombre ? J'utilise unbound et il permet de récupérer ses zones d'une manière simple à savoir HTTPS. C'est du DNS la seconde plus évidente est de faire une zone DNS récupérable via un transfert de zone (IXFR).J'ai préféré HTTP car plus simple dans mon setup actuel. La mise à jour est plus simple. C'est donc parti, je fait un nouveau vhost
**[https://rpz.verry.org](https://rpz.verry.org )**
avec une belle page indéxé qui contient plusieurs fichiers de RPZ
# Unbound side
Côté DNS récursif, ici unbound il faut tout d'abord activer deux modules :
```
server:
module-config: "respip validator iterator"
```
Et ensuite on déclare en fin de fichier les multiples RPZ souhaités :
```
rpz:
name: "oisd"
url: https://rpz.oisd.nl
rpz-log: yes
rpz-log-name: "rpz-oisd"
rpz:
name: "youtube"
url: https://rpz.verry.org/youtube.zone
rpz-log: yes
rpz-log-name: "rpz-youtube"
rpz:
name: "adaway"
url: https://rpz.verry.org/adaway.zone
rpz-log: yes
rpz-log-name: "rpz-adaway"
rpz:
name: "easylist-full"
url: https://rpz.verry.org/easylist.zone
rpz-log: yes
rpz-log-name: "rpz-easylist"
rpz:
name: "easylist-fr"
url: https://rpz.verry.org/easylist_fr.zone
rpz-log: yes
rpz-log-name: "rpz-easylistfr"
```
Nous avons plusieurs section, pour chaque mention de _rpz_ une configuration différente qui sera évalué de haut en bas.On lui donne un petit nom, l'url pour la récupérer. Afin d'avoir du logging on indique le nom à afficher ce qui sera pratique pour savoir quel RPZ rentre en action.
Côté logging ça donne quelque chose du genre :
```
info: RPZ applied [rpz-adaway] currency.prebid.org. nxdomain
```
Et voila !
# La suite ?
Automotiser la génération des fichiers situé sur rpz.verry.org. Aujourd'hui j'ai récupéré plusieurs listes un peu n'importe comment, fait des `grep/sed/awk` ce qui n'est pas du tout optimal, ensuite il faut créditer les sources cleaner les doublons et ajouter une petite cron pour faire bien dans un projet git

View file

@ -0,0 +1,61 @@
+++
author = "Yann Verry"
categories = ["cloud"]
date = 2018-06-04T06:42:00Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2018/06/498544386_01f64e68dd_o.jpg"
slug = "s3-origin-de-cloudfront"
tags = ["cloud"]
title = "Les erreurs avec S3 + Cloudfront → Origin Access Identity"
+++
Le couple S3 && cloudfront est le serverless avant l'heure.C'est facile à setup, performant, éfficace.
Par défaut si un fichier n'éxiste pas dans un dossier alors cloudfront renvoie une erreur 403 au lieu d'une 404. C'est bien dommage surtout quand on se sers de cette feature pour faire des règles de réécriture.
## Comment remédier à cela ?
Par défaut lorsqu'on fait la liaison entre S3 et cloudfront il y a création d'une bucket policy du style:
```
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <ID>"
},
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::<bucketName>/*"
]
}]
}
```
Ceci donne l'accès à cloudfront à votre bucket S3. Il y a comme action _s3:GetObject_, il manque donc juste une action pour lister le contenu ? Oui mais non si AWS était intuitif ça se serais. Il faut faire un [OAI](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html).
Récupérer le *S3CanonicalUserId* via
```
aws cloudfront list-cloud-front-origin-access-identities
```
Une fois celui-ci obtenu il faut donc ajouter l'option `--grant-read` avec le S3CanonicalUserId récupéré à l'instant.
```
aws s3api put-bucket-acl --bucket <bucketName> --grant-read id=<S3CanonicalUserId>
```
**--grant-read (string) Allows grantee to list the objects in the bucket.**

View file

@ -0,0 +1,32 @@
+++
author = "Yann Verry"
categories = ["s3", "scaleway", "cloud"]
date = 2018-10-20T20:26:48Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2018/10/599820538_2871b1a5e9_b.jpg"
slug = "stockage-scaleway-s3"
tags = ["s3", "scaleway", "cloud"]
title = "Stockage Scaleway"
+++
Online.net via sa filiale "cloud" scaleway viens (enfin) de lancer sa beta public pour son [stockage objet](https://www.scaleway.com/object-storage/) compatible S3, le standard de facto (un peu comme le frigo).
Le choix technique est d'être compatible S3 ce qui de facto le rend compatible avec un nombre impressionnant d'outils, le filesystem POSIX est de moins en moins utile.
Côté pricing, il est simple 500Go de stockage avec dedans 500Go de transfert, tout cela pour 5€/mois. Si vous êtes dans le réseau online/scaleway, pas de limitations sur le transfert. Il y a d'autre subtilité mais si vous avez un usage classique ce n'est pas votre [problème](https://www.scaleway.com/faq/object-storage/#-Is-there-a-limitation-in-number-of-HTTP-requests).
Et en exemple d'utilisation, car c'est bien beau mais dans la vrai vie ? Par exemple sur une instance nextcloud avec un stockage S3 externe :
{{< figure src="__GHOST_URL__/content/images/2018/10/sc_s3_nextcloud.jpg" >}}
**Et c'est tout !**
## Un autre exemple ?
J'utilise comme outil de backup restic, il est lui aussi compatible s3-like.Plus simplement chercher un outil S3 compatible mais non AWS. L'exemple que je trouve le plus souvent est "voici comment faire sous minio", suivé le tutorial et ça fonctionnera
Conclusion, c'est une super nouvelle il faut une gestion plus fine des droits sans tomber dans l'enfer des IAM, plus de détail

40
content/posts/tlsv1-3.md Normal file
View file

@ -0,0 +1,40 @@
+++
author = "Yann Verry"
date = 2018-11-18T20:08:16Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2018/11/key.jpg"
slug = "tlsv1-3"
title = "TLSv1.3 en masse"
+++
Suite à une faille de sécurité dans nginx au niveau de h2 Ondřej Surý upgrade la version nginx de 1.4.1 ce qui est une très bonne chose.
Petite nouveauté, nginx est compilé avec la version 1.1.1 d'OpenSSL
> nginx version: nginx/1.14.1built with OpenSSL 1.1.1 11 Sep 2018
Ceci ouvre donc la possibilité d'activer TLSv1.3 (10ans après TLSv1.2!). C'est donc parti le plus simplement du monde en ajoutant dans la directive **ssl_protocols** le protocole **TLSv1.3** puis recharger **nginx** et ... c'est tout ! Beaucoup d'article tournais autour d'une compilation à la main d'OpenSSL puis ensuite nginx, c'est bien pour du test mais aucunemment pour tout les jours car ce sera une solution jamais mis à jours donc bientôt bourré de faille de sécurité (tiens m'ai j'en parle déjà tout en haut)
## Zéro RTT
Ok c'est super TLSv1.3 mais quel est l'interêt ? Pour moi l'interêt majeur est le zéro RTT. L'idée est d'aller plus vite à l'initialisation de la connexion, tout le web est passé de http vers https, on a perdu en rapidité, il était temps de récupérer un peu de cette vitesse perdu malheureusement ce n'est encore que très peu disponible côté serveur car il y a des problèmes de sécurité.
Sur nginx par exemple ajouter la directive **ssl_early_data on;**
## Ciphers obsolète
Le second interêt majeur est d'enfin supprimer tout le legacy qu'on se traîne depuis bientôt deux décennies (oui oui). TLSv1.3 autorise uniquement un niveau élevé exit donc les cipher/echange de clé/... :
* 3DES
* MD5/SHA1
* RC4
* DSA
* CBC
Je pourrais en dire bien plus mais le sujet est déjà abondamment traité. Bon upgrade vers TLSv1.3 et je vous suggère de laisser uniquement 1.2 et 1.3 d'actif avec les bon ciphers ça ne fera pas de mal puis ensuite de faire jouer la suite qualys

View file

@ -0,0 +1,57 @@
+++
author = "Yann Verry"
categories = ["www"]
date = 2021-02-07T21:42:19Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2021/02/caddy.jpg"
slug = "un-serveur-web-different"
tags = ["www"]
title = "Évolution des serveurs web"
+++
Le serveur web est un composant clé sur le web et en même temps on ne pense même plus à sa présense, il est omniprésent. Au tout début j'ai comme tous utilisé massivement Apache (1 puis 2). Quelques tentatives sous lighttpd et puis nginx et maintenant pourquoi pas Caddyserver ? Il est pas dit qu'un jour je retourne pas sur Apache2 qui depuis mpm_event est top!
Quel est la définition d'un serveur web ? En éffet quel sont les features selon moi nécessaires vs un simple reverse proxy.
* Offloading de TLS, SNI
* Support de FastCGI, pour avoir PHP
* Servir des fichiers static
* Reverse Proxy
* Manipulation des headers&co
* Protection par auth basic / restrictions IPs
* Open Source
Avec cette définition on écarte donc les simples reverse proxy qui sont pourtant d'une performance importante type haproxy, envoy, traefik etc... Le support de FastCGI est clairement quelques choses limitatif, PHP est en perte de vitesse et dorénavant le moindre service possède déjà son propre serveur web avec des performances suffisante sans être pour autant dans l'excellence en terme de performances. Le mieux étant de pouvoir servir les assets directement par notre serveur web.
Quoi qu'il en soit FastCGI pour PHP est mandatory pour moi.
## Apache
Ce serveur web à été un de mes premiers serveur que j'ai administré. Il a pour moi popularisé la fondation Apache et je dirais que sa popularité est encore aujourd'hui du à sa fameuse gestion des .htaccess qui ont permis à tout développeur de modifier les rewrite pour afficher des URLs fancy simplifier certaines réécriture pour variabiliser des requêtes.Par contre côté performance ce n'est pas la fête, il n'est pas des plus light avec des configurations pas simple.Lassé j'ai voulu exploré d'autre solutions, surtout plus light car j'ai toujours préféré les solutions légères et Apache n'est clairement pas dans cette catégorie
## Nginx
Je me souviens de ce début de serveur web super prometteur et moi en train de traduire via google translate le russe vers l'anglais. La popularité a gagné grandement quand la doc en anglais à été plus populaire et disponible.
J'utilisais beaucoup ce serveur web mais la légereté ne suffit pas. J'aime bien ne pas prendre le serveur web #1 et voir un peu ce qu'il se passe ailleurs pour voir ce qu'il se fait de bien.
## Caddy
Dans ma quête du changement je viens de switcher sur Caddyserver. Il est simple, challenge ce que j'ai vu avec un fichier de configuration unique (_Caddyfile_) et moderne.
C'est à dire moderne ?
* Support natif d'un exporteur prometheus avec de vrai metrics. Pas de ruse comme le fait actuellement nginx avec des morceaux de _lua_ (oui je sais, il faudrait la version plus mais bon).
* Gestion reverse proxy websocket, ajout des headers _x-forwarded-for_ et _proto_ out of the box
* Support de LetsEncrypt et plus récemment de ZeroSSL en fallback
* Configuration TLS par défaut sécurisé, c'est à dire >=TLSv1.2 et une suite de cipher correcte. C'est le premier serveur avec du TLS ou je n'ai RIEN à modifier
Le switch a été facile, malgré quelques recherche pas simple car j'utilise uniquement le fichier de configuration et pas API/JSON. Car oui moderne cela comprend aussi un Ingress Controler pour Kubernetes mais restons modeste avec l'auto hébergement (oui un jour peut-être k3s on verra)
Et vous quel est votre serveur web favori ? et pourquoi ?

View file

@ -0,0 +1,53 @@
+++
author = "Yann Verry"
categories = ["vpn", "network"]
date = 2020-10-06T07:57:23Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2020/04/raspi_web_server_02.jpg"
slug = "une-freebox-en-remote-avec-du-vxlan-sur-vpn"
summary = "Serveur vxlan"
tags = ["vpn", "network"]
title = "Seconde partie: Une Freebox en remote avec du VxLAN sur vpn"
+++
Nous revoilà pour configurer notre serveur afin de rendre disponible à nos client le réseaux nécessaire à la freebox.
## VPN: Wireguard
Il vous faut setup un vpn wireguard fonctionnel. Il est possible de faire du vxlan directement sur le WAN (l'internet des chats) mais un vpn sécurisé c'est quand même le minimum.
La seul particularité est d'avoir un subnet pour notre VPN qui n'overlap (toujours) pas les réseaux utilisé, à savoir 192.168.0.0/24 et 192.168.1.0/24.
## VxLAN
Enfin on attaque les vxlan, maintenant que nous avons un vpn fonctionnel
serverside:
> ip link add vxlan101 type vxlan id 101 local 172.16.42.4 srcport 10101 10101 remote 172.16.42.1 dstport 10101ip link add link eth0 name eth0.101 type vlan id 101
On ajoute dans le bridge:
> brctl addbr br101brctl addif br101 vxlan101 eth0.101
clientside
> ip link add vxlan101 type vxlan id 101 local 172.16.42.4 srcport 10101 10101 remote 172.16.42.1 dstport 10101ip link add link eth0 name eth0.101 type vlan id 101
On ajoute dans le bridge:
> brctl addbr br101brctl addif br101 vxlan100 eth0.101
## Persistance
Si vous avez une version "récente" de systemd, il est possible de faire tout cela via systemd

View file

@ -0,0 +1,13 @@
+++
author = "Yann Verry"
date = 2020-10-10T13:39:57Z
description = ""
draft = true
slug = "une-histoire-de-compression"
title = "Une histoire de compression"
+++
Dans le monde du web la compression gzip éxiste depuis des lustres

View file

@ -0,0 +1,42 @@
+++
author = "Yann Verry"
categories = ["security"]
date = 2019-03-21T21:09:11Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2019/03/1188551383_fbd414077a_o.jpg"
slug = "vault-ssh"
tags = ["security"]
title = "Vault SSH"
+++
Nous allons explorer une fonctionnalité de [vault](https://www.vaultproject.io/) trop peu utilisé qui pourtant résous enfin le problème de déploiement et révocation des clés SSH sur les serveurs.
Tout d'abord cela commence par la génération d'une CA SSH qu'on pousse sur chaque serveurs, on ajoute la ligne magique dans sshd_config :
> TrustedUserCAKeys <path certificate>
Pour réaliser cela l'authentification SSH s'éffectue avec un certificat et vault sign la clé publique pour une durée réduite, de 30minutes à disons 12heures.
Exemple:
> ➜ ~ ssh ns2.verry.orgReceived disconnect from 2a0b:cbc0:110d:1::1e port 22:2: Too many authentication failuresDisconnected from 2a0b:cbc0:110d:1::1e port 22
Il est donc impossible de se connecter au serveur, je demande donc à vault de signer à nouveau ma clé ed25519:
> ➜ ~ vault write -field=signed_key ssh-client-signer/sign/ssh-yverry public_key=@$HOME/.ssh/id_ed25519.pub > $HOME/.ssh/id_ed25519-cert.pub
Vault sign donc ma clé public fourni dans public_key, le serveur sshd vérifie que la signature est conforme et valide dans le temp. Je peux donc me connecter sur le serveur:
> ➜ ~ ssh ns2.verry.orgWelcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-46-generic x86_64)
## Conclusion
Grâce à vault plus de besoin particulier pour déployer la clé de chaque personne sur chaque serveur dès son arrivé dans vos équipes de sysadmin, il suffit juste d'une policies vault et le tour est joué !
Une personne quitte votre équipe ? Aucun problème avec des signatures courte et la révocation de son accès à vault plus aucun accès n'est possible.
J'ai volontairement passé beaucoup d'étape car le but n'est pas de réinventer la documentation déjà [fourni](https://www.vaultproject.io/docs/secrets/ssh/signed-ssh-certificates.html)

36
content/posts/vegas.md Normal file
View file

@ -0,0 +1,36 @@
+++
author = "Yann Verry"
categories = ["voyage"]
date = 2018-12-11T20:11:55Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2018/12/20181125_092822-PANO.jpg"
slug = "vegas"
tags = ["voyage"]
title = "Las Vegas"
+++
C'est parti pour un joli voyage à Las Vegas ! Passons la raison pro du voyage (même si c'était top!) mais les a côté.
Comme tout au US mais plus particulièrement à vegas tout est sans commune mesure
## Valley Of Fire
image valley of fire
## Vegas
{{< figure src="__GHOST_URL__/content/images/2018/12/vegas_paris-1.jpg" caption="Paris à Las Vegas" >}}
La ville, que dire tout est immense, absolument rien n'est prévu pour les piétons, ni autre chose que la voiture. C'est très choquant au début ... et puis on se souviens que nous sommes en plein désert et que les températures avoisinent les 40°C en moyenne avec des peak approchant les 50°C (oui oui).
Que dire, nous sommes dans un désert ? Oui et pourquoi ne pas mettre un grand lac car c'est joli ? C'est le cas avec le bellagio biensur!
{{< figure src="__GHOST_URL__/content/images/2018/12/20181126_154842.jpg" >}}

View file

@ -0,0 +1,61 @@
+++
author = "Yann Verry"
categories = ["network", "vpn"]
date = 2020-04-19T14:07:25Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2020/04/fiber-4814456_1920.jpg"
slug = "vxlan-sur-vpn"
summary = "Freebox en télétavail comment faire ? grâce à du vpn et vxlan"
tags = ["network", "vpn"]
title = "Première partie: Une Freebox en remote avec du VxLAN sur vpn"
+++
Nous sommes actuellement tous confiné, pour continuer à télétravailler il y a certains besoins plus difficile à apporter qu'un simple VPN.
Notamment dans les équipes j'ai des développeurs Freebox. Et pour développer ils ont besoin de quoi ? Eh bien ... d'une freebox. Ok facile quand tu es abonné @home chez Free mais dans le cas contraire comment faire ?
On va donc transporter le réseau Free n'importe ou dans le monde grâce à un VPN, ici wireguard et des vlan grâce à vxlan.
## Fonctionnement de la box
Tout d'abord la freebox player a besoin de deux types de connectivités. La première classique c'est votre connexion Free (et pas une autre hein).La seconde le réseau IPTV sur un vlan taggé : vlan100.
## Prérequis
Il y a une partie dis "client" et un serveur qui lui possède l'abonnement Free.En matériel pour le client il faut donc :
* Deux switchs (un de chaque côtés) qui comprend les vlan, switch dis donc manageable. Il faut compter une petite centaine d'euros pour un truc pas extra mais qui fait le job.
* Deux serveurs, type RasbperryPI sous linux
* Une Freebox Player et serveur
Plusieurs VLAN avec des subnet associés:
* Vlan100 (géré par Free on laisse tel quel)
* Vlan99, réseau Free domestique
* Subnet des opérateurs principaux français qui ne doit pas overlap:- [Orange](https://assistance.orange.fr/livebox-modem/toutes-les-livebox-et-modems/installer-et-utiliser/piloter-et-parametrer-votre-materiel/le-parametrage-avance-reseau-nat-pat-ip/gerer-votre-adresse-ip/adresses-ip-les-elements-a-connaitre-_238182-760947) 192.168.1.0/24- [SFR](https://assistance.sfr.fr/internet-tel-fixe/box-nb4/configurer-acces-interface-web-administration.html) sur nb4 192.168.1.0/24- [Bouygue](https://www.assistance.bouyguestelecom.fr/internet-bbox/installation-bbox/connexion-installation-interface-administration-bbox) 192.168.1.0/24
Bonne nouvelle ils utilisent tous le même subnet par défaut.Mais cela impose donc côté serveur de modifier. On va s'occuper de faire uniquement l'avant dernier octet (192.168.x.0/24). Pour cela se rendre sur l'interface [http://mafreebox.freebox.fr/](http://mafreebox.freebox.fr/) ouvrir réseau local depuis _paramètres de la freebox_
{{< figure src="__GHOST_URL__/content/images/2020/04/fbx_subnet.png" caption="Freebox Routeur / réseau local" >}}
Il faut aussi modifier la partie range DHCP etc ...
## Physique "client"
On branche donc le tout sur notre switch, rpi et freebox et un uplink avec notre box d'un autre opérateur.
{{< figure src="__GHOST_URL__/content/images/2020/04/Freebox@remote-2.png" >}}
Il faut donc tagguer le vlan100 vers le rpi ET la freebox.Il faut un second VLAN pour transporter le vlan Free. On le propagera égalemment sur le poste du dev afin de lui permettre de piloter la/les freebox.
## Physique "serveur"
C'est presque plus simple, un serveur type rpi aussi toujours un switch manageable et on tag le vlan100 sur la freebox server et notre rpi
## Conclusion
Voila nous avons notre infra physique prête pour transporter notre player n'importe ou dans le monde. La prochaine partie s'attelera sur la partie serveur avec le vpn et surtout vxlan

View file

@ -0,0 +1,52 @@
+++
author = "Yann Verry"
categories = ["vpn"]
date = 2019-02-11T22:01:46Z
description = ""
draft = false
image = "__GHOST_URL__/content/images/2019/02/35366000233_0580617b42_h.jpg"
slug = "wireguard"
summary = "Wireguard un vpn facile"
tags = ["vpn"]
title = "Wireguard, le vpn simple et rapide"
+++
{{< figure src="__GHOST_URL__/content/images/2019/02/640px-Logo_of_WireGuard.svg-1.png" >}}
Ce nouveau VPN à la mode ou _linus torvalds_ himself en fait des éloges sur l'élégance du code est rien que pour cette raison quelque chose qu'il faut regarder.
## La promesse
Un VPN enfin rapide à setup, facile d'utilisation et sécurisé. Pour connaître IPSec, la joie des phase1, puis 2, passage des clés etc ... Ensuite en alternative nous avons OpenVPN, bien mignon avec une gestion de la PKI à avoir, un code décrié pour sa qualité qui semble disons aléatoire.
La performance est aussi de mise, avec un module noyau, l'intégration de courbe elliptique et des jeux d'instructions CPU la charge processeur doit être faible au vu des débits transféré
Bref quand je vois _facile_ je demande à voir !
## La vrai vie enfin!
Le plus long dans l'installation de ce VPN est le fait que wireguard n'est pas encore inclus dans le kernel mainline et il faut en passer par DKMS. Chose ultra facile, la configuration s'éffecute en quelques lignes avec
* La définition de l'interface, son IP, sa clé privée
* La définition des peers distant, IP autorisé, endpoint, clé pub
**TADA**! rien d'autre, je vous laisse vérifier par vous même
## Les moins
Bon Il y a des moins il faut l'avouer.
Tout d'abord avec mon utilisation massive d'ipv6, immédiatement j'ai vu un problème sur la MTU qui est arbitrairement défini à 1400 en v4 ou en v6 ce qui pose donc un problème :
> ip link set wg0 mtu 1380
Ensuite pas de mode _TCP_ et il y a encore des hôtels avec le port 443 ouvert et c'est tout, dommage [il éxiste des solutions à base de _socat_ mais peu élégant]
Un debug parfois douloureux, l'outil étant encore en version préliminaire il y a de gros manque et la documentation est faiblarde.
## Conclusion
Il faut tester, je pense que dans des cas simples c'est très pratique et l'enfer du vpn n'éxiste plus avec wireguard et c'est une bonne chose, pour la production je dirais qu'il faut attendre encore un peu

8
content/search.md Normal file
View file

@ -0,0 +1,8 @@
---
title: "Search" # in any language you want
layout: "search" # is necessary
# url: "/archive"
# description: "Description for Search"
summary: "search"
placeholder: "placeholder text in search input box"
---