Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions articles/systemd-setting-up-service.asm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
<resource xml:id="_concept-unit-dependencies" href="../concepts/systemd-unit-dependencies.xml">
<description>Unit dependencies and order</description>
</resource>
<resource xml:id="_systemd-secure-services" href="../concepts/systemd-securing.xml">
<description>Securing &systemd; services</description>
</resource>
</resources>
<!-- Tasks -->
<resources>
Expand All @@ -39,6 +42,9 @@
</resource>
<resource xml:id="_create-systemd-service" href="../tasks/systemd-create-service.xml">
<description>Creating a Linux service with systemd</description>
</resource>
<resource xml:id="_systemd-example-secure-service" href="../tasks/systemd-example-secure-service.xml">
<description>An example of securing a &systemd; service </description>
</resource>
</resources>
<!-- References -->
Expand Down Expand Up @@ -134,7 +140,7 @@
<listitem>
<para>
&systemd; is used to manage system settings and services.
&systemd; organizes tasks into components called <emphasis>units</emphasis> and groups multiple units into
&systemd; organizes tasks into components called <emphasis>units</emphasis> and groups multiple units into
<emphasis>targets</emphasis>.
</para>
</listitem>
Expand Down Expand Up @@ -186,11 +192,13 @@
<module resourceref="_concept-unit-dependencies" renderas="section"/>
<module resourceref="_create-systemd-service" renderas="section"/>
<module resourceref="_systemctl-edit-service-file" renderas="section"/>
<module resourceref="_systemd-secure-services" renderas="section"/>
<module resourceref="_systemd-example-secure-service" renderas="section"/>
<module resourceref="_debugg-systemd-service" renderas="section"/>
<module resourceref="_systemctl-command" renderas="section"/>
<module resourceref="_legal" renderas="section"/>
<module resourceref="_gfdl" renderas="appendix"/>

<!-- Troubleshooting -->
</structure>
</assembly>
</assembly>
43 changes: 26 additions & 17 deletions concepts/systemd-securing.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:trans="http://docbook.org/ns/transclusion">
<info>
<title>Secure &systemd; services</title>
<title>Securing &systemd; services</title>
<meta name="maintainer" content="[email protected]" its:translate="no"/>
<abstract>
<para>
Linux increases its security by separating privileges between individual components of the
Expand All @@ -30,23 +31,31 @@
them from certain privileges that normal users are allowed to use.
</para>
</abstract>
<meta name="maintainer" content="[email protected]" its:translate="no"/>
</info>
<section xml:id="how-it-works-securing-with-systemd">
<title>How does securing services with &systemd; work?</title>
<para>
There are several methods to secure processes and applications that you can use
simultaneously. For example, confining with &selnx; <phrase os="sles">or &aa; </phrase>is
recommended. &systemd; can apply additional restrictions to local services by using
technologies included in the kernel. These restrictions are activated by adding specific
options to the &systemd; service definition and restarting the service.
</para>
</section>
<section xml:id="benefits-securing-with-systemd">
<title>Benefits of securing services</title>
</info>
<section xml:id="benefits-securing-with-systemd">
<title>Why is securing &systemd; services important?</title>
<para>
Securing &systemd; services increases the security of the whole operating system and protects
sensitive data contained on its file system.
sensitive data contained on its file system. With &systemd;, you can configure your system in many ways.
&systemd; runs as the first process on boot (PID1) which means that it has a lot of power on your Linux environment.
</para>
<para>&systemd; can apply additional restrictions to local services by using technologies included in the kernel.
These restrictions are activated by adding specific options to the systemd service definition and restarting the service.
&systemd; has a command-line tool <command>systemd-analyze security</command>. This command analyses the services and checks
if the services are using its security options.</para>
</section>
</topic>
<section xml:id="what-is-systemd-aalyze-security-command">
<title>What is the <command>systemd-analyze security</command> command?</title>
<para>
The command analyzes the security and sandboxing settings of the specified service units.
A detailed analysis of the security settings is executed and displayed.
If a service unit is not specified, all currently loaded, long-running service units are inspected and the results are displayed in a terse table.
</para>
<para>Upon checking the security settings, the command assigns a numeric value , also known as <emphasis>exposure level</emphasis>.
This value is dependent on how important a setting is. It then calculates an overall exposure level for the whole unit. This value ranges
from 0.0-10.0, which is an indicator of how exposed a service is security wise.
High exposure levels indicate that the service might benefit from additional security settings.
While low exposure levels indicate tight security restrictions.
</para>
</section>
</topic>
164 changes: 164 additions & 0 deletions tasks/systemd-example-secure-service.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
[
<!ENTITY % entities SYSTEM "../common/generic-entities.ent">
%entities;
]>
<topic xml:id="systemd-example-secure-service"
role="task" xml:lang="en"
xmlns="http://docbook.org/ns/docbook" version="5.2"
xmlns:its="http://www.w3.org/2005/11/its"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:trans="http://docbook.org/ns/transclusion">
<info>
<title>How to analyze the security of a &systemd; service?</title>
<meta name="maintainer" content="[email protected]" its:translate="no"/>
<abstract>
<para>
Use the <command>systemd-analyze security</command> command to analyze the security settings of a &systemd; service.
The <literal>security</literal> option analyzes the security and the sandboxing settings of one or more specified services.
</para>

</abstract>

</info>
Copy link
Contributor

@taroth21 taroth21 Jul 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would subdivide this file into two sections, one for <systemd-analyze security> and the second one for improving the overall exposure. Because the second part is at least equally important (if not more important), and it currently does not get the same 'weight' like the first part.

