---
title: "Quelle infrastructure informatique pour la société KAPTUS ?"
canonical: "https://blog.kaptus.net/space/BKAP/blog/182714371/Quelle%20infrastructure%20informatique%20pour%20la%20soci%C3%A9t%C3%A9%20KAPTUS%20%3F"
format: markdown
---
> Macro (toc)

# 1. Introduction.

Depuis un certain temps, l'envie me démange de partager mon expérience concernant la mise en place et la gestion de l'infrastructure chez KAPTUS. À l'ère du Cloud Public, dominé par des acteurs majeurs tels qu'AWS, GCP, AZURE, OVH (et la liste est plus longue),  je me suis interrogé sur l'évolution du paysage informatique. Aujourd'hui, il semble  (**de mon point de vue**), presque impensable de concevoir **un Système d'Information sans s'associer à l'un de ces géants**.

D'ailleurs, une multitude d'offres [SaaS](https://fr.wikipedia.org/wiki/Software_as_a_service), qu'elles soient OpenSource ou propriétaires, font leur apparition, remplaçant progressivement les logiciels que nous installions autrefois sur nos ordinateurs. L**e but de cet article n'est pas de critiquer ces nouvelles offres, qui ont clairement leurs mérites**. Au contraire, je souhaite illustrer qu'avec une gestion budgétaire judicieuse, il est encore possible de construire et de gérer une infrastructure personnalisée, **répondant parfaitement à nos besoins**.

Quand je pose la question directement à [ChatGPT](https://chat.openai.com/), voici sa réponse (**que je trouve très pertinente sauf pour le choix de l’Hyperviseur **😉 ) :

> ℹ️ L'infrastructure informatique idéale pour la société KAPTUS dépendra grandement de ses besoins spécifiques, de sa taille, de son budget et de son secteur d'activité. Cependant, je peux vous fournir une suggestion générale basée sur les tendances actuelles et les meilleures pratiques dans le domaine des TI. Voici une infrastructure de base pour une société moderne :
> ℹ️ 
> ℹ️ 1. **Serveurs Physiques et Virtuels** :
> ℹ️   - **Serveur dédié** pour les bases de données critiques.
> ℹ️   - **Virtualisation** (comme VMware ou Hyper-V) pour optimiser l'utilisation des ressources et faciliter la gestion des serveurs.
> ℹ️ 2. **Stockage** :
> ℹ️   - **Stockage SAN/NAS** pour centraliser le stockage de données et offrir une meilleure performance et redondance.
> ℹ️   - Solutions de **sauvegarde automatisée** pour assurer la protection des données.
> ℹ️ 3. **Réseau** :
> ℹ️   - **Switches et routeurs** de haute qualité pour une connectivité robuste.
> ℹ️   - **Firewalls** pour sécuriser le réseau contre les menaces externes.
> ℹ️   - Solutions **VPN** pour les employés travaillant à distance.
> ℹ️ 4. **Cloud** :
> ℹ️   - Utilisation de services cloud comme **AWS, Azure, ou GCP** pour les besoins évolutifs ou pour des services spécifiques (par exemple, le stockage d'objets, les fonctions serverless).
> ℹ️   - **SaaS** (Software as a Service) pour des applications spécifiques comme la CRM, comptabilité, etc.
> ℹ️ 5. **Sécurité** :
> ℹ️   - **Antivirus et antimalware** pour tous les postes de travail et serveurs.
> ℹ️   - **Système de détection et de prévention des intrusions (IDS/IPS)**.
> ℹ️   - **Gestion unifiée des menaces (UTM)** pour une protection complète.
> ℹ️ 6. **Collaboration et communication** :
> ℹ️   - **Systèmes de VoIP** pour la téléphonie.
> ℹ️   - Plateformes de **collaboration en temps réel** comme Microsoft Teams ou Slack.
> ℹ️   - Solutions d'**e-mail d'entreprise** comme Microsoft Exchange ou Google Workspace.
> ℹ️ 7. **Gestion** :
> ℹ️   - Outils de **surveillance de l'infrastructure** pour détecter et résoudre les problèmes rapidement.
> ℹ️   - **Systèmes de gestion des incidents et des demandes** pour suivre les besoins et les problèmes des utilisateurs.
> ℹ️ 
> ℹ️ Il est important de consulter un expert en infrastructure informatique qui pourra analyser les besoins spécifiques de la société KAPTUS et recommander une solution adaptée. La clé est de construire une infrastructure qui est à la fois flexible et robuste, tout en étant sécurisée et économiquement viable.

# 2. Un bref historique.

La société **[KAPTUS](https://www.kaptus.fr)** (anciennement NAOS Technologies) fait de l’hébergement de sites et d’applications **depuis 1997**. A cet époque, je suis aller déposer un PC acheté [rue Mongallet à Paris](https://www.rue-montgallet.com/boutiques/), dans une armoire de bureau chez Internet-FR à Massy.  
Ils étaient entrain de monter leur datacenter et j’ai été un de leur premier client. Quelques années plus tard, j’ai loué une demi-baie et j’ai installé **4 serveurs Bull Express 5800**. Ce qui m’a permit de mettre en place un hébergement de qualité avec de la redondance en cas de pannes (et des pannes il y en a eu…). Début des années 2010, j’ai commencé à entendre parler des machines virtuelles qu’offraient certaines hébergeurs. C'était une vrai rupture technologique pour moi et j'étais assez réticent. Mais [le rachat d’Internet-Fr par PROSODIE](https://www.journaldunet.com/solutions/cloud-computing/1089087-prosodie-rachete-internet-fr-et-level-ip/), allait avoir raison de mes réserves. Après le rachat, le centre d’hébergement de Massy fermait ses portes et j’avais la possibilité de déménager mes serveurs dans un centre d’hébergement du côté de Courbevoie mais avec un coût mensuel multiplié par 3 (**je passais de 500 € à 1500 € H.T. par mois**). 

> 📝 Ce n'était plus vraiment viable surtout que mes serveurs étaient proches de leurs dates d’obsolescences.

J’ai donc décidé de passer l’ensemble de ma production **sur des machines virtuelles**. Gérant mes noms de domaines chez [GANDI](https://www.gandi.net/fr), j’ai choisi cet hébergeur pour déployer mon infrastructure. **J’ai été très satisfait du service proposé par Gandi pendant quelques années.** Le problème c’est que les clients que j’hébergeai, devenaient de plus en plus gourmand en ressources et que les prix commençaient à grimper sans que je puisse les répercuter (**car ce n'était pas prévu contractuellement**) sur les factures. **Je voyais ma marge diminuer régulièrement**. En 2016 lors d’une mission, je découvre grâce à un collègue de travail l’hébergeur [ONLINE (devenu SCALAWAY aujourd’hui)](https://www.scaleway.com/en/dedibox/) et l’hyperviseur [PROXMOX](https://www.proxmox.com/en/proxmox-virtual-environment/overview). Changement de paradigme pour moi car du coup je revenais sur le concept de machine physique **mais en location**. J’ai du monter en compétences sur l’utilisation de PROXMOX PVE et migrer l’ensemble des services et applications qui étaient hébergés chez GANDI, sur ma nouvelle infrastructure.

> ℹ️ Aujourd’hui, l’infrastructure en place est mature, fiable et surtout très souple et je vais vous expliquer pourquoi dans ce qui suit.

# 3. Le pourquoi.

C’est quand même important de définir pourquoi j’ai choisi d'avoir ma propre infrastructure. Je vais énoncer ci-dessous quelques points clés.

1. <u>***C’est historique***</u>**.**
  1. Je baigne dans l’internet depuis 1996 et à cette époque avec les projets que je gérais, je n’avais pas d’autre choix, d’autres alternatives.
2. <u>***Maitrise des technologies que j’utilise.***</u>
  1. Çà me permet de choisir les technologies adaptées à mes besoins et de les proposer à mes clients
  2. Çà me permet aussi de faire une veille technologique permanente sur mon périmètre d’intervention
3. <u>***Maitrise des coûts : Une infrastructure basée sur la location de machines physiques permet d’avoir des coûts mensuels fixes.***</u>
  1. Pas de surprise en fin de mois
  2. Pas de coûts supplémentaires pour les transferts de paquets sur le réseau (interne ou externe).
  3. J'évalue au départ les besoins en ressources et d’espaces disques et je peux allouer l’espace que je veux sur les serveurs que je veux et en ajouter si nécessaire.
4. <u>***La flexibilité.***</u>
  1. L’ajout de nouvelles ressources s’effectue sans trop d’effort.

> ⚠️ Gérer et maintenir une infrastructure demande d’avoir les compétences adéquates et surtout être passionné car certaines tâches peuvent vite devenir rébarbatives.

# 4. Les besoins.

En premier lieu, je vais essayer de détailler nos besoins propres en termes d’utilisations et de services et les besoins de nos clients.

> ℹ️ L’ensemble des applications que nous utilisons sont presque toutes issues du monde de l’OpenSource. Mais il y a quelques exceptions….  
> ℹ️ Tous nos serveurs fonctionnent avec DEBIAN comme système d’exploitation.

| **Usage** | **Ressource/Application** | **Commentaire** |
| --- | --- | --- |
| Interne | Serveur de messagerie | Historiquement j’ai toujours hébergé notre messagerie pour des raisons de confidentialités et de sécurité.<br>- [POSTFIX](https://www.postfix.org/)
- [Dovecot IMAPD](https://www.dovecot.org/) |
| Interne | WebMail | Pour la lecture de nos messages électroniques sur nos postes de travail<br>- [ROUNDCUB](https://roundcube.net/) |
| Interne | Serveur DNS | Même chose et aussi pour avoir plus d'indépendant au niveau de la gestion de mes domaines.<br>> 📝 Mais bon c’est discutable aujourd’hui ?<br>- [BIND 9](https://www.isc.org/bind/) |
| Interne | Application CRM | Pour la gestion de la relation clients et prospects et aussi pour la gestion commerciale (devis, facture, affaire, etc…)<br>- [SuiteCRM](https://suitecrm.com/) |
| Interne | Application de monitoring | Avoir une infrastructure à maintenir impose d'avoir des outils de surveillances et d’alertes.<br>- [NAGIOS](https://www.nagios.org/)
- [GRAFANA](https://grafana.com/grafana/) avec [PROMETHEUS](https://prometheus.io/) |
| Interne | Gestion de la connaissance | Avoir un outil pour la gestion de nos documents, pour la gestion de nos connaissances, de nos procédures et la rédaction de [REX](https://fr.wikipedia.org/wiki/Retour_d%27exp%C3%A9rience).<br>- [ATLASSIAN CONFLUENCE](https://www.atlassian.com/fr/software/confluence) (***pas OpenSource***)<br>> ⚠️ 9/23/2023 : On a récemment migrer vers CONFLUENCE CLOUD |
| Interne | Gestion des versions des codes sources | Avoir un outil de gestion de code source distribué (GIT) pour le développement de nos applications.<br>- [ATLASSIAN BITBUCKET](https://www.atlassian.com/fr/software/bitbucket) (***pas OpenSource***)<br>> ⚠️ 9/23/2023 : On est entrain de migrer vers BITBUCKET CLOUD |
| Interne | Hyperviseur KVM | Pour la gestion et la mise en place de nos machines virtuelles, il est beaucoup plus simple d’utiliser un [hyperviseur](https://fr.wikipedia.org/wiki/Hyperviseur).<br>- [PROXMOX VE](https://www.proxmox.com/en/proxmox-virtual-environment/overview) |
| Interne | Sauvegarde des machines virtuelles | Pour la sauvegarde régulière des machines virtuelles en cas de crash serveurs ou autres incidents<br>- [PROXMOX BS](https://www.proxmox.com/en/proxmox-backup-server/overview) |
| Interne | Gestion et partage de fichiers | Afin de partager les fichiers entre nos différents postes de travail (Mac, PC, téléphone mobile, …)<br>- [NEXTCLOUD](https://nextcloud.com/fr/) |
| Interne | Édition en ligne des documents | Pour éditer directement dans un navigateur les documents partagés dans NEXTCLOUD<br>- [ONLYOFFICE Server](https://www.onlyoffice.com/fr/download-docs.aspx) |
| Interne | Boutique en ligne | Une boutique en ligne pour la commercialisation de nos prestations dématérialisées<br>- [PRESTASHOP](https://prestashop.fr/)<br>> ⚠️ 9/27/2023 : En cours de réalisation |
| Interne | Solution VPN | Pour les accès sécurisés aux différents serveurs<br>- [OpenVPN](https://openvpn.net/) |
| Interne | Sécurité et Pare-Feu | Pour sécuriser et contrôler les accès aux serveurs et aux applications<br>- [IPTABLES](https://www.netfilter.org/projects/iptables/index.html)
- [FAIL2BAN](https://www.fail2ban.org/wiki/index.php/Main_Page) |
| Interne | CI/CD | Pour le déploiement de nos applications sur nos serveurs<br>- [JENKINS](https://www.jenkins.io/) |
| Interne | Chaîne d’approvisionnement | Pour la gestion des packages de nos applications et des packages tiers<br>- [SONARTYPE](https://www.sonatype.com/products/sonatype-nexus-oss) |
| Externe | Solution d’emailing | Pour l’hébergement des serveurs de clients qui utilisent notre application d’emailing [ENEWS](https://www.enews.fr). |
| Externe | Hébergement de solutions clients | Pour l’hébergement d’applications, de solutions pour nos clients<br>- Site internet
- Base de données
- Applications spécifiques développées pas nos soins
- … |
| Interne/Externe | Serveurs POCs | Pour la réalisation de POCs (**Proof Of Concept**) sur différentes technologies |
| Interne/Externe | Automatisation des déploiements | Pour automatiser les déploiements d’applications, la configuration de nouvelles machines virtuelles ou la propagation DNS.<br>- [JENKINS](https://www.jenkins.io/)
- [ANSIBLE](https://www.ansible.com/)
- Shell Script |
| Interne/Externe | Outils de gestion de nos bases de données | Pour gérer nos bases de données, internes et clients, (**essentiellement MariaDB, MySQL**) à distances<br>- [PhpMyAdmin](https://www.phpmyadmin.net/) |

> 📝 Ces besoins se sont construit au cours du temps. A chaque étapes, nous avons essayer de trouver les outils qui pouvaient convenir à notre utilisations.  
> 📝 9/27/2023 Par exemple aujourd’hui j'étudie la possibilité de mettre en place la base de données distribuées [CockCroachDB](https://www.cockroachlabs.com/) ou l’application de gestion des authentifications centralisée [KeyCloak](https://www.keycloak.org/)

# 5. L’infrastructure.

Aujourd’hui mes serveurs physiques sont répartis principalement chez 2 hébergeurs

1. [SCALEWAY](https://www.scaleway.com/fr/)
2. [HETZNER](https://www.hetzner.com/dedicated-rootserver)

## 5.1. Côté hardware.

> Macro (drawio)

J’ai 2 gros serveurs chez SCALEWAY pour l’ensemble de ma production. Sur chacun de ces 2 serveurs, est installé l’hyperviseur PROXMOX VE pour la gestion des machines virtuelles. Pour des raisons de sécurités, ces 2 serveurs sont dans des datacenters différents (**Vitry sur Seine** et **Pontoise**).

> ℹ️ Pour ces 2 serveurs j’ai pris une licence entreprise PROXMOX VE

![image](media://97b8b66c-f2bc-4f49-9d46-de5ad9c42cb1)

![image](media://cf3f8192-a846-4747-9610-9677c6622bd5)

Pour la sauvegarde des VMs, j’ai un serveur primaire et un serveur secondaire chez HETZNER. Pour l’instant et pour des question de coûts, (**même si c’est pas très prudent**), les 2 serveurs sont dans le même datacenter. Sur chacun des 2 serveurs, une version de PROXMOX BS est installée.

> ℹ️ J’ai pris une licence entreprise PROXMOX BS pour le serveur primaire mais pas pour le serveur secondaire.

![image](media://7241f486-2f15-4791-92bc-97a3292c4171)

Le serveur secondaire est une réplication (**via rsync toute les 5mn**) du serveur de backup primaire. 

Chez HETZNER, j’ai aussi un serveur sur lequel j’ai installé notre instance NEXTCLOUD. 

> 📝 J’ai fait ce choix car j’avais besoin d’espace de stockage plus important et je ne voulais pas avoir à gérer ça dans une VM.

## 5.2. Côté sauvegarde.

Bon, avoir une jolie infrastructure c’est bien, mais il faut aussi penser aux différents scénarii de reprise en cas de problèmes graves :

- Problèmes physiques sur un serveur (perte de plusieurs disques, défaillance d’un composant électronique, …)
- Problèmes techniques dans un datacenter occasionnant la perte d’un serveur
- What else ? …

Avant de parler de **plan de reprise** ou de **continuité**, je vais faire un point sur **les procédures de sauvegardes en place**. Comme vous l’aurez compris, l’ensemble de **ma production s’effectue sur des machines virtuelles**. J’utilise donc PROXMOX BS pour la gestion des sauvegardes de mes VMs. La périodicité de ces sauvegardes est  fonction de l’importance des données. Par exemple :

- Serveur de messagerie → **toute les 30mn**
- Serveur ENEWS de nos clients → **toutes les 30mn**
- Serveur d’automatisation (ANSIBLE) → **Une fois par jour car les codes sources ANSIBLE sont dans un dépôt BitBucket.**
- …

![image](media://e61fde84-4bdb-4a79-8dee-91668a721693)

> 📝 Voici quelques raisons pour lesquelles j’ai choisi PROXMOX BS pour la gestion des sauvegardes des VMs :
> 📝 
> 📝 1. Parfaite intégration avec PROXMOX VE
> 📝   1. Configuration assez simple une fois qu’on a compris le mécanisme
> 📝 2. Gestion des sauvegardes incrémentales ce qui me permet de diminuer considérablement le temps de la sauvegarde d’une VM (**quelques dizaines de secondes**)
> 📝 3. Une interface graphique très conviviale et très complète
> 📝 4. Une [CLI](https://fr.wikipedia.org/wiki/Interface_en_ligne_de_commande) très pratique pour automatiser certaines tâches

> ⚠️ La prise en main de la CLI n'est par simple car il y a très peu de documentations sur le sujet.

Pour certaines application, j’ai développé des script BASH qui sont lancés par un cron pour faire les sauvegardes régulières des différents composants :

- bases de données
- fichiers attachés aux applications
- etc …

Par exemple pour notre instance NEXTCLOUD qui est sur une machine physique, **je sauvegarde toutes les 4 heures l’ensemble des données**

> Macro (drawio)

> ℹ️ Toutes les sauvegardes vont sur le serveur principal dans le datacenter HETZNER et un cron réplique les données sauvegardés (incluant la sauvegarde des VMs) sur le serveur secondaire.

***Pour finir, j’effectue chaque jours une copie des données (via rsync) sur une box de stockage HETZNER de 10To.***

## 5.3. Concernant le PCA.

Nous allons commencer par le Plan de Continuité de l’Activité ([PCA](https://fr.wikipedia.org/wiki/Plan_de_continuit%C3%A9_d%27activit%C3%A9_(informatique))).

Un des avantages d'être chez SCALEWAY et de pouvoir bénéficier de leur adresses IPs failover.

Je dispose d’un pool d’adresses IPs (**32 à ce jour**) que je peux attribuer à n’importe quel serveur sur le réseau SCALEWAY (multi-datacenter)

> Macro (drawio)

Si un serveur physique est défaillant, je bascule l’ensemble des VMs sur le serveur qui est encore en fonction. 

> 📝 Actuellement mon process n’est pas optimal car je n’ai pas pris le temps de configurer PROXMOX VE en mode cluster. Ce qui me permettrait de faire de la “**live migration**” et diminuerait drastiquement le temps d’indisponibilité des VMs.
> 📝 
> 📝 **Avec une budget plus important, j’aurai 2 serveurs identiques dans chaque datacenters et je mettrai en place le mode cluster sur PROXMOX VE. **

> ℹ️ 9/27/2023 : A ce jour, je n’ai jamais eu de problèmes graves sur les serveurs, mais j’ai pu valider la procédure lorsque j’ai effectuer une migration sur un nouveau serveur (**pour diminuer les coûts** ou parce **la période de maintenance du serveur était dépassée**). <span style="color: #36b37e">***Le temps maximum observé pour la remise en ligne d’une VM était de 50mn.***</span>   
> ℹ️ ***Ce qui dans mon cas est acceptable et explicable auprès de mes clients.***

## 5.4. Concernant le PRA.

**Ne nous leurrons pas**, l’infrastructure mise en place est fortement dépendante de l’hébergeur SCALEWAY. La raison principale de cette dépendance est liée aux adresses IPs qui sont la propriéte de l’hébergeur. Donc en cas de changement d’hébergeur, on perds les adresses IPs et dans certains cas (par exemple pour la réputation de l’adresse IP d'un serveur de messageries), c’est problématique. 

> 📝 Certes, il existe des moyens de ne pas être dépendant d’un prestataire d’infrastructure, mais pour ma société, je n’ai pas encore trouvé de solutions en accord avec nos moyens financiers.

> ❌ <span style="color: #bf2600">***Ma reprise d’activité en cas de fermeture de SCALEWAY ou si l’ensemble de leurs datacenters est défaillant, serra pour moi très compliqué.***</span>

Mais soyons positif et supposons qu’un seul datacenter soit défaillance pendant une période indéterminée. Le PRA est le suivant :

| **Action** | **Durée totale** |
| --- | --- |
| Mise en place de mon PCA | entre 2 et 4h |
| Location d’un nouveau serveur | 15mn |
| Installation et configuration de l’OS et de PROXMOX VE | 3h |
| Migration des VMs et mise en production sur le nouveau serveur | entre 2 et 4h |
| ***Temps total de l’opération*** | ***entre 7h et 11h*** |

## 5.5. Côté supervision/monitoring.

Avec une telle infrastructure, il est indispensable d’avoir une application de supervision pour surveiller les serveurs et les services. J’ai opté pour le couple NAGIOS/GRAFANA, qui sont installées sur une VMs spécifique. J’ai développé un rôle ANSIBLE pour mettre à jour la configuration de NAGIOS et de GRAFANA lorsque j’ajoute ou je supprime un nouveau serveur (incluant ses services).

![image](media://6ff76ce0-1488-49c1-a787-dae64e30c39c)

> 📝 Les alertes arrivent sur mon portable grace à l’application [PUSHBULLET](https://www.pushbullet.com/).

![image](media://0e6f9877-788a-4085-ac57-3584ca93db6d)

GRAFANA/PROMETHEUS me permet d’avoir via des tableaux de bords, un historique sur l’utilisation des ressources de mon infrastructure :

![image](media://987fad65-4059-40d2-a3c7-c8bc89615f7d)

## 5.6. Et pour gérer tout ça ?

Il est clair que la mise en place de l’ensemble de l’infrastructure a pris un peu de temps. Il a fallu utiliser des outils pour déployer rapidement et de manière fiable, un nouveau serveur et les différentes applications et service qui le compose. Pour l’automatisation du déploiement, je me suis tourné il y a quelques années vers ANSIBLE. 

> 📝 J’avais essayé [PUPPET](https://www.puppet.com/), mais je n’avais pas été convaincu à l'époque. La raison principale était du à la courbe d’apprentissage beaucoup trop longue.

J’ai donc développé pas mal de rôles et de playbooks ANSIBLE pour mon activité :

|  |  |
| --- | --- |
| ![image](media://8741904e-10e1-4475-a596-5f84a8673933) | ![image](media://8292a7ce-3764-4ef9-ba5e-b246c5b13cf5) |

Pour chaque serveur je défini un fichier de variables et en fonction de la valeur de ces variables j’installe le composant système correspondant :   
Voici un exemple de fichiers de propriétés pour un serveur :

```plaintext
---
ansible_host: xxx.xxx.xxx.xxx
ansible_connection: ssh
ansible_port: xx
ansible_user: ansible
ansible_ssh_private_key_file: /etc/ansible/.ssh/id_rsa
server_name: tyrannotitan
server_description: SERVER HETZNER HELINSKI DC6 - 2x512GO disks SSD NVME (RAID Soft), 2x12TO disks HDD - AMD Ryzen 7 3700X 8-Core Processor/16 Threads - 64Go mem DDR4
server_prompt: kaptus_backup_03
external_ipv4: xxx.xxx.xxx.xxx
external_ipv6:
external_inet: enp7s0
internal_ipv4:
internal_inet: 
internal_ipv4_online: false
internal_inet_online: false
grafana: false
grafana_dashboard: true
dhcp_ip_server:
proxmox_backup_server: true
proxmox: true
suitecrm: false
keycloak: false
nextcloud: false
prestashop: false
proxmox_host:
timezone: Europe/Paris
java_version: 15
tomcat_version: false
php_version: 7.4
naos_dir: /opt/naos
is_enews_server: false
enews_customer_name: 
enews_domain_name:
enews_emailing_number:
enews_email_code: 
dkim_selector: kaptus
dkim_domain: kaptus.fr
dkim_pub_key:
  - MIICIjXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcwZ4IB0bq
  - hVVHZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXau0guZkUT
  - 8QWolXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcRpXT348
  - nTSCUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBTMPXOE
  - NloVLXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXibdzp
  - 9gHNmXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFWdGsn
  - nq6LuXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAczcq
  - p6N+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAQ==
server_localisation: hetzner_helsinki_dc6
is_vpn_server: false
is_dns_server: false
dns_server_type:
backup_server: true
##
## WordPress
##
wordpress: false
##
## nagios variables
##
is_nagios_server: false
is_supervized: true
is_mysql_slave: true
is_mysql_master: false
mysql_slave: tyrannotitan
nagios_clock: distant
nagios_disk_root: distant
nagios_disk_home: true
nagios_disk_home_name: /opt
nagios_dkim: false
nagios_dns: false
nagios_firewall: distant
nagios_ftp: false
nagios_http: distant
nagios_imap4: false
nagios_imap4s: false
nagios_munin: distant
nagios_mysql: false
nagios_mariadb_slave: false
nagios_pop3: false
nagios_procs: distant
nagios_enews: false
nagios_ddos: distant
nagios_smtp: distant
nagios_ssh: distant
nagios_users: distant
nagios_xvfb: false
nagios_blacklist: distant
nagios_fail2ban: distant
nagios_tomcat: false
nagios_ul: false
nagios_procs_warning_value: 600
nagios_procs_critical_value: 1200
##
## PROXY SSH : Authorized IP to connect
##
authorized_ips:
```

> 📝 A titre d’exemple, je déploie un nouvelle machine virtuelle en moins de 2h. Ce qui comprend :
> 📝 
> 📝 - la gestion de la déclaration et la propagation des domaines du nouveau serveur
> 📝 - l’installation et la configuration de l’OS
> 📝 - l’installation et la configuration des applications tierces (base de données, JVM, Serveur d’application TOMCAT, serveur HTTPD Apache, serveur de messageries POSTFIX, etc…)
> 📝 - l’intégration du serveur dans la supervision et le monitoring
> 📝 - le déploiement des script de sauvegardes
> 📝 - le déploiement des règles de pare-feu pour contrôler les accès au serveur
> 📝 - la mise en place de Fail2Ban pour bannir les tentatives d’intrusions par attaque brute
> 📝 - la mise en place de la politique de sauvegarde du serveur
> 📝 - … et j’en oublie certainement ?

> ⚠️ Il a certainement des améliorations à faire pour réduire encore le temps de déploiement. Mais je ne déploie pas de nouveau serveur tous les jours et le délai pour la mise en place d’une nouvelle VM est acceptable.

## 5.7. Côté DNS.

Je gère mon propre DNS pour l’ensemble des noms de domaines que j’ai déposé. 

> ℹ️ Actuellement je gère **66 noms de domaines**.

J’ai déclaré chez mon prestataire GANDI, 5 serveurs de noms de domaines :

> Macro (drawio)

> 📝 Avec le système mis en place, je pourrais avoir autant de serveurs de noms de domaines que je veux, répartie un peu par tout à travers le monde.

Pour le déploiement, j’utilise encore un rôle ANSIBLE qui se base sur un fichier de variables propres à chaque nom de domaine. Ci-dessous, un exemple : 

```yaml
---
btobevent.fr:
  name: btobevent.fr
  index: 12
  main_server_name: pterodactylus
  google_site_verification:
  comodo_certificat_authent:
  txt:
  dns:
    - ns1.naostech.com.
    - ns2.naostech.com.
    - ns3.naostech.com.
    - ns4.naostech.com.
    - ns5.naostech.com.
  mx:
  dkim:
  dkim_host:
  spf:
  spf_host:
  dmarc:
  dmarc_host:
  a_record:
    pterodactylus:
      name: pterodactylus
      server_name: pterodactylus
    mail:
      name: mail
      server_name: pterodactylus
  cname_record:
    pterodactylus:
      - www
      - ftp
      - roundcube
```

> 📝 Avant d’avoir ANSIBELISÈ mon déploiement, j’avais un serveur DNS maître et quatre serveurs DNS esclaves. Ce qui me permettait lors de simples modifications, de ne déployer que le serveur maître et les serveurs esclaves se mettaient à jours. Mais avec mon rôle ANSIBLE, j’ai trouvé plus simple de n’avoir que des serveurs maîtres et je déploie les modifications ou les ajouts sur l’ensemble des serveurs.  
> 📝 ***Pour information, le temps d’exécution du playbook de mise à jour des noms de domaines prend 3 à 4 mn environ.***

Le fichier produit en sortie :

```plaintext
; Domain btobevent.fr, configured by ANSIBLE - 26.Sep.2023,17h06
$TTL 600
@     IN SOA ns1.naostech.com. root.btobevent.fr. (
                                2023092612     ; numero de serie (correspond a annee, mois, jour, numero)
                                1H              ; rafraichissement (toutes les heures)
                                15M             ; tentatives (15 minutes)
                                2W              ; expiration (2 semaines)
                                2H              ; minimum time to live (2 heures)
                )
; Tout ce qui arrive sur "btobevent.fr" arrive sur pterodactylus.btobevent.fr
                IN A   xxx.xxx.xxx.xxx

; Les serveurs de noms de btobevent.fr sont
		IN NS ns1.naostech.com.
		IN NS ns2.naostech.com.
		IN NS ns3.naostech.com.
		IN NS ns4.naostech.com.
		IN NS ns5.naostech.com.

; Les passerelles pour le mail sont (preference decroissante)
@                IN MX 10 mail.btobevent.fr.

; sfp record
btobevent.fr.  IN TXT "v=spf1 mx a ip4:xxx.xxx.xxx.xxx ?all"
;btobevent.fr.  IN SPF "v=spf1 mx a ip4:xxx.xxx.xxx.xxx ?all"
pterodactylus.btobevent.fr.  IN TXT "v=spf1 mx a ip4:xxx.xxx.xxx.xxx ?all"
;pterodactylus.btobevent.fr.  IN SPF "v=spf1 mx a ip4:xxx.xxx.xxx.xxx ?all"

; signature DKIM
kaptus._domainkey IN TXT ("v=DKIM1; k=rsa; h=sha256; s=email; p="
"MIICIjXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZ4IB0bq"
"hVVHZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX5duZkUT"
"8QWolOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXRpXT348"
"nTSCUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTMPXOE"
"NloVLTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXpibdzp"
"9gHNmVVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhcw8FWdGsn"
"nq6LXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVCi2AAczcq"
"p6N+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEAAQ=="
)

; opendmarc record
_dmarc.btobevent.fr. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc_report@naostech.com; ruf=mailto:dmarc_report@naostech.com"

; DNS CAA records
@ 	IN 		CAA 		0 		issue 	"comodoca.com"
@		IN    CAA 		0 		issue 	"letsencrypt.org"
@	  IN    CAA    	0 		iodef 	"mailto:dns_caa@naostech.com"


; Serveurs du domaine btobevent.fr
mail                    	IN A		xxx.xxx.xxx.xxx
pterodactylus           	IN A		xxx.xxx.xxx.xxx

www                     	IN CNAME	pterodactylus
ftp                     	IN CNAME	pterodactylus
roundcube               	IN CNAME	pterodactylus
```

> 📝 Le système n’est pas parfait mais fonctionne très bien avec la volumétrie de noms de domaines que je gère. Il est clair qu’avec plus d’une centaine de noms de domaines à gérer, il faudra certainement revoir le processus.

## 5.8. Côté sécurité.

Aujourd’hui la sécurité est une composante importante et non négligeable de toute infrastructure exposée sur le net. 

> ℹ️ Depuis que j’ai installé l’application Fail2Ban, je vois passer des centaines de tentatives d’intrusions chaque jour.

### 5.8.1. Pare-Feu.

Pour notre infrastructure, j’utilise (encore) iptables comme pare-feu. J’ai un rôle ANSIBLE qui me permet de déployer les règles que je définie dans un template [JINJA](https://jinja.palletsprojects.com/en/3.1.x/). La particularité de mes règles est d’avoir :

1. Un fichier qui contient les sous-domaines que je bannie des mes serveurs (***blacklist***)
2. Un fichier qui contient des adresses IPs que je bannie de mes serveurs (***blacklist***)
3. Un fichier qui contient les adresses IPs que j’autorise sur mes serveurs (***whitelist***)

La portion de code que me permet de réaliser cette fonctionnalité :

```plaintext
### Begin Setup our black list ###
# Create a new chain
iptables -N droplist
iptables -N whitelist
#
# Banissement d'adresse IP
#
for ipBanned in `cat {{ hostvars[inventory_hostname]['naos_dir'] }}/archives/firewall/ip_banned.txt`
do
#	ipset test ip_banned $ipBanned &> /dev/null
#	if [[ $? == 0 ]]; then
#		echo "$ipBanned est déjà dans la liste..."
#	else
		ipset add ip_banned $ipBanned
#	fi
done
#
# Whithelist d'adresse IP
#
{% for host in groups['all'] %}
# ipset test ip_whitelisted {{ hostvars[host]['external_ipv4'] }} &> /dev/null
# if [[ $? == 0 ]]; then
#	echo "{{ hostvars[host]['external_ipv4'] }} est déjà dans la liste..."
#else
	ipset add ip_whitelisted {{ hostvars[host]['external_ipv4'] }}
#fi
{% endfor %}
for ipWhite in `cat {{ hostvars[inventory_hostname]['naos_dir'] }}/archives/firewall/ip_whitelisted.txt`
do
#	ipset test ip_whitelisted $ipWhite &> /dev/null
#	if [[ $? == 0 ]]; then
#		echo "$ipWhite est déjà dans la liste..."
#	else
		ipset add ip_whitelisted $ipWhite
#	fi
done
#
# Banissement de sous-reseaux
#
for subnetBanned in `cat {{ hostvars[inventory_hostname]['naos_dir'] }}/archives/firewall/subnet_banned.txt`
do
#	ipset test subnet_banned $subnetBanned &> /dev/null
#	if [[ $? == 0 ]]; then
#		echo "$subnetBanned est déjà dans la liste..."
#	else
		ipset add subnet_banned $subnetBanned
#	fi
done
iptables -A droplist -i {{ hostvars[inventory_hostname]['external_inet'] }} -m set --match-set ip_banned src -j LOG --log-prefix " myBad IP BlockList  "
iptables -A droplist -i {{ hostvars[inventory_hostname]['external_inet'] }} -m set --match-set ip_banned src -j DROP
iptables -A droplist -i {{ hostvars[inventory_hostname]['external_inet'] }} -m set --match-set subnet_banned src -j LOG --log-prefix " myBad IP BlockList  "
iptables -A droplist -i {{ hostvars[inventory_hostname]['external_inet'] }} -m set --match-set subnet_banned src -j DROP
# iptables -A whitelist -i {{ hostvars[inventory_hostname]['external_inet'] }} -m set --match-set ip_whitelisted src -j LOG --log-prefix " myGod IP WhiteList  "
iptables -A whitelist -i {{ hostvars[inventory_hostname]['external_inet'] }} -m set --match-set ip_whitelisted src -j ACCEPT
# Drop it
iptables -I INPUT -j droplist
iptables -I OUTPUT -j droplist
iptables -I FORWARD -j droplist
# Accept it
iptables -I INPUT -j whitelist
iptables -I OUTPUT -j whitelist
iptables -I FORWARD -j whitelist
#
### End Setup our block list ### 
```

> ⚠️ La gestion du bannissement de sous-réseaux et d’adresses IPs est un peu laborieuse car elle n’est pas automatisée. Je récupère les sous-réseaux ou les adresses IPs à bannir des notifications Fail2Ban que je reçois suite à une tentative d’intrusion. **Je ne le fais pas régulièrement** et je n’ai pas encore trouvé d’autres solutions satisfaisantes à ce jour.  
> ⚠️ 9/27/2023 : J’ai **6804 adresses IPs** et **10791 sous-réseaux** dans ma blacklist.

### 5.8.2. Fail2Ban

Pour compléter le pare-feu, je déploie Fail2Ban avec un rôle ANSIBLE, ce qui me permet de définir des règles qui se basent sur les fichiers de logs systèmes et de mes applications ou services. A partir d’un certain nombres d'échecs, l’adresse IP est bannie du serveur.

Voici un exemple de résultat d’adresse IPs bannies sur un serveur :

![image](media://82117267-37ea-4c21-947d-617c9be660b4)

### 5.8.3. Mise à jour.

Un autre aspect important de la sécurité est la mise à jour régulière du système d’exploitation. Cette opération s’effectue aussi avec un rôle ANSIBLE pour ne pas avoir à oublier un serveur. J’ai développé un plugin PROMETHEUS afin d’afficher dans un dashboard GRAFANA la version de l’OS qui tourne sur chaque serveur.

> Macro (drawio)

> 📝 Dés que j’en ai la possibilité, j’upgrade les serveurs vers la dernière version stable de l’OS que j’utilise afin ne me pas avoir de dettes techniques.  
> 📝 9/27/2023 : En ce moment j’ai entamé la migration des serveurs DEBIAN 11 vers DEBIAN 12.

## 5.9. Côté coûts.

Le coût total annuel pour la maintenance de cette infrastructure **est d’environ 42 230.00 € **soit un** coût mensuel de 3520.00 €. **  
La décomposition des coûts est détaillée ci-dessous.

### 5.9.1. Coûts externes.

|  |  |
| --- | --- |
| **Product** | **Cost by Year in €** |
| Basic Server by LINODE | € 60.00 |
| Core-4-M-SATA sd-133615 by SCALEWAY | € 1692.00 |
| Core-4-M-SATA sd-113586 by SCALEWAY | € 1752.00 |
| 32 FailOver IP Adresses by SCALEWAY | € 764.16 |
| AX41 Server by HETZNER | € 672.00 |
| AX41 Server by HETZNER | € 672.00 |
| AX41 Server by HETZNER | € 672.00 |
| BX31 10TB by HETZNER | € 249.60 |
| Enterprise Licence PROXMOX VE 2 CPUs | € 210.00 |
| Enterprise Licence PROXMOX VE 2 CPUs | € 210.00 |
| Enterprise Licence PROXMOX BACKUP SERVER | € 409.00 |
| **Total by year** | **€ 7362.76** |
| **Total by month** | **€ 613.56** |

### 5.9.2. Coûts internes.

Les coûts internes vont être approximatif car mes interventions s'étalent rarement sur des journées mais plutôt sur quelques heures dans la journée (principalement le soir ou le WE).

J'évalue mes interventions sur l’infrastructure à **7 jours/mois**, en considérant un salaire brut annuel **d’un ingénieur système à 60K€** sur **210 jours travaillés**, on obtient :

| **Salaire Brut chargé (45%) en €** | **Coût annuel des interventions** | **Coût mensuel des interventions** |
| --- | --- | --- |
| ***87 000 €*** | ***34 860 €*** | ***2905 €*** |

> ⚠️ J'ai considéré le coût **d’un seul ingénieur système**, parce que je maitrise l’ensemble des technologies que j’ai exposé et que mon implication en tant qu’associé de l’entreprise est (peut-être ?) plus importante que le serait celle d’un salarié. Si vous n’avez pas les ressources en interne, il est préférable de s’attacher **les compétences d’un prestataire** ou **recruter 2 ingénieurs systèmes** ? A vous de choisir.

### 5.9.3. Frais d’installation.

Si vous n’avez pas les ressources en interne pour mettre ce type d’infrastructure en place et que vous souhaitez travailler avec un prestataire externe, il faudra compter une quinzaine de jours de prestations qui se décompose de la manière suivante :

| **Prestation** | **Nb J/H** | **Coût total moyen en € H.T.** |
| --- | --- | --- |
| - Gestion du projet | 2 J/H | **1800 €** |
| - Recueil des besoins
- Réalisation du dossier d’architecture
- Présentation de la solution | 4 J/H | **3600 €** |
| - Location des serveurs
- Configuration de l’infrastructure
- Installation et configuration des serveurs
- Installation et configuration des services
- Réalisation des scripts d’automatisations
- Test de validation de l’installation
- Rédaction du dossier de réalisation
- Formation, transfert de compétences | entre 6 et 12 J/H | **entre 3600 et 7200 € H.T.** |

> ⚠️ Ces tarifs sont données à titre indicatif et seront certainement fonction du prestataire que vous sélectionnerez.

# 6. Pour conclure.

Avec cet article, j’ai souhaité partager mon retour d’expérience concernant la mise en place d'une infrastructure adaptée à une TPE, mais qui peut aisément convenir à une PME. J’ai abordé les technologies principales que j'ai adoptées et que j'utilise actuellement. Si certaines sont essentielles, d'autres sont sujettes à débat et peuvent être reconsidérées. Les technologies évoluent à un rythme effrénées, et il est parfois difficile de rester à jour. Il est essentiel de remettre en question les technologies qui datent un peu, même si elles éprouvées et efficaces. <span style="color: #ff991f">*Si je n’avais pas fait cet exercice, je serai encore aujourd’hui avec mes serveurs EXPRESS 5800 dans une demi-baie chez un hébergeur et je devrais me déplacer régulièrement sur site en cas de pannes matérielles.*</span> L'un des bénéfices majeurs que je retire aujourd'hui est la capacité de travailler à distance, de gérer et de maintenir l'ensemble de mon infrastructure, tant que j'ai accès à Internet. Un autre avantage de la location de serveurs est qu'en cas de défaillance matérielle, il m'est plus aisé et rapide de louer un nouveau serveur et de transférer ma production, plutôt que de rester avec un serveur risquant de nouveau de tomber en panne.

L’infrastructure dont je dispose, est d’une grande souplesse. Elle me permet de mettre en place des serveurs et des services dans des délais assez court. **Seul bémol c’est la partie stockage**. J'étudie actuellement des solutions pour avoir un stockage distribué (CEPH, S3, ZFS, etc…) sans perte de performances. Avec ce type de solutions, mes VMs et les sauvegardes seraient moins volumineuses et les temps de bascule seraient fortement réduits.