From 0800a3d4fd1c0874090d72fe5022e14d8de086a9 Mon Sep 17 00:00:00 2001
From: Daniel Berteaud <dbd@ehtrace.com>
Date: Mon, 21 Mar 2022 17:00:07 +0100
Subject: [PATCH] Update to 2022-03-21 17:00

---
 roles/zabbix_server/defaults/main.yml         | 23 +++++++++++++++++
 roles/zabbix_server/tasks/conf.yml            | 25 +++++++++++++++++++
 roles/zabbix_server/tasks/directories.yml     |  4 +++
 .../templates/saml_metadata.xml.j2            | 24 ++++++++++++++++++
 .../templates/zabbix.conf.php.j2              |  4 +++
 5 files changed, 80 insertions(+)
 create mode 100644 roles/zabbix_server/templates/saml_metadata.xml.j2

diff --git a/roles/zabbix_server/defaults/main.yml b/roles/zabbix_server/defaults/main.yml
index a7c9e81..a069e98 100644
--- a/roles/zabbix_server/defaults/main.yml
+++ b/roles/zabbix_server/defaults/main.yml
@@ -63,3 +63,26 @@ zabbix_server_backup_hooks: True
 # so its web monitoring can be direct
 # This will only have an effect if system_proxy is defined
 zabbix_server_uses_system_proxy: True
+
+# If using SAML auth, you have to configure the certificate of the IDP
+# zabbix_server_saml_idp_cert: |
+#   -----BEGIN CERTIFICATE-----
+#   MIICsDCCAZigAwIBAgIEY42IsjANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9z
+#   c28uZWh0cmFjZS5jb20wHhcNMjEwNDI5MTAyNDE1WhcNNDEwNDI0MTAyNDE1WjAa
+#   MRgwFgYDVQQDDA9zc28uZWh0cmFjZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
+#   DwAwggEKAoIBAQCnkJTXog/iNhNGBWuwKFGurhwHJGQfAsOc0LfDcJC4MHCkaRdW
+#   f5nM2txxuDn2iCN6bhsPL9Q0XR9MOGfwc9cb0WNCpg91rFLG7FLxbevp81m2thRe
+#   gTwdBpJoUJkm/MoMa7+oU8/PYuG/XFTrlq9/TznE/7BcvNqUJQYT4k9LAnkusIBA
+#   yRj9mF3ZHNZKe9YcqD9e2kwOfA8uGFBAMw4UR2m158vyNmng2AMzHdgnKrIKwYjJ
+#   e1f8B+GQRc+C/o06jF+wRYpVTYitcJzaadNjDgUWsUwjaYeKB2Z2E0FUE5ybTkoh
+#   rfL0HQzCFC5beQkfq0vjHrMCInOvGGkaEDQBAgMBAAEwDQYJKoZIhvcNAQELBQAD
+#   ggEBACIWuRwpF6FYmlw224n9Pc14iOTazgWr41hJEw36cpQFEiN/ZYU2C8a2W7SV
+#   OBK2bzCMkELUlewuuzrodjflBdh55ZIDx3RKB8Db70hvw/fAe/US33oeSnngBQxm
+#   FazCQq5ijajSH76xuoUw9AkH2KPP+tm/Y8ReV2xj6JxMpPArJsQ9ITuaiC9Bt4bI
+#   LwXXqa+rnDtReBZBDjt8eyV0L5u5XvkfKlQoG/+UOdsfXavyJR6by2m6vv7/zGS+
+#   fGpPuqtTWh0G4A3JEMJ5i0bajftWyYn7XGXOi2DIX5LGP1dhEml55m/NxLkPxTw8
+#   vGPDSdbhHJZxQkilQsrPXNQqK38=
+#   -----END CERTIFICATE-----
+
+# When using SAML, you should also set the public URL so SAML metadata are correctly generated
+# zabbix_server_public_url: https://monitoring.example.org
diff --git a/roles/zabbix_server/tasks/conf.yml b/roles/zabbix_server/tasks/conf.yml
index f01267b..d1d7fa4 100644
--- a/roles/zabbix_server/tasks/conf.yml
+++ b/roles/zabbix_server/tasks/conf.yml
@@ -1,5 +1,30 @@
 ---
 