<procedure>
<step><para>Create a &systemd; service in the <filename>/etc/systemd/system</filename>. </para>
</step>
<step><para>Reload the service files to include the new service:</para>
<screen>&prompt.sudo; systemctl daemon-reload</screen>
</step>
<step><para>Start,enable, and check the status of the service:</para>
<screen>&prompt.sudo; systemctl start <replaceable>SERVICE_NAME</replaceable></screen>
<screen>&prompt.sudo;systemctl enable <replaceable>SERVICE_NAME</replaceable></screen>
<screen>&prompt.sudo; systemctl status <replaceable>SERVICE_NAME</replaceable></screen>

</step>
<step><para>Analyze the security settings of the service:</para>
<screen>&prompt.sudo; systemd-analyze security <replaceable>SERVICE_NAME</replaceable></screen>
<para>For example:</para>
<screen>&prompt.sudo; systemd-analyze security test.service
NAME DESCRIPTION EXPOSURE
✗ PrivateNetwork= Service has access to the host's network 0.5
✗ User=/DynamicUser= Service runs as root user 0.4
✗ DeviceAllow= Service has no device ACL
...
→ Overall exposure level for test.service: 9.6 UNSAFE 😨
</screen>
</step>
</procedure>

<para><emphasis>How to improve the overall exposure</emphasis></para>
Copy link
Contributor

@taroth21 taroth21 Jul 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would start the second section here (with a title like 'How to improve the overall exposure' or ' How to harden systemd services). Looking at the PDF, <emphasis> just renders the text in italics - it's easy to overlook and does not look similar to the other titles.

<para>If you get <emphasis>9.6 UNSAFE</emphasis>, you can use <literal>[Section]</literal> part of the service definition file to add any of the below options. For example:</para>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<para>If you get <emphasis>9.6 UNSAFE</emphasis>, you can use <literal>[Section]</literal> part of the service definition file to add any of the below options. For example:</para>
<para>If you get a high exposure rate like <emphasis>9.6 UNSAFE</emphasis> (or similar), you can use the <literal>[Service]</literal> part of the service definition file to add directives. </para>

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not 100% sure if it should be [Service] instead of [Section] but it looks like it from the example below.

<screen>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would wrap the screen (plus the other available options) into an <example> element (with a title like Adding Hardening Directives or similar).

[Service]
NoNewPrivileges=yes
PrivateTmp=yes
PrivateNetwork=yes
InaccessibleDirectories=/home
.....
</screen>
<variablelist>
<varlistentry>
<term>NoNewPrivileges=yes</term>
<listitem>
<para>
New privileges are not required.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>PrivateTmp=yes</term>
<listitem>
<para>
Private directory for temporary files. This option provides the service with a private <filename>/tmp</filename> isolated from
the host system's <filename>/tmp</filename>. The shared host <filename>/tmp</filename>
directory is a major source of security problems, such as symlink attacks and DoS
<filename>/tmp</filename> temporary files.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>PrivateNetwork=yes</term>
<listitem>
<para>
This option isolates the service and its processes from networking. This prevents
external network requests from reaching the protected service. Be aware that certain
services require the network to be operational.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>InaccessibleDirectories=/home</term>
<listitem>
<para>
This option makes the specified directories inaccessible to the service. This option
narrows the range of directories that can be read or modified by the service, for
example, to secure users' private files.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>ReadOnlyDirectories=/var</term>
<listitem>
<para>
This option makes the specified directories inaccessible for writing to the service. The
example configuration makes the whole tree below <filename>/var</filename> read-only.
This option prevents the service from damaging the system files.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>CapabilityBoundingSet=CAP_CHOWN CAP_KILL</term>
<listitem>
<para>
This option restricts the kernel capabilities that a service can retain. In the example
above, only the <literal>CAP_CHOWN</literal> and <literal>CAP_KILL</literal> capabilities
are retained by the service, and the service and any processes it creates cannot obtain
any other capabilities, not even via setuid binaries.
</para>
<tip>
<title>The <command>pscap</command> command tool</title>
<para>
To easily identify which processes on your system retain which capabilities, use the
<command>pscap</command> command tool from the <package>libcap-ng-utils</package> package.
</para>
</tip>

<para>
The <literal>~</literal> prefix inverts the meaning of the option&mdash;. Instead of
listing all capabilities that the service retains, you can list the ones it does not
retain:
</para>
<screen>...
[Service]
CapabilityBoundingSet=~CAP_SYS_PTRACE
...</screen>

</listitem>

</varlistentry>
<varlistentry>
<term>LimitNPROC=1, LimitFSIZE=0</term>
<listitem>
<para>
You can use <emphasis>resource limits</emphasis> to apply security limits on services.
Two of them can disable specific operating system features:
<option>RLIMIT_NPROC=1</option> disables precess forking, while
<option>RLIMIT_FSIZE=0</option> disables creating non-empty files on the file system.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>DeviceAllow=/dev/null rw</term>
<listitem>
<para>
This option limits access to <filename>/dev/null</filename>, disallowing access to any
other device nodes.
</para>
</listitem>
</varlistentry>
</variablelist>
<para>These are some options you can use.</para>
</topic>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is adding the directives everything there is to it? No further steps required like restarting the daemon or the systemd service? And how about testing the new settings (e.g. controlling the logs for any errors or denied operations to make sure that the new restrictions haven't broken the service's legitimate operations)? This would fit in nicely with the next topic, debugging systemd options.