setcap 指令詳解

setcap 指令詳解,在Linux中setcap指令最常見的就是限制1024以上的端口使用,也稱為特權端口,可以不通過防火牆,進行端口限制。主要在於分割root使用者的特權,即將root的特權分割成不同的能力,每種能力代表一定的特權操作。

什麼是setcap指令

,在Linux中最常見的就是限制1024以上的端口使用,也稱為特權端口,可以不通過防火牆,進行端口限制。主要在於分割root使用者的特權,即將root的特權分割成不同的能力,每種能力代表一定的特權操作。

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_cap_forcedive使用時必須從原始進程的cap_inheritable中執行檔的能力集,cap_forcedective.3可以在執行其服務時執行其服務時執行其服務時的能力集,cap_forcedective,則使用文件完成的能力集可以開始執行其服務時執行其服務時的能力集,cap_forcedect.effdive;
(一)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

評分

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *