Operating systems · UBU · v0.1.0 · draft

Ubuntu

Secure configuration baseline for Ubuntu LTS systems, servers and desktops. Version-specific differences are handled per control with applicability.versions.

Ubuntu 20.04, 22.04, 24.04, 26.04173 controlsIDs CB-UBU-<domain>-NNN

Release v0.1.0 (beta), tag ubuntu/v0.1.0: the active and deprecated controls it shipped. A beta published for testing: it may still change before a final release. Current state.

01

Controls

173 controls
IDControlSeverityAssessmentProfiles
CB-UBU-AUDIT-001Keep the systemd journal running, persistent, compressed and bounded in sizeSystem logs may be lost at reboot or fill the diskmediumautomatedautomated fixcore
CB-UBU-AUDIT-002Forward the journal to rsyslog only when rsyslog is the chosen loggerThe journal forwarding setting does not match the logging system in uselowautomatedautomated fixcore
CB-UBU-AUDIT-003Do not accept logs from other hostsThe system listens for log messages from the networkmediumautomatedautomated fixcore
CB-UBU-AUDIT-004Restrict access to log filesLog files are readable or writable by too many usersmediumautomatedautomated fixcore
CB-UBU-AUDIT-005Run rsyslog and create its log files with restricted permissionsrsyslog is installed but does not run, or writes logs readable by everyonelowautomatedautomated fixcore
CB-UBU-AUDIT-006Review which messages rsyslog writes and whereThe rsyslog rules have not been reviewed against the site logging needslowmanualcore
CB-UBU-AUDIT-007Rotate log files with logrotateText log files are never rotatedlowautomatedautomated fixcore
CB-UBU-AUDIT-008Send system logs to a remote log serverSystem logs are only stored on the system that produced themmediummanualcore
CB-UBU-AUDIT-009Encrypt and authenticate the rsyslog connection to the log serverLogs are sent to the log server without TLSmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-010Give each exposed service its own activity logService activity is mixed into general logs or not logged at alllowmanualserver-hardened
CB-UBU-AUDIT-011Install and run the audit daemonThe kernel audit records are not collectedmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-012Enable auditing from boot with a large enough backlogProcesses started before auditd are not auditedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-013Keep audit logs instead of rotating them awayOld audit logs are deleted automaticallymediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-014Decide and configure what happens when the audit disk fills upThe system keeps running without recording audit events when the audit log space runs outmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-015Send audit records to a remote serverAudit records are only stored on the audited systemmediumautomatedserver-hardened
CB-UBU-AUDIT-016Audit changes to sudo rights and commands run as another userChanges to administrator rights and use of other identities are not recordedmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-017Audit changes to the system clock and time zoneChanges to the system time are not recordedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-018Audit changes to the host name and network configurationChanges to the host identity and network settings are not recordedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-019Audit changes to accounts, groups and authentication settingsChanges to accounts and authentication settings are not recordedmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-020Audit changes to file permissions, owners and extended attributesChanges to file permissions and ownership are not recordedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-021Audit denied attempts to open or truncate filesFailed attempts to access files are not recordedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-022Audit file system mounts and unmounts by usersFile system mounts by users are not recordedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-023Audit file deletions and renames by usersFile deletions and renames by users are not recordedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-024Audit changes to the AppArmor configurationChanges to the mandatory access control policy are not recordedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-025Audit kernel module loading and unloadingKernel modules can be loaded or removed without a recordmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-026Audit every use of setuid and setgid programsUse of privileged programs is not recordedmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-027Audit login records and session filesTampering with login records is not detectedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-028Audit changes to scheduled tasks and to the systemd journalChanges to scheduled tasks and journal files are not recordedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-029Lock the audit configuration and load every valid ruleThe audit rules can be changed or disabled on the running systemmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-030Restrict access to the audit logsAudit logs can be read or changed by users other than rootmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-031Restrict access to the audit configuration and toolsAudit configuration or tools can be changed by users other than rootmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-032Install the AIDE file integrity checkerNo file integrity checker is installedmediumautomatedautomated fixcore
CB-UBU-AUDIT-033Check the integrity of the audit tools with AIDEA modified audit tool would not be detectedlowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUDIT-034Build the AIDE database and check file integrity every dayFile integrity is never checkedmediumautomatedautomated fixcore
CB-UBU-AUDIT-035Keep a protected copy of the AIDE databaseThe AIDE reference database is only stored on the system it protectsmediummanualserver-hardened, desktop-hardened
CB-UBU-AUDIT-036Audit administrative commands that are not setuidUse of administrative commands is not recordedmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUTH-001Show a legal warning before login, without system detailsThe login prompt shows the operating system version and no legal warninglowautomatedautomated fixcore
CB-UBU-AUTH-002Keep system details out of the message of the dayThe message of the day shows the operating system version and kernel release to every user who logs inlowautomatedautomated fixcore
CB-UBU-AUTH-003Protect the login banner files from modificationLogin banner files can be changed by non-root userslowautomatedautomated fixcore
CB-UBU-AUTH-004Install sudo for administrative accesssudo is not installedmediumautomatedautomated fixcore
CB-UBU-AUTH-005Configure sudo to use a pseudo-terminal, a log file and a short credential cachesudo defaults allow terminal hijacking, keep no local log or cache credentials too longmediumautomatedautomated fixcore
CB-UBU-AUTH-006Require a password for every sudo ruleSome sudo rules run commands without asking for a passwordhighautomatedserver-hardened, desktop-hardened
CB-UBU-AUTH-007Never disable authentication for sudo globallysudo is configured to skip authenticationhighautomatedcore
CB-UBU-AUTH-008Restrict the su command to an empty groupAny user who knows a target password can switch user with sumediumautomatedautomated fixcore
CB-UBU-AUTH-009Write sudo rules with least privilegesudo rules give broader rights than the tasks needmediummanualcore
CB-UBU-AUTH-010Enforce password quality with pam_pwqualityUsers can set short or trivial passwordsmediumautomatedautomated fixcore
CB-UBU-AUTH-011Lock accounts after repeated failed loginsPasswords can be guessed without limitmediumautomatedautomated fixcore
CB-UBU-AUTH-012Prevent reuse of recent passwordsUsers can set a password they used beforelowautomatedautomated fixcore
CB-UBU-AUTH-013Refuse empty passwords and hash passwords with a strong algorithm in pam_unixpam_unix accepts accounts with an empty passwordhighautomatedautomated fixcore
CB-UBU-AUTH-014Set password aging and hashing defaults for new accountsNew accounts get passwords that never expire and are never disabled when unusedlowautomatedautomated fixcore
CB-UBU-AUTH-015Apply the password aging policy to existing accountsExisting accounts keep passwords that never expirelowautomatedautomated fixcore
CB-UBU-AUTH-016Keep root the only superuser account and protect its passwordAnother account has superuser identity, or root has no password protectionhighautomatedcore
CB-UBU-AUTH-017Keep the root PATH free of relative and writable directoriesThe root login PATH contains a relative or writable directorymediumautomatedcore
CB-UBU-AUTH-018Prevent interactive logins to system accountsA system account has a login shell or an unlocked passwordmediumautomatedautomated fixcore
CB-UBU-AUTH-019Set a restrictive default umask for login sessionsNew files are readable by every local user by defaultlowautomatedautomated fixcore
CB-UBU-AUTH-020Close idle shell sessions automaticallyIdle shell sessions stay open foreverlowautomatedautomated fixcore
CB-UBU-AUTH-021Do not list nologin as a valid shellnologin is declared as a valid login shelllowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-AUTH-022Disable reboot with Ctrl-Alt-Del on the consoleAnyone at the console can reboot the system with Ctrl-Alt-Dellowautomatedautomated fixserver-hardened
CB-UBU-AUTH-023Disable accounts that are no longer usedAccounts of people or services that left are still activemediummanualcore
CB-UBU-AUTH-024Give each service its own dedicated accountSeveral services share one account, or run as a person's accountmediummanualcore
CB-UBU-AUTH-025Replace default secrets right after installationSecrets set by the installer, an image or a vendor are still in usehighmanualserver-hardened, desktop-hardened
CB-UBU-AUTH-026Store every password hash in shadow and leave no account without a passwordAn account has its password hash in /etc/passwd, or an empty passwordhighautomatedautomated fixcore
CB-UBU-AUTH-027Keep the user and group databases consistentUser and group files contain duplicates or dangling referencesmediumautomatedcore
CB-UBU-AUTH-028Keep the shadow group emptyUsers are members of the shadow grouphighautomatedautomated fixcore
CB-UBU-AUTH-029Keep user home directories and dot files privateUser home directories or startup files are readable or writable by othersmediumautomatedautomated fixcore
CB-UBU-AUTH-030Turn off MOTD content fetched from the network (motd-news, update-notifier)The system contacts Canonical servers to build the message of the daylowautomatedautomated fixcore
CB-UBU-BOOT-001Enable full address space layout randomizationMemory layout of processes is predictablemediumautomatedautomated fixcore
CB-UBU-BOOT-002Hide kernel addresses from usersKernel memory addresses are exposed through /proc and other interfacesmediumautomatedautomated fixcore
CB-UBU-BOOT-003Restrict the kernel log buffer to privileged usersUnprivileged users can read the kernel log bufferlowautomatedautomated fixcore
CB-UBU-BOOT-004Restrict ptrace to descendant processesAny process can trace and read the memory of other processes of the same usermediumautomatedautomated fixcore
CB-UBU-BOOT-005Disable core dumps of setuid programsPrivileged programs can write their memory to core dump filesmediumautomatedautomated fixcore
CB-UBU-BOOT-006Protect symbolic links in world-writable sticky directoriesSymbolic links in shared temporary directories are followed for any usermediumautomatedautomated fixcore
CB-UBU-BOOT-007Protect hard links to files the user does not ownUsers can create hard links to files they do not ownmediumautomatedautomated fixcore
CB-UBU-BOOT-008Install and enable AppArmorAppArmor mandatory access control is not activemediumautomatedautomated fixcore
CB-UBU-BOOT-009Stop unconfined unprivileged processes from switching AppArmor profilesUnprivileged unconfined processes can move to a more permissive AppArmor profilelowautomatedautomated fixcore
CB-UBU-BOOT-010Keep no AppArmor profile in complain modeSome AppArmor profiles only log violations instead of blocking themmediumautomatedserver-hardened, desktop-hardened
CB-UBU-BOOT-011Protect the boot loader configuration with a passwordAnyone at the console can edit the boot entriesmediumautomatedcore
CB-UBU-BOOT-012Restrict access to the boot loader configurationUsers can read the boot loader configurationlowautomatedautomated fixcore
CB-UBU-BOOT-013Disable core dumpsCrashing programs can write their memory to disklowautomatedautomated fixcore
CB-UBU-BOOT-014Remove prelinkprelink is installedlowautomatedautomated fixcore
CB-UBU-BOOT-015Disable automatic crash reporting (apport, whoopsie)Crashes are collected automatically and can be sent outside the organizationmediumautomatedautomated fixcore
CB-UBU-BOOT-016Restrict unprivileged user namespaces with AppArmorAny local program can create unprivileged user namespacesmediumautomatedautomated fixcore
CB-UBU-BOOT-017Protect FIFOs and regular files in world-writable sticky directoriesPrograms can be tricked into opening FIFOs or files planted by other users in /tmplowautomatedautomated fixcore
CB-UBU-DESK-001Disable automatic mounting of removable media in GNOMEGNOME mounts and opens removable media as soon as they are plugged inmediumautomatedautomated fixserver, desktop-hardened
CB-UBU-DESK-002Show a warning banner and hide the user list on the GDM login screenThe GDM login screen lists local accounts and shows no warningmediumautomatedautomated fixdesktop
CB-UBU-DESK-003Lock GNOME sessions after a short inactivity delayUsers can extend or disable the GNOME inactivity lockmediumautomatedautomated fixdesktop
CB-UBU-DESK-004Never run software automatically from inserted media in GNOMEGNOME can start programs from inserted mediamediumautomatedautomated fixdesktop
CB-UBU-DESK-005Disable XDMCP in the display managerThe display manager accepts XDMCP remote loginshighautomatedautomated fixdesktop
CB-UBU-DESK-006Require a password at the graphical login, without automatic login or guest sessionThe display manager opens a session without a passwordhighautomatedautomated fixdesktop
CB-UBU-DESK-007Refuse root logins at the graphical login screenroot can open a graphical sessionmediumautomatedautomated fixdesktop
CB-UBU-DESK-008Lock idle sessions outside GNOME, through logind and the KDE screen lockerIdle sessions of desktops other than GNOME may never lockmediumautomatedautomated fixdesktop
CB-UBU-DESK-009Lock the session when the screen saver starts and when the system suspendsUsers can turn off the screen lock, including on suspend and lid closemediumautomatedautomated fixdesktop
CB-UBU-DESK-010Decide whether to turn off Wayland sessions in GDM (recommended - skip)GDM starts Wayland sessions, which run X11 programs through Xwaylandlowmanualserver-hardened, desktop-hardened
CB-UBU-DESK-011Remove the Ctrl-Alt-Del shortcut from GNOMECtrl-Alt-Del in GNOME opens the power-off and restart dialoglowautomatedautomated fixdesktop-hardened
CB-UBU-DESK-012Allow only known USB devices with USBGuardAny USB device plugged into the machine is acceptedmediumautomatedautomated fixdesktop-hardened
CB-UBU-FS-001Block kernel modules for filesystems the system does not useThe kernel can load modules for rarely used filesystemslowautomatedautomated fixcore
CB-UBU-FS-002Block USB mass storage and FireWire kernel modulesUSB storage devices and FireWire can be used on the systemmediumautomatedautomated fixserver, desktop-hardened
CB-UBU-FS-003Mount /tmp as a separate filesystem with nodev, nosuid and noexecPrograms can be run, or device files and setuid programs used, from /tmpmediumautomatedautomated fixcore
CB-UBU-FS-004Mount /dev/shm with nodev, nosuid and noexecPrograms can be run from the shared memory filesystemmediumautomatedautomated fixcore
CB-UBU-FS-005Put /home, /var, /var/tmp, /var/log and /var/log/audit on separate filesystemsUser data, variable data and logs share the root filesystemlowautomatedserver-hardened, desktop-hardened
CB-UBU-FS-006Mount separate filesystems with nodev, nosuid and noexec where they are not neededSeparate filesystems are mounted without restrictive optionslowautomatedcore
CB-UBU-FS-007Protect the user, group and password database filesThe account database files have weak ownership or permissionshighautomatedautomated fixcore
CB-UBU-FS-008Leave no world-writable file, and set the sticky bit on world-writable directoriesFiles can be changed by any user, or shared directories let users delete each other's filesmediumautomatedautomated fixcore
CB-UBU-FS-009Leave no file without a known owner or groupSome files belong to a user or group that does not existlowautomatedcore
CB-UBU-FS-010Review setuid and setgid programs and keep only those that are neededUnexpected setuid or setgid programs are presentmediumpartialcore
CB-UBU-FS-011Keep system programs and libraries owned by root and not writable by othersSystem programs or libraries can be changed by a non-root accounthighautomatedcore
CB-UBU-FS-012Encrypt the disks holding the system and dataFile systems or swap are stored unencrypted on diskmediumautomateddesktop-hardened
CB-UBU-NET-001Decide whether IPv6 is used, and disable or secure it accordinglyIPv6 is active without a decision to use itlowmanualcore
CB-UBU-NET-002Prevent loading of unused network protocol modulesRarely used network protocol modules can be loaded on demandmediumautomatedautomated fixcore
CB-UBU-NET-003Disable wireless network interfaces on serversA wireless network interface is available on a servermediumautomatedserver
CB-UBU-NET-004Disable the Bluetooth serviceThe Bluetooth service can be startedmediumautomatedautomated fixserver, desktop-hardened
CB-UBU-NET-005Run exactly one host firewallNo host firewall is active, or several firewall tools compete for the same ruleshighautomatedautomated fixcore
CB-UBU-NET-006Drop incoming and forwarded traffic by default, with SSH allowedThe host firewall accepts incoming or forwarded traffic that no rule allowshighautomatedautomated fixcore
CB-UBU-NET-007Drop outgoing traffic by defaultThe host firewall lets the system open any outgoing connectionmediumautomatedserver-hardened, desktop-hardened
CB-UBU-NET-008Restrict access to firewall and IPsec configuration filesFirewall or IPsec configuration files can be changed or read by non-root usersmediumautomatedautomated fixcore
CB-UBU-NET-009Disable IP forwarding unless the system is a routerThe system forwards packets between networksmediumautomatedautomated fixcore
CB-UBU-NET-010Ignore ICMP redirects and source-routed packets, and send no redirectsThe kernel accepts route changes or routing instructions from the networkmediumautomatedautomated fixcore
CB-UBU-NET-011Drop and log packets with spoofed source addressesThe kernel accepts packets whose source address cannot be genuine, without logging themmediumautomatedautomated fixcore
CB-UBU-NET-012Harden ICMP and TCP handling against floods and bogus packetsThe kernel ICMP and TCP settings leave the system open to simple floods and protocol abuselowautomatedautomated fixcore
CB-UBU-NET-013Restrict ARP answers and ignore gratuitous ARPThe kernel answers and accepts ARP messages beyond what the local network needslowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-NET-014Ignore IPv6 router advertisementsThe kernel configures IPv6 addresses and routes from any router advertisementmediumautomatedautomated fixcore
CB-UBU-NET-015Use only strong ciphers, MACs and key exchange algorithms in the SSH serverThe SSH server accepts weak or outdated cryptographic algorithmsmediumautomatedautomated fixcore
CB-UBU-NET-016Restrict SSH authentication to named accounts with strong methodsThe SSH server allows root logins, weak authentication methods or unlimited guessinghighautomatedautomated fixcore
CB-UBU-NET-017Limit SSH connections and close dead sessionsThe SSH server keeps dead sessions open and accepts many concurrent unauthenticated connectionslowautomatedautomated fixcore
CB-UBU-NET-018Disable SSH forwardingSSH sessions can forward ports, sockets, X11 and the SSH agentmediumautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-NET-019Log SSH logins with enough detailThe SSH server logs too little to trace loginslowautomatedautomated fixcore
CB-UBU-NET-020Show the legal warning banner before SSH authenticationThe SSH server shows no warning before authenticationlowautomatedautomated fixcore
CB-UBU-NET-021Limit SSH logins to the users and groups that need themEvery account with a valid credential can log in over SSHmediummanualcore
CB-UBU-NET-022Protect the SSH server configuration and host keysSSH server configuration or host keys can be read or changed by non-root usershighautomatedautomated fixcore
CB-UBU-NET-023Restrict access to netplan configuration filesNetplan configuration files can be read or changed by non-root usersmediumautomatedautomated fixcore
CB-UBU-PKG-001Bind every APT repository to its signing keyAPT repositories are not bound to a signing key or bypass signature checkshighautomatedautomated fixcore
CB-UBU-PKG-002Download packages over HTTPSAPT downloads from repositories over an unencrypted protocollowautomatedautomated fixcore
CB-UBU-PKG-003Keep APT signature, freshness and TLS checks enabledAPT is configured to accept unsigned, weakly signed, outdated or unverified repositorieshighautomatedautomated fixcore
CB-UBU-PKG-004Restrict write access to APT keys and repository listsNon-root users can change the APT keys or repository listsmediumautomatedautomated fixcore
CB-UBU-PKG-005Restrict access to APT repository credentialsAPT repository credentials are readable or writable by other usersmediumautomatedautomated fixcore
CB-UBU-PKG-006Configure the Ubuntu security pocketThe Ubuntu security pocket is not configuredhighautomatedcore
CB-UBU-PKG-007Install security updates automaticallySecurity updates are not installed automaticallymediumautomatedautomated fixcore
CB-UBU-PKG-008Leave no security update pendingSecurity updates are available but not installedmediumautomatedcore
CB-UBU-PKG-009Run an Ubuntu release that still receives security updatesThe Ubuntu release no longer receives security updateshighautomatedcore
CB-UBU-PKG-010Install only the packages the system needsPackages without a use on this system are installedlowmanualcore
CB-UBU-PKG-011Do not install recommended and suggested packages automaticallyAPT installs recommended packages automaticallylowautomatedautomated fixserver-hardened, desktop-hardened
CB-UBU-PKG-012Keep snap packages refreshed automaticallySnap packages are not refreshed automaticallymediumautomatedautomated fixcore
CB-UBU-PKG-013Reboot after updates that require it, or use LivepatchThe system has waited too long for a reboot that updates requiremediumautomatedcore
CB-UBU-PKG-014Receive security updates for every installed package, including universe (Ubuntu Pro esm-apps)Packages from universe are installed without Ubuntu Pro esm-appsmediumautomatedserver, desktop-hardened
CB-UBU-SVC-001Disable DHCP and DNS server services the system does not provideDHCP or DNS server services can run on a system that does not provide themmediumautomatedautomated fixcore
CB-UBU-SVC-002Disable file transfer and file sharing server services the system does not provideFTP, TFTP, rsync or Samba servers can run on a system that does not provide themmediumautomatedautomated fixcore
CB-UBU-SVC-003Remove the NFS server and disable rpcbind when the system does not provide themThe NFS server or rpcbind can run on a system that does not need themmediumautomatedautomated fixcore
CB-UBU-SVC-004Disable LDAP and NIS directory server services the system does not provideAn LDAP or NIS directory server can run on a system that does not provide onemediumautomatedautomated fixcore
CB-UBU-SVC-005Disable IMAP and POP3 mail access servers the system does not provideAn IMAP or POP3 server can run on a system that does not provide mailboxesmediumautomatedautomated fixcore
CB-UBU-SVC-006Disable the SNMP agent and trap receiver when they are not usedAn SNMP agent or trap receiver can run on a system that is not monitored through SNMPmediumautomatedautomated fixcore
CB-UBU-SVC-007Remove telnet, rsh and talk servers and disable inetd super-serversClear-text remote access servers or an inetd super-server are presenthighautomatedautomated fixcore
CB-UBU-SVC-008Disable web server services on systems that do not serve web contentA web server can run on a system that does not serve web contentmediumautomatedautomated fixcore
CB-UBU-SVC-009Disable the Squid web proxy on systems that are not proxy serversA web proxy can run on a system that is not a proxy servermediumautomatedautomated fixcore
CB-UBU-SVC-010Restrict the mail transfer agent to local deliveryThe mail transfer agent accepts connections from the networkmediumautomatedautomated fixcore
CB-UBU-SVC-011Forward mail for root to a monitored mailboxMail sent to root stays unread on the systemlowautomatedcore
CB-UBU-SVC-012Only approved services listen on network interfacesServices nobody approved accept connections from the networkmediumpartialcore
CB-UBU-SVC-013Remove clear-text network clients (NIS, rsh, talk, telnet, LDAP tools, FTP)Clients for clear-text or obsolete network protocols are installedlowautomatedautomated fixcore
CB-UBU-SVC-014Run exactly one time synchronization daemonThe system clock is not synchronized, or several daemons fight over itmediumautomatedcore
CB-UBU-SVC-015Configure systemd-timesyncd with approved time servers and keep it runningsystemd-timesyncd uses built-in fallback servers or is not runninglowautomatedautomated fixcore
CB-UBU-SVC-016Configure chrony with time sources, run it unprivileged and keep it runningchrony has no time source, runs as root or is not runninglowautomatedautomated fixcore
CB-UBU-SVC-017Keep the cron daemon enabled and runningThe cron daemon is installed but not runninglowautomatedautomated fixcore
CB-UBU-SVC-018Restrict the system crontab and cron directories to rootUsers can read the system cron jobsmediumautomatedautomated fixcore
CB-UBU-SVC-019Allow only listed users to schedule jobs with crontab and atAny local user can schedule jobs with crontab or atmediumautomatedautomated fixcore
CB-UBU-SVC-020Encrypt SSSD LDAP connections and verify the server certificateSSSD talks to the LDAP directory without TLS or without checking the server certificatehighautomatedcore
CB-UBU-SVC-021Disable the autofs automounterThe autofs automounter can mount file systems on demandmediumautomatedautomated fixserver, desktop-hardened
CB-UBU-SVC-022Disable the Avahi mDNS/DNS-SD daemonAvahi announces the system and its services on the local networkmediumautomatedautomated fixserver, desktop-hardened
CB-UBU-SVC-023Disable the CUPS print server and printer discoveryThe CUPS print service runs on a system that does not printmediumautomatedautomated fixserver, desktop-hardened
CB-UBU-SVC-024Remove the X Window System server and the GNOME display manager from serversAn X Window System server or a graphical login manager is installed on a serverlowautomatedautomated fixserver-hardened
CB-UBU-SVC-025Confine services with systemd sandboxing optionsNetwork-facing services run with the full privileges systemd gives by defaultmediumpartialserver-hardened
CB-UBU-SVC-026Disable the kdump kernel crash dump serviceKernel crash dumps are collected on the systemlowautomatedautomated fixserver-hardened
CB-UBU-SVC-027Remove the NFS client utilities when no NFS share is mountedNFS client utilities are installed on a system that mounts no NFS sharelowautomatedautomated fixserver-hardened
CB-UBU-SVC-028Disable cloud-init once the server is provisionedcloud-init still runs at every boot on a provisioned servermediumautomatedautomated fixserver-hardened
CB-UBU-SVC-029Do not send usage data to Canonical (popularity-contest, ubuntu-report, ubuntu-insights)The system can send its package list or hardware details to Canonicallowautomatedautomated fixcore
02

