aboutsummaryrefslogtreecommitdiff
path: root/contrib/sepgsql/hooks.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sepgsql/hooks.c')
-rw-r--r--contrib/sepgsql/hooks.c193
1 files changed, 3 insertions, 190 deletions
diff --git a/contrib/sepgsql/hooks.c b/contrib/sepgsql/hooks.c
index 47437ba5b31..70934950e51 100644
--- a/contrib/sepgsql/hooks.c
+++ b/contrib/sepgsql/hooks.c
@@ -18,7 +18,6 @@
#include "commands/seclabel.h"
#include "executor/executor.h"
#include "fmgr.h"
-#include "libpq/auth.h"
#include "miscadmin.h"
#include "tcop/utility.h"
#include "utils/guc.h"
@@ -36,10 +35,7 @@ void _PG_init(void);
* Saved hook entries (if stacked)
*/
static object_access_hook_type next_object_access_hook = NULL;
-static ClientAuthentication_hook_type next_client_auth_hook = NULL;
static ExecutorCheckPerms_hook_type next_exec_check_perms_hook = NULL;
-static needs_fmgr_hook_type next_needs_fmgr_hook = NULL;
-static fmgr_hook_type next_fmgr_hook = NULL;
static ProcessUtility_hook_type next_ProcessUtility_hook = NULL;
static ExecutorStart_hook_type next_ExecutorStart_hook = NULL;
@@ -82,48 +78,6 @@ sepgsql_get_debug_audit(void)
}
/*
- * sepgsql_client_auth
- *
- * Entrypoint of the client authentication hook.
- * It switches the client label according to getpeercon(), and the current
- * performing mode according to the GUC setting.
- */
-static void
-sepgsql_client_auth(Port *port, int status)
-{
- char *context;
-
- if (next_client_auth_hook)
- (*next_client_auth_hook) (port, status);
-
- /*
- * In the case when authentication failed, the supplied socket shall be
- * closed soon, so we don't need to do anything here.
- */
- if (status != STATUS_OK)
- return;
-
- /*
- * Getting security label of the peer process using API of libselinux.
- */
- if (getpeercon_raw(port->sock, &context) < 0)
- ereport(FATAL,
- (errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("SELinux: unable to get peer label: %m")));
-
- sepgsql_set_client_label(context);
-
- /*
- * Switch the current performing mode from INTERNAL to either DEFAULT or
- * PERMISSIVE.
- */
- if (sepgsql_permissive)
- sepgsql_set_mode(SEPGSQL_MODE_PERMISSIVE);
- else
- sepgsql_set_mode(SEPGSQL_MODE_DEFAULT);
-}
-
-/*
* sepgsql_object_access
*
* Entrypoint of the object_access_hook. This routine performs as
@@ -221,121 +175,6 @@ sepgsql_exec_check_perms(List *rangeTabls, bool abort)
}
/*
- * sepgsql_needs_fmgr_hook
- *
- * It informs the core whether the supplied function is trusted procedure,
- * or not. If true, sepgsql_fmgr_hook shall be invoked at start, end, and
- * abort time of function invocation.
- */
-static bool
-sepgsql_needs_fmgr_hook(Oid functionId)
-{
- ObjectAddress object;
-
- if (next_needs_fmgr_hook &&
- (*next_needs_fmgr_hook) (functionId))
- return true;
-
- /*
- * SELinux needs the function to be called via security_definer wrapper,
- * if this invocation will take a domain-transition. We call these
- * functions as trusted-procedure, if the security policy has a rule that
- * switches security label of the client on execution.
- */
- if (sepgsql_avc_trusted_proc(functionId) != NULL)
- return true;
-
- /*
- * Even if not a trusted-procedure, this function should not be inlined
- * unless the client has db_procedure:{execute} permission. Please note
- * that it shall be actually failed later because of same reason with
- * ACL_EXECUTE.
- */
- object.classId = ProcedureRelationId;
- object.objectId = functionId;
- object.objectSubId = 0;
- if (!sepgsql_avc_check_perms(&object,
- SEPG_CLASS_DB_PROCEDURE,
- SEPG_DB_PROCEDURE__EXECUTE,
- SEPGSQL_AVC_NOAUDIT, false))
- return true;
-
- return false;
-}
-
-/*
- * sepgsql_fmgr_hook
- *
- * It switches security label of the client on execution of trusted
- * procedures.
- */
-static void
-sepgsql_fmgr_hook(FmgrHookEventType event,
- FmgrInfo *flinfo, Datum *private)
-{
- struct
- {
- char *old_label;
- char *new_label;
- Datum next_private;
- } *stack;
-
- switch (event)
- {
- case FHET_START:
- stack = (void *) DatumGetPointer(*private);
- if (!stack)
- {
- MemoryContext oldcxt;
-
- oldcxt = MemoryContextSwitchTo(flinfo->fn_mcxt);
- stack = palloc(sizeof(*stack));
- stack->old_label = NULL;
- stack->new_label = sepgsql_avc_trusted_proc(flinfo->fn_oid);
- stack->next_private = 0;
-
- MemoryContextSwitchTo(oldcxt);
-
- /*
- * process:transition permission between old and new label,
- * when user tries to switch security label of the client
- * on execution of trusted procedure.
- */
- if (stack->new_label)
- sepgsql_avc_check_perms_label(stack->new_label,
- SEPG_CLASS_PROCESS,
- SEPG_PROCESS__TRANSITION,
- NULL, true);
-
- *private = PointerGetDatum(stack);
- }
- Assert(!stack->old_label);
- if (stack->new_label)
- stack->old_label = sepgsql_set_client_label(stack->new_label);
-
- if (next_fmgr_hook)
- (*next_fmgr_hook) (event, flinfo, &stack->next_private);
- break;
-
- case FHET_END:
- case FHET_ABORT:
- stack = (void *) DatumGetPointer(*private);
-
- if (next_fmgr_hook)
- (*next_fmgr_hook) (event, flinfo, &stack->next_private);
-
- if (stack->old_label)
- sepgsql_set_client_label(stack->old_label);
- stack->old_label = NULL;
- break;
-
- default:
- elog(ERROR, "unexpected event type: %d", (int) event);
- break;
- }
-}
-
-/*
* sepgsql_executor_start
*
* It saves contextual information during ExecutorStart to distinguish
@@ -465,8 +304,6 @@ sepgsql_utility_command(Node *parsetree,
void
_PG_init(void)
{
- char *context;
-
/*
* We allow to load the SE-PostgreSQL module on single-user-mode or
* shared_preload_libraries settings only.
@@ -522,33 +359,16 @@ _PG_init(void)
NULL,
NULL);
- /*
- * Set up dummy client label.
- *
- * XXX - note that PostgreSQL launches background worker process like
- * autovacuum without authentication steps. So, we initialize sepgsql_mode
- * with SEPGSQL_MODE_INTERNAL, and client_label with the security context
- * of server process. Later, it also launches background of user session.
- * In this case, the process is always hooked on post-authentication, and
- * we can initialize the sepgsql_mode and client_label correctly.
- */
- if (getcon_raw(&context) < 0)
- ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("SELinux: failed to get server security label: %m")));
- sepgsql_set_client_label(context);
-
/* Initialize userspace access vector cache */
sepgsql_avc_init();
+ /* Initialize security label of the client and related stuff */
+ sepgsql_init_client_label();
+
/* Security label provider hook */
register_label_provider(SEPGSQL_LABEL_TAG,
sepgsql_object_relabel);
- /* Client authentication hook */
- next_client_auth_hook = ClientAuthentication_hook;
- ClientAuthentication_hook = sepgsql_client_auth;
-
/* Object access hook */
next_object_access_hook = object_access_hook;
object_access_hook = sepgsql_object_access;
@@ -557,13 +377,6 @@ _PG_init(void)
next_exec_check_perms_hook = ExecutorCheckPerms_hook;
ExecutorCheckPerms_hook = sepgsql_exec_check_perms;
- /* Trusted procedure hooks */
- next_needs_fmgr_hook = needs_fmgr_hook;
- needs_fmgr_hook = sepgsql_needs_fmgr_hook;
-
- next_fmgr_hook = fmgr_hook;
- fmgr_hook = sepgsql_fmgr_hook;
-
/* ProcessUtility hook */
next_ProcessUtility_hook = ProcessUtility_hook;
ProcessUtility_hook = sepgsql_utility_command;