diff --git a/acme.yaml b/acme.yaml index 218a35f47971bc6983c345161d93ba4523bc746c..fe3106cb19c2805855e0475a2f2b1c21431417d0 100644 --- a/acme.yaml +++ b/acme.yaml @@ -13,4 +13,4 @@ spec: http01: ingress: ingressClassName: nginx - \ No newline at end of file + \ No newline at end of file diff --git a/atelier_secu.md b/atelier_secu.md index cccc8e1d1d20182508c07a02ecb59a6f469b3325..2e7ac28e8199d7e82cd80ebf0bbf0f62f4162bfc 100644 --- a/atelier_secu.md +++ b/atelier_secu.md @@ -88,7 +88,7 @@ chmod +x jq - https://developer.hashicorp.com/vault/tutorials/secrets-management/pki-engine?variants=vault-deploy%3Aselfhosted -#### Root CA : +#### 1. Création du CA racine: Commandes : @@ -104,40 +104,278 @@ vault write pki/config/urls issuing_certificates="$VAULT_ADDR/v1/pki/ca" \ crl_d → TTL de 2 semaine ( pour tester le bridge CA ) → Rôle permissif au niveau des noms (a changer ?) -#### Intermediate CA : +#### 2. Création du CA intermédiaire : Commandes : ``` vault secrets enable -path=pki_int pki vault secrets tune -max-lease-ttl=240h pki_int +vault write -format=json pki_int/intermediate/generate/internal \ + common_name="chepia.ch Intermediate Authority" \ + issuer_name="chepia-dot-ch-intermediate" \ + | jq -r '.data.csr' > pki_intermediate.csr +vault write -format=json pki/root/sign-intermediate \ + issuer_ref="root" \ + csr=@pki_intermediate.csr \ + format=pem_bundle ttl="240h" \ + | jq -r '.data.certificate' > intermediate.cert.pem +vault write pki_int/intermediate/set-signed certificate=@intermediate.cert.pem ``` → TTL 10 jours -- **ADD GUI STEPS** +#### 3. Création du rôle : -#### Create a role : +- Un rôle définit une politique d'accès au certificats intermédiaire : Le domaine doit être `chepia.ch` ou un sous domaine comme `www.chepia.ch`, et le temps de vie maximum est de 120 heures. -- **ADD GUI STEPS** +Commandes : + +``` + vault write pki_int/roles/chepia-dot-ch \ + issuer_ref="$(vault read -field=default pki_int/config/issuers)" \ + allowed_domains="chepia.ch" \ + allow_subdomains=true \ + max_ttl="120h" +``` -#### Request certificates +#### 4. Demander un certificat : + +Commande : + +``` +vault write pki_int/issue/chepia-dot-ch common_name="test.chepia.ch" ttl="24h" +``` -- **ADD GUI STEPS** +→ Crée un certificat valide 24 heures pour le nom de domaine "test.chepia.ch" ### Configurer cert-manager - https://developer.hashicorp.com/vault/tutorials/kubernetes/kubernetes-cert-manager -### Delete expired certs +#### 1. Activation de cert-manager : + +- `microk8s enable cert-manager` + +#### 2. Configurer l'accès entre Vault et Kubernetes + +```bash +kubectl exec --stdin=true --tty=true vault-0 -- /bin/sh +vault auth enable kubernetes +write auth/kubernetes/config \ + kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" +``` + +→ La variable globale `$KUBERNETES_PORT_443_TCP_ADDR`est à modifier selon votre configuration. L'adresse utilisée par le service principal de Kubernetes peut être consultée avec la commande `microk8s kubectl get services | grep kubernetes`. Dans mon cas, Kubernetes utilise l'adresse 10.152.183.1. + +#### 3. Configurer l'émetteur de certificats +1. Créer une identité pour communiquer avec l'émetteur. C'est avec cette identité que cert-manager utilisera pour accéder au rôle créé à l'étape précédente : \newline + `kubectl create serviceaccount issuer` +2. Créer un secret que l'identité `issuer` utilisera pour s'authentifier : + +- On crée pour cela le fichier `issuer-secret.yaml`: + +``` +apiVersion: v1 +kind: Secret +metadata: + name: issuer-token-lmzpj + annotations: + kubernetes.io/service-account.name: issuer +type: kubernetes.io/service-account-token +``` + +- Appliquer la config avec la commande `microk8s kubectl apply -f issuer-secret.yaml`. + +3. Créer le ficher de configuration de l'émetteur `vault-issuer.yaml`: + +```yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: vault-issuer + namespace: default +spec: + vault: + server: http://vault.default:8200 + path: pki_int/sign/chepia-dot-ch + auth: + kubernetes: + mountPath: /v1/auth/kubernetes + role: issuer + secretRef: + name: issuer-token-lmzpj + key: token +``` + +- Appliquer la config avec la commande `microk8s kubectl apply -f vault-issuer.yaml`. + + + +### Mise en place de TLS sur un service + +#### 1. Création du service + +- Nous allons utiliser un simple serveur web Nginx pour représenter la page d'accueil de notre entreprise : + +1. Créer le fichier de config de la page d'accueil : + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-configmap + namespace: default +data: + index.html: | + <html> + <h1> Bienvenue sur l'intranet de CHEPIA </h1> + <h3> Certificats gratos !! </h3> + </html> +``` + +2. Créer le fichier de config du serveur : + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx + labels: + app: nginx +spec: + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 + volumeMounts: + - name: nginx-index + mountPath: /usr/share/nginx/index.html + subPath: index.html + volumes: + - name: nginx-index + configMap: + name: nginx-configmap +``` + +3. Appliquer les configs : `microk8s kubectl apply -f nginx-configmap.yaml`, `microk8s kubectl apply -f nginx.yaml` + + +#### 2. Création du certificat du service : + +- Création du fichier `cert.yaml` : + +```yaml +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: chepia-cert + namespace: default +spec: + issuerRef: + name: vault-issuer + commonName: www.chepia.ch + secretName: chepia-cert + dnsNames: + - www.chepia.ch +``` + +- Appliquer la config avec la commande `microk8s kubectl apply -f cert.yaml` + +#### 3. Configuration de l'accès au service + +- Créer le fichier `nginx-service.yaml`: + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: nginx +spec: + ports: + - port: 80 + targetPort: 80 + protocol: TCP + selector: + app: nginx +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: nginx +spec: + ingressClassName: nginx + tls: + - hosts: + - www.chepia.ch + secretName: chepia-cert + rules: + - host: www.chepia.ch + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: nginx + port: + number: 80 +``` + +- Appliquer la config avec la commande `microk8s kubectl apply -f nginx-service.yaml` + +#### 4. Test de l'accès au service + +Pour pouvoir accéder à notre service de manière sécurisée, il faut le faire par son nom de domaine, car c'est à celui-ci qu'est relié le certificat créé précédemment. Pour cela, on va ajouter la ligne suivante au fichier `/etc/hosts`: +`127.0.0.1 www.chepia.ch` + +Ensuite, on peut tester la connexion TLS avec la commande : +` curl -kivL 'https://www.chepia.ch'` + + + +On peut voir que le certificat du serveur est bien émit par notre autorité de certification intermédiaire. Par contre +la ligne `SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.` indique que notre CA n'a pas été reconnu. C'est normal, car on a pas encore ajouté le certificat racine de notre autorité à la liste des CA reconnu par notre système d'exploitation. Si on essaye d'accéder à notre service avec un navigateur web, on va rencontrer l'avertissement suivant : + + + +Pour remédier à cela, on va chercher le certificat de notre autorité intermédiaire dans l'interface graphique de Vault. + + + +Ensuite, on crée un sous-répertoire `chepia.ch` dans le répertoire `/usr/local/share/ca-certificates`: +`sudo mkdir /usr/local/share/ca-certificates/chepia.ch` +On place le certificat dans le répertoire et on met à jour la liste des CAs reconnus avec `sudo update-ca-certificates`. + +Il faut aussi ajouter le certificat à la liste des CAs de confiance de votre navigateur. Pour cela, allez dans *préférences*, *Vie privée et sécurité*, *Certificats* et cliquer sur *Afficher les certificats* puis *Importer*. +Une fois le certificat importé, on retrouve notre autorité dans la liste des CAs de confiance. + + + +Si on retourne sur *www.chepia.ch*, l'alerte a disparu. + + + +### Mise à jour des certificats + +#### 1. Suppression des certificats expirés ``` vault write pki_int/tidy tidy_cert_store=true tidy_revoked_certs=true ``` -### Root certificate rotation +#### 2. Rotation du certificat racine ``` vault write pki/root/rotate/internal \ @@ -150,7 +388,9 @@ vault write pki/roles/chepia-servers allow_any_name=true ``` -#### Root bridge +#### 3. Création d'un pont entre le nouveau certificat racine et l'ancien + +Cette étape permet aux services qui n'ont pas communiqué avec le CA depuis longtemps et doivent mettre à jour leur certificat racine. Le pont permet à ses service de faire confiance à notre nouveau certificat racine. ``` cd vault @@ -172,13 +412,13 @@ vault write pki/roles/chepia-servers allow_any_name=true ``` -#### Set default issuer +#### 4. Remplacer l'émetteur par défaut ``` vault write pki/root/replace default=root-2 ``` -### cross-sign intermediate +#### 5. Signer l'autorité intermédiaire avec notre nouveau certificat racine ```bash cd vault @@ -272,59 +512,6 @@ spec: \- www.chepia.ch ``` -### Expose https service -- Nous allons utiliser un simple serveur web Nginx pour représenter la page d'accueil de l'intranet de notre entreprise : - -1. Créer le fichier de config de la page d'accueil : - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: nginx-configmap - namespace: default -data: - index.html: | - <html> - <h1> Bienvenue sur l'intranet de CHEPIA </h1> - <h3> Certificats gratos !! </h3> - </html> -``` - -2. Créer le fichier de config du serveur : - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-configmap - labels: - app: nginx -spec: - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:latest - ports: - - containerPort: 80 - volumeMounts: - - name: nginx-index - mountPath: /usr/share/nginx/index.html - subPath: index.html - volumes: - - name: nginx-index - configMap: - name: nginx-configmap -``` - -3. Appliquer les configs : `microk8s kubectl apply -f nginx-configmap.yaml`, `microk8s kubectl apply -f nginx.yaml` https://cert-manager.io/docs/usage/ingress/ \ No newline at end of file diff --git a/cert.yaml b/cert.yaml index 7c25c91d4bf573e21bc3674bb2463ac397db820a..6286d8a0586077e307e212dfcc7301a736761783 100644 --- a/cert.yaml +++ b/cert.yaml @@ -5,8 +5,8 @@ metadata: namespace: default spec: issuerRef: - name: chepia-ch - kind: ClusterIssuer + name: vault-issuer + commonName: www.chepia.ch secretName: chepia-cert dnsNames: - www.chepia.ch \ No newline at end of file diff --git a/images/auth_unknown.png b/images/auth_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c94120b90e897aeb9f3481d9b49df3d20990f7 Binary files /dev/null and b/images/auth_unknown.png differ diff --git a/images/cert_gui.png b/images/cert_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..27dfefa526f52acead677a051b888b34799fc6ee Binary files /dev/null and b/images/cert_gui.png differ diff --git a/images/chrome_certs.png b/images/chrome_certs.png new file mode 100644 index 0000000000000000000000000000000000000000..a5db309f5bdc4886b0ead96bd464adf75b6f264d Binary files /dev/null and b/images/chrome_certs.png differ diff --git a/images/curl.png b/images/curl.png new file mode 100644 index 0000000000000000000000000000000000000000..50066dfd2829faaf7f37f47a8cb2451c5ee7c495 Binary files /dev/null and b/images/curl.png differ diff --git a/images/lock.png b/images/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..4a85bcfdea467b82ae30f37230bae42b36f25253 Binary files /dev/null and b/images/lock.png differ diff --git a/nginx-service.yaml b/nginx-service.yaml index 1bdaa7f5851ce15c0d9d9be90bea9b9295120b0e..5ac155cf069852375604c8cf06b4bc70bd5b4e80 100644 --- a/nginx-service.yaml +++ b/nginx-service.yaml @@ -4,7 +4,7 @@ metadata: name: nginx spec: ports: - - port: 443 + - port: 80 targetPort: 80 protocol: TCP selector: @@ -14,16 +14,15 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx - annotations: - cert-manager.io/cluster-issuer: chepia-ch spec: ingressClassName: nginx tls: - hosts: - - chepia.ch - secretName: tls-secret + - www.chepia.ch + secretName: chepia-cert rules: - - http: + - host: www.chepia.ch + http: paths: - path: / pathType: Prefix