Profiles

Core core
Settings every Ubuntu system should apply, server or desktop. Low operational impact. 112 controls.
Server server
Core plus settings for headless servers. Extends core: applies every one of its controls too. 120 controls.
Server hardened server-hardened
Stronger settings for exposed or sensitive servers. May break some workloads. Extends server: applies every one of its controls too. 162 controls.
Desktop desktop
Core plus settings for workstations with a graphical session. Extends core: applies every one of its controls too. 120 controls.
Desktop hardened desktop-hardened
Stronger settings for admin or mobile workstations. May hinder some uses. Extends desktop: applies every one of its controls too. 164 controls.
03

Domains

Boot & system hardening CB-UBU-BOOT-NNN
17 controls.
Accounts & authentication CB-UBU-AUTH-NNN
30 controls.
Network CB-UBU-NET-NNN
23 controls.
Services CB-UBU-SVC-NNN
29 controls.
Filesystem & permissions CB-UBU-FS-NNN
12 controls.
Logging & auditing CB-UBU-AUDIT-NNN
36 controls.
Desktop environment CB-UBU-DESK-NNN
12 controls.
Packages & updates CB-UBU-PKG-NNN
14 controls.
04

Facts

27 detected

Conditions a scanner detects on its own, once per target. A control, check or fix that needs a false fact is not applicable there.

