mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-29 22:49:41 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			293 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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`
 | |
| 
 | |
| # we must move to contrib/sepgsql directory to run pg_regress correctly
 | |
| cd `dirname $0`
 | |
| 
 | |
| 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
 | |
| POLICY_STATUS=`getsebool sepgsql_enable_users_ddl | awk '{print $3}'`
 | |
| echo ${POLICY_STATUS:-failed}
 | |
| if [ "${POLICY_STATUS}" != on ]; then
 | |
|     echo ""
 | |
|     echo "The SELinux boolean 'sepgsql_enable_users_ddl' must be"
 | |
|     echo "turned on in order to enable the rules necessary to run"
 | |
|     echo "the 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_enable_users_ddl on"
 | |
|         echo ""
 | |
|         echo "For security reasons, it is suggested that you turn off this"
 | |
|         echo "variable when regression testing is complete, unless you"
 | |
|         echo "don't want to allow unprivileged users DDL commands."
 | |
|     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 ddl alter misc" REGRESS_OPTS="--launcher ./launcher" installcheck
 | |
| 
 | |
| # exit with the exit code provided by "make"
 |