From 7379f2cf6b2d9cfcd81f3f907fb606cf0f7133d5 Mon Sep 17 00:00:00 2001 From: Daniel J Walsh Date: Thu, 10 Feb 2005 22:13:36 +0000 Subject: [PATCH] * Thu Feb 10 2005 Dan Walsh 1.21.15-2 - Rewrite genhomedircon to generate file_context.homedirs --- policycoreutils-rhat.patch | 278 ++++++++++++++++++++++++++++++++++--- policycoreutils.spec | 7 +- 2 files changed, 262 insertions(+), 23 deletions(-) diff --git a/policycoreutils-rhat.patch b/policycoreutils-rhat.patch index 3c378f5..80994d2 100644 --- a/policycoreutils-rhat.patch +++ b/policycoreutils-rhat.patch @@ -1,22 +1,256 @@ -diff --exclude-from=exclude -N -u -r nsapolicycoreutils/restorecon/restorecon.c policycoreutils-1.21.13/restorecon/restorecon.c ---- nsapolicycoreutils/restorecon/restorecon.c 2005-02-02 17:20:59.000000000 -0500 -+++ policycoreutils-1.21.13/restorecon/restorecon.c 2005-02-08 13:32:22.000000000 -0500 -@@ -118,8 +118,8 @@ - int restore(char *filename) { - int retcontext=0; - int retval=0; -- security_context_t scontext; -- security_context_t prev_context; -+ security_context_t scontext=NULL; -+ security_context_t prev_context=NULL; - int len=strlen(filename); - struct stat st; - char path[PATH_MAX+1]; -@@ -185,6 +185,7 @@ - - if (retcontext >= 0 || errno == ENODATA) { - int customizable=0; -+ if (retcontext < 0) prev_context=NULL; - if (retcontext < 0 || - (strcmp(prev_context,scontext) != 0 && - !(customizable=(force ? 0: (is_context_customizable(prev_context) > 0))))) { +diff --exclude-from=exclude -N -u -r nsapolicycoreutils/scripts/genhomedircon policycoreutils-1.21.15/scripts/genhomedircon +--- nsapolicycoreutils/scripts/genhomedircon 2005-01-28 11:16:36.000000000 -0500 ++++ policycoreutils-1.21.15/scripts/genhomedircon 2005-02-10 17:08:52.000000000 -0500 +@@ -13,38 +13,131 @@ + # + # ASSUMPTIONS: + # +-# If a user has more than one role in FILECONTEXTDIR/users, genhomedircon uses ++# The file CONTEXTDIR/files/homedir_template exists. This file is used to ++# set up the home directory context for each real user. ++# ++# If a user has more than one role in CONTEXTDIR/local.users, genhomedircon uses + # the first role in the list. + # +-# If a user is not listed in FILECONTEXTDIR/users, genhomedircon assumes that +-# the user's home dir will be found in one of the HOME_ROOTs. ++# If a user is not listed in CONTEXTDIR/local.users, he will default to user_u, role user + # + # "Real" users (as opposed to system users) are those whose UID is greater than + # or equal STARTING_UID (usually 500) and whose login is not a member of +-# EXCLUDE_LOGINS. Users who are explicitly defined in FILECONTEXTDIR/users ++# EXCLUDE_LOGINS. Users who are explicitly defined in CONTEXTDIR/local.users + # are always "real" (including root, in the default configuration). + # ++# + + import commands, sys, os, pwd, string + ++rhplPath="/usr/lib/python%d.%d/site-packages/rhpl" % (sys.version_info[0], sys.version_info[1]) ++if not rhplPath in sys.path: ++ sys.path.append(rhplPath) ++ ++rhplPath="/usr/lib64/python%d.%d/site-packages/rhpl" % (sys.version_info[0], sys.version_info[1]) ++if not rhplPath in sys.path: ++ sys.path.append(rhplPath) ++ ++from Conf import * ++ + EXCLUDE_LOGINS=["/sbin/nologin", "/bin/false"] + +-def getPrefixes(): ++SELINUXDIR="/etc/selinux/" ++SELINUXCONFIG=SELINUXDIR+"config" ++CONTEXTDIR="/contexts" ++FILECONTEXTDIR=CONTEXTDIR+"/files" ++HOMEDIRTEMPLATE="/homedir_template" ++USERSFILE="/users/local.users" ++ ++def getStartingUID(): ++ conf=Conf("/etc/login.defs") ++ while conf.findnextcodeline(): ++ if conf.getfields()[0] == "UID_MIN": ++ return int(conf.getfields()[1]) ++ ++ conf.nextline() ++ return 500 ++ ++def getDefaultHomeDir(): ++ conf=ConfShellVar("/etc/default/useradd") ++ if conf.has_key("HOME"): ++ return conf["HOME"] ++ else: ++ return "/home" ++ ++def getHomeDirs(): + ulist = pwd.getpwall() +- prefixes = {} ++ homedirs = [] ++ homedirs.append(getDefaultHomeDir()) ++ starting_uid=getStartingUID() + for u in ulist: +- if u[2] >= STARTING_UID and \ ++ if u[2] >= starting_uid and \ + not u[6] in EXCLUDE_LOGINS and \ + u[5] != "/" and \ + string.count(u[5], "/") > 1: +- prefix = u[5][:string.rfind(u[5], "/")] +- if not prefixes.has_key(prefix): +- prefixes[prefix] = "" +- return prefixes ++ homedir = u[5][:string.rfind(u[5], "/")] ++ if not homedir in homedirs: ++ homedirs.append(homedir) ++ ++ homedirs.sort() ++ return homedirs + +-def getUsers(): +- rc = commands.getstatusoutput("grep ^user %s/users" % FILECONTEXTDIR) ++def usage(error = ""): ++ if error != "": ++ sys.stderr.write("%s\n" % (error,)) ++ sys.stderr.write("Usage: %s \n" % sys.argv[0]) ++ sys.stderr.flush() ++ sys.exit(1) ++ ++def errorExit(error): ++ sys.stderr.write("%s exiting for: " % sys.argv[0]) ++ sys.stderr.write("%s\n" % error) ++ sys.stderr.flush() ++ sys.exit(1) ++ ++class selinuxConfig: ++ def __init__(self): ++ self.type="targeted" ++ self.types=[] ++ if os.access(SELINUXDIR, os.F_OK) == 0: ++ #File doesn't exist. return ++ return None ++ ++ conf=ConfShellVar(SELINUXCONFIG) ++ if conf.has_key("SELINUXTYPE"): ++ self.type=conf.vars["SELINUXTYPE"] ++ ++ def getSelinuxType(self): ++ return self.type ++ ++ def getFileContextDir(self): ++ return SELINUXDIR+self.getSelinuxType()+FILECONTEXTDIR ++ ++ def getContextDir(self): ++ return SELINUXDIR+self.getSelinuxType()+CONTEXTDIR ++ ++ def getHomeDirTemplate(self): ++ return self.getFileContextDir()+HOMEDIRTEMPLATE ++ ++ def getHomeRootContext(self): ++ rc=commands.getstatusoutput("grep HOME_ROOT %s | sed -e \"s|^HOME_ROOT|%s|\"" % ( self.getHomeDirTemplate(), getDefaultHomeDir())) ++ if rc[0] == 0: ++ return rc[1] ++ else: ++ errorExit(string.join("sed error ", rc[1])) ++ ++ def getUsersFile(self): ++ return SELINUXDIR+self.getSelinuxType()+USERSFILE ++ ++ def heading(self): ++ ret = "\n#\n#\n# User-specific file contexts, generated via %s\n" % sys.argv[0] ++ ret += "# edit %s to change file_context\n#\n#\n" % self.getUsersFile() ++ return ret ++ ++ def getUsers(self): ++ rc = commands.getstatusoutput("grep ^user %s" % self.getUsersFile()) + udict = {} ++ prefs = {} + if rc[0] == 0: + ulist = rc[1].strip().split("\n") + for u in ulist: +@@ -68,71 +161,44 @@ + sys.stderr.write("The user \"%s\" is not present in the passwd file, skipping...\n" % (user[1],)) + return udict + +-def usage(error = ""): +- if error != "": +- sys.stderr.write("%s\n" % (error,)) +- sys.stderr.write("Usage: %s POLICYSOURCEDIR FILE_CONTEXTS\n" % sys.argv[0]) +- sys.stderr.flush() +- sys.exit(1) +- +-def errorExit(error): +- sys.stderr.write("%s exiting for: " % sys.argv[0]) +- sys.stderr.write("%s\n" % error) +- sys.stderr.flush() +- sys.exit(1) +- +-def update(filecontext, user, prefs): +- rc=commands.getstatusoutput("grep -h '^HOME_DIR' %s | grep -v vmware | sed -e 's|HOME_DIR|%s|' -e 's/ROLE/%s/' -e 's/system_u/%s/'" % (filecontext, prefs["home"], prefs["role"], user)) +- if rc[0] == 0: +- print rc[1] +- else: +- errorExit(string.join("grep/sed error ", rc[1])) +- return rc +- +-try: +- if len(sys.argv) != 3: +- print len(sys.argv) +- usage("Incorrect parameters") +- +- rc=commands.getstatusoutput("grep -h '^UID_MIN' /etc/login.defs | sed -e 's/^UID_MIN[^0-9]*//'") +- if rc[0] == 0: +- STARTING_UID=int(rc[1]) +- else: +- STARTING_UID=500 +- +- FILECONTEXTDIR=sys.argv[1] +- prefixes = getPrefixes() +- +- rc=commands.getstatusoutput("grep -h '^HOME' /etc/default/useradd") +- if rc[0] == 0: +- homedir = rc[1].split("=")[1] +- else: +- sys.stderr.write("%s\n" % (rc[1],)) +- sys.stderr.write("You do not have access to /etc/default/useradd, default /home\n") +- sys.stderr.flush() +- homedir = "/home" +- +- +- if not prefixes.has_key(homedir): +- prefixes[homedir] = "" +- +- # There may be a more elegant sed script to expand a macro to multiple lines, but this works +- sed_root = "h; s|^HOME_ROOT|%s|" % (string.join(prefixes.keys(), "|; p; g; s|^HOME_ROOT|"),) +- sed_dir = "h; s|^HOME_DIR|%s/[^/]+|; s|ROLE_|user_|" % (string.join(prefixes.keys(), "/[^/]+|; s|ROLE_|user_|; p; g; s|^HOME_DIR|"),) +- +- # Fill in HOME_ROOT, HOME_DIR, and ROLE for users not explicitly defined in /etc/security/selinux/src/policy/users +- rc=commands.getstatusoutput("sed -e \"/^HOME_ROOT/{%s}\" -e \"/^HOME_DIR/{%s}\" %s" % (sed_root, sed_dir, sys.argv[2])) +- if rc[0] == 0: +- print rc[1] +- else: +- errorExit(string.join("sed error ", rc[1])) +- +- users = getUsers() +- print "\n#\n# User-specific file contexts\n#\n" +- ++ def getHomeDirContext(self, user, home, role): ++ ret="\n\n#\n# Context for user %s\n#\n\n" % user ++ rc=commands.getstatusoutput("grep -e '^HOME_DIR' %s | sed -e 's|HOME_DIR|%s|' -e 's/ROLE/%s/' -e 's/system_u/%s/'" % (self.getHomeDirTemplate(), home, role, user)) ++ return ret + rc[1] ++ ++ ++ def genHomeDirContext(self): ++ users = self.getUsers() ++ ret="" + # Fill in HOME and ROLE for users that are defined + for u in users.keys(): +- update(sys.argv[2], u, users[u]) ++ ret += self.getHomeDirContext (u, users[u]["home"], users[u]["role"]) ++ return ret ++ ++ def genoutput(self): ++ ret= self.heading() ++ ret += self.getHomeRootContext() ++ for h in getHomeDirs(): ++ ret += self.getHomeDirContext ("user_u" , h, "user") ++ ret += self.genHomeDirContext() ++ return ret ++ ++ def printout(self): ++ print self.genoutput() ++ ++ def write(self): ++ fd = open(self.getFileContextDir()+"/file_context.homedirs", "w") ++ fd.write(self.genoutput()) ++ fd.close() ++ ++# ++# This script will generate home dir file context ++# based off the homedir_template file, entries in the password file, and ++# ++try: ++ selconf=selinuxConfig() ++ selconf.write() ++ + except ValueError, error: + errorExit(string.join("ValueError ", error)) + except IndexError, error: diff --git a/policycoreutils.spec b/policycoreutils.spec index 9bb60e6..94cf943 100644 --- a/policycoreutils.spec +++ b/policycoreutils.spec @@ -2,10 +2,11 @@ Summary: SELinux policy core utilities. Name: policycoreutils Version: 1.21.15 -Release: 1 +Release: 2 License: GPL Group: System Environment/Base Source: http://www.nsa.gov/selinux/archives/policycoreutils-%{version}.tgz +Patch: policycoreutils-rhat.patch Prefix: %{_prefix} BuildRequires: libselinux-devel >= %{libselinuxver} pam-devel libsepol-devel >= 1.1.1 @@ -32,6 +33,7 @@ context. %prep %setup -q +%patch -p1 -b .rhat %build make CFLAGS="%{optflags}" all @@ -79,6 +81,9 @@ rm -rf ${RPM_BUILD_ROOT} %config(noreplace) %{_sysconfdir}/sestatus.conf %changelog +* Thu Feb 10 2005 Dan Walsh 1.21.15-2 +- Rewrite genhomedircon to generate file_context.homedirs + * Thu Feb 10 2005 Dan Walsh 1.21.15-1 - Update from NSA * Changed relabel Makefile target to use restorecon.