18113: Merge branch 'main' into 18113-change-cloudops-defaults
[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 {%- set curr_tpldir = tpldir %}
6 {%- set tpldir = 'arvados' %}
7 {%- from "arvados/map.jinja" import arvados with context %}
8 {%- set tpldir = curr_tpldir %}
9
10 include:
11   - nginx.passenger
12   - nginx.config
13   - nginx.service
14
15 # Debian uses different dirs for certs and keys, but being a Snake Oil example,
16 # we'll keep it simple here.
17 {%- set arvados_ca_cert_file = '/etc/ssl/private/arvados-snakeoil-ca.pem' %}
18 {%- set arvados_ca_key_file = '/etc/ssl/private/arvados-snakeoil-ca.key' %}
19 {%- set arvados_cert_file = '/etc/ssl/private/arvados-snakeoil-cert.pem' %}
20 {%- set arvados_csr_file = '/etc/ssl/private/arvados-snakeoil-cert.csr' %}
21 {%- set arvados_key_file = '/etc/ssl/private/arvados-snakeoil-cert.key' %}
22
23 {%- if grains.get('os_family') == 'Debian' %}
24   {%- set arvados_ca_cert_dest = '/usr/local/share/ca-certificates/arvados-snakeoil-ca.crt' %}
25   {%- set update_ca_cert = '/usr/sbin/update-ca-certificates' %}
26   {%- set openssl_conf = '/etc/ssl/openssl.cnf' %}
27 {%- else %}
28   {%- set arvados_ca_cert_dest = '/etc/pki/ca-trust/source/anchors/arvados-snakeoil-ca.pem' %}
29   {%- set update_ca_cert = '/usr/bin/update-ca-trust' %}
30   {%- set openssl_conf = '/etc/pki/tls/openssl.cnf' %}
31 {%- endif %}
32
33 arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed:
34   pkg.installed:
35     - pkgs:
36       - openssl
37       - ca-certificates
38
39 # Remove the RANDFILE parameter in openssl.cnf as it makes openssl fail in Ubuntu 18.04
40 # Saving and restoring the rng state is not necessary anymore in the openssl 1.1.1
41 # random generator, cf
42 #   https://github.com/openssl/openssl/issues/7754
43 #
44 arvados_test_salt_states_examples_single_host_snakeoil_certs_file_comment_etc_openssl_conf:
45   file.comment:
46     - name: /etc/ssl/openssl.cnf
47     - regex: ^RANDFILE.*
48     - onlyif: grep -q ^RANDFILE /etc/ssl/openssl.cnf
49     - require_in:
50       - cmd: arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_ca_cmd_run
51
52 arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_ca_cmd_run:
53   # Taken from https://github.com/arvados/arvados/blob/master/tools/arvbox/lib/arvbox/docker/service/certificate/run
54   cmd.run:
55     - name: |
56         # These dirs are not to CentOS-ish, but this is a helper script
57         # and they should be enough
58         mkdir -p /etc/ssl/certs/ /etc/ssl/private/ && \
59         openssl req \
60           -new \
61           -nodes \
62           -sha256 \
63           -x509 \
64           -subj "/C=CC/ST=Some State/O=Arvados Formula/OU=arvados-formula/CN=snakeoil-ca-{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}" \
65           -extensions x509_ext \
66           -config <(cat {{ openssl_conf }} \
67                   <(printf "\n[x509_ext]\nbasicConstraints=critical,CA:true,pathlen:0\nkeyUsage=critical,keyCertSign,cRLSign")) \
68           -out {{ arvados_ca_cert_file }} \
69           -keyout {{ arvados_ca_key_file }} \
70           -days 365 && \
71         cp {{ arvados_ca_cert_file }} {{ arvados_ca_cert_dest }} && \
72         {{ update_ca_cert }}
73     - unless:
74       - test -f {{ arvados_ca_cert_file }}
75       - openssl verify -CAfile {{ arvados_ca_cert_file }} {{ arvados_ca_cert_file }}
76     - require:
77       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed
78
79 arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_cert_cmd_run:
80   cmd.run:
81     - name: |
82         cat > /tmp/openssl.cnf <<-CNF
83         [req]
84         default_bits = 2048
85         prompt = no
86         default_md = sha256
87         req_extensions = rext
88         distinguished_name = dn
89         [dn]
90         C   = CC
91         ST  = Some State
92         L   = Some Location
93         O   = Arvados Formula
94         OU  = arvados-formula
95         CN  = {{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
96         emailAddress = admin@{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
97         [rext]
98         subjectAltName = @alt_names
99         [alt_names]
100         {%- for entry in grains.get('ipv4') %}
101         IP.{{ loop.index }} = {{ entry }}
102         {%- endfor %}
103         {%- for entry in [
104             'keep',
105             'collections',
106             'download',
107             'ws',
108             'workbench',
109             'workbench2',
110           ]
111         %}
112         DNS.{{ loop.index }} = {{ entry }}.{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
113         {%- endfor %}
114         DNS.7 = {{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
115         CNF
116
117         # The req
118         openssl req \
119           -config /tmp/openssl.cnf \
120           -new \
121           -nodes \
122           -sha256 \
123           -out {{ arvados_csr_file }} \
124           -keyout {{ arvados_key_file }} > /tmp/snake_oil_certs.output 2>&1 && \
125         # The cert
126         openssl x509 \
127           -req \
128           -days 365 \
129           -in {{ arvados_csr_file }} \
130           -out {{ arvados_cert_file }} \
131           -extfile /tmp/openssl.cnf \
132           -extensions rext \
133           -CA {{ arvados_ca_cert_file }} \
134           -CAkey {{ arvados_ca_key_file }} \
135           -set_serial $(date +%s) && \
136         chmod 0644 {{ arvados_cert_file }} && \
137         chmod 0640 {{ arvados_key_file }}
138     - unless:
139       - test -f {{ arvados_key_file }}
140       - openssl verify -CAfile {{ arvados_ca_cert_file }} {{ arvados_cert_file }}
141     - require:
142       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed
143       - cmd: arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_ca_cmd_run
144     # We need this before we can add the nginx's snippet
145     - require_in:
146       - file: nginx_snippet_arvados-snakeoil.conf
147
148 {%- if grains.get('os_family') == 'Debian' %}
149 arvados_test_salt_states_examples_single_host_snakeoil_certs_ssl_cert_pkg_installed:
150   pkg.installed:
151     - name: ssl-cert
152     - require_in:
153       - sls: postgres
154
155 arvados_test_salt_states_examples_single_host_snakeoil_certs_certs_permissions_cmd_run:
156   file.managed:
157     - name: {{ arvados_key_file }}
158     - owner: root
159     - group: ssl-cert
160     - require:
161       - cmd: arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_cert_cmd_run
162       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_ssl_cert_pkg_installed
163     - require_in:
164       - file: nginx_snippet_arvados-snakeoil.conf
165 {%- endif %}