Un guide très complet pour monter une archi HAproxy en HA derrière un ELB avec la terminaison SSL au niveau du HAproxy (utile pour avoir plusieurs certificats SSL sur le même HAproxy par exemple).
Parmi les points importants:
- utiliser le mode TCP au niveau de l'ELB pour laisser HAproxy gérer la terminaison SSL
- activer le Proxy Protocol au niveau ELB (
ProxyProtocolPolicyType
) et HAproxy (accept-proxy
) pour récupérer les IP sources dans les logs HAproxy - créer un frontend sans le Proxy Protocol sur le HAproxy dédié au Healthcheck ELB (les healthcheck ELB ne supportent pas encore le ProxyProtocol)
Également pas mal d'autres astuces pour ajouter des fonctions de sécurité basiques au niveau HAproxy (URL filtering, Rate limiting, DDOS protection...)
Bonnes pratiques pour gérer ses rôles avec Ansible Galaxy:
- utiliser la commande
ansible-galaxy init
pour créer la structure du rôle$ ansible-galaxy init test-role - test-role was created successfully $ tree . └── test-role ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml 9 directories, 8 files
- Isoler chaque rôle dans un repo git séparé (permet de gérer la version du rôle avec les tags git)
- Utiliser Ansible Galaxy pour installer les rôles privés avec un fichier requirements.yml:
$ cat requirements.yml - src: git+https://bitbucket.org/ursuad/sample_role_oracle-java version: v1.1.6 $ ansible-galaxy install -r requirements.yml
- Gérer les dépendances entre rôles dans meta/main.yml
$ cat meta/main.yml dependencies: - { role: 'git+https://bitbucket.org/ursuad/sample_role_launchpad-ppa-webupd8,v1.0.0'}
Fetch permet de récupérer des fichiers ou répertoires spécifiques à l'intérieur d'un repo git sans avoir à cloner tous le repos.
C'est pratique quand on a besoin de récupérer un seul fichier (script ou fichier de conf par exemple...) dans un repo.
Quelques astuces pour se protéger des attaques DDOS au niveau du HAproxy
- Pour limiter les attaques DDOS de type TCP Syn Flood au niveau de l'HAproxy, modifier les parmètre suivant dans
sysctl
:net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.tcp_max_syn_backlog = 1024
- Pour limiter les attaques de type Slowloris, ajouter le paramètre
timeout http-request 5s
dans le fichier de configuration HAproxy
Egalement d'autres astuces, pour:
- paramétrer des limites max de connexions différentes pour le contenu static et dynamique (en utilisant 2 backends différents)
- limiter le nombre de connexions par user
- limiter le nombre de connexions par secondes par user
- limiter le nombre de requêtes par secondes
- détecter et bloquer les scans de vulnerabilités
Quelques commandes pratiques pour iPython
Celery est une librairie Python qui permet de gérer des files d'attentes pour des traitements batchs asynchrones ou schedulés.
Il est possible de plugger Celery a un backend parmi Redis, AWS SQS, RabbitMQ, MongoDB ou une base de données par exemple.
Les slides de Gruntwork qui résument toutes les bonnes pratiques Terraform présentés dans leur série d'article
Cf. liens précédents:
The Intercepts conseille d'utiliser la méthode Diceware pour générer des passphrases de 7 mots pour tout ce qui doit être déchiffré localement (disque dur chiffré, gpg key, private ssh key, archives chiffrées...).
Pour les login/password de service web, en revanche, générer les passwords avec KeePassX est suffisant à condition d'utiliser une passphrase générée avec la méthode Diceware pour la base de mots de passe
ansible-lint vérifie le playbook indiqué en argument et indique les tâches qui ne suivent pas les best-practices Ansible dans leur définitions.
L'installation se fait via pip:
pip2 install ansible-lint
Un theme Material Design pour Jenkins
LinkedIn utilise un outils maison pour analyser les exceptions dans les logs applicatifs. Chaque nouvelle exception est enregistrée dans une base avec son hash. Le nombre d'occurrence de chaque exception par période de temps est ensuite enregistré dans une autre table. Cette solution nécessite seulement 30Gb pour stocker l'ensemble des exceptions alors qu'une solution ELK nécessiterait 50Pb pour centraliser l'ensemble des logs de leurs applications.
Workflow proposé par Gruntwork pour les changements d'infrastructure avec Terraform:
- Vérifier les effets du changements avec
terraform plan
- Appliquer le changement en environnement de test avec
terraform apply
- Pusher le changement sur une branche et soumettre une pull-request à reviewer
- Merger la PR sur master après la code review
- Appliquer le changement en environnement de production avec
terraform apply
Un tuto pour parser et centraliser les logs avec logstash. La possibilité d'envoyer des alertes via PagerDuty ou mail directement depuis logstash est intéressante aussi
Un tuto pour utiliser les nouvelles fonctionnalités de pipeline de Jenkins 2 avec une application NPM Electron
Des astuces pour utiliser des boucles et des conditions avec Terraform en utilisant le paramètre count
au sein des ressources:
- comme un compteur pour les boucles
- comme un booléen (0=false, 1=true) pour les conditions
On peut ensuite utiliser la fonction element
pour récupérer l'élément d'une liste correspondant à l'indice de count
ou utiliser la fonction replace
pour remplacer 0 ou 1 par des valeurs différentes par exemple.
C'est plutôt tricky mais ça à l'air de faire le job.
Best practices pour Terraform:
- utiliser des modules contenant le code nécessaire au provisinning des services
- appeler les modules depuis les répertoires de configuration spécifiques aux environnements en passant en variables les données spécifiques aux environnements
- séparer les modules et la configuration spécifique aux environnements dans 2 repos git différents afin de pouvoir appeler des versions du module différent selon les environnements (en utilisant les tags git)
ex:
- infrastructure-live-repo
| - dev
| | - app1
| | - app2
| | - db1
| | - vpc
| - test
| | - ...
| - prod
| | - ...
| - mgmt
| | - bastion
| | - ...
| - global
| | - iam
| | - route53
| | - ...
- infrastructure-modules-repo (tags v0.0.1, v0.0.2, ...)
| - app1
| - app2
| - db1
| - vpc
| - bastion
| - ...
Configuration HAproxy pour bloquer les attaques Slow POST.
frontend my-frontend
...
option http-buffer-request
timeout http-request 10s
Pour sauvegarder un dump du kernel dans /var/crash sous debian en cas de kernel panic:
apt install kdump-tools crash kexec-tools makedumpfile `uname -r`-dbg
sed -i 's/USE_KDUMP=0/USE_KDUMP=1/' /etc/default/kdump-tools
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet" crashkernel=128M"/' /etc/default/grub
update grub
reboot
- Évènements à tracer en Production:
- Changes (who/what/when/type)
- Incidents (when/TTD/TTR/severity/root cause)
- Métriques résultantes:
- déploiements applicatif par jour
- déploiements de config par jour
- migrations de schémas DB par jour
- lignes de codes changés par déploiements
- change / incident ratio (pour chaque type de changement)
Comment centraliser les logs des containers Docker dans Cloudwatch en utilisant awslogs et comment les envoyer par la suite dans une stack ELK en passant par un export S3.