Ajustement d'index et ajout ANSIBLE pour la zone PROXY

master
Pierre Coimbra 2020-03-01 17:41:39 +01:00
parent e480ed1a68
commit 0b90d15b4c
No known key found for this signature in database
GPG Key ID: F9C449C78F6FAEE6
9 changed files with 381 additions and 29 deletions

View File

@ -27,11 +27,14 @@ charge de former leur successeurs.
4. [Cluster](proxmox/cluster)
5. [Haute Disponibilitée](#)
6. [Gestion de l'authentification](#)
7. [Sécurisation des container / VM](proxmox/securisation)
3. [Réseau](reseau)
1. [Introduction à OpenvSwitch](reseau/introduction_ovs.md)
2. [Topologie du réseau matériel](reseau/topologie_reseau_physique.md)
3. [Topologie du réseau virtuel](reseau/topologie_reseau_virtuel.md)
4. [Mise en place du réseau](reseau/mise_en_place.md)
2. [Topologie globale du réseau](reseau/topologie_globale.md)
3. [Topologie du réseau matériel](reseau/topologie_reseau_physique.md)
4. [Topologie du réseau virtuel](reseau/topologie_reseau_virtuel.md)
5. [Mise en place du réseau](reseau/mise_en_place.md)
6. [Logique de l'assignation des adresses IP](reseau/logique_ip_ct_vm.md)
4. [Applicatif](applicatif)
1. [Répartition des services dans les zones](applicatif/repartition_en_zones.md)
2. [Zone WAN](applicatif/zone_wan)
@ -39,3 +42,7 @@ charge de former leur successeurs.
4. [Zone Proxy](applicatif/zone_proxy)
5. [Zone Interne](applicatif/zone_interne)
6. [Zone CTF](applicatif/zone_ctf)
5. [Déploiement](deploiement)
1. [Introduction à Ansible](#)
2. [Déploiement via Ansible](deploiement/deploiement_avec_ansible.md)
3. [Notes et conseils](#)

View File

@ -574,7 +574,302 @@ doit retourner une erreur, si on ajout -ZZ à la fin ça doit fonctionner
Voilà pour la mise en place de base du LDAP cependant il faut configuré chaque client pour se connecter au serveur avec STARTTLS.
NB : Il manque la réplication que nous mettrons en place plus tard.
## Réplication de l'annuaire LDAP
Nous allons mettre en place une réplication Master/Master. Lidée est de faire en sorte que nimporte lequel de nos serveurs LDAP soit capable à la fois de lire les données, mais également de les modifier. De plus, nous allons mettre en place une réplication, à la fois sur larbre de données dc=krhacken,dc=org mais également sur larbre de configuration cn=config.
Vous avez déjà fait toute la configuration du premier conteneur LDAP (CT107). Pour gagner du temps clonez ce conteneur vers le conteneur 108 sur l'autre node.
Avant le démarrage il vous faudra reconfigurer les interfaces comme suis :
- eth0 : vmbr1 / VLAN: 30 / IP: 10.0.2.2/24 / GW: 10.0.2.254
- eth1 : vmbr2 / VLAN: 100 / IP: 10.1.0.108/24 / GW: 10.1.0.254
Nous avons désormais deux conteneurs LDAP identique
## Réplication de l'arbre de configuration
### 01-syncprov_act.ldif
```
dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcmoduleload: syncprov.la
olcmodulepath: /usr/lib/ldap
```
```
ldapadd -Y EXTERNAL -H ldapi:/// -f 01-syncprov_act.ldif
```
Vérifications :
```
ldapsearch -LLLY external -H ldapi:/// -b "cn=config" "objectClass=olcModuleList"
ldapsearch -LLLY external -H ldapi:/// -b "cn=module{6},cn=config"
```
### 02-serverid.ldif
X vaut 1 sur Alpha 2 sur Beta.
```
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: X
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 02-serverid.ldif
```
Vérification :
```
ldapsearch -LLLY external -H ldapi:/// -b "cn=config" "objectClass=olcGlobal" olcServerID
```
### 03-replica_account.ldif
```
dn: cn=replica,ou=system,dc=krhacken,dc=org
userPassword: PASS
cn: replica
objectclass: top
objectclass: person
sn: replica
```
```
ldapadd -x -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -y /root/pwdldap -f 03-replica_account.ldif
```
### 04-droit_conf.ldif
Gestion des droits du CN *replica*
```
dn: olcDatabase={0}config,cn=config
changeType: modify
add: olcAccess
olcAccess: to * by dn.exact=cn=replica,ou=system,dc=krhacken,dc=org manage by * break
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 04-droit_conf.ldif
```
### 05-syncprov_conf_conf.ldif
```
dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 05-syncprov_conf_conf.ldif
```
### 06-repl_conf_conf.ldif
```
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=01 provider=ldap://alpha.ldap.krhacken.org
binddn="cn=replica,ou=system,dc=krhacken,dc=org" bindmethod=simple
credentials=password searchbase="cn=config"
type=refreshAndPersist retry="5 5 300 5" timeout=1
olcSyncRepl: rid=02 provider=ldap://beta.ldap.krhacken.org
binddn="cn=replica,ou=system,dc=krhacken,dc=org" bindmethod=simple
credentials=password searchbase="cn=config"
type=refreshAndPersist retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 06-repl_conf_conf.ldif
```
Vérification :
```
ldapsearch -QLLLY external -H ldapi:/// -b "cn=config" "olcDatabase={0}config" olcSyncRepl
```
A partir d'ici l'arbre de configuration cn=config est synchronisé entre les deux conteneurs LDAP. Pour le reste de la configuration il faut faire les manipulations que sur un des deux conteneurs LDAP
## Réplication de l'arbre de données
Nous allons ici mettre en place la synchronisation automatique de l'arbre de données entre les deux conteneurs LDAP.
### 07-acl_replica.ldif
```
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to attrs=userPassword by self write by anonymous auth by dn="cn=writer,ou=system,dc=krhacken,dc=org" write by dn="cn=viewer,ou=system,dc=krhacken,dc=org" read by dn="cn=admin,dc=krhacken,dc=org" write by dn.exact="cn=replica,ou=system,dc=krhacken,dc=org" read by * none
olcAccess: to dn.subtree="dc=krhacken,dc=org" by users read by * none
olcAccess: to * by self write by dn="cn=admin,dc=krhacken,dc=org" write by * read by anonymous none
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 07-acl_replica.ldif
```
Vérification :
```
ldapsearch -QLLLY external -H ldapi:/// -b "cn=config" "olcDatabase={1}mdb" olcAccess
```
### 08-limit.ldif
```
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcLimits
olcLimits: dn.exact="cn=replica,ou=system,dc=krhacken,dc=org" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 08-limit.ldif
```
### 09-index.ldif
```
dn:olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryCSN,entryUUID eq
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 09-index.ldif
```
### 10-syncprov_conf_data.ldif
```
dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 10-syncprov_conf_data.ldif
```
### 11-repl_conf_data.ldif
```
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=01 provider=ldap://alpha.ldap.krhacken.org
binddn="cn=replica,ou=system,dc=krhacken,dc=org"
bindmethod=simple credentials=password
searchbase="dc=krhacken,dc=org"
type=refreshAndPersist retry="5 5 300 5" timeout=1
olcSyncRepl: rid=02 provider=ldap://beta.ldap.krhacken.org
binddn="cn=replica,ou=system,dc=krhacken,dc=org"
bindmethod=simple credentials=password
searchbase="dc=krhacken,dc=org"
type=refreshAndPersist retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
```
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f 11-repl_conf_data.ldif
```
## Configuration des ServerID
A cause de la synchronisation de l'arbre de configuration les ServerID sont les mêmes.
Il faut stoper **slapd** sur les deux conteneurs avec `systemctl stop slapd`
Puis éditer `/etc/ldap/slapd.d/cn\=config.ldif` de la manière suivante
- Alpha -> `olcServerID: 1`
- Beta -> `olcServerID: 2`
On peut maintenant relancer slapd sur les deux conterneurs avec `systemctl start slapd`
Maintenant la commande ci-dessous donne un ID différent selon le conteneur.
```
ldapsearch -x -LLL -H ldap://localhost -D cn=admin,dc=krhacken,dc=org -w passadmin -b cn=config "objectClass=olcGlobal"
```
## Accès via une IP virtuelle
Comme pour HAProxy nous allons utiliser keepalived pour avoir une IP virtuelle que se déplace entre les deux conteneurs en fonction de la disponibilité de l'annuaire LDAP.
```
apt-get install -y keepalived
```
### Script pour vérifier l'état des conteneurs LDAP
Créer, sur les deux serveurs, le script `/etc/keepalived/test_ldap.sh`
Il faut spécifier le mot de passe du compte viewer.
```
#!/bin/bash
ldapsearch -x -H ldap://$1 -D cn=viewer,ou=system,dc=krhacken,dc=org -w passview -b dc=krhacken,dc=org -l 3 > /dev/null 2>&1
ldapresponse=$?
if [ "$ldapresponse" -gt 0 ]; then
echo "down"
exit 1
else
echo "up"
fi
exit 0
```
```
chmod /etc/keepalived/test_ldap.sh +x
```
## Configuration de keepalived
### Configuration sur Alpha
#### /etc/keepalived/keepalived.conf
```
vrrp_script check_server_health {
script "/etc/keepalived/test_ldap.sh 10.0.2.1" (mettre l'ip réel de votre serveur)
interval 2
fall 2
rise 2
}
vrrp_instance VI_LDAP {
interface eth0
state MASTER
virtual_router_id 50
priority 101 # 101 on master, 100 on backup
virtual_ipaddress {
10.0.2.3
}
track_script {
check_server_health
}
}
```
```
systemctl restart keepalived
```
authentication {
auth_type PASS
auth_pass MON_MOT_DE_PASSE_SECRET
}
### Configuration sur Beta
#### /etc/keepalived/keepalived.conf
```
vrrp_script check_server_health {
script "/etc/keepalived/test_ldap.sh 10.0.2.2" (mettre l'ip réel de votre serveur)
interval 2
fall 2
rise 2
}
vrrp_instance VI_LDAP {
interface eth0
state MASTER
virtual_router_id 50
priority 101 # 101 on master, 100 on backup
virtual_ipaddress {
10.0.2.3
}
track_script {
check_server_health
}
}
```
```
systemctl restart keepalived
```
Un des deux conteneur est maintenant accessible à l'adresse 10.0.2.3. Les requêtes se feront sur cette adresse.
## Configuration des futurs client LDAP
Sur tout les futurs client LDAP il faudra activer la connexion SSL.

View File

@ -2,6 +2,7 @@
Vous trouverez ici toute la documentation relative au déploiement via Ansible ainsi que des notes et des conseils issue des précédents déploiement.
# Table des matières
1. [Introduction à Ansible](#)
1. [Déploiement via Ansible](deploiement_avec_ansible.md)
2. [Déploiement via Ansible](deploiement_avec_ansible.md)
3. [Notes et conseils](#)

View File

@ -1,11 +1,11 @@
# Ansible
Nous allons utilisé Ansible pour la création et la configuration de base (mise à jours, proxy...) de tout les container.
Nous allons utilisé Ansible pour la création et la configuration de base (mise à jours, proxy...) de tout les conteneurs.
## Création du container Ansible
Avant de lancer la création et l'installation de tout les container il vous faut mettre en place le réseau et les pare-feux ainsi au minimum l'interface admin sur le pare-feu (avec ip virtuelle en .254).
## Création du conteneur Ansible
Avant de lancer la création et l'installation de tout les conteneurs il vous faut mettre en place le réseau et les pare-feux ainsi au minimum l'interface admin sur le pare-feu (avec ip virtuelle en .254).
Une fois que c'est fait, créer un container Ansible avec un numéro élevée (253 max).
Une fois que c'est fait, créer un conteneur Ansible avec un numéro élevée (253 max).
### Réseau
Au niveau des interfaces réseau, une sur la partie admin, l'autre sur le zone proxy pour l'accès au futur proxy interne.
@ -14,15 +14,15 @@ Au niveau des interfaces réseau, une sur la partie admin, l'autre sur le zone p
- eth1 : vmbr1 VLAN: 20 IP:10.0.1.200/24 GW:10.0.1.254
### Configuration initiale
Vous allez générer une clé ed25519 qui servira à l'administation des container.
Vous allez générer une clé ed25519 qui servira à l'administation des conteneurs.
```
ssh-keygen -o -a 100 -t ed25519 -f /root/.ssh/id_ed25519
```
Avant d'installer Ansible, il faut que vous mettiez en place (vous-même) le container du proxy interne. C'est le seul container, avec celui d'Ansible, que vous aurez à créer.
Avant d'installer Ansible, il faut que vous mettiez en place (vous-même) le conteneur du proxy interne. C'est le seul conteneur, avec celui d'Ansible, que vous aurez à créer.
### Connexion au proxy
On doit connecter le container au proxy pour qu'il puisse utiliser wget et apt.
On doit connecter le conteneur au proxy pour qu'il puisse utiliser wget et apt.
#### /root/.wgetrc
```
@ -46,13 +46,13 @@ apt-get install -y ansible python python3-proxmoxer
```
Il faut maintenant remplacer `/usr/lib/python3/dist-packages/ansible/modules/cloud/misc/proxmox.py` par le fichier proxmox.py qui est dans le même dossier.
Maintenant que Ansible est en place, on va pouvoir installer tous les container nécessaires. L'installation va se faire par zone, en commençant par la zone DMZ.
Maintenant que Ansible est en place, on va pouvoir installer tous les conteneurs nécessaires. L'installation va se faire par zone, en commençant par la zone DMZ.
Pour la création des container, nous allons utiliser la librairie python `proxmoxer` qui s'exécute en local. Pour toutes les autres tâches, Ansible se connectera via SSH au container. Pour savoir sur quel container exécuter son playbook, Ansible utilise un inventaire trouvable dans `/etc/ansible/hosts`.
Pour la création des conteneurs, nous allons utiliser la librairie python `proxmoxer` qui s'exécute en local. Pour toutes les autres tâches, Ansible se connectera via SSH au conteneur. Pour savoir sur quel conteneur exécuter son playbook, Ansible utilise un inventaire trouvable dans `/etc/ansible/hosts`.
Pour notre usage, nous allons faire des groupes pour chaque type de container et un groupe pour chaque zone.
Pour notre usage, nous allons faire des groupes pour chaque type de conteneur et un groupe pour chaque zone.
Il vous faut mettre le mot de passe root de proxmox et la clé publique du container Ansible dans un fichier à l'adresse `/root/src/source_pve.yml` et restreindre la lecture `chmod 640 /root/src/source_pve.yml`.
Il vous faut mettre le mot de passe root de proxmox et la clé publique du conteneur Ansible dans un fichier à l'adresse `/root/src/source_pve.yml` et restreindre la lecture `chmod 640 /root/src/source_pve.yml`.
Structure du fichier source_pve.yml :
```
@ -60,7 +60,7 @@ pass_pve:
ssh_pub:
```
Par exemple, il y aura un groupe HAProxy regroupant tous les container HAProxy et un groupe DMZ regroupant tous les groupes de container DMZ.
Par exemple, il y aura un groupe HAProxy regroupant tous les conteneurs HAProxy et un groupe DMZ regroupant tous les groupes de conteneurs DMZ.
## Zone DMZ
@ -94,14 +94,62 @@ pass_hasync_same:
pass_dns:
```
### Templace Ferm pour les container
### Templace Ferm et scripts pour les conteneurs
Le playbook Ansible s'occupe aussi de la mise en place d'un pare-feu. Une template a été réalisée pour la sécurisation des container avec ferm. Le détail de cette template est dans proxmox/securisation/template_ferm.md
Le playbook Ansible s'occupe aussi de la mise en place d'un pare-feu. Une template a été réalisée pour la sécurisation des conteneurs avec ferm. Le détail de cette template est dans `proxmox/securisation/template_ferm.md`
Il vous faut mettre dans `/root/src/ferm/` les deux fichiers de configuration fournis (haproxy_ferm.conf & dns_ferm.conf)
Il vous faut mettre dans `/root/src/ferm/` les fichiers de configuration qui sont dans `sources/zone_dmz`
Une fois que tout est fait, vous trouverez le playbook sous le nom de `ct_dmz.yml` dans le dossier zone_dmz.
Lancez le avec `ansible-playbook ct_dmz.yml`.
Lancez le avec
```
ansible-playbook ct_dmz.yml
```
Normalement tout est prêt, vous pouvez passer à la configuration des services de la zone DMZ.
Normalement tout est prêt, vous pouvez passer à la configuration des services.
## Zone PROXY
Comme pour la zone DMZ un playbook Ansible est disponible pour l'installation et la sécurisation de base des conteneurs de base de la zone PROXY. Cela comprend les deux reverse proxy Nginx et la mail gateway.
Voici les tâches à réaliser avant de lancer le playbook.
### /etc/ansible/hosts
Ajoutez
```
[nginx]
10.1.0.104 #Reverse Alpha
10.1.0.105 #Reverse Beta
[mailgw]
10.1.0.109 #Mail Gateway
[zoneproxy:children]
nginx
mailgw
```
Pour les mots de passe à vous de les générer, il vous faut ensuite les mettre dans ce fichier.
### /root/src/password_proxy.yml
```
pass_nginx_alpha:
pass_nginx_beta:
pass_mailgw:
```
### Templace Ferm pour les conteneurs
Le playbook Ansible s'occupe aussi de la mise en place d'un pare-feu. Une template a été réalisée pour la sécurisation des conteneurs avec ferm. Le détail de cette template est dans `proxmox/securisation/template_ferm.md`
Il vous faut mettre dans `/root/src/ferm/` les fichiers de configuration qui sont dans `sources/zone_proxy`
Une fois que tout est fait, vous trouverez le playbook sous le nom de `ct_proxy.yml` dans le dossier zone_proxy.
Lancez le avec
```
ansible-playbook ct_proxy.yml
```
Normalement tout est prêt, vous pouvez passer à la configuration des services.

View File

@ -8,4 +8,4 @@ Vous trouverez ici toute la documentation relative au déploiement de Proxmox.
4. [Cluster](cluster)
5. [Haute Disponibilité](#)
6. [Gestion de l'authentification](#)
7. [Sécurisation des container / VM](securisarion)
7. [Sécurisation des container / VM](securisation)

View File

@ -3,7 +3,8 @@ Vous trouverez ici toute la documentation relative à l'infrastructure réseau.
# Table des matières
1. [Introduction à OpenvSwitch](introduction_ovs.md)
2. [Topologie du réseau matériel](topologie_reseau_physique.md)
3. [Topologie du réseau virtuel](topologie_reseau_virtuel.md)
4. [Mise en place du réseau](mise_en_place.md)
5. [Logique de l'assignation des adresses IP](logique_ip_ct_vm.md)
2. [Topologie globale du réseau](topologie_globale.md)
3. [Topologie du réseau matériel](topologie_reseau_physique.md)
4. [Topologie du réseau virtuel](topologie_reseau_virtuel.md)
5. [Mise en place du réseau](mise_en_place.md)
6. [Logique de l'assignation des adresses IP](logique_ip_ct_vm.md)

View File

@ -146,7 +146,7 @@ iface eth2 inet manual
iface eth3 inet manual
# WAN
# WAN
allow-vmbr0 wan
iface lan inet static
address X.X.X.X
@ -246,7 +246,7 @@ iface eth2 inet manual
iface eth3 inet manual
# WAN
# WAN
allow-vmbr0 wan
iface lan inet static
address X.X.X.X