OpenSSH server is installed openssh-server
Used by 9 controls.
name: openssh-server
state: installed
A sudo command is installed (sudo or sudo-rs) sudo
Used by 4 controls.
script: command -v sudo >/dev/null 2>&1
auditd is installed auditd
Used by 0 controls.
name: auditd
state: installed
rsyslog is installed rsyslog
Used by 4 controls.
name: rsyslog
state: installed
chrony is installed chrony
Used by 1 control.
name: chrony
state: installed
systemd-timesyncd is installed systemd-timesyncd
Used by 1 control.
name: systemd-timesyncd
state: installed
ufw is installed ufw
Used by 3 controls.
name: ufw
state: installed
nftables is installed nftables
Used by 2 controls.
name: nftables
state: installed
systemd-coredump is installed systemd-coredump
Used by 1 control.
name: systemd-coredump
state: installed
cron is installed cron
Used by 3 controls.
name: cron
state: installed
GNOME Display Manager is installed gdm
Used by 4 controls.
name: gdm3
state: installed
GNOME desktop is installed desktop-gnome
Used by 5 controls.
name: gnome-shell
state: installed
KDE Plasma desktop is installed desktop-kde
Used by 2 controls.
name: plasma-workspace
state: installed
Xfce desktop is installed desktop-xfce
Used by 0 controls.
name: xfce4-session
state: installed
IPv6 is enabled in the kernel ipv6
Used by 3 controls.
script: test -d /proc/sys/net/ipv6
GRUB is the boot loader grub
Used by 3 controls.
script: test -f /boot/grub/grub.cfg
LightDM display manager is installed lightdm
Used by 2 controls.
name: lightdm
state: installed
SDDM display manager is installed sddm
Used by 1 control.
name: sddm
state: installed
The kernel has USB support usb
Used by 1 control.
script: test -d /sys/bus/usb
A mail transfer agent is installed mta
Used by 2 controls.
script: test -x /usr/sbin/sendmail
at is installed at
Used by 1 control.
name: at
state: installed
SSSD LDAP provider is installed sssd-ldap
Used by 1 control.
name: sssd-ldap
state: installed
sudo is provided by sudo-rs sudo-rs
Used by 0 controls.
script: sudo --version 2>/dev/null | head -n 1 | grep -q '^sudo-rs'
snapd is installed snapd
Used by 1 control.
name: snapd
state: installed
cloud-init is installed cloud-init
Used by 1 control.
name: cloud-init
state: installed
apport is installed apport
Used by 1 control.
name: apport
state: installed
The system is attached to Ubuntu Pro ubuntu-pro
Used by 1 control.
script: |
  pro api u.pro.status.is_attached.v1 2>/dev/null | grep -Eq '"is_attached": ?true'
