17755: Merge branch 'main' into 17755-add-singularity-to-compute-image
[arvados.git] / tools / salt-install / config_examples / single_host / single_hostname / states / snakeoil_certs.sls
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.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 {%- set arvados_ca_cert_file = '/etc/ssl/certs/arvados-snakeoil-ca.pem' %}
11 {%- set arvados_ca_key_file = '/etc/ssl/private/arvados-snakeoil-ca.key' %}
12 {%- set arvados_cert_file = '/etc/ssl/certs/arvados-snakeoil-cert.pem' %}
13 {%- set arvados_csr_file = '/etc/ssl/private/arvados-snakeoil-cert.csr' %}
14 {%- set arvados_key_file = '/etc/ssl/private/arvados-snakeoil-cert.key' %}
15
16 {%- if grains.get('os_family') == 'Debian' %}
17   {%- set arvados_ca_cert_dest = '/usr/local/share/ca-certificates/arvados-snakeoil-ca.crt' %}
18   {%- set update_ca_cert = '/usr/sbin/update-ca-certificates' %}
19   {%- set openssl_conf = '/etc/ssl/openssl.cnf' %}
20 {%- else %}
21   {%- set arvados_ca_cert_dest = '/etc/pki/ca-trust/source/anchors/arvados-snakeoil-ca.pem' %}
22   {%- set update_ca_cert = '/usr/bin/update-ca-trust' %}
23   {%- set openssl_conf = '/etc/pki/tls/openssl.cnf' %}
24 {%- endif %}
25
26 arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed:
27   pkg.installed:
28     - pkgs:
29       - openssl
30       - ca-certificates
31
32 arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_ca_cmd_run:
33   # Taken from https://github.com/arvados/arvados/blob/main/tools/arvbox/lib/arvbox/docker/service/certificate/run
34   cmd.run:
35     - name: |
36         # These dirs are not to CentOS-ish, but this is a helper script
37         # and they should be enough
38         mkdir -p /etc/ssl/certs/ /etc/ssl/private/ && \
39         openssl req \
40           -new \
41           -nodes \
42           -sha256 \
43           -x509 \
44           -subj "/C=CC/ST=Some State/O=Arvados Formula/OU=arvados-formula/CN=snakeoil-ca-{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}" \
45           -extensions x509_ext \
46           -config <(cat {{ openssl_conf }} \
47                   <(printf "\n[x509_ext]\nbasicConstraints=critical,CA:true,pathlen:0\nkeyUsage=critical,keyCertSign,cRLSign")) \
48           -out {{ arvados_ca_cert_file }} \
49           -keyout {{ arvados_ca_key_file }} \
50           -days 365 && \
51         cp {{ arvados_ca_cert_file }} {{ arvados_ca_cert_dest }} && \
52         {{ update_ca_cert }}
53     - unless:
54       - test -f {{ arvados_ca_cert_file }}
55       - openssl verify -CAfile {{ arvados_ca_cert_file }} {{ arvados_ca_cert_file }}
56     - require:
57       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed
58
59 arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_cert_cmd_run:
60   cmd.run:
61     - name: |
62         cat > /tmp/openssl.cnf <<-CNF
63         [req]
64         default_bits = 2048
65         prompt = no
66         default_md = sha256
67         req_extensions = rext
68         distinguished_name = dn
69         [dn]
70         C   = CC
71         ST  = Some State
72         L   = Some Location
73         O   = Arvados Formula
74         OU  = arvados-formula
75         CN  = {{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
76         emailAddress = admin@{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
77         [rext]
78         subjectAltName = @alt_names
79         [alt_names]
80         {%- for entry in grains.get('ipv4') %}
81         IP.{{ loop.index }} = {{ entry }}
82         {%- endfor %}
83         {%- for entry in [
84             'keep',
85             'collections',
86             'download',
87             'keepweb',
88             'ws',
89             'workbench',
90             'workbench2',
91           ]
92         %}
93         DNS.{{ loop.index }} = {{ entry }}
94         {%- endfor %}
95         DNS.8 = {{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
96         DNS.9 = '__HOSTNAME_EXT__'
97         DNS.10 = '__HOSTNAME_INT__'
98         CNF
99
100         # The req
101         openssl req \
102           -config /tmp/openssl.cnf \
103           -new \
104           -nodes \
105           -sha256 \
106           -out {{ arvados_csr_file }} \
107           -keyout {{ arvados_key_file }} > /tmp/snake_oil_certs.output 2>&1 && \
108         # The cert
109         openssl x509 \
110           -req \
111           -days 365 \
112           -in {{ arvados_csr_file }} \
113           -out {{ arvados_cert_file }} \
114           -extfile /tmp/openssl.cnf \
115           -extensions rext \
116           -CA {{ arvados_ca_cert_file }} \
117           -CAkey {{ arvados_ca_key_file }} \
118           -set_serial $(date +%s) && \
119         chmod 0644 {{ arvados_cert_file }} && \
120         chmod 0640 {{ arvados_key_file }}
121     - unless:
122       - test -f {{ arvados_key_file }}
123       - openssl verify -CAfile {{ arvados_ca_cert_file }} {{ arvados_cert_file }}
124     - require:
125       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed
126       - cmd: arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_ca_cmd_run
127
128 {%- if grains.get('os_family') == 'Debian' %}
129 arvados_test_salt_states_examples_single_host_snakeoil_certs_ssl_cert_pkg_installed:
130   pkg.installed:
131     - name: ssl-cert
132     - require_in:
133       - sls: postgres
134
135 arvados_test_salt_states_examples_single_host_snakeoil_certs_certs_permissions_cmd_run:
136   cmd.run:
137     - name: |
138         chown root:ssl-cert {{ arvados_key_file }}
139     - require:
140       - cmd: arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_cert_cmd_run
141       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_ssl_cert_pkg_installed
142 {%- endif %}
143
144 arvados_test_salt_states_examples_single_host_snakeoil_certs_nginx_snakeoil_file_managed:
145   file.managed:
146     - name: /etc/nginx/snippets/arvados-snakeoil.conf
147     - contents: |
148         ssl_certificate {{ arvados_cert_file }};
149         ssl_certificate_key {{ arvados_key_file }};
150     - require:
151       - pkg: nginx_install
152     - require_in:
153       - file: nginx_config
154       - service: nginx_service
155     - watch_in:
156       - service: nginx_service
157
158