-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 This patch looks good to me. acked. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk5D5GUACgkQrlYvE4MpobO1hQCdH7cR2DlIAdFgVgGXrDYaFpjF KhAAmQG3TI4MW8eyihvS+8V4cpItAY5a =pAi3 -----END PGP SIGNATURE-----
>From fd07b3826096abe74da6db9ebfe8dee5e0ef6f8f Mon Sep 17 00:00:00 2001 From: Russell Coker <russell@xxxxxxxxxxxx> Date: Wed, 5 Jan 2011 19:30:25 +1100 Subject: [PATCH 09/96] libsemanage: patch for MCS/MLS in user files The attached patch makes the /etc/selinux/default/contexts/files/file_contexts.homedirs generation process include the MCS/MLS level. This means that if you have a user with a MCS/MLS level that isn't SystemLow then their home directory will be labeled such that they can have read/write access to it by default. Unless anyone has any better ideas for how to solve this problem I will upload this to Debian shortly. What do the MLS users do in this situation? Just relabel home directories manually? Finally it seems that when you run "semanage user -m" the file_contexts.homedirs doesn't get updated, it's only when you run "semanage login -m" that it takes affect. Signed-off-by: Eric Paris <eparis@xxxxxxxxxx> Acked-by: Russell Coker <russell@xxxxxxxxxxxx> --- libsemanage/src/genhomedircon.c | 48 ++++++++++++++++++++++++++++++-------- 1 files changed, 38 insertions(+), 10 deletions(-) diff --git a/libsemanage/src/genhomedircon.c b/libsemanage/src/genhomedircon.c index 8b29c2e..847d87e 100644 --- a/libsemanage/src/genhomedircon.c +++ b/libsemanage/src/genhomedircon.c @@ -76,9 +76,11 @@ #define TEMPLATE_USER "USER" #define TEMPLATE_ROLE "ROLE" #define TEMPLATE_SEUSER "system_u" +#define TEMPLATE_LEVEL "s0" #define FALLBACK_USER "user_u" #define FALLBACK_USER_PREFIX "user" +#define FALLBACK_USER_LEVEL "s0" #define DEFAULT_LOGIN "__default__" typedef struct { @@ -87,6 +89,7 @@ typedef struct { const char *homedir_template_path; char *fallback_user; char *fallback_user_prefix; + char *fallback_user_level; semanage_handle_t *h_semanage; sepol_policydb_t *policydb; } genhomedircon_settings_t; @@ -96,6 +99,7 @@ typedef struct user_entry { char *sename; char *prefix; char *home; + char *level; struct user_entry *next; } genhomedircon_user_entry_t; @@ -487,12 +491,13 @@ static int check_line(genhomedircon_settings_t * s, Ustr *line) static int write_home_dir_context(genhomedircon_settings_t * s, FILE * out, semanage_list_t * tpl, const char *user, const char *seuser, const char *home, - const char *role_prefix) + const char *role_prefix, const char *level) { replacement_pair_t repl[] = { {.search_for = TEMPLATE_SEUSER,.replace_with = seuser}, {.search_for = TEMPLATE_HOME_DIR,.replace_with = home}, {.search_for = TEMPLATE_ROLE,.replace_with = role_prefix}, + {.search_for = TEMPLATE_LEVEL,.replace_with = level}, {NULL, NULL} }; Ustr *line = USTR_NULL; @@ -584,13 +589,15 @@ static int name_user_cmp(char *key, semanage_user_t ** val) } static int push_user_entry(genhomedircon_user_entry_t ** list, const char *n, - const char *sen, const char *pre, const char *h) + const char *sen, const char *pre, const char *h, + const char *l) { genhomedircon_user_entry_t *temp = NULL; char *name = NULL; char *sename = NULL; char *prefix = NULL; char *home = NULL; + char *level = NULL; temp = malloc(sizeof(genhomedircon_user_entry_t)); if (!temp) @@ -607,11 +614,15 @@ static int push_user_entry(genhomedircon_user_entry_t ** list, const char *n, home = strdup(h); if (!home) goto cleanup; + level = strdup(l); + if (!level) + goto cleanup; temp->name = name; temp->sename = sename; temp->prefix = prefix; temp->home = home; + temp->level = level; temp->next = (*list); (*list) = temp; @@ -622,6 +633,7 @@ static int push_user_entry(genhomedircon_user_entry_t ** list, const char *n, free(sename); free(prefix); free(home); + free(level); free(temp); return STATUS_ERR; } @@ -639,25 +651,30 @@ static void pop_user_entry(genhomedircon_user_entry_t ** list) free(temp->sename); free(temp->prefix); free(temp->home); + free(temp->level); free(temp); } -static int set_fallback_user(genhomedircon_settings_t *s, - const char *user, const char *prefix) +static int set_fallback_user(genhomedircon_settings_t *s, const char *user, + const char *prefix, const char *level) { char *fallback_user = strdup(user); char *fallback_user_prefix = strdup(prefix); + char *fallback_user_level = strdup(level); - if (fallback_user == NULL || fallback_user_prefix == NULL) { + if (fallback_user == NULL || fallback_user_prefix == NULL || fallback_user_level == NULL) { free(fallback_user); free(fallback_user_prefix); + free(fallback_user_level); return STATUS_ERR; } free(s->fallback_user); free(s->fallback_user_prefix); + free(s->fallback_user_level); s->fallback_user = fallback_user; s->fallback_user_prefix = fallback_user_prefix; + s->fallback_user_level = fallback_user_level; return STATUS_SUCCESS; } @@ -670,6 +687,7 @@ static int setup_fallback_user(genhomedircon_settings_t * s) const char *name = NULL; const char *seuname = NULL; const char *prefix = NULL; + const char *level = NULL; unsigned int i; int retval; int errors = 0; @@ -692,11 +710,17 @@ static int setup_fallback_user(genhomedircon_settings_t * s) break; } if (semanage_user_query(s->h_semanage, key, &u) < 0) + { prefix = name; + level = "s0"; + } else + { prefix = semanage_user_get_prefix(u); + level = semanage_user_get_mlslevel(u); + } - if (set_fallback_user(s, seuname, prefix) != 0) + if (set_fallback_user(s, seuname, prefix, level) != 0) errors = STATUS_ERR; semanage_user_key_free(key); if (u) @@ -724,6 +748,7 @@ static genhomedircon_user_entry_t *get_users(genhomedircon_settings_t * s, const char *name = NULL; const char *seuname = NULL; const char *prefix = NULL; + const char *level = NULL; struct passwd pwstorage, *pwent = NULL; unsigned int i; long rbuflen; @@ -775,8 +800,10 @@ static genhomedircon_user_entry_t *get_users(genhomedircon_settings_t * s, &name_user_cmp); if (u) { prefix = semanage_user_get_prefix(*u); + level = semanage_user_get_mlslevel(*u); } else { prefix = name; + level = "s0"; } retval = getpwnam_r(name, &pwstorage, rbuf, rbuflen, &pwent); @@ -803,7 +830,7 @@ static genhomedircon_user_entry_t *get_users(genhomedircon_settings_t * s, continue; } if (push_user_entry(&head, name, seuname, - prefix, pwent->pw_dir) != STATUS_SUCCESS) { + prefix, pwent->pw_dir, level) != STATUS_SUCCESS) { *errors = STATUS_ERR; break; } @@ -846,7 +873,7 @@ static int write_gen_home_dir_context(genhomedircon_settings_t * s, FILE * out, if (write_home_dir_context(s, out, homedir_context_tpl, users->name, users->sename, users->home, - users->prefix)) { + users->prefix, users->level)) { return STATUS_ERR; } if (write_user_context(s, out, user_context_tpl, users->name, @@ -910,7 +937,7 @@ static int write_context_file(genhomedircon_settings_t * s, FILE * out) homedir_context_tpl, s->fallback_user, s->fallback_user, ustr_cstr(temp), - s->fallback_user_prefix) != + s->fallback_user_prefix, s->fallback_user_level) != STATUS_SUCCESS) { ustr_sc_free(&temp); retval = STATUS_ERR; @@ -967,7 +994,8 @@ int semanage_genhomedircon(semanage_handle_t * sh, s.fallback_user = strdup(FALLBACK_USER); s.fallback_user_prefix = strdup(FALLBACK_USER_PREFIX); - if (s.fallback_user == NULL || s.fallback_user_prefix == NULL) + s.fallback_user_level = strdup(FALLBACK_USER_LEVEL); + if (s.fallback_user == NULL || s.fallback_user_prefix == NULL || s.fallback_user_level == NULL) return STATUS_ERR; s.usepasswd = usepasswd; -- 1.7.6
Attachment:
0009-libsemanage-patch-for-MCS-MLS-in-user-files.patch.sig
Description: PGP signature