diff --git a/.gitignore b/.gitignore index 0b535ae..7d4a19c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.ign frigate.env +*.token diff --git a/Makefile b/Makefile index 9fdba50..7422eb1 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,9 @@ $(foreach t,$(wildcard *.yaml),$(eval $(call genrules,$(t)))) %.env: %.env.gpg gpg2 --decrypt $< > $@ +%.token: %.token.gpg + gpg2 --decrypt $< > $@ + publish: \ nvr1.ign rsync -rti $^ files.pyrocufflink.blue:public_html/ diff --git a/fetchcert.service b/fetchcert.service new file mode 100644 index 0000000..e5baead --- /dev/null +++ b/fetchcert.service @@ -0,0 +1,36 @@ +[Unit] +Description=Fetch HTTPS certificate from Kubernetes Secret API +Wants=network-online.target +After=network-online.target + +[Service] +Type=oneshot +ExecStart=/bin/sh /etc/fetchcert/fetchcert.sh default pyrocufflink-cert +ProtectSystem=strict +ReadWritePaths=/etc/pki/nginx +CapabilityBoundingSet=CAP_CHOWN +DeviceAllow= +DevicePolicy=closed +LockPersonality=yes +MemoryDenyWriteExecute=yes +NoNewPrivileges=yes +PrivateDevices=yes +PrivateUsers=yes +PrivateTmp=yes +ProcSubset=pid +ProtectClock=yes +ProtectControlGroups=yes +ProtectHome=yes +ProtectHostname=yes +ProtectKernelLogs=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +ProtectProc=invisible +ProtectSystem=strict +RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX +RestrictNamespaces=yes +RestrictRealtime=yes +RestrictSUIDSGID=yes +SystemCallArchitectures=native +SystemCallFilter=@system-service +SystemCallFilter=~@privileged @resources diff --git a/fetchcert.sh b/fetchcert.sh new file mode 100644 index 0000000..7e0730e --- /dev/null +++ b/fetchcert.sh @@ -0,0 +1,54 @@ +#!/bin/sh +# vim: set sw=4 ts=4 sts=4 et : + +namespace=$2 +secret=$3 + +keyout=/etc/pki/nginx/private/server.key +crtout=/etc/pki/nginx/server.crt + +tmpdir=$(mktemp -d) +trap 'rm -rf "${tmpdir}"' INT TERM QUIT EXIT + +cat > "${tmpdir}"/ca.crt < "${tmpdir}"/server.key +jq -r '.data["tls.crt"]' "${tmpdir}"/secret.json | \ + base64 -d > "${tmpdir}"/server.crt + +if [ "$(b2sum < "${tmpdir}"/server.crt)" != "$(b2sum < "${crtout}")" ]; then + install -m u=rw,go= -o 101 -g 101 "${tmpdir}"/server.key "${keyout}" + install -m u=rw,go=r -o root -g root "${tmpdir}"/server.crt "${crtout}" + chcon -t container_file_t "${keyout}" "${crtout}" + echo 'Certificate updated, reloading nginx ...' >&2 + podman exec -it systemd-nginx nginx -s reload +fi diff --git a/fetchcert.timer b/fetchcert.timer new file mode 100644 index 0000000..489c582 --- /dev/null +++ b/fetchcert.timer @@ -0,0 +1,9 @@ +[Unit] +Description=Periodically fetch certificate from Kubernetes + +[Timer] +OnCalendar=*-*-* 0:0:0 +RandomizedDelaySec=8h + +[Install] +WantedBy=timers.target diff --git a/fetchcert.yaml b/fetchcert.yaml new file mode 100644 index 0000000..237fdaa --- /dev/null +++ b/fetchcert.yaml @@ -0,0 +1,22 @@ +variant: fcos +version: 1.4.0 + +storage: + files: + - path: /etc/fetchcert/fetchcert.sh + mode: 0755 + contents: + local: fetchcert.sh + - path: /etc/systemd/system/fetchcert.service + mode: 0644 + contents: + local: fetchcert.service + - path: /etc/systemd/system/fetchcert.timer + mode: 0644 + contents: + local: fetchcert.timer + +systemd: + units: + - name: fetchcert.timer + enabled: true diff --git a/nginx.yaml b/nginx.yaml index 2ea8ff0..14007fb 100644 --- a/nginx.yaml +++ b/nginx.yaml @@ -1,6 +1,11 @@ variant: fcos version: 1.4.0 +ignition: + config: + merge: + - local: fetchcert.ign + storage: files: - path: /etc/containers/systemd/nginx.container