ADD(1.7.x): add apparmor checks

This commit is contained in:
Thibault Ayanides 2020-12-23 10:46:51 +01:00
parent 936b84c0f2
commit 8da1107532
9 changed files with 179 additions and 41 deletions

View File

@ -17,14 +17,31 @@ HARDENING_LEVEL=3
# shellcheck disable=2034 # shellcheck disable=2034
DESCRIPTION="Install AppArmor." DESCRIPTION="Install AppArmor."
PACKAGES='apparmor apparmor-utils'
# This function will be called if the script status is on enabled / audit mode # This function will be called if the script status is on enabled / audit mode
audit() { audit() {
: for PACKAGE in $PACKAGES; do
is_pkg_installed "$PACKAGE"
if [ "$FNRET" != 0 ]; then
crit "$PACKAGE is absent!"
else
ok "$PACKAGE is installed"
fi
done
} }
# This function will be called if the script status is on enabled mode # This function will be called if the script status is on enabled mode
apply() { apply() {
: for PACKAGE in $PACKAGES; do
is_pkg_installed "$PACKAGE"
if [ "$FNRET" = 0 ]; then
ok "$PACKAGE is installed"
else
crit "$PACKAGE is absent, installing it"
apt_install "$PACKAGE"
fi
done
} }
# This function will check config parameters required # This function will check config parameters required

View File

