Skip to content

Commit db97225

Browse files
committed
feat(conf): setup SSL certificate for Slurm-web
Add SSL/TLS certificate for Slurm-web with internal CA.
1 parent 8652fc5 commit db97225

File tree

8 files changed

+96
-8
lines changed

8 files changed

+96
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ and this project adheres to
1212
- conf:
1313
- Add pkgs.rackslab.io packages repositories by default.
1414
- Support GPU gres without model in Slurm configuration.
15+
- Add SSL/TLS certificate for Slurm-web with internal CA.
1516
- cli: Add `deploy --update-os-image` option to force download of base OS image
1617
when already present on host.
1718
- lib: Add `deploy --update-os-image` option in bash-completion.

conf/bootstrap.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@
2020
include_role:
2121
name: redis
2222
tasks_from: bootstrap
23+
- name: Generate Slurm-web CA certificate
24+
vars:
25+
slurmweb_bootstrap: true # used to skip role dependencies
26+
include_role:
27+
name: slurmweb
28+
tasks_from: bootstrap
2329

2430
- hosts: all
2531
connection: machinectl

conf/group_vars/all.yml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# shared variables
22
fhpc_local_ssh_dir: "{{ fhpc_cluster_state_dir }}/ssh"
33
fhpc_local_ca_dir: "{{ fhpc_cluster_state_dir }}/ca"
4-
fhpc_ldap_server: "{{ groups['admin'][0] }}"
4+
fhpc_admin_server: "{{ groups['admin'][0] }}"
55
fhpc_ldap_base: "dc=cluster,dc={{ fhpc_cluster }}"
66
fhpc_primary_group: "{{ fhpc_groups[0].name }}"
77
fhpc_slurm_with_jwt: false
@@ -16,20 +16,20 @@ common_ip_addresses: "{{ fhpc_addresses }}"
1616
common_cluster: "{{ fhpc_cluster }}"
1717
ssh_key_dir: "{{ fhpc_local_ssh_dir }}"
1818
ldap_local_ca_dir: "{{ fhpc_local_ca_dir }}"
19-
ldap_server_hostname: "{{ fhpc_ldap_server }}"
19+
ldap_server_hostname: "{{ fhpc_admin_server }}"
2020
ldap_local_admin_password_file: "{{ fhpc_cluster_state_dir }}/ldap/ldap.password"
2121
ldap_base: "dc=cluster,dc={{ fhpc_cluster }}"
2222
ldap_domain: "cluster.{{ fhpc_cluster }}"
2323
ldap_email_domain: "cluster.{{ fhpc_cluster }}"
2424
ldap_users: "{{ fhpc_users }}"
2525
ldap_groups: "{{ fhpc_groups }}"
2626
sssd_ldap_base: "{{ fhpc_ldap_base }}"
27-
sssd_ldap_server: "{{ fhpc_ldap_server }}"
27+
sssd_ldap_server: "{{ fhpc_admin_server }}"
2828
users_ssh_host_key_dir: "{{ fhpc_local_ssh_dir }}"
2929
users_defs: "{{ fhpc_users }}"
3030
users_group: "{{ fhpc_primary_group }}"
3131
slurm_emulator: "{{ fhpc_emulator_mode }}"
32-
slurm_server: "{{ groups['admin'][0] }}"
32+
slurm_server: "{{ fhpc_admin_server }}"
3333
# This hash associates slurm profiles in keys with a group of nodes on which the
3434
# the profile must be applied when slurm_emulator is false. When slurm_emulator
3535
# is true, all slurm profiles are applied on the single admin node.
@@ -52,6 +52,8 @@ slurm_restd_port: "{{ fhpc_slurmrestd_port }}"
5252
slurm_accounts: "{{ fhpc_groups }}"
5353
racksdb_database: "{{ fhpc_db }}"
5454
redis_local_password_file: "{{ fhpc_cluster_state_dir }}/redis/redis.password"
55+
slurmweb_local_ca_dir: "{{ fhpc_local_ca_dir }}"
56+
slurmweb_hostname: "{{ fhpc_admin_server }}"
5557
slurmweb_local_slurmrestd_jwt_key_file: "{{ fhpc_local_slurm_jwt_key }}"
5658
slurmweb_slurmrestd_uri: "{{ fhpc_slurmrestd_with_unix_socket | ternary('unix:' ~ fhpc_slurmrestd_socket, 'http://localhost:' ~ fhpc_slurmrestd_port ) }}"
5759
slurmweb_slurmrestd_auth: "{{ fhpc_slurm_with_jwt | ternary('jwt', 'local') }}"
@@ -73,14 +75,14 @@ slurmweb_agent_settings_defaults:
7375
password: "{{ lookup('ansible.builtin.file', redis_local_password_file) }}"
7476
slurmweb_gateway_settings_defaults:
7577
ui:
76-
host: "http://{{ slurmweb_hostname }}.{{ fhpc_namespace }}"
78+
host: "https://{{ slurmweb_hostname }}.{{ fhpc_namespace }}"
7779
agents:
78-
url: "http://{{ slurmweb_hostname }}/{{ slurmweb_agent_subdir }}"
80+
url: "https://{{ slurmweb_hostname }}/{{ slurmweb_agent_subdir }}"
7981
authentication:
8082
enabled: yes
8183
ldap:
82-
uri: "ldaps://{{ fhpc_ldap_server }}/"
84+
uri: "ldaps://{{ fhpc_admin_server }}/"
8385
user_base: "ou=people,{{ fhpc_ldap_base }}"
8486
group_base: "ou=groups,{{ fhpc_ldap_base }}"
85-
metrics_ldap_server: "{{ fhpc_ldap_server }}"
87+
metrics_ldap_server: "{{ fhpc_admin_server }}"
8688
metrics_ldap_search_base: "{{ fhpc_ldap_base }}"