05

Versions

3 released
VersionReleasedControlsFiles
mainunreleased, v0.1.0 in progresssource
v0.1.2 (beta)2026-10-19173release archive
v0.1.1 (beta)2026-10-19173release archive
v0.1.0 (beta)2026-10-19173release archive

A release is the git tag ubuntu/v<version>: a zip with the controls and their translations, bundle.json, index.json, an OSCAL catalog and profiles, and per profile the generated audit.sh, remediate.sh and Ansible role.

06

Run it

v0.1.0 (beta)

Each release ships, per profile, scripts generated from its controls. They need only POSIX sh, run on the machine itself and send nothing anywhere. Profiles in v0.1.0: core, server, server-hardened, desktop, desktop-hardened. A beta published for testing: it may still change before a final release.

# Warning: do not execute code or commands that you don't understand
# Download the release and check its checksum
curl -LO https://github.com/cirsec/baselines/releases/download/ubuntu/v0.1.0/cirsec-baselines-ubuntu-0.1.0.zip
curl -LO https://github.com/cirsec/baselines/releases/download/ubuntu/v0.1.0/cirsec-baselines-ubuntu-0.1.0.zip.sha256
sha256sum -c cirsec-baselines-ubuntu-0.1.0.zip.sha256
unzip -q cirsec-baselines-ubuntu-0.1.0.zip
cd cirsec-baselines-ubuntu-0.1.0/generated/server

