[PATCH 1/5] adding seadmin support
Leonidas Da Silva Barbosa
leosilva at linux.vnet.ibm.com
Thu Nov 7 15:21:10 UTC 2013
Signed-off-by: Leonidas Da Silva Barbosa <leosilva at linux.vnet.ibm.com>
---
policycoreutils/sepolicy/sepolicy/seadmin.py | 83 ++++++++++++++++++++++++++++
1 file changed, 83 insertions(+)
create mode 100644 policycoreutils/sepolicy/sepolicy/seadmin.py
diff --git a/policycoreutils/sepolicy/sepolicy/seadmin.py b/policycoreutils/sepolicy/sepolicy/seadmin.py
new file mode 100644
index 0000000..96cab8a
--- /dev/null
+++ b/policycoreutils/sepolicy/sepolicy/seadmin.py
@@ -0,0 +1,83 @@
+#! /usr/bin/python -Es
+
+import os
+import sys
+import selinux
+import seobject
+import sepolicy
+
+from shutil import copy2
+from os import chmod as set_permissions
+from selinux import selinux_user_contexts_path, selinux_policy_root
+
+# PATH to staff_u that will be base to new users created.
+STAFF_U = "staff_u"
+COMMON_PATH = selinux_user_contexts_path()
+
+# These are constants used to create SEADM user to an Isolate Admin environment.
+SELEVEL = "s0"
+PREFIX = "user"
+SERANGE = "s0-s0:c0.c1023"
+
+SUDOERS_PATH = "/etc/sudoers.d/"
+SUDOERS_ENTRY = "\n%s ALL=(ALL) ROLE=%s TYPE=%s %s"
+
+# Initialize adm roles list.
+ADM_ROLES = [adm_r for adm_r in sepolicy.get_all_roles() if (adm_r[:-2]).
+ endswith('adm')]
+# Initialize a dictionary of se_adm_users with adm_role as key.
+ADM_USERS = {key: 'se_'+key[:-2]+'_u' for key in ADM_ROLES}
+
+__user = seobject.seluserRecords()
+__link = seobject.loginRecords()
+
+
+def create_user(adm_role, login, user=None):
+ import pwd
+ try:
+ pwd.getpwnam(login)
+ except KeyError:
+ print("User/Login %s doesn't exist" % login)
+ sys.exit(1)
+
+ if adm_role in ADM_ROLES:
+ seadm_user = ADM_USERS[adm_role] if not user else user
+ roles = "staff_r {role1} {role2}".format(role1=adm_role,
+ role2="system_r" if adm_role == "sysadm_r" else "")
+
+ if not seadm_user in sepolicy.get_all_users():
+ __user.add(seadm_user, roles.split(), SELEVEL,
+ SERANGE, PREFIX)
+ copy2(COMMON_PATH+STAFF_U, COMMON_PATH+seadm_user)
+ else:
+ print("%s is not an ADM_ROLE" % adm_role)
+ sys.exit(1)
+
+
+def modify_user(seadm_user, roles):
+ if seadm_user in sepolicy.get_all_users():
+ __user.modify(seadm_user, roles.split(), SELEVEL,
+ SERANGE, PREFIX)
+ else:
+ print("SELinux user not found")
+ sys.exit(1)
+
+# sepolicy admin -d -user se_auditadm_u -login leosilva
+def delete_user(seadm_user, login):
+ if seadm_user in sepolicy.get_all_users():
+ __link.delete(login)
+ __user.delete(seadm_user)
+
+ else:
+ print("SELinux user not found")
+
+
+def create_link(adm_role, login, commands, user=None):
+ seadm_user = ADM_USERS[adm_role] if not user else user
+ adm_domain = adm_role.replace("_r", "_t")
+
+ __link.add(login, seadm_user, SERANGE)
+ with open(SUDOERS_PATH+login, 'a') as f:
+ f.write(SUDOERS_ENTRY % (login, adm_role, adm_domain, commands))
+
+ set_permissions(SUDOERS_PATH+login, 0440)
--
1.8.3.1
More information about the selinux
mailing list