conf/roles/slurmweb/defaults/main.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
---
22
slurmweb_enabled: false
3+
slurmweb_bootstrap: false
34
slurmweb_hostname: "{{ inventory_hostname }}"
45
slurmweb_http_server_names:
56
- "{{ slurmweb_hostname }}"
@@ -16,3 +17,14 @@ slurmweb_agent_settings_defaults: {}
1617
slurmweb_gateway_settings_defaults: {}
1718
slurmweb_agent_settings: {}
1819
slurmweb_gateway_settings: {}
20+
slurmweb_local_ca_dir: ca # dummy
21+
slurmweb_local_ca_password_file: "{{ slurmweb_local_ca_dir }}/ca.password"
22+
slurmweb_local_ca_key_file: "{{ slurmweb_local_ca_dir }}/key.pem"
23+
slurmweb_local_ca_cert_file: "{{ slurmweb_local_ca_dir }}/ca.crt"
24+
slurmweb_local_tls_key_file: "{{ slurmweb_local_ca_dir }}/key-slurmweb.pem"
25+
slurmweb_local_tls_cert_file: "{{ slurmweb_local_ca_dir }}/cert-slurmweb.crt"
26+
27+
slurmweb_tls_dir: /etc/slurm-web/tls
28+
slurmweb_tls_ca_cert_file: "{{ slurmweb_tls_dir }}/ca.crt"
29+
slurmweb_tls_cert_file: "{{ slurmweb_tls_dir }}/cert.crt"
30+
slurmweb_tls_key_file: "{{ slurmweb_tls_dir }}/key.pem"

conf/roles/slurmweb/meta/main.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ dependencies:
33
- role: nginx
44
nginx_site_template: ../../slurmweb/templates/nginx.conf.j2
55
nginx_site_filename: slurm-web
6+
when: not slurmweb_bootstrap
67
- role: redis
8+
when: not slurmweb_bootstrap
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
- name: Create local slurm-web CA certificate directory
3+
ansible.builtin.file:
4+
path: "{{ slurmweb_local_ca_dir }}"
5+
state: directory
6+
recurse: true
7+
8+
- name: Create Slurm-web private key for TLS certificate
9+
community.crypto.openssl_privatekey:
10+
path: "{{ slurmweb_local_tls_key_file }}"
11+
12+
- name: Create certificate signing request (CSR) for Slurm-web TLS certificate
13+
community.crypto.openssl_csr_pipe:
14+
privatekey_path: "{{ slurmweb_local_tls_key_file }}"
15+
common_name: "{{ slurmweb_hostname }}"
16+
subject_alt_name:
17+
- "DNS:{{ slurmweb_hostname }}"
18+
register: csr
19+
20+
- name: Sign Slurm-web certificate with internal CA
21+
community.crypto.x509_certificate:
22+
csr_content: "{{ csr.csr }}"
23+
provider: ownca
24+
ownca_path: "{{ slurmweb_local_ca_cert_file }}"
25+
ownca_privatekey_path: "{{ slurmweb_local_ca_key_file }}"
26+
ownca_privatekey_passphrase: "{{ lookup('ansible.builtin.file', slurmweb_local_ca_password_file) }}"
27+
ownca_not_after: +365d # valid for one year
28+
ownca_not_before: "-1d" # valid since yesterday
29+
path: "{{ slurmweb_local_tls_cert_file }}"
30+
force: true # override possibly existing certificate

conf/roles/slurmweb/tasks/main.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,28 @@
8989
when:
9090
- slurmweb_slurmrestd_auth == 'local'
9191

92+
- name: Create Slurm-web SSL directory
93+
ansible.builtin.file:
94+
path: "{{ slurmweb_tls_dir }}"
95+
state: directory
96+
recurse: true
97+
98+
- name: Deploy Slurm-web TLS certificate
99+
ansible.builtin.copy:
100+
src: "{{ slurmweb_local_tls_cert_file }}"
101+
dest: "{{ slurmweb_tls_cert_file }}"
102+
owner: root
103+
group: root
104+
mode: 0644
105+
106+
- name: Deploy Slurm-web TLS key
107+
ansible.builtin.copy:
108+
src: "{{ slurmweb_local_tls_key_file }}"
109+
dest: "{{ slurmweb_tls_key_file }}"
110+
owner: root
111+
group: root
112+
mode: 0600
113+
92114
- name: Ensure Slurm-web uWGSI are started
93115
ansible.builtin.systemd_service:
94116
name: "slurm-web-{{ item }}-uwsgi"

conf/roles/slurmweb/templates/nginx.conf.j2

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@ server {
44
listen [::]:80;
55
server_name {{ slurmweb_http_server_names | join(' ') }};
66

7+
# Redirect HTTP to HTTPS
8+
return 301 https://$host$request_uri;
9+
}
10+
11+
# {{ slurmweb_http_server_names | join(',')}}:443
12+
server {
13+
listen 443 ssl;
14+
listen [::]:443 ssl;
15+
server_name {{ slurmweb_http_server_names | join(' ') }};
16+
17+
ssl_certificate {{ slurmweb_tls_cert_file }};
18+
ssl_certificate_key {{ slurmweb_tls_key_file }};
19+
720
location / {
821
include uwsgi_params;
922
uwsgi_pass unix:/run/slurm-web-gateway/uwsgi.sock;

0 commit comments

Comments
 (0)