最终编辑

最终编辑

我在用着免费IPA定义 RBAC、HBAC 和sudo规则,以及包含几百台虚拟机的域的 SELinux 用户映射,我需要向多个团队(开发人员、数据库管理员、系统管理员、管理人员……)授予不同级别的访问权限。

目前这些机器上的 SELinux 策略设置为targeted,我正在考虑是否可以删除unconfined_uSELinux 用户,以便让这些系统在strict策略下运行。

为了做到这一点,其中一个要求是让最终用户清楚地知道他/她已从 '降级' 到unconfined_ustaff_u问题在于sudo与 SELinux 用户映射的互操作方式。以下是一些事实:

  1. 如果您想使用受限的 SELinux 用户,并且仍然希望能够使用sudo,则需要使用staff_u,因为这是 SELinux 用户可以访问 SETUID 可执行文件

  2. 当用户登录系统时,系统会为其分配一个 SELinux 用户映射。即使 SELinux 用户可以运行su( unconfined_u) 或sudo( unconfined_u, staff_u),该映射也不会改变。

  3. forSELinux Spec目前sudo包含运行已定义types和中的命令的功能roles,但缺少指定的可能性user。可以找到更多参考资料这里

  4. 此次部署中涉及的机器都是 freeIPA 客户端,它们的sudo策略由 freeIPA 管理,但它们也有一个puppet托管的、定制的/etc/sudoers文件,作为 freeIPA 故障时的后备。

我第一次尝试解决这个问题时,涉及编写一个策略模块,其中包含允许staff_u访问未修改的所需规则sudorules。这种方法已被证明是错误的,因为策略可以无限增长,最终你所做的就是在策略上打一个洞。

所以到目前为止我处理这些事实的方式是重写sudorules以明确包含对runcon切换到适当的 SELinux 用户的调用,因此典型的开发人员现在需要运行,例如:

$ sudo -u jboss runcon -u sysadm_u jboss_cli.sh

这样做的缺点是必须修改所有现有的内容sudorules,并迫使用户改变通常运行的方式。因此问题是:

  • 有没有办法在定义中明确定义 SELinux 用户Runas_Spec
  • 如果无法通过sudoers,是否可以sudorule在 freeIPA 中定义或以其他方式绑定到 SELinux 用户映射?

考虑以下场景:

# ipa sudorule-show services_4_operators_3
  Rule name: services_4_operators_3
  Description: Operator Level 3 access to service management commands
  Enabled: TRUE
  User Groups: operators_3
  Host Groups: all-hosts
  Sudo Allow Command Groups: services
  Sudo Option: type=sysadm_t, role=sysadm_r

# ipa sudocmdgroup-show services
  Sudo Command Group: services
  Description: commands for services and daemons management
  Member Sudo commands: /sbin/service, /sbin/chkconfig

如果我尝试:

$ sudo service sshd status
sudo: unable to open /var/log/sudo-io/seq: Permission denied
时间->2013 年 9 月 11 日星期三 09:57:30
类型 = PATH msg = audit(1378886250.584:46644668):item = 0 name =“/var/log/sudo-io/seq”inode = 154 dev = fd:0c mode = 0100600 ouid = 0 ogid = 1168000009 rdev = 00:00 obj = unconfined_u:object_r:var_log_t:s0
类型=CWD 消息=审核(1378886250.584:46644668):cwd=“/home/some_user”
类型 = SYSCALL msg = 审核(1378886250.584:46644668):arch = c000003e syscall = 2 成功 = 否退出 = -13 a0 = 7fff2e7ab970 a1 = 42 a2 = 180 a3 = 0 项目 = 1 ppid = 2374 pid = 2442 auid = 1168000009 uid = 1168000009 gid = 1168000009 euid = 0 suid = 0 fsuid = 0 egid = 1168000009 sgid = 1168000009 fsgid = 1168000009 tty = pts0 ses = 6459 comm =“sudo”exe =“/ usr/bin/sudo” subj=staff_u:staff_r:staff_sudo_t:s0-s0:c0.c1023 key="访问"
类型 = AVC 消息 = 审核(1378886250.584:46644668):avc:拒绝 {读写} pid = 2442 comm =“sudo”name =“seq”dev = dm-12 ino = 154 scontext = staff_u:staff_r:staff_sudo_t:s0-s0:c0.c1023 tcontext = unconfined_u:object_r:var_log_t:s0 tclass = file

因为我正在使用log_outputDefaults

# ll -dZ /var/log/sudo-io
drwx------. root root system_u:object_r:var_log_t:s0   /var/log/sudo-io/

尝试“修复”此 AVC 拒绝将导致前面提到的无限策略模块,因为允许:

