A quick way to make a Ubuntu server a bit more secure.
Tested on 18.04 Bionic Beaver
, 18.10 Cosmic Cuttlefish
and
Ubuntu 19.04 Disco Dingo (development branch)
.
Systemd required.
If you’re just interested in the security focused systemd configuration, it’s available as a separate document.
If you’re interested in testing your host settings, you’ll find the instructions here.
If you’re using Ansible, a playbook with most of the above functions implemented is available in my Ansible repository konstruktoid/ansible-role-hardening.
Note
|
This is a constant work in progress. Make sure you understand what it
does. Read the code .
|
Start the installation of the server.
Pick language, keyboard layout, timezone and so on as you usually would.
/
/boot (rw)
/home (rw,nosuid,nodev)
swap
/var
/var/log (rw,nosuid,nodev,noexec)
/var/log/audit (rw,nosuid,nodev,noexec)
Note that /tmp
and /var/tmp
will be added automatically by the script.
Do not add any packages.
Log in.
Select a Grub2 password (using grub-mkpasswd-pbkdf2
).
Download the script using git clone https://github.com/konstruktoid/hardening.git
.
Change the configuration options in the ubuntu.cfg
file and last but not least
run the script, sudo bash ubuntu.sh
.
FW_ADMIN='127.0.0.1' // (1)
SSH_GRPS='sudo' // (2)
SYSCTL_CONF='./misc/sysctl.conf' // (3)
AUDITD_MODE='1' // (4)
AUDITD_RULES='./misc/audit-base.rules ./misc/audit-aggressive.rules ./misc/audit-docker.rules' // (5)
LOGROTATE_CONF='./misc/logrotate.conf' // (6)
NTPSERVERPOOL='0.ubuntu.pool.ntp.org 1.ubuntu.pool.ntp.org 2.ubuntu.pool.ntp.org 3.ubuntu.pool.ntp.org pool.ntp.org' // (7)
TIMEDATECTL='' // (8)
VERBOSE='N' // (9)
AUTOFILL='N' // (10)
CHANGEME='' // (11)
# Configuration files
ADDUSER='/etc/adduser.conf'
AUDITDCONF='/etc/audit/auditd.conf'
AUDITRULES='/etc/audit/rules.d/hardening.rules'
COMMONPASSWD='/etc/pam.d/common-password'
COMMONACCOUNT='/etc/pam.d/common-account'
COMMONAUTH='/etc/pam.d/common-auth'
DEFAULTGRUB='/etc/default/grub'
DISABLEMNT='/etc/modprobe.d/disablemnt.conf'
DISABLEMOD='/etc/modprobe.d/disablemod.conf'
DISABLENET='/etc/modprobe.d/disablenet.conf'
JOURNALDCONF='/etc/systemd/journald.conf'
LIMITSCONF='/etc/security/limits.conf'
LOGINDCONF='/etc/systemd/logind.conf'
LOGINDEFS='/etc/login.defs'
LOGROTATE='/etc/logrotate.conf'
PAMLOGIN='/etc/pam.d/login'
RESOLVEDCONF='/etc/systemd/resolved.conf'
RKHUNTERCONF='/etc/default/rkhunter'
SECURITYACCESS='/etc/security/access.conf'
SSHDFILE='/etc/ssh/sshd_config'
SYSCTL='/etc/sysctl.conf'
SYSTEMCONF='/etc/systemd/system.conf'
TIMESYNCD='/etc/systemd/timesyncd.conf'
UFWDEFAULT='/etc/default/ufw'
USERADD='/etc/default/useradd'
USERCONF='/etc/systemd/user.conf'
-
The IP addresses that will be able to connect with SSH, separated by spaces.
-
Which group the users have to be member of in order to acess via SSH, separated by spaces.
-
Stricter sysctl settings.
-
Auditd failure mode. 0=silent 1=printk 2=panic.
-
Auditd rules.
-
Logrotate settings.
-
NTP server pool.
-
Add a specific time zone or use the system default by leaving it empty.
-
If you want all the details or not.
-
Let the script guess the
FW_ADMIN
andSSH_GRPS
settings. -
Add something just to verify that you actually glanced the code.
CCE-80137-3, CCE-80138-1, CCE-80139-9, CCE-80140-7, CCE-80141-5, CCE-80142-3, CCE-80143-1, UBTU-16-010070
Disable cramfs
freevxfs
jffs2
hfs
hfsplus
squashfs
udf
vfat
file
systems.
Disable coredumps and crash shells, set DefaultLimitNOFILE
and
DefaultLimitNPROC
to 1024.
Configure /tmp/
and /var/tmp/
. Remove floppy drivers from /etc/fstab
and add hidepid=2
to /proc
.
CCE-26895-3, UBTU-16-010010, UBTU-16-010560, UBTU-16-010570
Configure dpkg
and apt-get
. apt-get
update and upgrade.
CCE-80205-8, UBTU-16-010150, UBTU-16-010170, UBTU-16-010190, UBTU-16-010210, UBTU-16-010220, UBTU-16-010640
Modify /etc/login.defs
, e.g. UMASK
, password age limits and
SHA_CRYPT_MAX_ROUNDS
.
Limit /etc/securetty
to console
, and root
from 127.0.0.1 in
/etc/security/access.conf
.
UBTU-16-010050, UBTU-16-010500, UBTU-16-010600
Installs acct
aide-common
apparmor-profiles
apparmor-utils
auditd
debsums
haveged
libpam-apparmor
libpam-cracklib
libpam-tmpdir
openssh-server
postfix
rkhunter
vlock
.
Removes avahi*
beep
popularity-contest
rsh*
talk*
telnet*
tftp*
yp-tools
ypbind
xinetd
.
CCE-27471-2, CCE-27082-7, CCE-27433-2, CCE-27314-4, CCE-27363-1, CCE-27413-4, CCE-80222-3, CCE-80223-1, CCE-80225-6, CCE-80224-9, CCE-27445-6, UBTU-16-030200, UBTU-16-030210, UBTU-16-030270, UBTU-16-030350
Configure the OpenSSH
-daemon.
UBTU-16-010090, UBTU-16-010100, UBTU-16-010110, UBTU-16-010120, UBTU-16-010120, UBTU-16-010130, UBTU-16-010140, UBTU-16-010180, UBTU-16-010230, UBTU-16-010240, UBTU-16-010250, UBTU-16-010290, UBTU-16-010320, UBTU-16-010340
Configure pam_cracklib.so
and pam_tally2.so
.
CCE-27407-6, UBTU-16-020000
Configure auditd
, use $AUDITD_RULES
and set failure mode $AUDITD_MODE
.
CCE-27327-6, CCE-27277-3, UBTU-16-010580
Disable bluetooth
bnep
btusb
firewire-core
n_hdlc
net-pf-31
pcspkr
soundcore
thunderbolt
usb-midi
usb-storage
kernel modules.
Remove suid
bits from /bin/fusermount
/bin/mount
/bin/ping
/bin/ping6
/bin/su
/bin/umount
/usr/bin/bsd-write
/usr/bin/chage
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/mlocate
/usr/bin/mtr
/usr/bin/newgrp
/usr/bin/pkexec
/usr/bin/traceroute6.iputils
/usr/bin/wall
/usr/sbin/pppd
.
UBTU-16-010780
Set root
path to /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
,
and user path to /usr/local/bin:/usr/bin:/bin
.
Disable the VRFY
command, configure smtpd_banner
, smtpd_client_restrictions
and inet_interfaces
.
f_pre
f_firewall
f_disablenet
f_disablefs
f_disablemod
f_systemdconf
f_resolvedconf
f_logindconf
f_journalctl
f_timesyncd
f_fstab
f_prelink
f_aptget_configure
f_aptget
f_hosts
f_issue
f_logindefs
f_sysctl
f_limitsconf
f_adduser
f_rootaccess
f_package_remove
f_package_install
f_coredump
f_usbguard
f_postfix
f_apport
f_motdnews
f_rkhunter
f_sshdconfig
f_password
f_cron
f_ctrlaltdel
f_auditd
f_aide
f_rhosts
f_users
f_lockroot
f_aptget_clean
f_suid
f_restrictcompilers
f_umask
f_path
f_aa_enforce
f_aide_post
f_aide_timer
f_aptget_noexec
f_systemddelta
f_checkreboot
There are approximately 450 Bats tests for most of the above settings available in the tests directory.
git clone https://github.com/konstruktoid/hardening.git
cd tests/
sudo bats .
.
├── LICENSE
├── README.adoc
├── Vagrantfile
├── action-shellcheck
│ ├── Dockerfile
│ ├── README.md
│ └── entrypoint.sh
├── checkScore.sh
├── config
│ ├── aidecheck.service
│ ├── aidecheck.timer
│ ├── initpath.sh
│ └── tmp.mount
├── createPartitions.sh
├── misc
│ ├── audit-aggressive.rules
│ ├── audit-base.rules
│ ├── audit-docker.rules
│ ├── audit.footer
│ ├── audit.header
│ ├── auditgenerator.sh
│ ├── fdcount.sh
│ ├── logrotate.conf
│ ├── proc_check.sh
│ ├── sysctl.conf
│ └── systemd_scan.sh
├── renovate.json
├── runTests.sh
├── scripts
│ ├── 01_pre
│ ├── 02_ufw
│ ├── 03_disablenet
│ ├── 04_disablefs
│ ├── 05_systemdconf
│ ├── 06_journalctl
│ ├── 07_timesyncd
│ ├── 08_fstab
│ ├── 09_prelink
│ ├── 10_aptget
│ ├── 11_hosts
│ ├── 12_logindefs
│ ├── 13_sysctl
│ ├── 14_limits
│ ├── 15_adduser
│ ├── 16_rootaccess
│ ├── 17_packages
│ ├── 18_sshdconfig
│ ├── 19_password
│ ├── 20_cron
│ ├── 21_ctraltdel
│ ├── 22_auditd
│ ├── 23_disablemod
│ ├── 24_aide
│ ├── 25_rhosts
│ ├── 26_users
│ ├── 27_suid
│ ├── 28_umask
│ ├── 29_apparmor
│ ├── 30_path
│ ├── 31_logindconf
│ ├── 32_resolvedconf
│ ├── 33_rkhunter
│ ├── 34_issue
│ ├── 35_apport
│ ├── 36_lockroot
│ ├── 37_coredump
│ ├── 38_postfix
│ ├── 39_motdnews
│ ├── 40_usbguard
│ ├── 41_compilers
│ ├── 98_systemddelta
│ └── 99_reboot
├── systemd.adoc
├── tests
│ ├── 01_pre.bats
│ ├── 02_ufw.bats
│ ├── 03_disablenet.bats
│ ├── 04_disablefs.bats
│ ├── 05_systemdconf.bats
│ ├── 06_journalctl.bats
│ ├── 07_timesyncd.bats
│ ├── 08_fstab.bats
│ ├── 10_aptget.bats
│ ├── 11_hosts.bats
│ ├── 12_logindefs.bats
│ ├── 13_sysctl.bats
│ ├── 14_limits.bats
│ ├── 15_adduser.bats
│ ├── 16_rootaccess.bats
│ ├── 17_packages.bats
│ ├── 18_sshd.bats
│ ├── 19_password.bats
│ ├── 20_cron.bats
│ ├── 21_ctrlaltdel.bats
│ ├── 22_auditd.bats
│ ├── 23_disablemod.bats
│ ├── 24_aide.bats
│ ├── 26_users.bats
│ ├── 27_suid.bats
│ ├── 28_umask.bats
│ ├── 29_apparmor.bats
│ ├── 31_logindconf.bats
│ ├── 32_resolvedconf.bats
│ ├── 33_rkhunter.bats
│ ├── 35_apport.bats
│ ├── 36_lockroot.bats
│ ├── 37_coredump.bats
│ ├── 38_postfix.bats
│ ├── 39_motdnews.bats
│ ├── 40_usbguard.bats
│ ├── 41_compilers.bats
│ ├── 99_misc.bats
│ └── test_helper.bash
├── ubuntu.cfg
└── ubuntu.sh
CIS Distribution Independent Linux Benchmark v1.0.0
Red Hat Enterprise Linux 7 Security Technical Implementation Guide Version: 1 Release: 4
Canonical Ubuntu 16.04 LTS Security Technical Implementation Guide Version: 1 Release: 1
CIS Ubuntu Linux Benchmarks
https://wiki.ubuntu.com/Security/Features
https://help.ubuntu.com/community/StricterDefaults
EUD Security Guidance: Ubuntu 18.04 LTS