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