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