Systemd Unitfile Linter
Project description
systemdlint
Systemd Unitfile Linter
Usage
usage: systemdlint [-h] [--nodropins] [--rootpath ROOTPATH] [--sversion SVERSION] [--output OUTPUT] [--norootfs] files [files ...]
Systemd Unitfile Linter
positional arguments:
files Files to parse
optional arguments:
-h, --help show this help message and exit
--nodropins Ignore Drop-Ins for parsing
--rootpath ROOTPATH Root path
--sversion SVERSION Version of Systemd to be used
--output OUTPUT Where to flush the findings (default: stderr)
--norootfs Run only unit file related tests
Why should I use it?
Surely you can use systemd-analyze verify [unitname] to validate your units - no problem and it's
the recommended way if you writing units for the system you are currently running on.
Unfortunately systemd doesn't offer a validation which doesn't require an already running version of
systemd you want to validate against.
This tool was initially created to check units in cross-compiled embedded images at build time, where you can't run a copy of systemd (as it's cross-compiled). As a consequence it doesn't use any systemd code and might interpret some settings differently than systemd itself - as with every linter take the outcomes as a basis for further analysis. Also keep in mind, that systemd does create a larger stack of runtime files, which are not taken into account by the tool - same for kernel related information like /dev, /sys or /proc entries.
Furthermore the tool gives you advice how your unit files could be hardened.
Installation
PyPi
simply run
pip3 install systemdlint
From source
- Install the needed requirements by running
pip3 install . - git clone this repository
- cd to <clone folder>/systemdlint
- run
sudo ./build.sh
Output
The tool will return
{file}:{line}:{severity} [{id}] - {message}
example:
/lib/systemd/system/console-shell.service:18:info [NoFailureCheck] - Return-code check is disabled. Errors are not reported
/lib/systemd/system/plymouth-halt.service:11:info [NoFailureCheck] - Return-code check is disabled. Errors are not reported
/lib/systemd/system/systemd-ask-password-console.service:12:warning [ReferencedUnitNotFound] - The Unit 'systemd-vconsole-setup.service' referenced was not found in filesystem
/lib/systemd/system/basic.target:19:warning [ReferencedUnitNotFound] - The Unit 'tmp.mount' referenced was not found in filesystem
The output format is configurable with --messageformat, for example:
systemdlint --messageformat='{path}:{line}:{severity}:{msg}' ...
Detectable Errors
- ConflictingOptions - The set option somehow is in conflict with another unit
- ErrorCyclicDependency - Unit creates a cyclic dependency
- ExecNotFound - The referenced executable was not found on system
- FullPrivileges - An executable is run with full privileges
- InvalidNumericBase - A numeric value doesn't match because it needs to be a multiple of X
- InvalidSetting - The option doesn't match the section
- InvalidValue - An invalid value is set
- MandatoryOptionMissing - A mandatory option was missing in the file
- Multiplicity - The option is not valid for the given amount of options in this context
- NoExecutable - The referenced executable is NOT executable
- NoFailureCheck - An executable is run without checking for failures
- OptionDeprecated - The used option is not available anymore in this version
- OptionTooNew - The used option will be available in a later version than used
- ReferencedUnitNotFound - The unit referenced was not found in system
- Security.@clock - SystemCallFilter shouldn't contain @clock
- Security.@cpu-emulation - SystemCallFilter shouldn't contain @cpu-emulation
- Security.@debug - SystemCallFilter shouldn't contain @debug
- Security.@module - SystemCallFilter shouldn't contain @module
- Security.@mount - SystemCallFilter shouldn't contain @mount
- Security.@obsolete - SystemCallFilter shouldn't contain @obsolete
- Security.@privileged - SystemCallFilter shouldn't contain @privileged
- Security.@raw-io - SystemCallFilter shouldn't contain @raw-io
- Security.@reboot - SystemCallFilter shouldn't contain @reboot
- Security.@resources - SystemCallFilter shouldn't contain @resources
- Security.@swap - SystemCallFilter shouldn't contain @swap
- Security.AF_INET - RestrictAddressFamilies shouldn't contain AF_INET
- Security.AF_INET6 - RestrictAddressFamilies shouldn't contain AF_INET6
- Security.AF_NETLINK - RestrictAddressFamilies shouldn't contain AF_NETLINK
- Security.AF_PACKET - RestrictAddressFamilies shouldn't contain AF_PACKET
- Security.AF_UNIX - RestrictAddressFamilies shouldn't contain AF_UNIX
- Security.CAP_AUDIT_CONTROL - CapabilityBoundingSet shouldn't contain CAP_AUDIT_CONTROL
- Security.CAP_AUDIT_READ - CapabilityBoundingSet shouldn't contain CAP_AUDIT_READ
- Security.CAP_AUDIT_WRITE - CapabilityBoundingSet shouldn't contain CAP_AUDIT_WRITE
- Security.CAP_BLOCK_SUSPEND - CapabilityBoundingSet shouldn't contain CAP_BLOCK_SUSPEND
- Security.CAP_CHOWN - CapabilityBoundingSet shouldn't contain CAP_CHOWN
- Security.CAP_DAC_OVERRIDE - CapabilityBoundingSet shouldn't contain CAP_DAC_OVERRIDE
- Security.CAP_DAC_READ_SEARCH - CapabilityBoundingSet shouldn't contain CAP_DAC_READ_SEARCH
- Security.CAP_FOWNER - CapabilityBoundingSet shouldn't contain CAP_FOWNER
- Security.CAP_FSETID - CapabilityBoundingSet shouldn't contain CAP_FSETID
- Security.CAP_IPC_LOCK - CapabilityBoundingSet shouldn't contain CAP_IPC_LOCK
- Security.CAP_IPC_OWNER - CapabilityBoundingSet shouldn't contain CAP_IPC_OWNER
- Security.CAP_KILL - CapabilityBoundingSet shouldn't contain CAP_KILL
- Security.CAP_LEASE - CapabilityBoundingSet shouldn't contain CAP_LEASE
- Security.CAP_LINUX_IMMUTABLE - CapabilityBoundingSet shouldn't contain CAP_LINUX_IMMUTABLE
- Security.CAP_MAC_ADMIN - CapabilityBoundingSet shouldn't contain CAP_MAC_ADMIN
- Security.CAP_MAC_OVERRIDE - CapabilityBoundingSet shouldn't contain CAP_MAC_OVERRIDE
- Security.CAP_MKNOD - CapabilityBoundingSet shouldn't contain CAP_MKNOD
- Security.CAP_NET_ADMIN - CapabilityBoundingSet shouldn't contain CAP_NET_ADMIN
- Security.CAP_NET_BIND_SERVICE - CapabilityBoundingSet shouldn't contain CAP_NET_BIND_SERVICE
- Security.CAP_NET_BROADCAST - CapabilityBoundingSet shouldn't contain CAP_NET_BROADCAST
- Security.CAP_NET_RAW - CapabilityBoundingSet shouldn't contain CAP_NET_RAW
- Security.CAP_RAWIO - CapabilityBoundingSet shouldn't contain CAP_RAWIO
- Security.CAP_SETFCAP - CapabilityBoundingSet shouldn't contain CAP_SETFCAP
- Security.CAP_SETGID - CapabilityBoundingSet shouldn't contain CAP_SETGID
- Security.CAP_SETPCAP - CapabilityBoundingSet shouldn't contain CAP_SETPCAP
- Security.CAP_SETUID - CapabilityBoundingSet shouldn't contain CAP_SETUID
- Security.CAP_SYS_ADMIN - CapabilityBoundingSet shouldn't contain CAP_SYS_ADMIN
- Security.CAP_SYS_BOOT - CapabilityBoundingSet shouldn't contain CAP_SYS_BOOT
- Security.CAP_SYS_CHROOT - CapabilityBoundingSet shouldn't contain CAP_SYS_CHROOT
- Security.CAP_SYS_MODULE - CapabilityBoundingSet shouldn't contain CAP_SYS_MODULE
- Security.CAP_SYS_NICE - CapabilityBoundingSet shouldn't contain CAP_SYS_NICE
- Security.CAP_SYS_PACCT - CapabilityBoundingSet shouldn't contain CAP_SYS_PACCT
- Security.CAP_SYS_PTRACE - CapabilityBoundingSet shouldn't contain CAP_SYS_PTRACE
- Security.CAP_SYS_RESOURCE - CapabilityBoundingSet shouldn't contain CAP_SYS_RESOURCE
- Security.CAP_SYS_TIME - CapabilityBoundingSet shouldn't contain CAP_SYS_TIME
- Security.CAP_SYS_TTY_CONFIG - CapabilityBoundingSet shouldn't contain CAP_SYS_TTY_CONFIG
- Security.CAP_SYSLOG - CapabilityBoundingSet shouldn't contain CAP_SYSLOG
- Security.CAP_WAKE_ALARM - CapabilityBoundingSet shouldn't contain CAP_WAKE_ALARM
- Security.CLONE_NEWCGROUP - RestrictNamespaces shouldn't contain CLONE_NEWCGROUP
- Security.CLONE_NEWIPC - RestrictNamespaces shouldn't contain CLONE_NEWIPC
- Security.CLONE_NEWNET - RestrictNamespaces shouldn't contain CLONE_NEWNET
- Security.CLONE_NEWNS - RestrictNamespaces shouldn't contain CLONE_NEWNS
- Security.CLONE_NEWPID - RestrictNamespaces shouldn't contain CLONE_NEWPID
- Security.CLONE_NEWUSER - RestrictNamespaces shouldn't contain CLONE_NEWUSER
- Security.CLONE_NEWUTS - RestrictNamespaces shouldn't contain CLONE_NEWUTS
- Security.Delegate - Delegate shall be set to yes
- Security.DevicePolicy - DevicePolicy should be set to closed
- Security.IPAddressDenyNA - IPAddressDeny shall be set
- Security.KeyringModeNA - KeyringMode shall be set
- Security.KeyringModeNPriv - KeyringMode shall be set to private
- Security.LockPersonality - LockPersonality shall be set to yes
- Security.MemoryDenyWriteExecute - MemoryDenyWriteExecute shall be set to yes
- Security.NoNewPrivileges - NoNewPrivileges shall be set to yes
- Security.NotifyAccess - NotifyAccess=all should be avoided
- Security.NoUser - No user is set for the service
- Security.PrivateDevices - PrivateDevices shall be set to yes
- Security.PrivateMounts - PrivateMounts shall be set to yes
- Security.PrivateNetwork - PrivateNetwork shall be set to yes
- Security.PrivateTmp - PrivateTmp shall be set to yes
- Security.PrivateUsers - PrivateUsers shall be set to yes
- Security.ProtectClock - ProtectClock shall be set to yes
- Security.ProtectControlGroups - ProtectControlGroups shall be set to yes
- Security.ProtectHomeNA - ProtectHome shall be set
- Security.ProtectHomeOff - ProtectHome shall be set to yes
- Security.ProtectHostname - ProtectHostname shall be set to yes
- Security.ProtectKernelLogs - ProtectKernelLogs shall be set to yes
- Security.ProtectKernelModules - ProtectKernelModules shall be set to yes
- Security.ProtectKernelTunables - ProtectKernelTunables shall be set to yes
- Security.ProtectSystemNA - ProtectSystem shall be set
- Security.ProtectSystemNStrict - ProtectSystem shall be set to strict
- Security.RemoveIPC - RemoveIPC should be activated
- Security.RestrictRealtime - RestrictRealtime shall be set to yes
- Security.RestrictSUIDSGID - RestrictSUIDSGID shall be set to yes
- Security.RootDirectory - RootDirectory or RootImage shall be set to a non-root path
- Security.SupplementaryGroups - SupplementaryGroups shall be avoided
- Security.SystemCallArchitecturesMult - SystemCallArchitectures shouldn't be set for multiple archs
- Security.SystemCallArchitecturesNA - SystemCallArchitectures shall be set
- Security.UMaskGR - Files created by service are group-readbale
- Security.UMaskGW - Files created by service are group-writeable
- Security.UMaskOR - Files created by service are world-readbale
- Security.UMaskOW - Files created by service are world-writeable
- Security.UserNobody - User nobody is set for the service
- Security.UserRoot - User root is set for the service
- SettingRequires - The option requires another option to be set
- SettingRestricted - The option can't be set due to another option
- SyntaxError - The file is not parsable
- UnitSectionMissing - The Unit-section is missing in the file
- UnknownUnitType - The file extension of the file is not a known systemd one
- WrongFileMask - The file has a risky filemode set
vscode extension
Find the extension in the marketplace, or search for systemdlint-vscode
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file systemdlint-1.4.0.tar.gz.
File metadata
- Download URL: systemdlint-1.4.0.tar.gz
- Upload date:
- Size: 47.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96b05fdc42db2f803fcd7661b5e8edd5d04022401bad1291321d72b3f63b6752
|
|
| MD5 |
4f6b14fe1eceadfe7c550fb889152d78
|
|
| BLAKE2b-256 |
650077bd801415ed6dd018610934f1600cf2bae4b9659aa01ccb13e4b293426b
|
Provenance
The following attestation bundles were made for systemdlint-1.4.0.tar.gz:
Publisher:
release.yml on priv-kweihmann/systemdlint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
systemdlint-1.4.0.tar.gz -
Subject digest:
96b05fdc42db2f803fcd7661b5e8edd5d04022401bad1291321d72b3f63b6752 - Sigstore transparency entry: 567661096
- Sigstore integration time:
-
Permalink:
priv-kweihmann/systemdlint@2e15602fca59c897009b642124fa61a6acd54688 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/priv-kweihmann
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2e15602fca59c897009b642124fa61a6acd54688 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file systemdlint-1.4.0-py3-none-any.whl.
File metadata
- Download URL: systemdlint-1.4.0-py3-none-any.whl
- Upload date:
- Size: 91.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8337e32a29c7d171fa76a814196638a471aaf7aa4816679d496c04f45ded8913
|
|
| MD5 |
af8fe5fb1be6010bb52d1c1bcf6e760d
|
|
| BLAKE2b-256 |
e4a94ccf5b50645e20082e6f66510dec7dbd169a3c2ac60d29f7bd6647cdbdcd
|
Provenance
The following attestation bundles were made for systemdlint-1.4.0-py3-none-any.whl:
Publisher:
release.yml on priv-kweihmann/systemdlint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
systemdlint-1.4.0-py3-none-any.whl -
Subject digest:
8337e32a29c7d171fa76a814196638a471aaf7aa4816679d496c04f45ded8913 - Sigstore transparency entry: 567661104
- Sigstore integration time:
-
Permalink:
priv-kweihmann/systemdlint@2e15602fca59c897009b642124fa61a6acd54688 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/priv-kweihmann
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2e15602fca59c897009b642124fa61a6acd54688 -
Trigger Event:
workflow_dispatch
-
Statement type: