evocheck/evocheck.sh

1467 lines
53 KiB
Bash
Raw Normal View History

2011-05-23 01:28:03 +02:00
#!/bin/bash
2009-07-05 01:58:11 +02:00
# EvoCheck
# Script to verify compliance of a Debian/OpenBSD server
# powered by Evolix
2009-07-05 01:58:11 +02:00
2019-03-24 21:56:20 +01:00
VERSION="0.14.0.beta2"
2009-09-14 18:58:38 +02:00
# Disable LANG*
export LANG=C
export LANGUAGE=C
2009-07-19 02:01:50 +02:00
# Default configuration values
IS_TMP_1777=1
IS_ROOT_0700=1
IS_VARTMPFS=1
IS_USRSHARESCRIPTS=1
IS_SERVEURBASE=1
IS_LOGROTATECONF=1
IS_SYSLOGCONF=1
IS_DEBIANSECURITY=1
IS_APTITUDEONLY=1
IS_APTITUDE=1
2016-08-31 15:38:38 +02:00
IS_APTGETBAK=1
2016-05-10 16:23:52 +02:00
IS_APTICRON=0
IS_USRRO=1
IS_TMPNOEXEC=1
IS_LISTCHANGESCONF=1
IS_DPKGWARNING=1
IS_CUSTOMCRONTAB=1
IS_CUSTOMSUDOERS=1
IS_SSHPERMITROOTNO=1
IS_SSHALLOWUSERS=1
IS_TMOUTPROFILE=1
IS_ALERT5BOOT=1
IS_ALERT5MINIFW=1
2014-10-07 17:11:38 +02:00
IS_MINIFW=1
IS_NRPEPERMS=1
IS_MINIFWPERMS=1
2012-02-27 12:12:06 +01:00
IS_NRPEDISKS=0
IS_NRPEPOSTFIX=1
IS_NRPEPID=1
IS_GRSECPROCS=1
IS_UMASKSUDOERS=1
IS_EVOMAINTENANCEUSERS=1
IS_APACHEMUNIN=1
IS_MYSQLUTILS=1
IS_RAIDSOFT=1
IS_AWSTATSLOGFORMAT=1
IS_MUNINLOGROTATE=1
IS_EVOMAINTENANCECONF=1
2011-05-23 02:02:13 +02:00
#IS_METCHE=1
2010-06-07 15:06:52 +02:00
IS_SQUID=1
2010-06-07 17:46:36 +02:00
IS_MODDEFLATE=1
2016-05-10 16:28:07 +02:00
IS_LOG2MAILRUNNING=1
IS_LOG2MAILAPACHE=1
IS_LOG2MAILMYSQL=1
IS_LOG2MAILSQUID=1
2010-06-08 14:37:29 +02:00
IS_BINDCHROOT=1
2010-06-09 18:35:19 +02:00
IS_REPVOLATILE=1
IS_AUTOIF=1
IS_INTERFACESGW=1
2010-06-11 17:49:17 +02:00
IS_USERLOGROTATE=1
2010-06-11 18:16:20 +02:00
IS_MODSECURITY=1
IS_APACHECTL=1
IS_APACHESYMLINK=1
IS_APACHEIPINALLOW=1
IS_MUNINAPACHECONF=1
IS_SAMBAPINPRIORITY=1
IS_KERNELUPTODATE=1
IS_UPTIME=1
2016-05-10 16:41:16 +02:00
IS_MUNINRUNNING=1
IS_BACKUPUPTODATE=1
IS_ETCGIT=1
2016-06-16 18:08:22 +02:00
IS_GITPERMS=1
IS_NOTUPGRADED=1
2017-05-31 16:01:19 +02:00
IS_TUNE2FS_M5=1
2017-09-11 17:16:42 +02:00
IS_PRIVKEYWOLRDREADABLE=1
2017-09-19 16:24:07 +02:00
IS_EVOLINUXSUDOGROUP=1
IS_USERINADMGROUP=1
IS_APACHE2EVOLINUXCONF=1
IS_BACKPORTSCONF=1
IS_BIND9MUNIN=1
IS_BIND9LOGROTATE=1
IS_BROADCOMFIRMWARE=1
IS_HARDWARERAIDTOOL=1
IS_LOG2MAILSYSTEMDUNIT=1
IS_LISTUPGRADE=1
IS_MARIADBEVOLINUXCONF=1
IS_MARIADBSYSTEMDUNIT=1
IS_MYSQLMUNIN=1
IS_PHPEVOLINUXCONF=1
IS_SQUIDLOGROTATE=1
IS_SQUIDEVOLINUXCONF=1
2017-12-06 10:28:39 +01:00
IS_SQL_BACKUP=1
IS_POSTGRES_BACKUP=1
2017-12-06 10:46:08 +01:00
IS_LDAP_BACKUP=1
2017-12-06 10:49:52 +01:00
IS_REDIS_BACKUP=1
2017-12-06 11:05:02 +01:00
IS_ELASTIC_BACKUP=1
2017-12-06 10:42:16 +01:00
IS_MONGO_BACKUP=1
2017-12-08 15:56:31 +01:00
IS_MOUNT_FSTAB=1
IS_NETWORK_INTERFACES=1
IS_EVOBACKUP=1
IS_DUPLICATE_FS_LABEL=1
IS_EVOMAINTENANCE_FW=1
IS_EVOLIX_USER=1
2018-06-13 18:03:14 +02:00
IS_EVOACME_CRON=1
2018-05-25 17:55:12 +02:00
IS_EVOACME_LIVELINKS=1
2018-06-27 15:20:39 +02:00
IS_APACHE_CONFENABLED=1
Squashed commit of the following: commit db23167246678114668d640f88ed9e2f6397ded2 Author: Benoît S <bserie@evolix.fr> Date: Thu Jun 28 11:48:22 2018 +0200 Add a check for kernel config gile commit ae1ec7b2b9f3bd2d1c78af544562dd207ef5f330 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 18:01:07 2018 +0200 Redo the jessie part commit 62b61aabf169ebc9e7e741f4190507f177a9642d Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:49:44 2018 +0200 Well... For Stretch use only /sys/devices/system/cpu/vulnerabilities/ commit 33b19090e6c2462228f9f650f1e83da0b5928406 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:45:11 2018 +0200 Add check for spectre v2 commit 3451218a167e5b2efebed1f80234c9d2596546d3 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:33:24 2018 +0200 Do not use the BOOT_IMAGE trick commit ee60e28a5add36fb6b55231f8e39f275b5592409 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:30:18 2018 +0200 We cannot rely on dmesg commit 57bd4312cea6ce1d5b9c23e3e8307f1bc42852cb Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:46:46 2018 +0100 Breakline indentation commit d2278292ccf4340913ac6982961e0f011e077a3a Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:45:12 2018 +0100 Diffrent test for Jessie kernel commit 1418d4306e81152fa949821484a7d1226e1f2d5b Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:52:43 2018 +0100 Modified Meltdown check to handle kaiser and pti commit 2c6d075e2a9749d2805fb52ec5a2c7274f73dfc7 Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:24:42 2018 +0100 Add IS_MELTDOWN We check kaiser flags in /proc/cpuinfo and CONFIG_PAGE_TABLE_ISOLATION in kernel config file.
2018-06-28 11:52:31 +02:00
IS_MELTDOWN_SPECTRE=1
IS_OLD_HOME_DIR=1
2019-03-21 21:57:28 +01:00
IS_LSBRELEASE=1
#Proper to OpenBSD
IS_SOFTDEP=1
IS_WHEEL=1
IS_SUDOADMIN=1
IS_PKGMIRROR=1
IS_HISTORY=1
IS_VIM=1
IS_TTYC0SECURE=1
IS_CUSTOMSYSLOG=1
IS_NOINETD=1
IS_SUDOMAINT=1
IS_POSTGRESQL=1
IS_NRPE=1
IS_NRPEDAEMON=1
IS_ALERTBOOT=1
IS_RSYNC=1
# Default return code : 0 = no error
RC=0
# Source configuration file
# shellcheck disable=SC1091
test -f /etc/evocheck.cf && . /etc/evocheck.cf
# OS detection
2019-03-20 21:49:08 +01:00
DEBIAN_RELEASE=""
LSB_RELEASE_BIN=$(command -v lsb_release)
2019-03-20 21:49:08 +01:00
OPENBSD_RELEASE=""
2019-03-20 21:49:08 +01:00
if [ -e /etc/debian_version ]; then
DEBIAN_VERSION=$(cut -d "." -f 1 < /etc/debian_version)
2019-03-22 23:56:46 +01:00
if [ -x "${LSB_RELEASE_BIN}" ]; then
DEBIAN_RELEASE=$(${LSB_RELEASE_BIN} --codename --short)
else
case ${DEBIAN_VERSION} in
5) DEBIAN_RELEASE="lenny";;
6) DEBIAN_RELEASE="squeeze";;
7) DEBIAN_RELEASE="wheezy";;
8) DEBIAN_RELEASE="jessie";;
9) DEBIAN_RELEASE="stretch";;
esac
fi
2019-03-20 21:49:08 +01:00
elif [ "$(uname -s)" = "OpenBSD" ]; then
# use a better release name
2019-03-22 20:29:25 +01:00
OPENBSD_RELEASE=$(uname -r)
2019-03-20 21:49:08 +01:00
fi
# Functions
show_version() {
cat <<END
evocheck version ${VERSION}
Copyright 2009-2019 Evolix <info@evolix.fr>,
Romain Dessort <rdessort@evolix.fr>,
Benoit Série <bserie@evolix.fr>,
Gregory Colpart <reg@evolix.fr>,
Jérémy Lecour <jlecour@evolix.fr>,
Tristan Pilat <tpilat@evolix.fr>,
Victor Laborie <vlaborie@evolix.fr>
and others.
evocheck comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
See the GNU General Public License v3.0 for details.
END
2010-06-09 18:35:19 +02:00
}
show_help() {
cat <<END
evocheck is a script that verifies Evolix conventions on Debian/OpenBSD servers.
Usage: evocheck
or evocheck --cron
or evocheck --quiet
or evocheck --verbose
Options
--cron disable a few checks
-v, --verbose increase verbosity of checks
2019-03-23 01:13:09 +01:00
-q, --quiet nothing is printed on stdout nor stderr
2019-03-23 01:15:00 +01:00
-h, --help print this message and exit
--version print version and exit
END
}
2019-03-20 21:49:08 +01:00
is_debian() {
test -n "${DEBIAN_RELEASE}"
}
is_debian_lenny() {
2019-03-22 14:08:31 +01:00
test "${DEBIAN_RELEASE}" = "lenny"
2019-03-20 21:49:08 +01:00
}
is_debian_squeeze() {
test "${DEBIAN_RELEASE}" = "squeeze"
}
is_debian_wheezy() {
test "${DEBIAN_RELEASE}" = "wheezy"
}
is_debian_jessie() {
test "${DEBIAN_RELEASE}" = "jessie"
}
is_debian_stretch() {
test "${DEBIAN_RELEASE}" = "stretch"
}
debian_release() {
printf "%s" "${DEBIAN_RELEASE}"
}
debian_version() {
printf "%s" "${DEBIAN_VERSION}"
}
is_openbsd() {
test -n "${OPENBSD_RELEASE}"
}
is_pack_web(){
test -e /usr/share/scripts/web-add.sh || test -e /usr/share/scripts/evoadmin/web-add.sh
}
is_pack_samba(){
test -e /usr/share/scripts/add.pl
}
is_installed(){
for pkg in "$@"; do
dpkg -l "$pkg" 2> /dev/null | grep -q -E '^(i|h)i' || return 1
done
}
# logging
failed() {
check_name=$1
shift
check_comments=$*
RC=1
2019-03-23 00:59:48 +01:00
if [ "${QUIET}" != 1 ]; then
if [ -n "${check_comments}" ] && [ "${VERBOSE}" = 1 ]; then
printf "%s FAILED! %s\n" "${check_name}" "${check_comments}" 2>&1
else
printf "%s FAILED!\n" "${check_name}" 2>&1
fi
fi
}
# Parse options
# based on https://gist.github.com/deshion/10d3cb5f88a21671e17a
while :; do
case $1 in
-h|-\?|--help)
show_help
exit 0
;;
--version)
show_version
exit 0
;;
--cron)
IS_KERNELUPTODATE=0
IS_UPTIME=0
;;
-v|--verbose)
VERBOSE=1
;;
-q|--quiet)
QUIET=1
VERBOSE=0
;;
--)
# End of all options.
shift
break
;;
-?*|[[:alnum:]]*)
# ignore unknown options
printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
;;
*)
# Default case: If no more options then break out of the loop.
break
;;
esac
shift
done
#-----------------------------------------------------------
#Vérifie si c'est une debian et fait les tests appropriés.
#-----------------------------------------------------------
2019-03-20 21:49:08 +01:00
if is_debian; then
is_debian_lenny && MINIFW_FILE=/etc/firewall.rc
is_debian_squeeze && MINIFW_FILE=/etc/firewall.rc
is_debian_wheezy && MINIFW_FILE=/etc/firewall.rc
is_debian_jessie && MINIFW_FILE=/etc/default/minifirewall
is_debian_stretch && MINIFW_FILE=/etc/default/minifirewall
2019-03-22 23:56:46 +01:00
if [ "$IS_LSBRELEASE" = 1 ]; then
if [ -x "${LSB_RELEASE_BIN}" ]; then
## only the major version matters
lhs=$(${LSB_RELEASE_BIN} --release --short | cut -d "." -f 1)
rhs=$(cut -d "." -f 1 < /etc/debian_version)
test "$lhs" = "$rhs" || failed "IS_LSBRELEASE" "release is not consistent between lsb_release and /etc/debian_version"
else
failed "IS_LSBRELEASE" "lsb_release is missing or not executable"
fi
2019-03-21 21:57:28 +01:00
fi
if [ "$IS_DPKGWARNING" = 1 ]; then
if is_debian_squeeze; then
if [ "$IS_USRRO" = 1 ] || [ "$IS_TMPNOEXEC" = 1 ]; then
count=$(grep -c -E -i "(Pre-Invoke ..echo Are you sure to have rw on|Post-Invoke ..echo Dont forget to mount -o remount)" /etc/apt/apt.conf)
2019-03-22 23:56:46 +01:00
test "$count" = 2 || failed "IS_DPKGWARNING" "Pre/Post-Invoke are missing."
fi
elif is_debian_wheezy; then
if [ "$IS_USRRO" = 1 ] || [ "$IS_TMPNOEXEC" = 1 ]; then
2019-03-22 21:55:47 +01:00
test -e /etc/apt/apt.conf.d/80evolinux \
|| failed "IS_DPKGWARNING" "/etc/apt/apt.conf.d/80evolinux is missing"
test -e /etc/apt/apt.conf \
&& failed "IS_DPKGWARNING" "/etc/apt/apt.conf is missing"
fi
elif is_debian_stretch; then
2019-03-22 21:55:47 +01:00
test -e /etc/apt/apt.conf.d/z-evolinux.conf \
|| failed "IS_DPKGWARNING" "/etc/apt/apt.conf.d/z-evolinux.conf is missing"
fi
fi
if [ "$IS_UMASKSUDOERS" = 1 ]; then
if is_debian_squeeze; then
2019-03-22 21:55:47 +01:00
grep -q "^Defaults.*umask=0077" /etc/sudoers \
|| failed "IS_UMASKSUDOERS" "sudoers must set umask to 0077"
fi
fi
2014-10-08 12:02:16 +02:00
# Verifying check_mailq in Nagios NRPE config file. (Option "-M postfix" need to be set if the MTA is Postfix)
if [ "$IS_NRPEPOSTFIX" = 1 ]; then
2019-03-22 00:02:51 +01:00
if is_installed postfix; then
if is_debian_squeeze; then
grep -q "^command.*check_mailq -M postfix" /etc/nagios/nrpe.cfg \
2019-03-22 21:55:47 +01:00
|| failed "IS_NRPEPOSTFIX" "NRPE \"check_mailq\" for postfix is missing"
2019-03-22 00:02:51 +01:00
else
2019-03-22 23:58:36 +01:00
{ test -e /etc/nagios/nrpe.cfg \
&& grep -qr "^command.*check_mailq -M postfix" /etc/nagios/nrpe.*;
} || failed "IS_NRPEPOSTFIX" "NRPE \"check_mailq\" for postfix is missing"
fi
fi
2014-10-08 12:10:34 +02:00
fi
2013-04-12 18:03:48 +02:00
# Check if mod-security config file is present
if [ "$IS_MODSECURITY" = 1 ]; then
if is_debian_squeeze; then
if is_installed libapache-mod-security; then
2019-03-22 21:55:47 +01:00
test -e /etc/apache2/conf.d/mod-security2.conf || failed "IS_MODSECURITY" "missing configuration file"
fi
elif is_debian_wheezy; then
if is_installed libapache2-modsecurity; then
2019-03-22 21:55:47 +01:00
test -e /etc/apache2/conf.d/mod-security2.conf || failed "IS_MODSECURITY" "missing configuration file"
fi
fi
2013-04-12 18:03:48 +02:00
fi
if [ "$IS_CUSTOMSUDOERS" = 1 ]; then
grep -E -qr "umask=0077" /etc/sudoers* || failed "IS_CUSTOMSUDOERS"
fi
if [ "$IS_VARTMPFS" = 1 ]; then
2019-03-22 21:55:47 +01:00
df /var/tmp | grep -q tmpfs || failed "IS_VARTMPFS" "/var/tmp is not a tmpfs"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_SERVEURBASE" = 1 ]; then
2019-03-22 21:55:47 +01:00
is_installed serveur-base || failed "IS_SERVEURBASE" "serveur-base package is not installed"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_LOGROTATECONF" = 1 ]; then
test -e /etc/logrotate.d/zsyslog || failed "IS_LOGROTATECONF"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_SYSLOGCONF" = 1 ]; then
grep -q "^# Syslog for Pack Evolix serveur" /etc/*syslog.conf \
|| failed "IS_SYSLOGCONF"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_DEBIANSECURITY" = 1 ]; then
grep -q "^deb.*security" /etc/apt/sources.list \
|| failed "IS_DEBIANSECURITY"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_APTITUDEONLY" = 1 ]; then
if is_debian_squeeze || is_debian_wheezy; then
test -e /usr/bin/apt-get && failed "IS_APTITUDEONLY"
fi
fi
2014-10-08 11:49:06 +02:00
if [ "$IS_APTITUDE" = 1 ]; then
if is_debian_jessie || is_debian_stretch; then
test -e /usr/bin/aptitude && failed "IS_APTITUDE"
fi
fi
2016-08-31 15:38:38 +02:00
if [ "$IS_APTGETBAK" = 1 ]; then
if is_debian_jessie || is_debian_stretch; then
test -e /usr/bin/apt-get.bak && failed "IS_APTGETBAK"
fi
2016-08-31 15:38:38 +02:00
fi
2014-10-08 11:49:06 +02:00
if [ "$IS_APTICRON" = 1 ]; then
status="OK"
test -e /etc/cron.d/apticron || status="fail"
test -e /etc/cron.daily/apticron && status="fail"
2014-10-08 11:49:06 +02:00
test "$status" = "fail" || test -e /usr/bin/apt-get.bak || status="fail"
if is_debian_squeeze || is_debian_wheezy; then
test "$status" = "fail" && failed "IS_APTICRON"
fi
2014-10-08 11:49:06 +02:00
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_USRRO" = 1 ]; then
grep /usr /etc/fstab | grep -q ro || failed "IS_USRRO"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_TMPNOEXEC" = 1 ]; then
mount | grep "on /tmp" | grep -q noexec || failed "IS_TMPNOEXEC"
fi
2018-03-29 22:29:50 +02:00
2017-12-08 15:56:31 +01:00
if [ "$IS_MOUNT_FSTAB" = 1 ]; then
# Test if lsblk available, if not skip this test...
2019-03-22 23:59:25 +01:00
LSBLK_BIN=$(command -v lsblk)
if test -x "${LSBLK_BIN}"; then
for mountPoint in $(${LSBLK_BIN} -o MOUNTPOINT -l -n | grep '/'); do
grep -Eq "$mountPoint\W" /etc/fstab || failed "IS_MOUNT_FSTAB"
2017-12-08 15:56:31 +01:00
done
fi
fi
if [ "$IS_LISTCHANGESCONF" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch; then
if is_installed apt-listchanges; then
failed "IS_LISTCHANGESCONF" "apt-listchanges must not be installed on Stretch"
fi
2017-09-19 16:24:07 +02:00
else
if [ -e "/etc/apt/listchanges.conf" ]; then
lines=$(grep -cE "(which=both|confirm=1)" /etc/apt/listchanges.conf)
2019-03-22 23:56:46 +01:00
if [ "$lines" != 2 ]; then
failed "IS_LISTCHANGESCONF" "apt-listchanges config is incorrect"
fi
else
failed "IS_LISTCHANGESCONF" "apt-listchanges config is missing"
fi
2017-09-19 16:24:07 +02:00
fi
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_CUSTOMCRONTAB" = 1 ]; then
2019-03-21 23:56:12 +01:00
found_lines=$(grep -c -E "^(17 \*|25 6|47 6|52 6)" /etc/crontab)
2019-03-22 23:56:46 +01:00
test "$found_lines" = 4 && failed "IS_CUSTOMCRONTAB"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_SSHALLOWUSERS" = 1 ]; then
grep -E -qi "(AllowUsers|AllowGroups)" /etc/ssh/sshd_config || failed "IS_SSHALLOWUSERS"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_DISKPERF" = 1 ]; then
test -e /root/disk-perf.txt || failed "IS_DISKPERF"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_TMOUTPROFILE" = 1 ]; then
grep -sq "TMOUT=" /etc/profile /etc/profile.d/evolinux.sh || failed "IS_TMOUTPROFILE" "TMOUT is not set"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_ALERT5BOOT" = 1 ]; then
if [ -n "$(find /etc/rc2.d/ -name 'S*alert5')" ]; then
grep -q "^date" /etc/rc2.d/S*alert5 || failed "IS_ALERT5BOOT" "boot mail is not sent by alert5 init script"
else
failed "IS_ALERT5BOOT" "alert5 init script is missing"
fi
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_ALERT5MINIFW" = 1 ]; then
if [ -n "$(find /etc/rc2.d/ -name 'S*alert5')" ]; then
grep -q "^/etc/init.d/minifirewall" /etc/rc2.d/S*alert5 \
|| failed "IS_ALERT5MINIFW" "Minifirewall is not started by alert5 init script"
else
failed "IS_ALERT5MINIFW" "alert5 init script is missing"
fi
fi
2014-10-07 17:11:38 +02:00
if [ "$IS_ALERT5MINIFW" = 1 ] && [ "$IS_MINIFW" = 1 ]; then
/sbin/iptables -L -n | grep -q -E "^ACCEPT\s*all\s*--\s*31\.170\.8\.4\s*0\.0\.0\.0/0\s*$" \
|| failed "IS_MINIFW"
2014-10-07 17:11:38 +02:00
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_NRPEPERMS" = 1 ]; then
if [ -d /etc/nagios ]; then
2019-03-22 00:00:49 +01:00
actual=$(stat --format "%A" /etc/nagios)
expected="drwxr-x---"
test "$expected" = "$actual" || failed "IS_NRPEPERMS"
fi
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_MINIFWPERMS" = 1 ]; then
if [ -f "$MINIFW_FILE" ]; then
actual=$(stat --format "%A" $MINIFW_FILE)
expected="-rw-------"
test "$expected" = "$actual" || failed "IS_MINIFWPERMS"
fi
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_NRPEDISKS" = 1 ]; then
NRPEDISKS=$(grep command.check_disk /etc/nagios/nrpe.cfg | grep "^command.check_disk[0-9]" | sed -e "s/^command.check_disk\([0-9]\+\).*/\1/" | sort -n | tail -1)
2019-03-23 00:00:14 +01:00
DFDISKS=$(df -Pl | grep -c -E -v "(^Filesystem|/lib/init/rw|/dev/shm|udev|rpc_pipefs)")
test "$NRPEDISKS" = "$DFDISKS" || failed "IS_NRPEDISKS"
fi
2016-05-11 11:21:23 +02:00
if [ "$IS_NRPEPID" = 1 ]; then
if ! is_debian_squeeze; then
2019-03-22 23:58:36 +01:00
{ test -e /etc/nagios/nrpe.cfg \
&& grep -q "^pid_file=/var/run/nagios/nrpe.pid" /etc/nagios/nrpe.cfg;
} || failed "IS_NRPEPID"
fi
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_GRSECPROCS" = 1 ]; then
2019-03-22 00:00:57 +01:00
if uname -a | grep -q grsec; then
2019-03-22 23:58:36 +01:00
{ grep -q "^command.check_total_procs..sudo" /etc/nagios/nrpe.cfg \
&& grep -A1 "^\[processes\]" /etc/munin/plugin-conf.d/munin-node | grep -q "^user root";
} || failed "IS_GRSECPROCS"
2019-03-22 00:00:57 +01:00
fi
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_APACHEMUNIN" = 1 ]; then
2019-03-22 18:16:53 +01:00
if test -e /etc/apache2/apache2.conf; then
if is_debian_stretch; then
{ test -h /etc/apache2/mods-enabled/status.load \
2019-03-22 00:30:44 +01:00
&& test -h /etc/munin/plugins/apache_accesses \
&& test -h /etc/munin/plugins/apache_processes \
2019-03-22 18:16:53 +01:00
&& test -h /etc/munin/plugins/apache_volume; } \
2019-04-04 18:25:10 +02:00
|| failed "IS_APACHEMUNIN" "missing munin plugins for Apache"
2019-03-22 18:16:53 +01:00
else
pattern="/server-status-[[:alnum:]]{4,}"
{ grep -r -q -s -E "^env.url.*${pattern}" /etc/munin/plugin-conf.d \
2019-03-22 18:16:53 +01:00
&& { grep -q -s -E "${pattern}" /etc/apache2/apache2.conf \
|| grep -q -s -E "${pattern}" /etc/apache2/mods-enabled/status.conf;
};
} || failed "IS_APACHEMUNIN" "server status is not properly configured"
fi
fi
fi
2018-03-29 22:29:50 +02:00
# Verification mytop + Munin si MySQL
if [ "$IS_MYSQLUTILS" = 1 ]; then
MYSQL_ADMIN=${MYSQL_ADMIN:-mysqladmin}
if is_installed mysql-server; then
# You can configure MYSQL_ADMIN in evocheck.cf
if ! grep -qs "$MYSQL_ADMIN" /root/.my.cnf; then
failed "IS_MYSQLUTILS" "mysqladmin missing in /root/.my.cnf"
fi
if ! test -x /usr/bin/mytop; then
if ! test -x /usr/local/bin/mytop; then
failed "IS_MYSQLUTILS" "mytop binary missing"
fi
fi
if ! grep -qs debian-sys-maint /root/.mytop; then
failed "IS_MYSQLUTILS" "debian-sys-maint missing in /root/.mytop"
fi
fi
fi
2018-03-29 22:29:50 +02:00
# Verification de la configuration du raid soft (mdadm)
if [ "$IS_RAIDSOFT" = 1 ]; then
2019-03-22 00:30:44 +01:00
if test -e /proc/mdstat && grep -q md /proc/mdstat; then
{ grep -q "^AUTOCHECK=true" /etc/default/mdadm \
2019-03-22 00:30:44 +01:00
&& grep -q "^START_DAEMON=true" /etc/default/mdadm \
&& grep -qv "^MAILADDR ___MAIL___" /etc/mdadm/mdadm.conf;
} || failed "IS_RAIDSOFT"
2019-03-22 00:30:44 +01:00
fi
fi
2018-03-29 22:29:50 +02:00
# Verification du LogFormat de AWStats
if [ "$IS_AWSTATSLOGFORMAT" = 1 ]; then
if is_installed apache2.2-common awstats; then
grep -qE '^LogFormat=1' /etc/awstats/awstats.conf.local \
|| failed "IS_AWSTATSLOGFORMAT"
fi
fi
2018-03-29 22:29:50 +02:00
# Verification de la présence de la config logrotate pour Munin
if [ "$IS_MUNINLOGROTATE" = 1 ]; then
{ test -e /etc/logrotate.d/munin-node \
&& test -e /etc/logrotate.d/munin;
} || failed "IS_MUNINLOGROTATE"
fi
# Verification de la présence de metche
#if [ "$IS_METCHE" = 1 ]; then
2019-03-20 22:55:37 +01:00
# is_installed metche || failed "IS_METCHE"
#fi
2018-03-29 22:29:50 +02:00
# Verification de l'activation de Squid dans le cas d'un pack mail
if [ "$IS_SQUID" = 1 ]; then
2019-03-22 20:02:04 +01:00
if is_debian_stretch; then
squidconffile="/etc/squid/evolinux-custom.conf"
else
squidconffile="/etc/squid*/squid.conf"
fi
if is_pack_web && (is_installed squid || is_installed squid3); then
host=$(hostname -i)
# shellcheck disable=SC2086
http_port=$(grep "http_port" $squidconffile | cut -f 2 -d " ")
2019-03-22 23:58:36 +01:00
{ grep -qE "^[^#]*iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner --uid-owner proxy -j ACCEPT" "$MINIFW_FILE" \
&& grep -qE "^[^#]*iptables -t nat -A OUTPUT -p tcp --dport 80 -d $host -j ACCEPT" "$MINIFW_FILE" \
&& grep -qE "^[^#]*iptables -t nat -A OUTPUT -p tcp --dport 80 -d 127.0.0.(1|0/8) -j ACCEPT" "$MINIFW_FILE" \
&& grep -qE "^[^#]*iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port.* $http_port" "$MINIFW_FILE";
} || failed "IS_SQUID"
fi
fi
if [ "$IS_EVOMAINTENANCE_FW" = 1 ]; then
if [ -f "$MINIFW_FILE" ]; then
rulesNumber=$(grep -c "/sbin/iptables -A INPUT -p tcp --sport 5432 --dport 1024:65535 -s .* -m state --state ESTABLISHED,RELATED -j ACCEPT" "$MINIFW_FILE")
if [ "$rulesNumber" -lt 2 ]; then
failed "IS_EVOMAINTENANCE_FW"
fi
fi
fi
# Verification de la conf et de l'activation de mod-deflate
if [ "$IS_MODDEFLATE" = 1 ]; then
f=/etc/apache2/mods-enabled/deflate.conf
if is_installed apache2.2; then
{ test -e $f && grep -q "AddOutputFilterByType DEFLATE text/html text/plain text/xml" $f \
&& grep -q "AddOutputFilterByType DEFLATE text/css" $f \
&& grep -q "AddOutputFilterByType DEFLATE application/x-javascript application/javascript" $f;
} || failed "IS_MODDEFLATE"
fi
fi
2018-03-29 22:29:50 +02:00
# Verification de la conf log2mail
2016-05-11 00:24:46 +02:00
if [ "$IS_LOG2MAILRUNNING" = 1 ]; then
if is_pack_web && is_installed log2mail; then
pgrep log2mail >/dev/null || failed 'IS_LOG2MAILRUNNING'
fi
2016-05-10 16:28:07 +02:00
fi
if [ "$IS_LOG2MAILAPACHE" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch; then
2017-09-19 16:24:07 +02:00
conf=/etc/log2mail/config/apache
else
conf=/etc/log2mail/config/default
fi
if is_pack_web && is_installed log2mail; then
grep -s -q "^file = /var/log/apache2/error.log" $conf \
|| failed "IS_LOG2MAILAPACHE"
fi
fi
if [ "$IS_LOG2MAILMYSQL" = 1 ]; then
if is_pack_web && is_installed log2mail; then
grep -s -q "^file = /var/log/syslog" /etc/log2mail/config/{default,mysql,mysql.conf} \
|| failed "IS_LOG2MAILMYSQL"
fi
fi
if [ "$IS_LOG2MAILSQUID" = 1 ]; then
if is_pack_web && is_installed log2mail; then
grep -s -q "^file = /var/log/squid.*/access.log" /etc/log2mail/config/* \
|| failed "IS_LOG2MAILSQUID"
fi
fi
2018-03-29 22:29:50 +02:00
# Verification si bind est chroote
if [ "$IS_BINDCHROOT" = 1 ]; then
2019-03-22 23:58:36 +01:00
if is_installed bind9; then
if netstat -utpln | grep "/named" | grep :53 | grep -qvE "(127.0.0.1|::1)"; then
if grep -q '^OPTIONS=".*-t' /etc/default/bind9 && grep -q '^OPTIONS=".*-u' /etc/default/bind9; then
md5_original=$(md5sum /usr/sbin/named | cut -f 1 -d ' ')
md5_chrooted=$(md5sum /var/chroot-bind/usr/sbin/named | cut -f 1 -d ' ')
if [ "$md5_original" != "$md5_chrooted" ]; then
failed "IS_BINDCHROOT" "The chrooted bind binary is differet than the original binary"
fi
else
failed "IS_BINDCHROOT" "bind process is not chrooted"
fi
fi
fi
fi
2018-03-29 22:29:50 +02:00
# Verification de la présence du depot volatile
if [ "$IS_REPVOLATILE" = 1 ]; then
if is_debian_lenny; then
grep -qE "^deb http://volatile.debian.org/debian-volatile" /etc/apt/sources.list \
|| failed "IS_REPVOLATILE"
fi
if is_debian_squeeze; then
grep -qE "^deb.*squeeze-updates" /etc/apt/sources.list \
|| failed "IS_REPVOLATILE"
fi
fi
2018-03-29 22:29:50 +02:00
# /etc/network/interfaces should be present, we don't manage systemd-network yet
if [ "$IS_NETWORK_INTERFACES" = 1 ]; then
if ! test -f /etc/network/interfaces; then
IS_AUTOIF=0
IS_INTERFACESGW=0
failed "IS_NETWORK_INTERFACES" "systemd network configuration is not supported yet"
fi
fi
2014-10-08 22:13:15 +02:00
# Verify if all if are in auto
if [ "$IS_AUTOIF" = 1 ]; then
if is_debian_stretch; then
2019-03-22 23:59:55 +01:00
interfaces=$(/sbin/ip address show up | grep "^[0-9]*:" | grep -E -v "(lo|vnet|docker|veth|tun|tap|macvtap)" | cut -d " " -f 2 | tr -d : | cut -d@ -f1 | tr "\n" " ")
else
2019-03-22 23:59:55 +01:00
interfaces=$(/sbin/ifconfig -s | tail -n +2 | grep -E -v "^(lo|vnet|docker|veth|tun|tap|macvtap)" | cut -d " " -f 1 |tr "\n" " ")
fi
for interface in $interfaces; do
if ! grep -q "^auto $interface" /etc/network/interfaces; then
2019-03-24 21:35:28 +01:00
failed "IS_AUTOIF" "Network interface \`${interface}' is not set to auto"
test "${VERBOSE}" = 1 || break
fi
2019-03-20 22:55:30 +01:00
done
fi
2018-03-29 22:29:50 +02:00
2014-10-08 22:13:15 +02:00
# Network conf verification
if [ "$IS_INTERFACESGW" = 1 ]; then
number=$(grep -Ec "^[^#]*gateway [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /etc/network/interfaces)
2019-03-22 23:56:46 +01:00
test "$number" -gt 1 && failed "IS_INTERFACESGW" "there is more than 1 IPv4 gateway"
number=$(grep -Ec "^[^#]*gateway [0-9a-fA-F]+:" /etc/network/interfaces)
2019-03-22 23:56:46 +01:00
test "$number" -gt 1 && failed "IS_INTERFACESGW" "there is more than 1 IPv6 gateway"
fi
# Verification de la mise en place d'evobackup
if [ "$IS_EVOBACKUP" = 1 ]; then
evobackup_found=$(find /etc/cron* -name '*evobackup*' | wc -l)
test "$evobackup_found" -gt 0 || failed "IS_EVOBACKUP"
fi
2018-03-29 22:29:50 +02:00
# Verification de la presence du userlogrotate
if [ "$IS_USERLOGROTATE" = 1 ]; then
if is_pack_web; then
test -x /etc/cron.weekly/userlogrotate || failed "IS_USERLOGROTATE"
fi
fi
2018-03-29 22:29:50 +02:00
# Verification de la syntaxe de la conf d'Apache
if [ "$IS_APACHECTL" = 1 ]; then
if is_installed apache2.2-common; then
2019-03-22 00:30:44 +01:00
/usr/sbin/apache2ctl configtest 2>&1 | grep -q "^Syntax OK$" || failed "IS_APACHECTL"
fi
fi
# Check if there is regular files in Apache sites-enabled.
2014-10-08 17:20:05 +02:00
if [ "$IS_APACHESYMLINK" = 1 ]; then
if is_installed apache2.2-common; then
stat -c %F /etc/apache2/sites-enabled/* | grep -q regular && failed "IS_APACHESYMLINK"
fi
fi
# Check if there is real IP addresses in Allow/Deny directives (no trailing space, inline comments or so).
if [ "$IS_APACHEIPINALLOW" = 1 ]; then
# Note: Replace "exit 1" by "print" in Perl code to debug it.
if is_installed apache2.2-common; then
grep -IrE "^[^#] *(Allow|Deny) from" /etc/apache2/ \
| grep -iv "from all" \
| grep -iv "env=" \
| perl -ne 'exit 1 unless (/from( [\da-f:.\/]+)+$/i)' \
2019-03-22 00:30:44 +01:00
|| failed "IS_APACHEIPINALLOW"
fi
fi
# Check if default Apache configuration file for munin is absent (or empty or commented).
2016-05-11 00:24:46 +02:00
if [ "$IS_MUNINAPACHECONF" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_squeeze || is_debian_wheezy; then
muninconf="/etc/apache2/conf.d/munin"
else
muninconf="/etc/apache2/conf-available/munin.conf"
fi
if is_installed apache2.2-common; then
2019-03-22 23:56:46 +01:00
test -e $muninconf && grep -vEq "^( |\t)*#" "$muninconf" && failed "IS_MUNINAPACHECONF"
fi
2016-05-11 11:21:23 +02:00
fi
2018-03-29 22:29:50 +02:00
# Verification de la priorité du package samba si les backports sont utilisés
if [ "$IS_SAMBAPINPRIORITY" = 1 ]; then
if is_pack_samba; then
2019-03-22 20:12:30 +01:00
if grep -qrE "^[^#].*backport" /etc/apt/sources.list{,.d}; then
priority=$(grep -E -A2 "^Package:.*samba" /etc/apt/preferences | grep -A1 "^Pin: release a=.*-backports" | grep "^Pin-Priority:" | cut -f2 -d" ")
2019-03-22 23:56:46 +01:00
test "$priority" -gt 500 || failed "IS_SAMBAPINPRIORITY"
2019-03-22 20:12:30 +01:00
fi
fi
fi
2018-03-29 22:29:50 +02:00
# Verification si le système doit redémarrer suite màj kernel.
if [ "$IS_KERNELUPTODATE" = 1 ]; then
if is_installed linux-image*; then
# shellcheck disable=SC2012
2019-03-23 00:00:44 +01:00
kernel_installed_at=$(date -d "$(ls --full-time -lcrt /boot | tail -n1 | awk '{print $6}')" +%s)
last_reboot_at=$(($(date +%s) - $(cut -f1 -d '.' /proc/uptime)))
2019-03-22 23:56:46 +01:00
if [ "$kernel_installed_at" -gt "$last_reboot_at" ]; then
failed "IS_KERNELUPTODATE"
fi
fi
fi
2018-03-29 22:29:50 +02:00
# Check if the server is running for more than a year.
if [ "$IS_UPTIME" = 1 ]; then
if is_installed linux-image*; then
limit=$(date -d "now - 2 year" +%s)
last_reboot_at=$(($(date +%s) - $(cut -f1 -d '.' /proc/uptime)))
2019-03-22 23:56:46 +01:00
if [ "$limit" -gt "$last_reboot_at" ]; then
failed "IS_UPTIME"
fi
fi
fi
2016-05-10 16:41:16 +02:00
# Check if munin-node running and RRD files are up to date.
2016-05-11 00:24:46 +02:00
if [ "$IS_MUNINRUNNING" = 1 ]; then
if ! pgrep munin-node >/dev/null; then
failed "IS_MUNINRUNNING" "Munin is not running"
elif [ -d "/var/lib/munin/" ] && [ -d "/var/cache/munin/" ]; then
limit=$(date +"%s" -d "now - 10 minutes")
if [ -n "$(find /var/lib/munin/ -name '*load-g.rrd')" ]; then
updated_at=$(stat -c "%Y" /var/lib/munin/*/*load-g.rrd |sort |tail -1)
[ "$limit" -gt "$updated_at" ] && failed "IS_MUNINRUNNING" "Munin load RRD has not been updated in the last 10 minutes"
else
failed "IS_MUNINRUNNING" "Munin is not installed properly (load RRD not found)"
fi
if [ -n "$(find /var/cache/munin/www/ -name 'load-day.png')" ]; then
updated_at=$(stat -c "%Y" /var/cache/munin/www/*/*/load-day.png |sort |tail -1)
grep -sq "^graph_strategy cron" /etc/munin/munin.conf && [ "$limit" -gt "$updated_at" ] && failed "IS_MUNINRUNNING" "Munin load PNG has not been updated in the last 10 minutes"
else
failed "IS_MUNINRUNNING" "Munin is not installed properly (load PNG not found)"
fi
else
failed "IS_MUNINRUNNING" "Munin is not installed properly (main directories are missing)"
fi
2016-05-10 16:41:16 +02:00
fi
# Check if files in /home/backup/ are up-to-date
if [ "$IS_BACKUPUPTODATE" = 1 ]; then
if [ -d /home/backup/ ]; then
2019-03-23 10:32:29 +01:00
if [ -n "$(ls -A /home/backup/)" ]; then
for file in /home/backup/*; do
limit=$(date +"%s" -d "now - 2 day")
updated_at=$(stat -c "%Y" "$file")
if [ -f "$file" ] && [ "$limit" -gt "$updated_at" ]; then
failed "IS_BACKUPUPTODATE" "$file has not been backed up"
test "${VERBOSE}" = 1 || break;
fi
done
else
failed "IS_BACKUPUPTODATE" "/home/backup/ is empty"
fi
else
failed "IS_BACKUPUPTODATE" "/home/backup/ is missing"
fi
fi
2016-06-16 18:08:22 +02:00
if [ "$IS_ETCGIT" = 1 ]; then
(cd /etc; git rev-parse --is-inside-work-tree > /dev/null 2>&1) || failed "IS_ETCGIT" "/etc is not a Git repository"
fi
2016-06-16 18:08:22 +02:00
# Check if /etc/.git/ has read/write permissions for root only.
if [ "$IS_GITPERMS" = 1 ]; then
if test -d /etc/.git; then
2019-03-22 00:04:01 +01:00
expected="700"
actual=$(stat -c "%a" /etc/.git/)
[ "$expected" = "$actual" ] || failed "IS_GITPERMS"
fi
2016-06-16 18:08:22 +02:00
fi
2016-11-30 17:49:38 +01:00
# Check if no package has been upgraded since $limit.
if [ "$IS_NOTUPGRADED" = 1 ]; then
last_upgrade=0
upgraded=false
for log in /var/log/dpkg.log*; do
2019-03-22 23:53:13 +01:00
if zgrep -qsm1 upgrade "$log"; then
# There is at least one upgrade
upgraded=true
break
fi
done
if $upgraded; then
last_upgrade=$(date +%s -d "$(zgrep -h upgrade /var/log/dpkg.log* | sort -n | tail -1 | cut -f1 -d ' ')")
fi
if grep -qs '^mailto="listupgrade-todo@' /etc/evolinux/listupgrade.cnf \
2019-03-20 22:55:30 +01:00
|| grep -qs -E '^[[:digit:]]+[[:space:]]+[[:digit:]]+[[:space:]]+[^\*]' /etc/cron.d/listupgrade; then
# Manual upgrade process
limit=$(date +%s -d "now - 180 days")
else
# Regular process
limit=$(date +%s -d "now - 90 days")
fi
install_date=0
if [ -d /var/log/installer ]; then
install_date=$(stat -c %Z /var/log/installer)
fi
# Check install_date if the system never received an upgrade
2019-03-22 23:56:46 +01:00
if [ "$last_upgrade" -eq 0 ]; then
[ "$install_date" -lt "$limit" ] && failed "IS_NOTUPGRADED" "The system has never been updated"
else
2019-03-22 23:56:46 +01:00
[ "$last_upgrade" -lt "$limit" ] && failed "IS_NOTUPGRADED" "The system hasn't been updated for too long"
fi
fi
2017-05-31 16:01:19 +02:00
# Check if reserved blocks for root is at least 5% on every mounted partitions.
if [ "$IS_TUNE2FS_M5" = 1 ]; then
min=5
2017-05-31 16:01:19 +02:00
parts=$(grep -E "ext(3|4)" /proc/mounts | cut -d ' ' -f1 | tr -s '\n' ' ')
for part in $parts; do
blockCount=$(dumpe2fs -h "$part" 2>/dev/null | grep -e "Block count:" | grep -Eo "[0-9]+")
# If buggy partition, skip it.
2019-03-22 23:56:46 +01:00
if [ -z "$blockCount" ]; then
continue
fi
2017-05-31 16:01:19 +02:00
reservedBlockCount=$(dumpe2fs -h "$part" 2>/dev/null | grep -e "Reserved block count:" | grep -Eo "[0-9]+")
# Use awk to have a rounded percentage
# python is slow, bash is unable and bc rounds weirdly
percentage=$(awk "BEGIN { pc=100*${reservedBlockCount}/${blockCount}; i=int(pc); print (pc-i<0.5)?i:i+1 }")
if [ "$percentage" -lt "${min}" ]; then
failed "IS_TUNE2FS_M5" "Partition ${part} has less than ${min}% reserved blocks (${percentage}%)"
2017-05-31 16:01:19 +02:00
fi
done
fi
2017-09-19 16:24:07 +02:00
if [ "$IS_EVOLINUXSUDOGROUP" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch; then
2019-03-22 20:30:23 +01:00
if grep -q "^evolinux-sudo:" /etc/group; then
2019-03-22 21:55:47 +01:00
grep -q '^%evolinux-sudo ALL=(ALL:ALL) ALL' /etc/sudoers.d/evolinux \
|| failed "IS_EVOLINUXSUDOGROUP"
2019-03-22 20:30:23 +01:00
fi
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_USERINADMGROUP" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch; then
2019-03-22 20:29:45 +01:00
users=$(grep "^evolinux-sudo:" /etc/group | awk -F: '{print $4}' | tr ',' ' ')
for user in $users; do
2019-03-22 23:56:46 +01:00
groups "$user" | grep -q adm || failed "IS_USERINADMGROUP" "User $user doesn't belong to \`adm' group"
2017-09-19 16:24:07 +02:00
done
fi
fi
if [ "$IS_APACHE2EVOLINUXCONF" = 1 ]; then
if is_debian_stretch && test -d /etc/apache2; then
{ test -L /etc/apache2/conf-enabled/z-evolinux-defaults.conf \
2017-09-19 16:24:07 +02:00
&& test -L /etc/apache2/conf-enabled/zzz-evolinux-custom.conf \
&& test -f /etc/apache2/ipaddr_whitelist.conf;
} || failed "IS_APACHE2EVOLINUXCONF"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_BACKPORTSCONF" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch; then
grep -qsE "^[^#].*backports" /etc/apt/sources.list \
&& failed "IS_BACKPORTSCONF" "backports can't be in main sources list"
if grep -qsE "^[^#].*backports" /etc/apt/sources.list.d/*.list; then
grep -qsE "^[^#].*backports" /etc/apt/preferences.d/* \
|| failed "IS_BACKPORTSCONF" "backports must have preferences"
fi
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_BIND9MUNIN" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch && is_installed bind9; then
{ test -L /etc/munin/plugins/bind9 \
&& test -e /etc/munin/plugin-conf.d/bind9;
} || failed "IS_BIND9MUNIN"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_BIND9LOGROTATE" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch && is_installed bind9; then
test -e /etc/logrotate.d/bind9 || failed "IS_BIND9LOGROTATE"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_BROADCOMFIRMWARE" = 1 ]; then
2019-03-23 10:32:53 +01:00
LSPCI_BIN=$(command -v lspci)
if [ -x "${LSPCI_BIN}" ]; then
if ${LSPCI_BIN} | grep -q 'NetXtreme II'; then
{ is_installed firmware-bnx2 \
&& grep -q "^deb http://mirror.evolix.org/debian.* non-free" /etc/apt/sources.list;
} || failed "IS_BROADCOMFIRMWARE"
fi
else
failed "IS_BROADCOMFIRMWARE" "lspci is missing"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_HARDWARERAIDTOOL" = 1 ]; then
2019-03-23 10:32:53 +01:00
LSPCI_BIN=$(command -v lspci)
if [ -x "${LSPCI_BIN}" ]; then
if ${LSPCI_BIN} | grep -q 'MegaRAID SAS'; then
# shellcheck disable=SC2015
is_installed megacli && { is_installed megaclisas-status || is_installed megaraidsas-status; } \
|| failed "IS_HARDWARERAIDTOOL" "Mega tools not found"
fi
if ${LSPCI_BIN} | grep -q 'Hewlett-Packard Company Smart Array'; then
is_installed cciss-vol-status || failed "IS_HARDWARERAIDTOOL" "cciss-vol-status not installed"
fi
else
failed "IS_HARDWARERAIDTOOL" "lspci is missing"
2019-03-22 00:30:44 +01:00
fi
2017-09-19 16:24:07 +02:00
fi
if [ "$IS_LOG2MAILSYSTEMDUNIT" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch; then
{ systemctl -q is-active log2mail.service \
&& test -f /etc/systemd/system/log2mail.service \
&& ! test -f /etc/init.d/log2mail;
} || failed "IS_LOG2MAILSYSTEMDUNIT"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_LISTUPGRADE" = 1 ]; then
{ test -f /etc/cron.d/listupgrade \
&& test -x /usr/share/scripts/listupgrade.sh;
} || failed "IS_LISTUPGRADE"
2017-09-19 16:24:07 +02:00
fi
if [ "$IS_MARIADBEVOLINUXCONF" = 1 ]; then
if is_debian_stretch; then
if is_installed mariadb-server; then
{ test -f /etc/mysql/mariadb.conf.d/z-evolinux-defaults.cnf \
&& test -f /etc/mysql/mariadb.conf.d/zzz-evolinux-custom.cnf;
} || failed "IS_MARIADBEVOLINUXCONF"
fi
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_SQL_BACKUP" = 1 ]; then
2017-12-06 10:28:39 +01:00
if (is_installed "mysql-server" || is_installed "mariadb-server"); then
# You could change the default path in /etc/evocheck.cf
SQL_BACKUP_PATH=${SQL_BACKUP_PATH:-"/home/backup/mysql.bak.gz"}
2019-03-22 21:55:47 +01:00
test -f "$SQL_BACKUP_PATH" || failed "IS_SQL_BACKUP" "MySQL dump is missing (${SQL_BACKUP_PATH})"
fi
fi
2017-12-06 10:28:39 +01:00
if [ "$IS_POSTGRES_BACKUP" = 1 ]; then
if is_installed "postgresql-9*"; then
2019-03-22 20:29:54 +01:00
# If you use something like barman, you should disable this check
2017-12-06 10:28:39 +01:00
# You could change the default path in /etc/evocheck.cf
POSTGRES_BACKUP_PATH=${POSTGRES_BACKUP_PATH:-"/home/backup/pg.dump.bak"}
2019-03-22 21:55:47 +01:00
test -f "$POSTGRES_BACKUP_PATH" || failed "IS_POSTGRES_BACKUP" "PostgreSQL dump is missing (${POSTGRES_BACKUP_PATH})"
2017-12-06 10:28:39 +01:00
fi
fi
2017-12-06 10:42:16 +01:00
if [ "$IS_MONGO_BACKUP" = 1 ]; then
if is_installed "mongodb-org-server"; then
# You could change the default path in /etc/evocheck.cf
MONGO_BACKUP_PATH=${MONGO_BACKUP_PATH:-"/home/backup/mongodump"}
if [ -d "$MONGO_BACKUP_PATH" ]; then
2019-03-22 22:45:45 +01:00
for file in "${MONGO_BACKUP_PATH}"/*/*.{json,bson}; do
2017-12-06 10:42:16 +01:00
# Skip indexes file.
if ! [[ "$file" =~ indexes ]]; then
limit=$(date +"%s" -d "now - 2 day")
2019-03-22 22:45:45 +01:00
updated_at=$(stat -c "%Y" "$file")
if [ -f "$file" ] && [ "$limit" -gt "$updated_at" ]; then
2019-03-22 21:55:47 +01:00
failed "IS_MONGO_BACKUP" "MongoDB hasn't been dumped for more than 2 days"
break
2017-12-06 10:42:16 +01:00
fi
fi
done
else
2019-03-22 21:55:47 +01:00
failed "IS_MONGO_BACKUP" "MongoDB dump directory is missing (${MONGO_BACKUP_PATH})"
2017-12-06 10:42:16 +01:00
fi
fi
fi
2017-12-06 10:14:17 +01:00
if [ "$IS_LDAP_BACKUP" = 1 ]; then
if is_installed slapd; then
# You could change the default path in /etc/evocheck.cf
LDAP_BACKUP_PATH=${LDAP_BACKUP_PATH:-"/home/backup/ldap.bak"}
2019-03-22 21:55:47 +01:00
test -f "$LDAP_BACKUP_PATH" || failed "IS_LDAP_BACKUP" "LDAP dump is missing (${LDAP_BACKUP_PATH})"
2017-12-06 10:14:17 +01:00
fi
fi
2017-12-06 10:49:52 +01:00
if [ "$IS_REDIS_BACKUP" = 1 ]; then
if is_installed redis-server; then
# You could change the default path in /etc/evocheck.cf
REDIS_BACKUP_PATH=${REDIS_BACKUP_PATH:-"/home/backup/dump.rdb"}
2019-03-22 21:55:47 +01:00
test -f "$REDIS_BACKUP_PATH" || failed "IS_REDIS_BACKUP" "Redis dump is missing (${REDIS_BACKUP_PATH})"
2017-12-06 10:49:52 +01:00
fi
fi
2017-12-06 11:05:02 +01:00
if [ "$IS_ELASTIC_BACKUP" = 1 ]; then
if is_installed elasticsearch; then
# You could change the default path in /etc/evocheck.cf
ELASTIC_BACKUP_PATH=${ELASTIC_BACKUP_PATH:-"/home/backup/elasticsearch"}
2019-03-22 21:55:47 +01:00
test -d "$ELASTIC_BACKUP_PATH" || failed "IS_ELASTIC_BACKUP" "Elastic snapshot is missing (${ELASTIC_BACKUP_PATH})"
2017-12-06 11:05:02 +01:00
fi
fi
2017-09-19 16:24:07 +02:00
if [ "$IS_MARIADBSYSTEMDUNIT" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch && is_installed mariadb-server; then
{ systemctl -q is-active mariadb.service \
&& test -f /etc/systemd/system/mariadb.service.d/evolinux.conf;
} || failed "IS_MARIADBSYSTEMDUNIT"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_MYSQLMUNIN" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch && is_installed mariadb-server; then
for file in mysql_bytes mysql_queries mysql_slowqueries \
2019-03-20 22:55:30 +01:00
mysql_threads mysql_connections mysql_files_tables \
mysql_innodb_bpool mysql_innodb_bpool_act mysql_innodb_io \
mysql_innodb_log mysql_innodb_rows mysql_innodb_semaphores \
mysql_myisam_indexes mysql_qcache mysql_qcache_mem \
mysql_sorts mysql_tmp_tables; do
if [[ ! -L /etc/munin/plugins/$file ]]; then
2019-03-22 21:55:47 +01:00
failed "IS_MYSQLMUNIN" "Munin plugin '$file' is missing"
2019-03-23 01:21:40 +01:00
test "${VERBOSE}" = 1 || break
fi
2017-09-19 16:24:07 +02:00
done
fi
fi
if [ "$IS_MYSQLNRPE" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch && is_installed mariadb-server; then
2019-03-22 20:30:08 +01:00
nagios_file="~nagios/.my.cnf"
{ test -f $nagios_file \
&& [ "$(stat -c %U $nagios_file)" = "nagios" ] \
&& [ "$(stat -c %a $nagios_file)" = "600" ] \
&& grep -q -F "command[check_mysql]=/usr/lib/nagios/plugins/check_mysql -H localhost -f $nagios_file";
} || failed "IS_MYSQLNRPE"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_PHPEVOLINUXCONF" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch && is_installed php; then
{ test -f /etc/php/7.0/cli/conf.d/z-evolinux-defaults.ini \
&& test -f /etc/php/7.0/cli/conf.d/zzz-evolinux-custom.ini;
} || failed "IS_PHPEVOLINUXCONF"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_SQUIDLOGROTATE" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch && is_installed squid; then
grep -q monthly /etc/logrotate.d/squid || failed "IS_SQUIDLOGROTATE"
2017-09-19 16:24:07 +02:00
fi
fi
if [ "$IS_SQUIDEVOLINUXCONF" = 1 ]; then
2019-03-20 21:49:08 +01:00
if is_debian_stretch && is_installed squid; then
{ grep -qs "^CONFIG=/etc/squid/evolinux-defaults.conf$" /etc/default/squid \
2017-09-19 16:24:07 +02:00
&& test -f /etc/squid/evolinux-defaults.conf \
&& test -f /etc/squid/evolinux-whitelist-defaults.conf \
&& test -f /etc/squid/evolinux-whitelist-custom.conf \
&& test -f /etc/squid/evolinux-acl.conf \
&& test -f /etc/squid/evolinux-httpaccess.conf \
&& test -f /etc/squid/evolinux-custom.conf;
} || failed "IS_SQUIDEVOLINUXCONF"
2017-09-19 16:24:07 +02:00
fi
fi
2018-03-19 14:51:18 +01:00
if [ "$IS_DUPLICATE_FS_LABEL" = 1 ]; then
2018-04-10 15:14:54 +02:00
# Do it only if thereis blkid binary
BLKID_BIN=$(command -v blkid)
if [ -x "$BLKID_BIN" ]; then
tmpFile=$(mktemp -p /tmp)
2019-03-22 20:02:04 +01:00
parts=$($BLKID_BIN | grep -ve raid_member -e EFI_SYSPART | grep -Eo ' LABEL=".*"' | cut -d'"' -f2)
for part in $parts; do
2018-03-19 14:51:18 +01:00
echo "$part" >> "$tmpFile"
done
2018-03-19 14:51:18 +01:00
tmpOutput=$(sort < "$tmpFile" | uniq -d)
# If there is no duplicate, uniq will have no output
# So, if $tmpOutput is not null, there is a duplicate
if [ -n "$tmpOutput" ]; then
# shellcheck disable=SC2086
labels=$(echo -n $tmpOutput | tr '\n' ' ')
failed "IS_DUPLICATE_FS_LABEL" "Duplicate labels: $labels"
2018-03-19 14:51:18 +01:00
fi
2019-03-22 23:56:46 +01:00
rm "$tmpFile"
2019-03-25 10:04:40 +01:00
else
failed "IS_DUPLICATE_FS_LABEL" "blkid not found"
fi
2018-04-10 15:16:37 +02:00
fi
if [ "$IS_EVOLIX_USER" = 1 ]; then
grep -q "evolix:" /etc/passwd && failed "IS_EVOLIX_USER"
fi
2018-06-13 18:03:14 +02:00
if [ "$IS_EVOACME_CRON" = 1 ]; then
if [ -f "/usr/local/sbin/evoacme" ]; then
# Old cron file, should be deleted
2019-03-22 21:55:47 +01:00
test -f /etc/cron.daily/certbot && failed "IS_EVOACME_CRON" "certbot cron is incompatible with evoacme"
2018-06-13 18:03:14 +02:00
# evoacme cron file should be present
2019-03-22 21:55:47 +01:00
test -f /etc/cron.daily/evoacme || failed "IS_EVOACME_CRON" "evoacme cron is missing"
2018-06-13 18:03:14 +02:00
fi
fi
2018-06-13 18:09:48 +02:00
2018-05-25 17:55:12 +02:00
if [ "$IS_EVOACME_LIVELINKS" = 1 ]; then
EVOACME_BIN=$(command -v evoacme)
if [ -x "$EVOACME_BIN" ]; then
# Sometimes evoacme is installed but no certificates has been generated
numberOfLinks=$(find /etc/letsencrypt/ -type l | wc -l)
2019-03-22 23:56:46 +01:00
if [ "$numberOfLinks" -gt 0 ]; then
for live in /etc/letsencrypt/*/live; do
2019-03-22 22:42:03 +01:00
actualLink=$(readlink -f "$live")
actualVersion=$(basename "$actualLink")
certDir=$(dirname "$live")
certName=$(basename "$certDir")
# shellcheck disable=SC2012
2019-03-22 22:42:03 +01:00
lastCertDir=$(ls -ds "${certDir}"/[0-9]* | tail -1)
lastVersion=$(basename "$lastCertDir")
if [[ "$lastVersion" != "$actualVersion" ]]; then
failed "IS_EVOACME_LIVELINKS" "Certificate \`$certName' hasn't been updated"
2019-03-23 01:21:40 +01:00
test "${VERBOSE}" = 1 || break
fi
done
fi
fi
2018-05-25 17:55:12 +02:00
fi
2018-06-27 15:20:39 +02:00
if [ "$IS_APACHE_CONFENABLED" = 1 ]; then
# Starting from Jessie and Apache 2.4, /etc/apache2/conf.d/
# must be replaced by conf-available/ and config files symlinked
# to conf-enabled/
2019-03-20 21:49:08 +01:00
if is_debian_jessie || is_debian_stretch; then
if [ -f /etc/apache2/apache2.conf ]; then
test -d /etc/apache2/conf.d/ && failed "IS_APACHE_CONFENABLED"
2019-03-20 22:55:30 +01:00
grep -q 'Include conf.d' /etc/apache2/apache2.conf && failed "IS_APACHE_CONFENABLED"
fi
fi
2018-06-27 15:20:39 +02:00
fi
Squashed commit of the following: commit db23167246678114668d640f88ed9e2f6397ded2 Author: Benoît S <bserie@evolix.fr> Date: Thu Jun 28 11:48:22 2018 +0200 Add a check for kernel config gile commit ae1ec7b2b9f3bd2d1c78af544562dd207ef5f330 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 18:01:07 2018 +0200 Redo the jessie part commit 62b61aabf169ebc9e7e741f4190507f177a9642d Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:49:44 2018 +0200 Well... For Stretch use only /sys/devices/system/cpu/vulnerabilities/ commit 33b19090e6c2462228f9f650f1e83da0b5928406 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:45:11 2018 +0200 Add check for spectre v2 commit 3451218a167e5b2efebed1f80234c9d2596546d3 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:33:24 2018 +0200 Do not use the BOOT_IMAGE trick commit ee60e28a5add36fb6b55231f8e39f275b5592409 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:30:18 2018 +0200 We cannot rely on dmesg commit 57bd4312cea6ce1d5b9c23e3e8307f1bc42852cb Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:46:46 2018 +0100 Breakline indentation commit d2278292ccf4340913ac6982961e0f011e077a3a Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:45:12 2018 +0100 Diffrent test for Jessie kernel commit 1418d4306e81152fa949821484a7d1226e1f2d5b Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:52:43 2018 +0100 Modified Meltdown check to handle kaiser and pti commit 2c6d075e2a9749d2805fb52ec5a2c7274f73dfc7 Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:24:42 2018 +0100 Add IS_MELTDOWN We check kaiser flags in /proc/cpuinfo and CONFIG_PAGE_TABLE_ISOLATION in kernel config file.
2018-06-28 11:52:31 +02:00
if [ "$IS_MELTDOWN_SPECTRE" = 1 ]; then
# For Stretch, detection is easy as the kernel use
# /sys/devices/system/cpu/vulnerabilities/
2019-03-20 21:49:08 +01:00
if is_debian_stretch; then
Squashed commit of the following: commit db23167246678114668d640f88ed9e2f6397ded2 Author: Benoît S <bserie@evolix.fr> Date: Thu Jun 28 11:48:22 2018 +0200 Add a check for kernel config gile commit ae1ec7b2b9f3bd2d1c78af544562dd207ef5f330 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 18:01:07 2018 +0200 Redo the jessie part commit 62b61aabf169ebc9e7e741f4190507f177a9642d Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:49:44 2018 +0200 Well... For Stretch use only /sys/devices/system/cpu/vulnerabilities/ commit 33b19090e6c2462228f9f650f1e83da0b5928406 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:45:11 2018 +0200 Add check for spectre v2 commit 3451218a167e5b2efebed1f80234c9d2596546d3 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:33:24 2018 +0200 Do not use the BOOT_IMAGE trick commit ee60e28a5add36fb6b55231f8e39f275b5592409 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:30:18 2018 +0200 We cannot rely on dmesg commit 57bd4312cea6ce1d5b9c23e3e8307f1bc42852cb Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:46:46 2018 +0100 Breakline indentation commit d2278292ccf4340913ac6982961e0f011e077a3a Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:45:12 2018 +0100 Diffrent test for Jessie kernel commit 1418d4306e81152fa949821484a7d1226e1f2d5b Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:52:43 2018 +0100 Modified Meltdown check to handle kaiser and pti commit 2c6d075e2a9749d2805fb52ec5a2c7274f73dfc7 Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:24:42 2018 +0100 Add IS_MELTDOWN We check kaiser flags in /proc/cpuinfo and CONFIG_PAGE_TABLE_ISOLATION in kernel config file.
2018-06-28 11:52:31 +02:00
for vuln in meltdown spectre_v1 spectre_v2; do
2019-03-22 22:43:38 +01:00
test -f "/sys/devices/system/cpu/vulnerabilities/$vuln" \
|| failed "IS_MELTDOWN_SPECTRE"
Squashed commit of the following: commit db23167246678114668d640f88ed9e2f6397ded2 Author: Benoît S <bserie@evolix.fr> Date: Thu Jun 28 11:48:22 2018 +0200 Add a check for kernel config gile commit ae1ec7b2b9f3bd2d1c78af544562dd207ef5f330 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 18:01:07 2018 +0200 Redo the jessie part commit 62b61aabf169ebc9e7e741f4190507f177a9642d Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:49:44 2018 +0200 Well... For Stretch use only /sys/devices/system/cpu/vulnerabilities/ commit 33b19090e6c2462228f9f650f1e83da0b5928406 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:45:11 2018 +0200 Add check for spectre v2 commit 3451218a167e5b2efebed1f80234c9d2596546d3 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:33:24 2018 +0200 Do not use the BOOT_IMAGE trick commit ee60e28a5add36fb6b55231f8e39f275b5592409 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:30:18 2018 +0200 We cannot rely on dmesg commit 57bd4312cea6ce1d5b9c23e3e8307f1bc42852cb Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:46:46 2018 +0100 Breakline indentation commit d2278292ccf4340913ac6982961e0f011e077a3a Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:45:12 2018 +0100 Diffrent test for Jessie kernel commit 1418d4306e81152fa949821484a7d1226e1f2d5b Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:52:43 2018 +0100 Modified Meltdown check to handle kaiser and pti commit 2c6d075e2a9749d2805fb52ec5a2c7274f73dfc7 Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:24:42 2018 +0100 Add IS_MELTDOWN We check kaiser flags in /proc/cpuinfo and CONFIG_PAGE_TABLE_ISOLATION in kernel config file.
2018-06-28 11:52:31 +02:00
done
# For Jessie this is quite complicated to verify and we need to use kernel config file
2019-03-20 21:49:08 +01:00
elif is_debian_jessie; then
2019-03-21 23:46:21 +01:00
if grep -q "BOOT_IMAGE=" /proc/cmdline; then
Squashed commit of the following: commit db23167246678114668d640f88ed9e2f6397ded2 Author: Benoît S <bserie@evolix.fr> Date: Thu Jun 28 11:48:22 2018 +0200 Add a check for kernel config gile commit ae1ec7b2b9f3bd2d1c78af544562dd207ef5f330 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 18:01:07 2018 +0200 Redo the jessie part commit 62b61aabf169ebc9e7e741f4190507f177a9642d Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:49:44 2018 +0200 Well... For Stretch use only /sys/devices/system/cpu/vulnerabilities/ commit 33b19090e6c2462228f9f650f1e83da0b5928406 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:45:11 2018 +0200 Add check for spectre v2 commit 3451218a167e5b2efebed1f80234c9d2596546d3 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:33:24 2018 +0200 Do not use the BOOT_IMAGE trick commit ee60e28a5add36fb6b55231f8e39f275b5592409 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:30:18 2018 +0200 We cannot rely on dmesg commit 57bd4312cea6ce1d5b9c23e3e8307f1bc42852cb Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:46:46 2018 +0100 Breakline indentation commit d2278292ccf4340913ac6982961e0f011e077a3a Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:45:12 2018 +0100 Diffrent test for Jessie kernel commit 1418d4306e81152fa949821484a7d1226e1f2d5b Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:52:43 2018 +0100 Modified Meltdown check to handle kaiser and pti commit 2c6d075e2a9749d2805fb52ec5a2c7274f73dfc7 Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:24:42 2018 +0100 Add IS_MELTDOWN We check kaiser flags in /proc/cpuinfo and CONFIG_PAGE_TABLE_ISOLATION in kernel config file.
2018-06-28 11:52:31 +02:00
kernelPath=$(grep -Eo 'BOOT_IMAGE=[^ ]+' /proc/cmdline | cut -d= -f2)
kernelVer=${kernelPath##*/vmlinuz-}
kernelConfig="config-${kernelVer}"
# Sometimes autodetection of kernel config file fail, so we test if the file really exists.
2019-03-22 22:43:38 +01:00
if [ -f "/boot/${kernelConfig}" ]; then
grep -Eq '^CONFIG_PAGE_TABLE_ISOLATION=y' "/boot/$kernelConfig" \
2019-03-22 21:55:47 +01:00
|| failed "IS_MELTDOWN_SPECTRE" "PAGE_TABLE_ISOLATION vulnerability is not patched"
2019-03-22 22:43:38 +01:00
grep -Eq '^CONFIG_RETPOLINE=y' "/boot/$kernelConfig" \
2019-03-22 21:55:47 +01:00
|| failed "IS_MELTDOWN_SPECTRE" "RETPOLINE vulnerability is not patched"
Squashed commit of the following: commit db23167246678114668d640f88ed9e2f6397ded2 Author: Benoît S <bserie@evolix.fr> Date: Thu Jun 28 11:48:22 2018 +0200 Add a check for kernel config gile commit ae1ec7b2b9f3bd2d1c78af544562dd207ef5f330 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 18:01:07 2018 +0200 Redo the jessie part commit 62b61aabf169ebc9e7e741f4190507f177a9642d Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:49:44 2018 +0200 Well... For Stretch use only /sys/devices/system/cpu/vulnerabilities/ commit 33b19090e6c2462228f9f650f1e83da0b5928406 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:45:11 2018 +0200 Add check for spectre v2 commit 3451218a167e5b2efebed1f80234c9d2596546d3 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:33:24 2018 +0200 Do not use the BOOT_IMAGE trick commit ee60e28a5add36fb6b55231f8e39f275b5592409 Author: Benoît S <bserie@evolix.fr> Date: Wed Jun 27 17:30:18 2018 +0200 We cannot rely on dmesg commit 57bd4312cea6ce1d5b9c23e3e8307f1bc42852cb Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:46:46 2018 +0100 Breakline indentation commit d2278292ccf4340913ac6982961e0f011e077a3a Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 14:45:12 2018 +0100 Diffrent test for Jessie kernel commit 1418d4306e81152fa949821484a7d1226e1f2d5b Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:52:43 2018 +0100 Modified Meltdown check to handle kaiser and pti commit 2c6d075e2a9749d2805fb52ec5a2c7274f73dfc7 Author: Benoît.S <benpro@benpro.fr> Date: Thu Jan 11 11:24:42 2018 +0100 Add IS_MELTDOWN We check kaiser flags in /proc/cpuinfo and CONFIG_PAGE_TABLE_ISOLATION in kernel config file.
2018-06-28 11:52:31 +02:00
fi
fi
fi
fi
if [ "$IS_OLD_HOME_DIR" = 1 ]; then
2019-03-22 21:55:47 +01:00
homeDir=${homeDir:-/home}
2019-03-22 22:43:38 +01:00
for dir in "$homeDir"/*; do
statResult=$(stat -c "%n has owner %u resolved as %U" "$dir" \
2019-03-21 23:46:21 +01:00
| grep -Eve '.bak' -e '\.[0-9]{2}-[0-9]{2}-[0-9]{4}' \
| grep "UNKNOWN")
# There is at least one dir matching
if [[ -n "$statResult" ]]; then
2019-03-22 21:55:47 +01:00
failed "IS_OLD_HOME_DIR" "$statResult"
2019-03-23 01:21:40 +01:00
test "${VERBOSE}" = 1 || break
fi
done
fi
fi
2019-03-20 21:49:08 +01:00
if is_openbsd; then
if [ "$IS_SOFTDEP" = 1 ]; then
grep -q "softdep" /etc/fstab || failed "IS_SOFTDEP"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_WHEEL" = 1 ]; then
grep -qE "^%wheel.*$" /etc/sudoers || failed "IS_WHEEL"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_SUDOADMIN" = 1 ]; then
2019-03-20 22:55:30 +01:00
grep -qE "^User_Alias ADMIN=.*$" /etc/sudoers || failed "IS_SUDOADMIN"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_PKGMIRROR" = 1 ]; then
grep -qE "^export PKG_PATH=http://ftp\.fr\.openbsd\.org/pub/OpenBSD/[0-9.]+/packages/[a-z0-9]+/$" /root/.profile \
|| failed "IS_PKGMIRROR"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_HISTORY" = 1 ]; then
f=/root/.profile
{ grep -q "^HISTFILE=\$HOME/.histfile" $f \
2019-03-20 22:55:30 +01:00
&& grep -q "^export HISTFILE" $f \
&& grep -q "^HISTSIZE=1000" $f \
&& grep -q "^export HISTSIZE" $f;
} || failed "IS_HISTORY"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_VIM" = 1 ]; then
command -v vim > /dev/null 2>&1 || failed "IS_VIM"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_TTYC0SECURE" = 1 ]; then
grep -Eqv "^ttyC0.*secure$" /etc/ttys || failed "IS_TTYC0SECURE"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_CUSTOMSYSLOG" = 1 ]; then
2019-03-21 23:46:21 +01:00
grep -q "Evolix" /etc/newsyslog.conf || failed "IS_CUSTOMSYSLOG"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_NOINETD" = 1 ]; then
2019-03-21 23:46:21 +01:00
grep -q "inetd=NO" /etc/rc.conf.local 2>/dev/null || failed "IS_NOINETD"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_SUDOMAINT" = 1 ]; then
f=/etc/sudoers
{ grep -q "Cmnd_Alias MAINT = /usr/share/scripts/evomaintenance.sh" $f \
&& grep -q "ADMIN ALL=NOPASSWD: MAINT" $f;
} || failed "IS_SUDOMAINT"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_POSTGRESQL" = 1 ]; then
2019-03-22 21:55:47 +01:00
pkg info | grep -q postgresql-client || failed "IS_POSTGRESQL" "postgresql-client is not installed"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_NRPE" = 1 ]; then
{ pkg info | grep -qE "nagios-plugins-[0-9.]" \
2019-03-20 22:55:30 +01:00
&& pkg info | grep -q nagios-plugins-ntp \
&& pkg info | grep -q nrpe;
2019-03-22 21:55:47 +01:00
} || failed "IS_NRPE" "NRPE is not installed"
fi
2018-03-29 22:29:50 +02:00
# if [ "$IS_NRPEDISKS" = 1 ]; then
# NRPEDISKS=$(grep command.check_disk /etc/nrpe.cfg 2>/dev/null | grep "^command.check_disk[0-9]" | sed -e "s/^command.check_disk\([0-9]\+\).*/\1/" | sort -n | tail -1)
# DFDISKS=$(df -Pl | grep -E -v "(^Filesystem|/lib/init/rw|/dev/shm|udev|rpc_pipefs)" | wc -l)
# [ "$NRPEDISKS" = "$DFDISKS" ] || failed "IS_NRPEDISKS"
# fi
2018-03-29 22:29:50 +02:00
# Verification du check_mailq dans nrpe.cfg (celui-ci doit avoir l'option "-M postfix" si le MTA est Postfix)
2018-03-29 22:29:50 +02:00
#
# if [ "$IS_NRPEPOSTFIX" = 1 ]; then
# pkg info | grep -q postfix && ( grep -q "^command.*check_mailq -M postfix" /etc/nrpe.cfg 2>/dev/null || failed "IS_NRPEPOSTFIX" )
# fi
2018-03-29 22:29:50 +02:00
if [ "$IS_NRPEDAEMON" = 1 ]; then
grep -q "echo -n ' nrpe'; /usr/local/sbin/nrpe -d" /etc/rc.local \
|| failed "IS_NREPEDAEMON"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_ALERTBOOT" = 1 ]; then
grep -qE "^date \| mail -sboot/reboot .*evolix.fr$" /etc/rc.local \
|| failed "IS_ALERTBOOT"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_RSYNC" = 1 ]; then
pkg info | grep -q rsync || failed "IS_RSYNC"
fi
2018-03-29 22:29:50 +02:00
if [ "$IS_CRONPATH" = 1 ]; then
grep -q "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" /var/cron/tabs/root \
|| failed "IS_CRONPATH"
fi
2018-03-29 22:29:50 +02:00
#TODO
# - Check en profondeur de postfix
# - NRPEDISK et NRPEPOSTFIX
fi
2009-07-05 01:58:11 +02:00
if [ "$IS_TMP_1777" = 1 ]; then
2019-03-21 23:44:18 +01:00
actual=$(stat --format "%A" /tmp)
expected="drwxrwxrwt"
test "$expected" = "$actual" || failed "IS_TMP_1777"
2009-07-05 01:58:11 +02:00
fi
if [ "$IS_ROOT_0700" = 1 ]; then
2019-03-21 23:44:18 +01:00
actual=$(stat --format "%A" /root)
expected="drwx------"
test "$expected" = "$actual" || failed "IS_ROOT_0700"
2009-07-05 01:58:11 +02:00
fi
if [ "$IS_USRSHARESCRIPTS" = 1 ]; then
2019-03-21 23:44:18 +01:00
actual=$(stat --format "%A" /usr/share/scripts)
expected="drwx------"
test "$expected" = "$actual" || failed "IS_USRSHARESCRIPTS"
2009-07-05 01:58:11 +02:00
fi
2009-07-13 01:44:31 +02:00
if [ "$IS_SSHPERMITROOTNO" = 1 ]; then
if is_debian_stretch; then
2019-03-22 00:30:44 +01:00
if grep -q "^PermitRoot" /etc/ssh/sshd_config; then
grep -E -qi "PermitRoot.*no" /etc/ssh/sshd_config || failed "IS_SSHPERMITROOTNO"
fi
else
grep -E -qi "PermitRoot.*no" /etc/ssh/sshd_config || failed "IS_SSHPERMITROOTNO"
fi
2009-07-13 01:44:31 +02:00
fi
2009-07-18 17:21:00 +02:00
if [ "$IS_EVOMAINTENANCEUSERS" = 1 ]; then
if is_debian_stretch; then
2019-03-22 20:39:42 +01:00
users=$(getent group evolinux-sudo | cut -d':' -f4 | tr ',' ' ')
2016-05-10 16:28:07 +02:00
else
if [ -f /etc/sudoers.d/evolinux ]; then
sudoers="/etc/sudoers.d/evolinux"
else
sudoers="/etc/sudoers"
fi
2019-03-22 22:44:15 +01:00
# combine users from User_Alias and sudo group
users=$({ grep "^User_Alias *ADMIN" $sudoers | cut -d= -f2 | tr -d " "; grep "^sudo" /etc/group | cut -d: -f 4; } | tr "," "\n" | sort -u)
2016-05-10 16:28:07 +02:00
fi
2019-03-22 20:39:42 +01:00
for user in $users; do
user_home=$(getent passwd "$user" | cut -d: -f6)
if [ -n "$user_home" ] && [ -d "$user_home" ]; then
if ! grep -qs "^trap.*sudo.*evomaintenance.sh" "${user_home}"/.*profile; then
failed "IS_EVOMAINTENANCEUSERS" "${user} doesn't have an evomaintenance trap"
test "${VERBOSE}" = 1 || break
fi
2019-03-22 20:39:42 +01:00
fi
done
2009-07-18 17:21:00 +02:00
fi
# Verification de la configuration d'evomaintenance
if [ "$IS_EVOMAINTENANCECONF" = 1 ]; then
f=/etc/evomaintenance.cf
if [ -e "$f" ]; then
perms=$(stat -c "%a" $f)
test "$perms" = "600" || failed "IS_EVOMAINTENANCECONF" "Wrong permissions on \`$f' ($perms instead of 600)"
{ grep "^export PGPASSWORD" $f | grep -qv "your-passwd" \
&& grep "^PGDB" $f | grep -qv "your-db" \
&& grep "^PGTABLE" $f | grep -qv "your-table" \
&& grep "^PGHOST" $f | grep -qv "your-pg-host" \
&& grep "^FROM" $f | grep -qv "jdoe@example.com" \
&& grep "^FULLFROM" $f | grep -qv "John Doe <jdoe@example.com>" \
&& grep "^URGENCYFROM" $f | grep -qv "mama.doe@example.com" \
&& grep "^URGENCYTEL" $f | grep -qv "06.00.00.00.00" \
&& grep "^REALM" $f | grep -qv "example.com";
} || failed "IS_EVOMAINTENANCECONF" "evomaintenance is not correctly configured"
else
failed "IS_EVOMAINTENANCECONF" "Configuration file \`$f' is missing"
fi
fi
2017-09-11 17:16:42 +02:00
if [ "$IS_PRIVKEYWOLRDREADABLE" = 1 ]; then
# a simple globbing fails if directory is empty
if [ -n "$(ls -A /etc/ssl/private/)" ]; then
for f in /etc/ssl/private/*; do
perms=$(stat -L -c "%a" "$f")
if [ "${perms: -1}" != 0 ]; then
failed "IS_PRIVKEYWOLRDREADABLE" "$f is world-readable"
test "${VERBOSE}" = 1 || break
fi
done
fi
2017-09-11 17:16:42 +02:00
fi
exit ${RC}