mirror of https://github.com/postgres/postgres
Because these tests require root privileges, not to mention invasive changes to the security configuration of the host system, it's not reasonable for them to be invoked by a regular "make check" or "make installcheck". Instead, dike out the Makefile's knowledge of the tests, and change chkselinuxenv (now renamed "test_sepgsql") into a script that verifies the environment is workable and then runs the tests. It's expected that test_sepgsql will only be run manually. While at it, do some cleanup in the error checking in the script, and do some wordsmithing in the documentation.pull/1/head
parent
bbd38af3a8
commit
cc4ff8742b
@ -1,230 +0,0 @@ |
||||
#!/bin/sh |
||||
# |
||||
# SELinux environment checks to ensure configuration of the operating system |
||||
# satisfies prerequisites to run regression test. |
||||
# If incorrect settings are found, this script suggest user a hint. |
||||
# |
||||
PG_BINDIR="$1" |
||||
PG_DATADIR="$2" |
||||
|
||||
echo |
||||
echo "============== checking selinux environment ==============" |
||||
|
||||
# matchpathcon must be present to assess whether the installation environment |
||||
# is OK. |
||||
echo -n "checking for matchpathcon ... " |
||||
if ! matchpathcon -n . >/dev/null 2>&1; then |
||||
echo "not found" |
||||
echo "" |
||||
echo "matchpathcon not found; please install it or update your PATH." |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# runcon must be present to launch psql using the correct environment |
||||
echo -n "checking for runcon ... " |
||||
if ! runcon --help >/dev/null 2>&1; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "The runcon command must exist and be executable; it is used to" |
||||
echo "launch psql command with a particular domain. It is typically" |
||||
echo "included within the coreutils package." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# check that the user is running in the unconfined_t domain |
||||
echo -n "checking current user domain ... " |
||||
DOMAIN=`id -Z 2>/dev/null | sed 's/:/ /g' | awk '{print $3}'` |
||||
echo ${DOMAIN:-failed} |
||||
if [ "${DOMAIN}" != "unconfined_t" ]; then |
||||
echo "" |
||||
echo "This regression test must be launched from the unconfined_t domain." |
||||
echo "" |
||||
echo "The unconfined_t domain is typically the default domain for user" |
||||
echo "shell processes. If the default has been changed on your system," |
||||
echo "you can revert the changes like this:" |
||||
echo "" |
||||
echo " \$ su -" |
||||
echo " # semanage login -d `whoami`" |
||||
echo "" |
||||
echo "Or, you can add a setting to log in using the unconfined_t domain:" |
||||
echo "" |
||||
echo " \$ su -" |
||||
echo " # semanage login -a -s unconfined_u -r s0-s0:c0.c255 `whoami`" |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
|
||||
# SELinux must be configured to enforcing mode |
||||
echo -n "checking selinux operating mode ... " |
||||
CURRENT_MODE=`env LANG=C sestatus | grep 'Current mode:' | awk '{print $3}'` |
||||
echo ${CURRENT_MODE:-failed} |
||||
if [ "${CURRENT_MODE}" != enforcing ]; then |
||||
if [ "${CURRENT_MODE}" = permissive -o "${CURRENT_MODE}" = disabled ]; then |
||||
echo "" |
||||
echo "Before running the regression tests, SELinux must be enabled and" |
||||
echo "must be running in enforcing mode." |
||||
echo "" |
||||
echo "If SELinux is currently running in permissive mode, you can" |
||||
echo "switch to enforcing command using the 'setenforce' command." |
||||
echo |
||||
echo " \$ su -" |
||||
echo " # setenforce 1" |
||||
echo "" |
||||
echo "The system default setting is configured in /etc/selinux/config," |
||||
echo "or using a kernel bool parameter." |
||||
echo "" |
||||
else |
||||
echo "" |
||||
echo "Unable to determine the current selinux operating mode. Please" |
||||
echo "verify that the sestatus command is installed and in your PATH." |
||||
echo "" |
||||
fi |
||||
exit 1 |
||||
fi |
||||
|
||||
# 'sepgsql-regtest' policy module must be loaded |
||||
echo -n "checking for sepgsql-regtest policy ... " |
||||
SELINUX_MNT=`env LANG=C sestatus 2>/dev/null | grep '^SELinuxfs mount:' | awk '{print $3}'` |
||||
if [ "$SELINUX_MNT" = "" ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "Unable to find SELinuxfs mount point." |
||||
echo "" |
||||
echo "The sestatus command should report the location where SELinuxfs" |
||||
echo "is mounted, but did not do so." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
if [ ! -e ${SELINUX_MNT}/booleans/sepgsql_regression_test_mode ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "The 'sepgsql-regtest' policy module appears not to be installed." |
||||
echo "Without this policy installed, the regression tests will fail." |
||||
echo "You can install this module using the following commands:" |
||||
echo "" |
||||
echo " \$ make -f /usr/share/selinux/devel/Makefile -C contrib/selinux" |
||||
echo " \$ su" |
||||
echo " # semodule -i contrib/sepgsql/sepgsql-regtest.pp" |
||||
echo "" |
||||
echo "To confirm that policy package is installed, use this command:" |
||||
echo "" |
||||
echo " # semodule -l | grep sepgsql" |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# Verify that sepgsql_regression_test_mode is active. |
||||
echo -n "checking whether policy is enabled ... " |
||||
POLICY_STATUS=`getsebool sepgsql_regression_test_mode | awk '{print $3}'` |
||||
echo ${POLICY_STATUS:-failed} |
||||
if [ "${POLICY_STATUS}" != "on" ]; then |
||||
echo "" |
||||
echo "The SELinux boolean 'sepgsql_regression_test_mode' must be" |
||||
echo "turned on in order to enable the rules necessary to run the" |
||||
echo "regression tests." |
||||
echo "" |
||||
if [ "${POLICY_STATUS}" = "" ]; then |
||||
echo "We attempted to determine the state of this Boolean using" |
||||
echo "'getsebool', but that command did not produce the expected" |
||||
echo "output. Please verify that getsebool is available and in" |
||||
echo "your PATH." |
||||
else |
||||
echo "You can turn on this variable using the following commands:" |
||||
echo "" |
||||
echo " \$ su -" |
||||
echo " # setsebool sepgsql_regression_test_mode 1" |
||||
echo "" |
||||
echo "For security reasons, it is suggested that you turn off this" |
||||
echo "variable when regression testing is complete and the associated" |
||||
echo "rules are no longer needed." |
||||
fi |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
|
||||
# 'psql' command must be executable by test domain |
||||
echo -n "checking whether we can run psql ... " |
||||
CMD_PSQL="${PG_BINDIR}/psql" |
||||
runcon -t sepgsql_regtest_user_t ${CMD_PSQL} --help >& /dev/null |
||||
if [ $? -ne 0 ]; then |
||||
echo "failed" |
||||
echo |
||||
echo "${CMD_PSQL} must be executable from the sepgsql_regtest_user_t" |
||||
echo "domain. The domain has restricted privileges compared to" |
||||
echo "unconfined_t, so you should ensure that it is labeled correctly." |
||||
echo |
||||
echo " \$ su - (not needed, if you owns installation directory)" |
||||
EXPECT_PSQL=`matchpathcon -n ${CMD_PSQL} | sed 's/:/ /g' | awk '{print $3}'` |
||||
if [ "${EXPECT_PSQL}" = "user_home_t" ]; then |
||||
## Case of installation on /home directory |
||||
echo " # restorecon -R ${PG_BINDIR}" |
||||
echo |
||||
echo "Or, using chcon" |
||||
echo |
||||
echo " # chcon -t user_home_t ${CMD_PSQL}" |
||||
else |
||||
echo " \$ su - (not needed, if you own the installation directory)" |
||||
echo " # restorecon -R ${PG_BINDIR}" |
||||
echo |
||||
echo "Or, using chcon" |
||||
echo |
||||
echo " # chcon -t bin_t ${CMD_PSQL}" |
||||
fi |
||||
echo |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# loadable module must be installed and not configured to permissive mode |
||||
echo -n "checking sepgsql installation ... " |
||||
VAL="`${CMD_PSQL} template1 -tc 'SHOW sepgsql.permissive' 2>/dev/null`" |
||||
RETVAL="$?" |
||||
if [ $RETVAL -eq 2 ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "Unable to connect to the server. Please check your installation." |
||||
echo "" |
||||
exit 1 |
||||
elif [ $RETVAL -ne 0 ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "The 'sepgsql' module does not appear to be loaded. Please verify" |
||||
echo "that the 'shared_preload_libraries' setting in postgresql.conf" |
||||
echo "includes sepgsql, and then stop and restart the server." |
||||
echo "" |
||||
exit 1 |
||||
elif ! echo "$VAL" | grep -q 'off$'; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "The GUC variable 'sepgsql.permissive' is set to 'on'. It must be" |
||||
echo "turned off before running the regression tests." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# template1 database must be labeled |
||||
echo -n "checking for labels in template1 ... " |
||||
NUM=`${CMD_PSQL} template1 -Atc 'SELECT count(*) FROM pg_catalog.pg_seclabel' 2>/dev/null` |
||||
if [ -z "${NUM}" ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "In order to regression test sepgsql, initial labels must be assigned" |
||||
echo "on the 'template1' database. These labels will be copied into the" |
||||
echo "regression test database." |
||||
echo "" |
||||
echo "See Installation section of the PostgreSQL documentation." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "found ${NUM}" |
||||
|
||||
# |
||||
# check complete - |
||||
# |
||||
echo "" |
||||
exit 0 |
@ -0,0 +1,264 @@ |
||||
#!/bin/sh |
||||
# |
||||
# Run the sepgsql regression tests, after making a lot of environmental checks |
||||
# to try to ensure that the SELinux environment is set up appropriately and |
||||
# the database is configured correctly. |
||||
# |
||||
# Note that this must be run against an installed Postgres database. |
||||
# There's no equivalent of "make check", and that wouldn't be terribly useful |
||||
# since much of the value is in checking that you installed sepgsql into |
||||
# your database correctly. |
||||
# |
||||
# This must be run in the contrib/sepgsql directory of a Postgres build tree. |
||||
# |
||||
|
||||
PG_BINDIR=`pg_config --bindir` |
||||
|
||||
echo |
||||
echo "============== checking selinux environment ==============" |
||||
|
||||
# matchpathcon must be present to assess whether the installation environment |
||||
# is OK. |
||||
echo -n "checking for matchpathcon ... " |
||||
if ! matchpathcon -n . >/dev/null 2>&1; then |
||||
echo "not found" |
||||
echo "" |
||||
echo "The matchpathcon command must be available." |
||||
echo "Please install it or update your PATH to include it" |
||||
echo "(it is typically in '/usr/sbin', which might not be in your PATH)." |
||||
echo "matchpathcon is typically included in the libselinux-utils package." |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# runcon must be present to launch psql using the correct environment |
||||
echo -n "checking for runcon ... " |
||||
if ! runcon --help >/dev/null 2>&1; then |
||||
echo "not found" |
||||
echo "" |
||||
echo "The runcon command must be available." |
||||
echo "runcon is typically included in the coreutils package." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# check sestatus too, since that lives in yet another package |
||||
echo -n "checking for sestatus ... " |
||||
if ! sestatus >/dev/null 2>&1; then |
||||
echo "not found" |
||||
echo "" |
||||
echo "The sestatus command must be available." |
||||
echo "sestatus is typically included in the policycoreutils package." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# check that the user is running in the unconfined_t domain |
||||
echo -n "checking current user domain ... " |
||||
DOMAIN=`id -Z 2>/dev/null | sed 's/:/ /g' | awk '{print $3}'` |
||||
echo ${DOMAIN:-failed} |
||||
if [ "${DOMAIN}" != unconfined_t ]; then |
||||
echo "" |
||||
echo "The regression tests must be launched from the unconfined_t domain." |
||||
echo "" |
||||
echo "The unconfined_t domain is typically the default domain for user" |
||||
echo "shell processes. If the default has been changed on your system," |
||||
echo "you can revert the changes like this:" |
||||
echo "" |
||||
echo " \$ sudo semanage login -d `whoami`" |
||||
echo "" |
||||
echo "Or, you can add a setting to log in using the unconfined_t domain:" |
||||
echo "" |
||||
echo " \$ sudo semanage login -a -s unconfined_u -r s0-s0:c0.c255 `whoami`" |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
|
||||
# SELinux must be configured in enforcing mode |
||||
echo -n "checking selinux operating mode ... " |
||||
CURRENT_MODE=`LANG=C sestatus | grep '^Current mode:' | awk '{print $3}'` |
||||
echo ${CURRENT_MODE:-failed} |
||||
if [ "${CURRENT_MODE}" = enforcing ]; then |
||||
: OK |
||||
elif [ "${CURRENT_MODE}" = permissive -o "${CURRENT_MODE}" = disabled ]; then |
||||
echo "" |
||||
echo "Before running the regression tests, SELinux must be enabled and" |
||||
echo "must be running in enforcing mode." |
||||
echo "" |
||||
echo "If SELinux is currently running in permissive mode, you can" |
||||
echo "switch to enforcing mode using the 'setenforce' command." |
||||
echo |
||||
echo " \$ sudo setenforce 1" |
||||
echo "" |
||||
echo "The system default setting is configured in /etc/selinux/config," |
||||
echo "or using a kernel boot parameter." |
||||
echo "" |
||||
exit 1 |
||||
else |
||||
echo "" |
||||
echo "Unable to determine the current selinux operating mode. Please" |
||||
echo "verify that the sestatus command is installed and in your PATH." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
|
||||
# 'sepgsql-regtest' policy module must be loaded |
||||
echo -n "checking for sepgsql-regtest policy ... " |
||||
SELINUX_MNT=`LANG=C sestatus | grep '^SELinuxfs mount:' | awk '{print $3}'` |
||||
if [ "$SELINUX_MNT" = "" ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "Unable to find SELinuxfs mount point." |
||||
echo "" |
||||
echo "The sestatus command should report the location where SELinuxfs" |
||||
echo "is mounted, but did not do so." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
if [ ! -e "${SELINUX_MNT}/booleans/sepgsql_regression_test_mode" ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "The 'sepgsql-regtest' policy module appears not to be installed." |
||||
echo "Without this policy installed, the regression tests will fail." |
||||
echo "You can install this module using the following commands:" |
||||
echo "" |
||||
echo " \$ make -f /usr/share/selinux/devel/Makefile" |
||||
echo " \$ sudo semodule -u sepgsql-regtest.pp" |
||||
echo "" |
||||
echo "To confirm that the policy package is installed, use this command:" |
||||
echo "" |
||||
echo " \$ sudo semodule -l | grep sepgsql" |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# Verify that sepgsql_regression_test_mode is active. |
||||
echo -n "checking whether policy is enabled ... " |
||||
POLICY_STATUS=`getsebool sepgsql_regression_test_mode | awk '{print $3}'` |
||||
echo ${POLICY_STATUS:-failed} |
||||
if [ "${POLICY_STATUS}" != on ]; then |
||||
echo "" |
||||
echo "The SELinux boolean 'sepgsql_regression_test_mode' must be" |
||||
echo "turned on in order to enable the rules necessary to run the" |
||||
echo "regression tests." |
||||
echo "" |
||||
if [ "${POLICY_STATUS}" = "" ]; then |
||||
echo "We attempted to determine the state of this Boolean using" |
||||
echo "'getsebool', but that command did not produce the expected" |
||||
echo "output. Please verify that getsebool is available and in" |
||||
echo "your PATH." |
||||
else |
||||
echo "You can turn on this variable using the following commands:" |
||||
echo "" |
||||
echo " \$ sudo setsebool sepgsql_regression_test_mode on" |
||||
echo "" |
||||
echo "For security reasons, it is suggested that you turn off this" |
||||
echo "variable when regression testing is complete and the associated" |
||||
echo "rules are no longer needed." |
||||
fi |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
|
||||
# 'psql' command must be executable from test domain |
||||
echo -n "checking whether we can run psql ... " |
||||
CMD_PSQL="${PG_BINDIR}/psql" |
||||
if [ ! -e "${CMD_PSQL}" ]; then |
||||
echo "not found" |
||||
echo |
||||
echo "${CMD_PSQL} was not found." |
||||
echo "Check your PostgreSQL installation." |
||||
echo |
||||
exit 1 |
||||
fi |
||||
runcon -t sepgsql_regtest_user_t "${CMD_PSQL}" --help >& /dev/null |
||||
if [ $? -ne 0 ]; then |
||||
echo "failed" |
||||
echo |
||||
echo "${CMD_PSQL} must be executable from the" |
||||
echo "sepgsql_regtest_user_t domain. That domain has restricted privileges" |
||||
echo "compared to unconfined_t, so the problem may be the psql file's" |
||||
echo "SELinux label. Try" |
||||
echo |
||||
PSQL_T=`matchpathcon -n "${CMD_PSQL}" | sed 's/:/ /g' | awk '{print $3}'` |
||||
if [ "${PSQL_T}" = "user_home_t" ]; then |
||||
# Installation appears to be in /home directory |
||||
echo " \$ sudo restorecon -R ${PG_BINDIR}" |
||||
echo |
||||
echo "Or, using chcon" |
||||
echo |
||||
echo " \$ sudo chcon -t user_home_t ${CMD_PSQL}" |
||||
else |
||||
echo " \$ sudo restorecon -R ${PG_BINDIR}" |
||||
echo |
||||
echo "Or, using chcon" |
||||
echo |
||||
echo " \$ sudo chcon -t bin_t ${CMD_PSQL}" |
||||
fi |
||||
echo |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# loadable module must be installed and not configured to permissive mode |
||||
echo -n "checking sepgsql installation ... " |
||||
VAL="`${CMD_PSQL} -t -c 'SHOW sepgsql.permissive' template1 2>/dev/null`" |
||||
RETVAL="$?" |
||||
if [ $RETVAL -eq 2 ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "Could not connect to the database server." |
||||
echo "Please check your PostgreSQL installation." |
||||
echo "" |
||||
exit 1 |
||||
elif [ $RETVAL -ne 0 ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "The sepgsql module does not appear to be loaded. Please verify" |
||||
echo "that the 'shared_preload_libraries' setting in postgresql.conf" |
||||
echo "includes 'sepgsql', and then restart the server." |
||||
echo "" |
||||
echo "See Installation section of the contrib/sepgsql documentation." |
||||
echo "" |
||||
exit 1 |
||||
elif ! echo "$VAL" | grep -q 'off$'; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "The parameter 'sepgsql.permissive' is set to 'on'. It must be" |
||||
echo "turned off before running the regression tests." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "ok" |
||||
|
||||
# template1 database must be labeled |
||||
# NOTE: this test is wrong; we really ought to be checking template0. |
||||
# But we can't connect to that without extra pushups, and it's not worth it. |
||||
echo -n "checking for labels in template1 ... " |
||||
NUM=`${CMD_PSQL} -At -c 'SELECT count(*) FROM pg_catalog.pg_seclabel' template1 2>/dev/null` |
||||
if [ -z "${NUM}" ]; then |
||||
echo "failed" |
||||
echo "" |
||||
echo "In order to test sepgsql, initial labels must be assigned within" |
||||
echo "the 'template1' database. These labels will be copied into the" |
||||
echo "regression test database." |
||||
echo "" |
||||
echo "See Installation section of the contrib/sepgsql documentation." |
||||
echo "" |
||||
exit 1 |
||||
fi |
||||
echo "found ${NUM}" |
||||
|
||||
# |
||||
# checking complete - let's run the tests |
||||
# |
||||
|
||||
echo |
||||
echo "============== running sepgsql regression tests ==============" |
||||
|
||||
make REGRESS="label dml misc" REGRESS_OPTS="--launcher ./launcher" installcheck |
||||
|
||||
# exit with the exit code provided by "make" |
Loading…
Reference in new issue