Sudo

在 freeIPA 中向 SELinux 受限使用者授予 sudo 訪問權限

  • November 7, 2013

我正在使用freeIPA為數百個虛擬機的域定義 RBAC、HBAC 和sudo規則,以及 SELinux 使用者映射,我需要向多個團隊(開發人員、數據庫管理員、系統管理員、管理, …)。

目前,這些機器上的 SELinux 策略設置為targeted,我正在考慮刪除unconfined_uSELinux 使用者以使這些系統在strict策略下執行的可能性。

為了做到這一點,要求之一是讓最終使用者了解他/她已從 ‘降級’unconfined_ustaff_u. 問題在於sudo與 SELinux 使用者映射的互操作方式。一些事實:

  1. 如果你想使用一個受限的 SELinux 使用者並且你希望仍然能夠使用sudo,你需要使用staff_u,因為這是可以訪問 SETUID 執行檔的 SELinux 使用者。
  2. 當使用者登錄系統時,他/她被分配一個 SELinux 使用者映射。su即使在 SELinux 使用者可以執行( unconfined_u) 或sudo( unconfined_u, )的情況下,該映射也不會改變staff_u
  3. SELinux Specfor目前包含在定義的andsudo中執行命令的工具,但缺乏指定 the 的可能性。進一步的參考可以在這裡找到。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
  • 如果無法通過,是否可以在 freeIPAsudoers中定義或綁定 a到 SELinux 使用者映射?sudorule

考慮這種情況:

# 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
type=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
type=CWD msg=audit(1378886250.584:46644668): cwd="/home/some_user"
type=SYSCALL msg=audit(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="access"
type=AVC msg=audit(1378886250.584:46644668):avc: denied { read write } for 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=文件

因為我正在使用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
type=PATH msg=audit(1378890053.185:46646934): item=0 name="/etc/init.d/sshd" inode=5490 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj =system_u:object_r:sshd_initrc_exec_t:s0
類型=CWD 消息=審計(1378890053.185:46646934):cwd="/"
type=SYSCALL msg=audit(1378890053.185:46646934): arch=c000003e syscall=59 成功=沒有退出=-13 a0=7fffc0829862 a1=7fffc0829578 a2=607030 a3=ffffe000 items=1 ppid=6715 pid=6720 90uid168001 auid= =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)
type=AVC msg=audit(1378890053.185:46646934):avc: denied { execute } for pid=6720 comm="env" name="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,但這是向前邁出的一大步,因為它稍微增強了整體安全性。當然,Matthew 的回答是正確的,staff_u應該可以通過sudo選項過渡到更高特權的域;但仍然存在system_u無法完全替換的問題unconfined_u。也許是因為它不打算這樣做。

你知道你可以進入這個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真的,人們可能無論如何都應該使用。

對於喜歡改掉壞習慣的人(比如我!),我通常硬連結runuserru作為兩個字母的替代品。sudo su -

引用自:https://serverfault.com/questions/537912