Transport Security Layer

  • Fournisseur de certificat: Nameshield
  • Autorité de certification: Digicert
  • Application utilisées: Apache httpd, Cassandra, MySQL, Kafka
  • Prérequis: Installation d’Ansible, des applications utilisées, avoir un certificat autosigné.

Partie Apache HTTPD

Créer votre certificat autosigné si vous voulez faire des tests avec du TLS:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
root@igraal:~/tls openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 -keyout private.key -out certificate.crt
Generating a RSA private key
.........................................................................................................++++
.................................................................................................................................................++++
writing new private key to 'private.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Ile-de-France
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Company
Organizational Unit Name (eg, section) []:DevOps
Common Name (e.g. server FQDN or YOUR name) []:company.net
Email Address []:

Cela vous génèrera une clé privée et un certificat public:

1
2
root@igraal:~/tls ls
certificate.crt  private.key

Voici l’arborescence de notre dossier deployment qui contiendra:

  1. Le dossier files qui contiendra le certificat publique, notre clé privée (chiffrée), une fullchain (concaténation certif publique + CA), un pkcs12 (contient fullchain et clé privée)
  2. Le dossier inventories qui contiendra l’inventaire de plusieurs environnements (variables à surcharger + fichier hosts), ici on utilisera dev.
  3. Le dossier roles qui contiendra nos différents rôles Ansible : Apache httpd, MySQL, Kafka, Cassandra
  4. Nos playbooks qui serviront à orchestrer les rôles respectifs.

png

  • Déroulement du dossier files:

png

  • Déroulement du dossier inventories:

png

  • Déroulement du dossier roles:

png

  • Déroulement du rôle Apache:

png

Nous partirons du principe que Apache httpd ait déjà été installé au préalable par un playbook Ansible.

Prenons également en compte ces variables qu’on aura attribué en amont dans ce fichier inventories/dev/group_vars/webserver/vhost.yaml:

Note: Nous prendrons l’exemple d’un certificat commandé par un réél fournisseur qui dispose d’une autorité de certification connue

1
2
3
4
5
6
7
8
9
---

httpd_vhosts:
  - vhost: web-server.dev.company.net
    balancer: web-server
    backend: http://web-server.intern
    tls_cert_file: "{{ tls_wildcard_cert_file }}"
    tls_cert_key_file: "{{ tls_wildcard_cert_key_file }}"
    tls_cert_ca_file: "{{ tls_wildcard_cert_ca_file }}"

Voici le main.yml qui incluera le fichier vhost.yaml. Il créé ensuite le dossier de log httpd et recharge le service.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
---

- include: vhost.yaml
  with_items:
    - "{{ httpd_vhosts }}"

- name: "création du dossier {{ httpd_log_dir }}"
  file:
    path: "{{ httpd_log_dir }}"
    owner: "{{ httpd_user }}"
    group: "{{ httpd_group }}"
    state: directory

- name: recharge le service httpd
  service:
    name: httpd
    state: reloaded

Voici la partie “vhost” qui va configurer les virtual hosts puis ajouter le certificat TLS, la clé privée et l’autorité de certification:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
---

- set_fact:
    httpd_vhost: "{{ item }}"

- debug:
    msg: "Configuration du vhost : {{ httpd_vhost.vhost }}"

- name: "Copie le fichier de conf https dans le répertoire {{ httpd_config_dir }}"
  template:
    src: proxy-ssl.conf
    dest: "{{ httpd_config_dir }}/{{ httpd_vhost.vhost }}-ssl.conf"

- name: "Copie le fichier redirection http vers https dans le répertoire {{ httpd_config_dir }}"
  template:
    src: proxy.conf
    dest: "{{ httpd_config_dir }}/{{ httpd_vhost.vhost }}.conf"

- name: "Copie le certificat dans le répertoire {{ httpd_tls_dir }}"
  copy:
    src: "{{ httpd_vhost.tls_cert_file }}"
    dest: "{{ httpd_tls_dir }}/{{ httpd_vhost.tls_cert_file }}"
    owner: root
    group: root
    mode: 0644

- name: "Copie la clé privée du certificat dans le répertoire {{ httpd_tls_dir }}"
  copy:
    src: "{{ httpd_vhost.tls_cert_key_file }}"
    dest: "{{ httpd_tls_dir }}/{{ httpd_vhost.tls_cert_key_file }}"
    owner: root
    group: root
    mode: 0644

- name: "Copie la CA dans le répertoire {{ httpd_tls_dir }}"
  copy:
    src: "{{ httpd_vhost.tls_cert_ca_file }}"
    dest: "{{ httpd_tls_dir }}/{{ httpd_vhost.tls_cert_ca_file }}"
    owner: root
    group: root
    mode: 0644

Description du code:

  • On fait référence aux variables de notre inventaire inventories/dev/group_vars/webserver/vhost.yaml via le httpd_vhost qui fait référence à la variable httpd_vhosts dans le main.yml.
  • On copie les fichiers de configurations : redirection http vers https et redirection https vers backend http (conteneur sur Openshift par exemple).
  • On copie le certificat public, la clé privée et l’autorité de certification

On vérifiera par la suite si la redirection https se fait correctement et que le SSL handshake peut s’établir.