allow staff_sudo_t var_log_t:file { open read write lock create };
allow staff_sudo_t var_log_t:dir { write add_name create search };

是一个虚假的问题,如启用此类权限时所示:

$ sudo service sshd status
env: /etc/init.d/sshd: Permission denied
时间->2013 年 9 月 11 日星期三 11:00:53
类型 = PATH 消息 = 审核 (1378890053.185:46646934): 项目 = 0 名称 =“/etc/init.d/sshd” inode = 5490 dev = fd:01 模式 = 0100755 ouid = 0 ogid = 0 rdev = 00:00 obj = system_u:object_r:sshd_initrc_exec_t:s0
类型=CWD 消息=审计(1378890053.185:46646934):cwd=“/”
类型 = SYSCALL msg = 审核(1378890053.185:46646934):arch = c000003e syscall = 59 成功 = 否退出 = -13 a0 = 7fffc0829862 a1 = 7fffc0829578 a2 = 607030 a3 = ffffe000 项目 = 1 ppid = 6715 pid = 6720 auid = 1168000009 uid = 0 gid = 0 euid = 0 suid = 0 fsuid = 0 egid = 0 sgid = 0 fsgid = 0 tty = pts2 ses = 6459 comm =“env”exe =“/ bin / env”subj = staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023 key =(null)
类型 = AVC 消息 = 审核(1378890053.185:46646934):avc:拒绝 { 执行 } pid = 6720 comm =“env”名称 =“sshd”dev = dm-1 ino = 5490 scontext = staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023 tcontext = system_u:object_r:sshd_initrc_exec_t:s0 tclass = file

最终编辑

我最终采取了中期解决方案。我对我的 IPA 服务器进行了如下配置:

$ sudo -u dsastrem ipa config-show
  Maximum username length: 32
  Home directory base: /home
  Default shell: /bin/rbash
  Default users group: ipausers
  Default e-mail domain: company.com
  Search time limit: 2
  Search size limit: 100
  User search fields: uid,givenname,sn,telephonenumber,ou,title
  Group search fields: cn,description
  Enable migration mode: FALSE
  Certificate Subject base: O=COMPANY.COM
  Password Expiration Notification (days): 4
  Password plugin features: AllowNThash
  SELinux user map order: guest_u:s0$xguest_u:s0$user_u:s0$staff_u:s0-s0:c0.c1023$unconfined_u:s0-s0:c0.c1023
  Default SELinux user: guest_u:s0
  Default PAC types: MS-PAC

并且我定义了一些与此类似的 SELinux 用户映射,将一些 RBAC 绑定到 SELinux 用户(staff_u)。

$ sudo -u dsastrem ipa selinuxusermap-find
---------------------------
X SELinux User Maps matched
---------------------------
  ....

  Rule name: semap_operators_3_mad
  SELinux User: staff_u:s0-s0:c0.c1023
  HBAC Rule: operators_3_access
  Description: SELinux user mapping for MAD level 3 operators
  Enabled: TRUE

  ....
----------------------------
Number of entries returned X
----------------------------

我的sudo规则现在如下所示:

  Rule name: services_4_operators_3
  Description: Operator Level 3 access to service management commands
  Enabled: TRUE
  User Groups: operators_3
  Host Groups: all-hosts
  Sudo Allow Command Groups: services
  Sudo Option: role=unconfined_r

这不是我的最终目标,因为我想完全消除unconfined_u,但这是一个很好的进步,因为它稍微增强了整体安全性。当然,马修的答案是正确的,因为staff_u应该能够通过选项过渡到更高权限的域;但仍然存在没有完全具备替换 的能力sudo的问题。也许是因为它不打算这样做。system_uunconfined_u

答案1

您知道您可以担任这个sysadm_r职位吗staff_u

例如,下面的代码就可以起作用。

myuser  ALL=(ALL)   TYPE=sysadm_t ROLE=sysadm_r PASSWD: ALL

这将允许您(几乎)以不受限制的方式执行您以 root 身份可以执行的操作。

哦,还有最后一个提示。使用suRBAC 有点棘手(它会执行很多操作,因此会涉及各种地方)。相反,您可以使用runuser执行相同操作且不会产生大量su开销的命令。

我实际上su像这样限制在 sudoers 中使用;

%wheel   ALL=(ALL)   TYPE=sysadm_t ROLE=sysadm_r NOPASSWD: ALL, ! /bin/su

因为默认情况下 SELinux 策略不允许sudo转换来管理必要的信号。实际上人们可能还是应该使用sudo -i

对于那些喜欢摆脱坏习惯的人(比如我!),我通常会将runuser其硬链接ru作为两个字母的替换。sudo su -

相关内容