Merge branch '19215-installer' refs #19215
[arvados.git] / tools / salt-install / config_examples / single_host / multiple_hostnames / states / snakeoil_certs.sls
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: Apache-2.0
4
5 # WARNING: This file is only used for testing purposes, and should not be used
6 # in a production environment
7
8 {%- set curr_tpldir = tpldir %}
9 {%- set tpldir = 'arvados' %}
10 {%- from "arvados/map.jinja" import arvados with context %}
11 {%- set tpldir = curr_tpldir %}
12
13 {%- set orig_cert_dir = salt['pillar.get']('extra_custom_certs_dir', '/srv/salt/certs')  %}
14
15 include:
16   - nginx.passenger
17   - nginx.config
18   - nginx.service
19
20 # Debian uses different dirs for certs and keys, but being a Snake Oil example,
21 # we'll keep it simple here.
22 {%- set arvados_ca_cert_file = '/etc/ssl/private/arvados-snakeoil-ca.pem' %}
23 {%- set arvados_ca_key_file = '/etc/ssl/private/arvados-snakeoil-ca.key' %}
24
25 {%- if grains.get('os_family') == 'Debian' %}
26   {%- set arvados_ca_cert_dest = '/usr/local/share/ca-certificates/arvados-snakeoil-ca.crt' %}
27   {%- set update_ca_cert = '/usr/sbin/update-ca-certificates' %}
28   {%- set openssl_conf = '/etc/ssl/openssl.cnf' %}
29
30 extra_snakeoil_certs_ssl_cert_pkg_installed:
31   pkg.installed:
32     - name: ssl-cert
33     - require_in:
34       - sls: postgres
35
36 {%- else %}
37   {%- set arvados_ca_cert_dest = '/etc/pki/ca-trust/source/anchors/arvados-snakeoil-ca.pem' %}
38   {%- set update_ca_cert = '/usr/bin/update-ca-trust' %}
39   {%- set openssl_conf = '/etc/pki/tls/openssl.cnf' %}
40
41 {%- endif %}
42
43 extra_snakeoil_certs_dependencies_pkg_installed:
44   pkg.installed:
45     - pkgs:
46       - openssl
47       - ca-certificates
48
49 # Remove the RANDFILE parameter in openssl.cnf as it makes openssl fail in Ubuntu 18.04
50 # Saving and restoring the rng state is not necessary anymore in the openssl 1.1.1
51 # random generator, cf
52 #   https://github.com/openssl/openssl/issues/7754
53 #
54 extra_snakeoil_certs_file_comment_etc_openssl_conf:
55   file.comment:
56     - name: /etc/ssl/openssl.cnf
57     - regex: ^RANDFILE.*
58     - onlyif: grep -q ^RANDFILE /etc/ssl/openssl.cnf
59     - require_in:
60       - cmd: extra_snakeoil_certs_arvados_snakeoil_ca_cmd_run
61
62 extra_snakeoil_certs_arvados_snakeoil_ca_cmd_run:
63   # Taken from https://github.com/arvados/arvados/blob/master/tools/arvbox/lib/arvbox/docker/service/certificate/run
64   cmd.run:
65     - name: |
66         # These dirs are not to CentOS-ish, but this is a helper script
67         # and they should be enough
68         /bin/bash -c "mkdir -p /etc/ssl/certs/ /etc/ssl/private/ && \
69         openssl req \
70           -new \
71           -nodes \
72           -sha256 \
73           -x509 \
74           -subj \"/C=CC/ST=Some State/O=Arvados Formula/OU=arvados-formula/CN=snakeoil-ca-{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}\" \
75           -extensions x509_ext \
76           -config <(cat {{ openssl_conf }} \
77                   <(printf \"\n[x509_ext]\nbasicConstraints=critical,CA:true,pathlen:0\nkeyUsage=critical,keyCertSign,cRLSign\")) \
78           -out {{ arvados_ca_cert_file }} \
79           -keyout {{ arvados_ca_key_file }} \
80           -days 365 && \
81         cp {{ arvados_ca_cert_file }} {{ arvados_ca_cert_dest }} && \
82         {{ update_ca_cert }}"
83     - unless:
84       - test -f {{ arvados_ca_cert_file }}
85       - openssl verify -CAfile {{ arvados_ca_cert_file }} {{ arvados_ca_cert_file }}
86     - require:
87       - pkg: extra_snakeoil_certs_dependencies_pkg_installed
88
89 # Create independent certs for each vhost
90 {%- for vh in [
91   'collections',
92   'controller',
93   'download',
94   'keepproxy',
95   'webshell',
96   'workbench',
97   'workbench2',
98   'websocket',
99   ]
100 %}
101 # We're creating these in a tmp directory, so they're copied to their destination
102 # with the `custom_certs` state file, as if using custom certificates.
103 {%- set arvados_cert_file = orig_cert_dir ~ '/arvados-' ~ vh ~ '.pem' %}
104 {%- set arvados_csr_file = orig_cert_dir ~ '/arvados-' ~ vh ~ '.csr' %}
105 {%- set arvados_key_file = orig_cert_dir ~ '/arvados-' ~ vh ~ '.key' %}
106
107 extra_snakeoil_certs_arvados_snakeoil_cert_{{ vh }}_cmd_run:
108   cmd.run:
109     - name: |
110         cat > /tmp/{{ vh }}.openssl.cnf <<-CNF
111         [req]
112         default_bits = 2048
113         prompt = no
114         default_md = sha256
115         distinguished_name = dn
116         req_extensions = rext
117         [rext]
118         subjectAltName = @alt_names
119         [dn]
120         C   = CC
121         ST  = Some State
122         L   = Some Location
123         O   = Arvados Provision Example Single Host / Multiple Hostnames
124         OU  = arvados-provision-example-single_host_multiple_hostnames
125         CN  = {{ vh }}.{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
126         emailAddress = admin@{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
127         [alt_names]
128         {%- for entry in grains.get('ipv4') %}
129         IP.{{ loop.index }} = {{ entry }}
130         {%- endfor %}
131         DNS.1 = {{ vh }}.{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
132         {%- if vh in [
133           'controller',
134           'keepproxy',
135           'websocket'
136           ]
137         %}
138           {%- if vh == 'controller' %}
139         DNS.2 = {{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
140           {%- elif vh == 'keepproxy' %}
141         DNS.2 = keep.{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
142           {%- elif vh == 'websocket' %}
143         DNS.2 = ws.{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
144           {%- endif %}
145         {%- endif %}
146         CNF
147
148         # The req
149         openssl req \
150           -config /tmp/{{ vh }}.openssl.cnf \
151           -new \
152           -nodes \
153           -sha256 \
154           -out {{ arvados_csr_file }} \
155           -keyout {{ arvados_key_file }} > /tmp/snakeoil_certs.{{ vh }}.output 2>&1 && \
156         # The cert
157         openssl x509 \
158           -req \
159           -days 365 \
160           -in {{ arvados_csr_file }} \
161           -out {{ arvados_cert_file }} \
162           -extfile /tmp/{{ vh }}.openssl.cnf \
163           -extensions rext \
164           -CA {{ arvados_ca_cert_file }} \
165           -CAkey {{ arvados_ca_key_file }} \
166           -set_serial $(date +%s) && \
167         chmod 0644 {{ arvados_cert_file }} && \
168         chmod 0640 {{ arvados_key_file }}
169     - unless:
170       - test -f {{ arvados_key_file }}
171       - openssl verify -CAfile {{ arvados_ca_cert_file }} {{ arvados_cert_file }}
172     - require:
173       - pkg: extra_snakeoil_certs_dependencies_pkg_installed
174       - cmd: extra_snakeoil_certs_arvados_snakeoil_ca_cmd_run
175     - require_in:
176       - file: extra_custom_certs_file_copy_arvados-{{ vh }}.pem
177       - file: extra_custom_certs_file_copy_arvados-{{ vh }}.key
178
179   {%- if grains.get('os_family') == 'Debian' %}
180 extra_snakeoil_certs_certs_permissions_{{ vh}}_cmd_run:
181   file.managed:
182     - name: {{ arvados_key_file }}
183     - owner: root
184     - group: ssl-cert
185     - require:
186       - cmd: extra_snakeoil_certs_arvados_snakeoil_cert_{{ vh }}_cmd_run
187       - pkg: extra_snakeoil_certs_ssl_cert_pkg_installed
188   {%- endif %}
189 {%- endfor %}