harden chronyd and chrony-wait services
This commit is contained in:
parent
49d1a1fef3
commit
cdae473dfc
120
chrony-services.patch
Normal file
120
chrony-services.patch
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
commit 83f96efdfd2d42a8de51ac3b05120acf5292bb00
|
||||||
|
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
||||||
|
Date: Wed Sep 29 15:25:48 2021 +0200
|
||||||
|
|
||||||
|
examples: harden systemd services
|
||||||
|
|
||||||
|
Add various settings to the example chronyd and chrony-wait services to
|
||||||
|
decrease the exposure reported by the "systemd-analyze security"
|
||||||
|
command. The original exposure was high as the analyzer does not check
|
||||||
|
the actual process (e.g. that it dropped the root privileges or that it
|
||||||
|
has its own seccomp filter).
|
||||||
|
|
||||||
|
Limit read-write access to /run, /var/lib/chrony, and /var/spool.
|
||||||
|
Access to /run (instead of /run/chrony) is needed for the refclock
|
||||||
|
socket expected by gpsd.
|
||||||
|
|
||||||
|
The mailonchange directive is most likely to break as it executes
|
||||||
|
/usr/sbin/sendmail, which can do unexpected operations depending on the
|
||||||
|
implementation. It should work with a setuid/setgid binary, but it is
|
||||||
|
not expected to write outside of /var/spool and the private /tmp.
|
||||||
|
|
||||||
|
diff --git a/examples/chrony-wait.service b/examples/chrony-wait.service
|
||||||
|
index b3aa7aa2..72b028f2 100644
|
||||||
|
--- a/examples/chrony-wait.service
|
||||||
|
+++ b/examples/chrony-wait.service
|
||||||
|
@@ -16,5 +16,32 @@ TimeoutStartSec=180
|
||||||
|
RemainAfterExit=yes
|
||||||
|
StandardOutput=null
|
||||||
|
|
||||||
|
+CapabilityBoundingSet=
|
||||||
|
+DevicePolicy=closed
|
||||||
|
+DynamicUser=yes
|
||||||
|
+IPAddressAllow=localhost
|
||||||
|
+IPAddressDeny=any
|
||||||
|
+LockPersonality=yes
|
||||||
|
+MemoryDenyWriteExecute=yes
|
||||||
|
+PrivateDevices=yes
|
||||||
|
+PrivateUsers=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
|
||||||
|
+RestrictNamespaces=yes
|
||||||
|
+RestrictRealtime=yes
|
||||||
|
+SystemCallArchitectures=native
|
||||||
|
+SystemCallFilter=@system-service
|
||||||
|
+SystemCallFilter=~@privileged @resources
|
||||||
|
+UMask=0777
|
||||||
|
+
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
diff --git a/examples/chronyd.service b/examples/chronyd.service
|
||||||
|
index 289548cb..2cac6026 100644
|
||||||
|
--- a/examples/chronyd.service
|
||||||
|
+++ b/examples/chronyd.service
|
||||||
|
@@ -10,9 +10,40 @@ Type=forking
|
||||||
|
PIDFile=/run/chrony/chronyd.pid
|
||||||
|
EnvironmentFile=-/etc/sysconfig/chronyd
|
||||||
|
ExecStart=/usr/sbin/chronyd $OPTIONS
|
||||||
|
+
|
||||||
|
+CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE
|
||||||
|
+CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_KILL CAP_LEASE CAP_LINUX_IMMUTABLE
|
||||||
|
+CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_MKNOD CAP_SYS_ADMIN
|
||||||
|
+CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_CHROOT CAP_SYS_MODULE CAP_SYS_PACCT
|
||||||
|
+CapabilityBoundingSet=~CAP_SYS_PTRACE CAP_SYS_RAWIO CAP_SYS_TTY_CONFIG CAP_WAKE_ALARM
|
||||||
|
+DeviceAllow=char-pps rw
|
||||||
|
+DeviceAllow=char-ptp rw
|
||||||
|
+DeviceAllow=char-rtc rw
|
||||||
|
+DevicePolicy=closed
|
||||||
|
+LockPersonality=yes
|
||||||
|
+MemoryDenyWriteExecute=yes
|
||||||
|
+NoNewPrivileges=yes
|
||||||
|
PrivateTmp=yes
|
||||||
|
+ProcSubset=pid
|
||||||
|
+ProtectControlGroups=yes
|
||||||
|
ProtectHome=yes
|
||||||
|
-ProtectSystem=full
|
||||||
|
+ProtectHostname=yes
|
||||||
|
+ProtectKernelLogs=yes
|
||||||
|
+ProtectKernelModules=yes
|
||||||
|
+ProtectKernelTunables=yes
|
||||||
|
+ProtectProc=invisible
|
||||||
|
+ProtectSystem=strict
|
||||||
|
+ReadWritePaths=/run /var/lib/chrony
|
||||||
|
+RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
|
||||||
|
+RestrictNamespaces=yes
|
||||||
|
+RestrictSUIDSGID=yes
|
||||||
|
+SystemCallArchitectures=native
|
||||||
|
+SystemCallFilter=~@cpu-emulation @debug @module @mount @obsolete @raw-io @reboot @swap
|
||||||
|
+
|
||||||
|
+# Adjust restrictions for /usr/sbin/sendmail (mailonchange directive)
|
||||||
|
+NoNewPrivileges=no
|
||||||
|
+ReadWritePaths=/var/spool
|
||||||
|
+RestrictAddressFamilies=AF_NETLINK
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
|
||||||
|
Avoid a SELinux issue
|
||||||
|
|
||||||
|
diff --git a/examples/chrony-wait.service b/examples/chrony-wait.service
|
||||||
|
index 72b028f2..57646950 100644
|
||||||
|
--- a/examples/chrony-wait.service
|
||||||
|
+++ b/examples/chrony-wait.service
|
||||||
|
@@ -18,7 +18,7 @@ StandardOutput=null
|
||||||
|
|
||||||
|
CapabilityBoundingSet=
|
||||||
|
DevicePolicy=closed
|
||||||
|
-DynamicUser=yes
|
||||||
|
+#DynamicUser=yes
|
||||||
|
IPAddressAllow=localhost
|
||||||
|
IPAddressDeny=any
|
||||||
|
LockPersonality=yes
|
@ -26,6 +26,8 @@ Source10: https://github.com/mlichvar/clknetsim/archive/%{clknetsim_ver}/c
|
|||||||
Patch1: chrony-nm-dispatcher-dhcp.patch
|
Patch1: chrony-nm-dispatcher-dhcp.patch
|
||||||
# update seccomp filter for new glibc
|
# update seccomp filter for new glibc
|
||||||
Patch2: chrony-seccomp.patch
|
Patch2: chrony-seccomp.patch
|
||||||
|
# harden chronyd and chrony-wait services
|
||||||
|
Patch3: chrony-services.patch
|
||||||
|
|
||||||
BuildRequires: libcap-devel libedit-devel nettle-devel pps-tools-devel
|
BuildRequires: libcap-devel libedit-devel nettle-devel pps-tools-devel
|
||||||
BuildRequires: gcc gcc-c++ make bison systemd gnupg2
|
BuildRequires: gcc gcc-c++ make bison systemd gnupg2
|
||||||
@ -58,18 +60,19 @@ service to other computers in the network.
|
|||||||
%{?gitpatch:%patch0 -p1}
|
%{?gitpatch:%patch0 -p1}
|
||||||
%patch1 -p1 -b .nm-dispatcher-dhcp
|
%patch1 -p1 -b .nm-dispatcher-dhcp
|
||||||
%patch2 -p1 -b .seccomp
|
%patch2 -p1 -b .seccomp
|
||||||
|
%patch3 -p1 -b .services
|
||||||
|
|
||||||
%{?gitpatch: echo %{version}-%{gitpatch} > version.txt}
|
%{?gitpatch: echo %{version}-%{gitpatch} > version.txt}
|
||||||
|
|
||||||
# review changes in packaged configuration files and scripts
|
# review changes in packaged configuration files and scripts
|
||||||
md5sum -c <<-EOF | (! grep -v 'OK$')
|
md5sum -c <<-EOF | (! grep -v 'OK$')
|
||||||
bc563c1bcf67b2da774bd8c2aef55a06 examples/chrony-wait.service
|
222e652b95027289877fa77146d3b9b1 examples/chrony-wait.service
|
||||||
2d01b94bc1a7b7fb70cbee831488d121 examples/chrony.conf.example2
|
2d01b94bc1a7b7fb70cbee831488d121 examples/chrony.conf.example2
|
||||||
96999221eeef476bd49fe97b97503126 examples/chrony.keys.example
|
96999221eeef476bd49fe97b97503126 examples/chrony.keys.example
|
||||||
6a3178c4670de7de393d9365e2793740 examples/chrony.logrotate
|
6a3178c4670de7de393d9365e2793740 examples/chrony.logrotate
|
||||||
a7054c9352c07384bd7ea0477e6e8a8c examples/chrony.nm-dispatcher.dhcp
|
a7054c9352c07384bd7ea0477e6e8a8c examples/chrony.nm-dispatcher.dhcp
|
||||||
8f5a98fcb400a482d355b929d04b5518 examples/chrony.nm-dispatcher.onoffline
|
8f5a98fcb400a482d355b929d04b5518 examples/chrony.nm-dispatcher.onoffline
|
||||||
32c34c995c59fd1c3ad1616d063ae4a0 examples/chronyd.service
|
76c8a32a5ac6692a7f15f65e2b5f3239 examples/chronyd.service
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# don't allow packaging without vendor zone
|
# don't allow packaging without vendor zone
|
||||||
|
Loading…
Reference in New Issue
Block a user