# Audit: changes nothing, prints a report, writes the result JSON here
sudo sh audit.sh

# Fix what failed: dry run first, then apply
sudo sh remediate.sh
sudo sh remediate.sh --apply
The report
A summary and a score, then the failures by severity with the observed and expected values, the checks that could not run, and what to check by hand. Colors on a terminal only, none with NO_COLOR. --verbose lists every entry.
The result JSON
On a terminal it goes to cirsec-result-<host>-<date>.json; redirected (sudo sh audit.sh > result.json) it goes to stdout, for a pipeline or a dashboard. Format: result.schema.json. audit.sh exits 1 when anything fails or cannot run.
Fixes
remediate.sh runs a fix only where its check fails and checks again after. Files are backed up under /var/backups/cirsec/ first, services restart once at the end, and it says when a reboot or a new login is needed. Fixes that can cut off administrative access stay off unless a tailoring file opts in.
One control, or Ansible
controls/<ID>.sh check runs one control (exit 0 pass, 1 fail, 2 not applicable, 3 error, 4 manual). The ansible/ folder holds the same checks and fixes as a role: ansible-playbook -i <host>, ansible/site.yml --check.
Your own settings
A tailoring file picks the profile, tunes parameters within their bounds and excludes controls with a reason. Regenerate the scripts with it: python tools/generate.py --standard ubuntu --tailoring yours.yml.
07

Written from

Maintained by1

Text under CC BY 4.0, code under Apache 2.0 · Source _standard.yml