記錄一次setcap提權失敗的經歷

Linux是一種安全操做系統,它給普通用戶儘量低的權限,而把所有的系統權限賦予一個單一的賬戶rootroot賬戶用來管理系統、安裝軟件、管理賬戶、運行某些服務、安裝/卸載文件系統、管理用戶、安裝軟件等。另外,普通用戶的不少操做也須要root權限,這經過setuid實現。linux

 

這種依賴單一賬戶執行特權操做的方式加大了系統的面臨風險,而須要root權限的程序可能只是爲了一個單一的操做,例如:綁定到特權端口、打開一個只有root權限能夠訪問的文件。某些程序可能有安全漏洞,而若是程序不是以root的權限運行,其存在的漏洞就不可能對系統形成什麼威脅。nginx

 

2.1版開始,內核開發人員在Linux內核中加入了能力(capability)的概念。其目標是消除須要執行某些操做的程序對root賬戶的依賴。api

 

Linux內核能力詳解安全

 

傳統UNIX的信任狀模型很是簡單,就是「超級用戶對普通用戶」模型。在這種模型中,一個進程要麼什麼都能作,要麼幾乎什麼也不能作,這取決於進程的UID。若是一個進程須要執行綁定到私有端口、加載/卸載內核模塊以及管理文件系統等操做時,就須要徹底的root權限。很顯然這樣作對系統安全存在很大的威脅。UNIX系統中的SUID問題就是由這種信任狀模型形成的。例如,一個普通用戶須要使用ping命令。這是一個SUID命令,會以root的權限運行。而實際上這個程序只是須要RAW套接字創建必要ICMP數據包,除此以外的其它root權限對這個程序都是沒有必要的。若是程序編寫很差,就可能被攻擊者利用,得到系統的控制權。網絡

 

使用能力(capability)能夠減少這種風險。系統管理員爲了系統的安全能夠剝奪root用戶的能力,這樣即便root用戶也將沒法進行某些操做。而這個過程又是不可逆的,也就是說若是一種能力被刪除,除非從新啓動系統,不然即便root用戶也沒法從新添加被刪除的能力。ui

 

Capabilities的主要思想在於分割root用戶的特權,即將root的特權分割成不一樣的能力,每種能力表明必定的特權操做。例如:能力CAP_SYS_MODULE表示用戶可以加載(或卸載)內核模塊的特權操做,而CAP_SETUID表示用戶可以修改進程用戶身份的特權操做。在Capbilities中系統將根據進程擁有的能力來進行特權操做的訪問控制。spa

    Capilities中,只有進程和可執行文件才具備能力,每一個進程擁有三組能力集,分別稱爲cap_effective, cap_inheritable, cap_permitted(分別簡記爲:pE,pI,pP),其中cap_permitted表示進程所擁有的最大能力集;cap_effective表示進程當前可用的能力集,能夠看作是cap_permitted的一個子集;而cap_inheitable則表示進程能夠傳遞給其子進程的能力集。系統根據進程的cap_effective能力集進行訪問控制,cap_effectivecap_permitted的子集,進程能夠經過取消cap_effective中的某些能力來放棄進程的一些特權。可執行文件也擁有三組能力集,對應於進程的三組能力集,分別稱爲cap_effective, cap_allowed cap_forced(分別簡記爲fE,fI,fP),其中,cap_allowed表示程序運行時可從原進程的cap_inheritable中集成的能力集,cap_forced表示運行文件時必須擁有才能完成其服務的能力集;而cap_effective則表示文件開始運行時可使用的能力。操作系統

(一)Linux內核中Capabilities的實現機制code

     Linux內核從2.2版本開始,就加進的Capabilities的概念與機制,並隨着版本升高逐步獲得改進。在linux中,root權限被分割成一下29中能力:blog

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標誌 參考man capabilities

 

注意點:

1)若是改變文件名,則能力保留到新文件.

2)用setcap -r /bin/chown能夠刪除掉文件的能力.

3)從新用setcap受權將覆蓋以前的能力. 

 

設置方法:

setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap 完成。 可使用 getcap /usr/bin/dumpcap驗證,輸出應當是:/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

 

 

實例說明1root用戶對小於1024端口的提權

對於編譯安裝的nginx,路徑/tmp/nginx

當普通用戶試圖啓動nginx時報錯Permission denied

 

 

切到root用戶提權

~]# setcap cap_net_bind_service=+ep /tmp/nginx/sbin/nginx

 

 

 

 

實例說明2root用戶查看/etc/shadow

~ ]# setcap cap_dac_read_search=eip /bin/cat

 

工做中遇到過,一個坑某塊磁盤的掛載屬性含nosuid 致使提權nginx 80端口給nginx用戶失敗

相關文章
相關標籤/搜索