Capabilities的主要思想在於分割root用戶的特權,即將root的特權分割成不同的能力,每種能力代表一定的特權操作。例如:能力CAP_SYS_MODULE表示用戶能夠加載(或卸載)內核模塊的特權操作,而CAP_SETUID表示用戶能夠修改進程用戶身份的特權操作。在Capbilities中系統將根據進程擁有的能力來進行特權操作的訪問控制。 在Capilities中,只有進程和可執行文件才具有能力,每個進程擁有三組能力集,分別稱為cap_effective, cap_inheritable, cap_permitted(分別簡記為:pE,pI,pP),其中cap_permitted表示進程所擁有的最大能力集;cap_effective表示進程當前可用的能力集,可以看做是cap_permitted的一個子集;而cap_inheitable則表示進程可以傳遞給其子進程的能力集。系統根據進程的cap_effective能力集進行訪問控制,cap_effective為cap_permitted的子集,進程可以通過取消cap_effective中的某些能力來放棄進程的一些特權。可執行文件也擁有三組能力集,對應於進程的三組能力集,分別稱為cap_effective, cap_allowed 和 cap_forced(分別簡記為fE,fI,fP),其中,cap_allowed表示程序運行時可從原進程的cap_inheritable中集成的能力集,cap_forced表示運行文件時必須擁有才能完成其服務的能力集;而cap_effective則表示文件開始運行時可以使用的能力。 (一)Linux內核中Capabilities的實現機制 Linux內核從2.2版本開始,就加進的Capabilities的概念與機制,並隨着版本升高逐步得到改進。在linux中,root權限被分割成一下29中能力: CAP_CHOWN:修改文件屬主的權限 CAP_DAC_OVERRIDE:忽略文件的DAC訪問限制 CAP_DAC_READ_SEARCH:忽略文件讀及目錄搜索的DAC訪問限制 CAP_FOWNER:忽略文件屬主ID必須和進程用戶ID相匹配的限制 CAP_FSETID:允許設置文件的setuid位 CAP_KILL:允許對不屬於自己的進程發送信號 CAP_SETGID:允許改變進程的組ID CAP_SETUID:允許改變進程的用戶ID CAP_SETPCAP:允許向其他進程轉移能力以及刪除其他進程的能力 CAP_LINUX_IMMUTABLE:允許修改文件的IMMUTABLE和APPEND屬性標志 CAP_NET_BIND_SERVICE:允許綁定到小於1024的端口 CAP_NET_BROADCAST:允許網絡廣播和多播訪問 CAP_NET_ADMIN:允許執行網絡管理任務 CAP_NET_RAW:允許使用原始套接字 CAP_IPC_LOCK:允許鎖定共享內存片段 CAP_IPC_OWNER:忽略IPC所有權檢查 CAP_SYS_MODULE:允許插入和刪除內核模塊 CAP_SYS_RAWIO:允許直接訪問/devport,/dev/mem,/dev/kmem及原始塊設備 CAP_SYS_CHROOT:允許使用chroot()系統調用 CAP_SYS_PTRACE:允許跟蹤任何進程 CAP_SYS_PACCT:允許執行進程的BSD式審計 CAP_SYS_ADMIN:允許執行系統管理任務,如加載或卸載文件系統、設置磁盤配額等 CAP_SYS_BOOT:允許重新啟動系統 CAP_SYS_NICE:允許提升優先級及設置其他進程的優先級 CAP_SYS_RESOURCE:忽略資源限制 CAP_SYS_TIME:允許改變系統時鍾 CAP_SYS_TTY_CONFIG:允許配置TTY設備 CAP_MKNOD:允許使用mknod()系統調用 CAP_LEASE:允許修改文件鎖的FL_LEASE標志
使用例子:
安裝 Wireshark 的時候,有一步是給 dumpcap 讀網卡的權限,使得普通用戶也可以使用 Wireshark 進行抓包。 # setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/sbin/dumpcap
使用SetUID chmod u+s /path/to/application
在 root 用戶下,用 setcap 命令給 /bin/ping 這個可執行文件加上 “cap_net_admin,cap_net_raw+ep” 權限,普通用戶即可使用 ping. #setcap 'cap_net_admin,cap_net_raw+ep' /bin/ping
查看: [root@rhel671 ~]# getcap /bin/ping /bin/ping = cap_net_admin,cap_net_raw+ep
注意:
setcap 一般用於二進制可執行文件。setcap 用於腳本文件時無效(比如以 #!/bin/python 開頭的腳本文件)
1024以內的端口: setcap cap_net_bind_service=+eip /home/tengine/nginx/tengine/sbin/nginx
-r是清除附加權限: setcap -r nginx
設置TOMCAT可以非ROOT用戶啟動 1024以下端口 setcap cap_net_bind_service=+eip /opt/tomcat/bin/startup.sh