@ -17,16 +17,18 @@ HARDENING_LEVEL=3
# shellcheck disable=2034 # shellcheck disable=2034
DESCRIPTION="Activate AppArmor to enforce permissions control." DESCRIPTION="Activate AppArmor to enforce permissions control."
PACKAGE='apparmor' PACKAGES='apparmor apparmor-utils'
# This function will be called if the script status is on enabled / audit mode # This function will be called if the script status is on enabled / audit mode
audit() { audit() {
is_pkg_installed "$PACKAGE" for PACKAGE in $PACKAGES; do
if [ "$FNRET" != 0 ]; then is_pkg_installed "$PACKAGE"
crit "$PACKAGE is absent!" if [ "$FNRET" != 0 ]; then
else crit "$PACKAGE is absent!"
ok "$PACKAGE is installed" else
fi ok "$PACKAGE is installed"
fi
done
ERROR=0 ERROR=0
RESULT=$($SUDO_CMD grep "^\s*linux" /boot/grub/grub.cfg) RESULT=$($SUDO_CMD grep "^\s*linux" /boot/grub/grub.cfg)
@ -43,19 +45,22 @@ audit() {
done done
IFS=$d_IFS IFS=$d_IFS
if [ "$ERROR" = 0 ]; then if [ "$ERROR" = 0 ]; then
ok "$PACKAGE is configured" ok "$PACKAGES are configured"
fi fi
} }
# This function will be called if the script status is on enabled mode # This function will be called if the script status is on enabled mode
apply() { apply() {
is_pkg_installed "$PACKAGE" for PACKAGE in $PACKAGES; do
if [ "$FNRET" != 0 ]; then is_pkg_installed "$PACKAGE"
crit "$PACKAGE is not installed, please install $PACKAGE and configure it" if [ "$FNRET" = 0 ]; then
else ok "$PACKAGE is installed"
ok "$PACKAGE is installed" else
fi crit "$PACKAGE is absent, installing it"
apt_install "$PACKAGE"
fi
done
ERROR=0 ERROR=0
RESULT=$($SUDO_CMD grep "^\s*linux" /boot/grub/grub.cfg) RESULT=$($SUDO_CMD grep "^\s*linux" /boot/grub/grub.cfg)
@ -76,7 +81,7 @@ apply() {
$SUDO_CMD sed -i "s/GRUB_CMDLINE_LINUX=\"/GRUB_CMDLINE_LINUX=\"apparmor=1 security=apparmor/" /etc/default/grub $SUDO_CMD sed -i "s/GRUB_CMDLINE_LINUX=\"/GRUB_CMDLINE_LINUX=\"apparmor=1 security=apparmor/" /etc/default/grub
$SUDO_CMD update-grub $SUDO_CMD update-grub
else else
ok "$PACKAGE is configured" ok "$PACKAGES are configured"
fi fi
} }

View File

@ -17,14 +17,48 @@ HARDENING_LEVEL=3
# shellcheck disable=2034 # shellcheck disable=2034
DESCRIPTION="Enforce or complain AppArmor profiles." DESCRIPTION="Enforce or complain AppArmor profiles."
PACKAGES='apparmor apparmor-utils'
# This function will be called if the script status is on enabled / audit mode # This function will be called if the script status is on enabled / audit mode
audit() { audit() {
: for PACKAGE in $PACKAGES; do
is_pkg_installed "$PACKAGE"
if [ "$FNRET" != 0 ]; then
crit "$PACKAGE is absent!"
else
ok "$PACKAGE is installed"
fi
done
RESULT_UNCONFINED=$($SUDO_CMD apparmor_status | grep "^0 processes are unconfined but have a profile defined")
if [ -n "$RESULT_UNCONFINED" ]; then
ok "No profiles are unconfined"
else
crit "Some processes are unconfined while they have defined profile"
fi
} }
# This function will be called if the script status is on enabled mode # This function will be called if the script status is on enabled mode
apply() { apply() {
: for PACKAGE in $PACKAGES; do
is_pkg_installed "$PACKAGE"
if [ "$FNRET" != 0 ]; then
crit "$PACKAGES is absent!"
else
ok "$PACKAGE is installed"
fi
done
RESULT_UNCONFINED=$(apparmor_status | grep "^0 processes are unconfined but have a profile defined")
if [ -n "$RESULT_UNCONFINED" ]; then
ok "No profiles are unconfined"
else
warn "Some processes are unconfined while they have defined profile, setting profiles to complain mode"
aa-complain /etc/apparmor.d/*
fi
} }
# This function will check config parameters required # This function will check config parameters required

View File

@ -17,14 +17,62 @@ HARDENING_LEVEL=3
# shellcheck disable=2034 # shellcheck disable=2034
DESCRIPTION="Enforce Apparmor profiles." DESCRIPTION="Enforce Apparmor profiles."
PACKAGES='apparmor apparmor-utils'
# This function will be called if the script status is on enabled / audit mode # This function will be called if the script status is on enabled / audit mode
audit() { audit() {
: for PACKAGE in $PACKAGES; do
is_pkg_installed "$PACKAGE"
if [ "$FNRET" != 0 ]; then
crit "$PACKAGE is absent!"
else
ok "$PACKAGE is installed"
fi
done
RESULT_UNCONFINED=$($SUDO_CMD apparmor_status | grep "^0 processes are unconfined but have a profile defined")
RESULT_COMPLAIN=$($SUDO_CMD apparmor_status | grep "^0 profiles are in complain mode.")
if [ -n "$RESULT_UNCONFINED" ]; then
ok "No profiles are unconfined"
else
crit "Some processes are unconfined while they have defined profile"
fi
if [ -n "$RESULT_COMPLAIN" ]; then
ok "No profiles are in complain mode"
else
crit "Some processes are in complain mode"
fi
} }
# This function will be called if the script status is on enabled mode # This function will be called if the script status is on enabled mode
apply() { apply() {
: for PACKAGE in $PACKAGES; do
is_pkg_installed "$PACKAGE"
if [ "$FNRET" != 0 ]; then
crit "$PACKAGE is absent!"
else
ok "$PACKAGE is installed"
fi
done
RESULT_UNCONFINED=$(apparmor_status | grep "^0 processes are unconfined but have a profile defined")
RESULT_COMPLAIN=$(apparmor_status | grep "^0 profiles are in complain mode.")
if [ -n "$RESULT_UNCONFINED" ]; then
ok "No profiles are unconfined"
else
warn "Some processes are unconfined while they have defined profile, setting profiles to enforce mode"
aa-enforce /etc/apparmor.d/*
fi
if [ -n "$RESULT_COMPLAIN" ]; then
ok "No profiles are in complain mode"
else
warn "Some processes are in complain mode, setting profiles to enforce mode"
aa-enforce /etc/apparmor.d/*
fi
} }
# This function will check config parameters required # This function will check config parameters required

View File

@ -19,6 +19,7 @@ Cmnd_Alias SCL_CMD = /bin/grep ,\
/sbin/sysctl kernel.*,\ /sbin/sysctl kernel.*,\
/sbin/sysctl -a,\ /sbin/sysctl -a,\
/bin/dmesg "",\ /bin/dmesg "",\
/bin/netstat /bin/netstat,\
/usr/sbin/apparmor_status
cisharden ALL = (root) NOPASSWD: SCL_CMD cisharden ALL = (root) NOPASSWD: SCL_CMD

View File

@ -1,11 +1,22 @@
# shellcheck shell=bash # shellcheck shell=bash
# run-shellcheck # run-shellcheck
test_audit() { test_audit() {
describe Running on blank host if [ -f "/.dockerenv" ]; then
register_test retvalshouldbe 0 skip "SKIPPED on docker"
dismiss_count_for_test else
# shellcheck disable=2154 describe Running on blank host
run blank /opt/debian-cis/bin/hardening/"${script}".sh --audit-all register_test retvalshouldbe 0
dismiss_count_for_test
# shellcheck disable=2154
run blank /opt/debian-cis/bin/hardening/"${script}".sh --audit-all
# TODO fill comprehensive tests describe correcting situation
sed -i 's/audit/enabled/' /opt/debian-cis/etc/conf.d/"${script}".cfg
/opt/debian-cis/bin/hardening/"${script}".sh --apply || true
describe Checking resolved state
register_test retvalshouldbe 0
register_test contain "is installed"
run resolved /opt/debian-cis/bin/hardening/"${script}".sh --audit-all
fi
} }

View File

@ -16,7 +16,7 @@ test_audit() {
describe Checking resolved state describe Checking resolved state
register_test retvalshouldbe 0 register_test retvalshouldbe 0
register_test contain "is configured" register_test contain "are configured"
run resolved /opt/debian-cis/bin/hardening/"${script}".sh --audit-all run resolved /opt/debian-cis/bin/hardening/"${script}".sh --audit-all
fi fi
} }

View File

@ -1,11 +1,22 @@
# shellcheck shell=bash # shellcheck shell=bash
# run-shellcheck # run-shellcheck
test_audit() { test_audit() {
describe Running on blank host if [ -f "/.dockerenv" ]; then
register_test retvalshouldbe 0 skip "SKIPPED on docker"
dismiss_count_for_test else
# shellcheck disable=2154 describe Running on blank host
run blank /opt/debian-cis/bin/hardening/"${script}".sh --audit-all register_test retvalshouldbe 0
dismiss_count_for_test
# shellcheck disable=2154
run blank /opt/debian-cis/bin/hardening/"${script}".sh --audit-all
# TODO fill comprehensive tests describe correcting situation
sed -i 's/audit/enabled/' /opt/debian-cis/etc/conf.d/"${script}".cfg
/opt/debian-cis/bin/hardening/"${script}".sh --apply || true
describe Checking resolved state
register_test retvalshouldbe 0
register_test contain "No profiles are unconfined"
run resolved /opt/debian-cis/bin/hardening/"${script}".sh --audit-all
fi
} }

View File

@ -1,11 +1,22 @@
# shellcheck shell=bash # shellcheck shell=bash
# run-shellcheck # run-shellcheck
test_audit() { test_audit() {
describe Running on blank host if [ -f "/.dockerenv" ]; then
register_test retvalshouldbe 0 skip "SKIPPED on docker"
dismiss_count_for_test else
# shellcheck disable=2154 describe Running on blank host
run blank /opt/debian-cis/bin/hardening/"${script}".sh --audit-all register_test retvalshouldbe 0
dismiss_count_for_test
# shellcheck disable=2154
run blank /opt/debian-cis/bin/hardening/"${script}".sh --audit-all
# TODO fill comprehensive tests describe correcting situation
sed -i 's/audit/enabled/' /opt/debian-cis/etc/conf.d/"${script}".cfg
/opt/debian-cis/bin/hardening/"${script}".sh --apply || true
describe Checking resolved state
register_test retvalshouldbe 0
register_test contain "No profiles are unconfined"
run resolved /opt/debian-cis/bin/hardening/"${script}".sh --audit-all
fi
} }