+- name: Create a selfsigned cert for SAML auth
+  import_tasks: ../includes/create_selfsigned_cert.yml
+  vars:
+    - cert_path: /etc/zabbix/ssl/sp.crt
+    - cert_key_path: /etc/zabbix/ssl/sp.key
+    - cert_key_group: apache
+    - cert_key_mode: '640'
+  tags: zabbix
+
+- name: Read SAML certificate
+  shell: cat /etc/zabbix/ssl/sp.crt | perl -e 'my $out; while (<STDIN>){ next if /^\-\-\-\-\-(END|BEGIN) CERTIFICATE/; chomp; $out .= $_; }; print $out'
+  changed_when: False
+  register: zabbix_server_saml_sp_cert
+  tags: zabbix
+
+- name: Deploy SAML IDP certificate
+  copy: content={{ zabbix_server_saml_idp_cert }} dest=/etc/zabbix/ssl/idp.crt mode=644
+  when: zabbix_server_saml_idp_cert is defined
+  tags: zabbix
+
+- name: Deploy SAML metadata
+  template: src=saml_metadata.xml.j2 dest=/usr/share/zabbix/saml-metadata.xml
+  when: zabbix_server_public_url is defined
+  tags: zabbix
+
 - name: Deploy patrix configuration file
   template: src=patrixrc.j2 dest=/var/lib/zabbix/.patrixrc owner=zabbix group=zabbix mode=600
   when: (zabbix_server_matrix_user is defined and zabbix_server_matrix_pass is defined) or zabbix_server_matrix_access_token is defined
diff --git a/roles/zabbix_server/tasks/directories.yml b/roles/zabbix_server/tasks/directories.yml
index 4582d26..b672708 100644
--- a/roles/zabbix_server/tasks/directories.yml
+++ b/roles/zabbix_server/tasks/directories.yml
@@ -10,6 +10,10 @@
       owner: apache
       group: apache
       mode: 700
+    - dir: /etc/zabbix/ssl
+      owner: root
+      group: apache
+      mode: 750
   tags: zabbix
 
   #- name: Ensure proper permission on the web config dir
diff --git a/roles/zabbix_server/templates/saml_metadata.xml.j2 b/roles/zabbix_server/templates/saml_metadata.xml.j2
new file mode 100644
index 0000000..5d90f3e
--- /dev/null
+++ b/roles/zabbix_server/templates/saml_metadata.xml.j2
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<EntityDescriptor entityID="{{ zabbix_server_public_url }}" xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
+  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="{{ zabbix_server_public_url | regex_replace('/$', '') }}/index_sso.php?acs" index="0" />
+    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="{{ zabbix_server_public_url | regex_replace('/$', '') }}/index_sso.php?sls" />
+    <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
+    <KeyDescriptor use="signing">
+      <ds:KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
+        <ds:X509Data>
+          <ds:X509Certificate>{{ zabbix_server_saml_sp_cert.stdout }}</ds:X509Certificate>
+        </ds:X509Data>
+      </ds:KeyInfo>
+    </KeyDescriptor>
+  </SPSSODescriptor>
+  <Organization>
+    <OrganizationName xml:lang="en">{{ ansible_domain }}</OrganizationName>
+    <OrganizationDisplayName xml:lang="en">Zabbix {{ ansible_domain }}</OrganizationDisplayName>
+    <OrganizationURL xml:lang="en">{{ zabbix_server_public_url }}</OrganizationURL>
+  </Organization>
+  <ContactPerson contactType="administrative">
+    <GivenName>System Administrator</GivenName>
+    <EmailAddress>{{ system_admin_email | default('admin@' ~ ansible_domain) }}</EmailAddress>
+  </ContactPerson>
+</EntityDescriptor>
diff --git a/roles/zabbix_server/templates/zabbix.conf.php.j2 b/roles/zabbix_server/templates/zabbix.conf.php.j2
index 174ec1a..0e94dce 100644
--- a/roles/zabbix_server/templates/zabbix.conf.php.j2
+++ b/roles/zabbix_server/templates/zabbix.conf.php.j2
@@ -12,4 +12,8 @@ $IMAGE_FORMAT_DEFAULT   = IMAGE_FORMAT_PNG;
 {% if zabbix_server_version.stdout is version('5.0', '>=') %}
 $DB['DOUBLE_IEEE754'] = 'true';
 {% endif %}
+$SSO['SP_KEY']          = '/etc/zabbix/ssl/sp.key';
+$SSO['SP_CERT']         = '/etc/zabbix/ssl/sp.crt';
+$SSO['IDP_CERT']        = '/etc/zabbix/ssl/idp.crt';
+
 ?>