真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

?如何查看和設(shè)置文件linuxcapabilities

這篇文章主要介紹“如何查看和設(shè)置文件linux capabilities”,在日常操作中,相信很多人在如何查看和設(shè)置文件linux capabilities問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何查看和設(shè)置文件linux capabilities”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站是一家專注于成都做網(wǎng)站、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),貢井網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:貢井等地區(qū)。貢井做網(wǎng)站價(jià)格咨詢:18980820575

Linux 系統(tǒng)中主要提供了兩種工具來管理 capabilities:libcaplibcap-ng。libcap 提供了 getcapsetcap 兩個(gè)命令來分別查看和設(shè)置文件的 capabilities,同時(shí)還提供了 capsh 來查看當(dāng)前 shell 進(jìn)程的 capabilities。libcap-ng 更易于使用,使用同一個(gè)命令 filecap 來查看和設(shè)置 capabilities。

1 libcap

安裝很簡(jiǎn)單,以 CentOS 為例,可以通過以下命令安裝:

$ yum install -y libcap

如果想查看當(dāng)前 shell 進(jìn)程的 capabilities,可以用 capsh 命令。下面是 CentOS 系統(tǒng)中的 root 用戶執(zhí)行 capsh 的輸出:

$ capsh --print

Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read+ep
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
Securebits: 00/0x0/1'b0
 secure-noroot: no (unlocked)
 secure-no-suid-fixup: no (unlocked)
 secure-keep-caps: no (unlocked)
uid=0(root)
gid=0(root)
groups=0(root)

解釋一下:

  • Current: 表示當(dāng)前 shell 進(jìn)程的 Effective capabilities 和 Permitted capabilities??梢园鄠€(gè)分組,每一個(gè)分組的表示形式為 capability[,capability…]+(e|i|p),其中 e 表示 effective,i 表示 inheritable,p 表示 permitted。不同的分組之間通過空格隔開,例如:Current: = cap_sys_chroot+ep cap_net_bind_service+eip。再舉一個(gè)例子,cap_net_bind_service+e cap_net_bind_service+ipcap_net_bind_service+eip 等價(jià)。

  • Bounding set: 這里僅僅表示 Bounding 集合中的 capabilities,不包括其他集合,所以分組的末尾不用加上 +... 。

  • Securebits: 我也沒搞清楚這是個(gè)什么鬼。

這個(gè)命令輸出的信息比較有限,完整的信息可以查看 /proc 文件系統(tǒng),比如當(dāng)前 shell 進(jìn)程就可以查看 /proc/$$/status。其中一個(gè)重要的狀態(tài)就是 NoNewPrivs,可以通過以下命令查看:

grep NoNewPrivs /proc/$$/status

NoNewPrivs:    0

根據(jù) prctl(2) 中的描述,自從 Linux 4.10 開始,/proc/[pid]/status 中的 NoNewPrivs 值表示了線程的 no_new_privs 屬性。至于 no_new_privs究竟是干嘛的,下面我單獨(dú)解釋一下。

no_new_privs

一般情況下,execve() 系統(tǒng)調(diào)用能夠賦予新啟動(dòng)的進(jìn)程其父進(jìn)程沒有的權(quán)限,最常見的例子就是通過 setuidsetgid 來設(shè)置程序進(jìn)程的 uid 和 gid 以及文件的訪問權(quán)限。這就給不懷好意者鉆了不少空子,可以直接通過 fork 來提升進(jìn)程的權(quán)限,從而達(dá)到不可告人的目的。

為了解決這個(gè)問題,Linux 內(nèi)核從 3.5 版本開始,引入了 no_new_privs 屬性(實(shí)際上就是一個(gè) bit,可以開啟和關(guān)閉),提供給進(jìn)程一種能夠在 execve() 調(diào)用整個(gè)階段都能持續(xù)有效且安全的方法。

  • 開啟了 no_new_privs 之后,execve 函數(shù)可以確保所有操作都必須調(diào)用 execve() 判斷并賦予權(quán)限后才能被執(zhí)行。這就確保了線程及子線程都無(wú)法獲得額外的權(quán)限,因?yàn)闊o(wú)法執(zhí)行 setuid 和 setgid,也不能設(shè)置文件的權(quán)限。

  • 一旦當(dāng)前線程的 no_new_privs 被置位后,不論通過 fork,clone 或 execve 生成的子線程都無(wú)法將該位清零。

Docker 中可以通過參數(shù) --security-opt 來開啟 no_new_privs 屬性,例如:docker run --security-opt=no_new_privs busybox。下面通過一個(gè)例子來體會(huì)一下 no_new_privs 屬性的作用。

首先擼一段 C 代碼,顯示當(dāng)前進(jìn)程的有效用戶 id:

$ cat testnnp.c

#include 
#include 
#include 

int main(int argc, char *argv[])
{
        printf("Effective uid: %d\n", geteuid());
        return 0;
}
$ make testnnp
cc     testnnp.c   -o testnnp

將可執(zhí)行文件打入 docker 鏡像中:

FROM fedora:latest
ADD testnnp /root/testnnp
RUN chmod +s /root/testnnp
ENTRYPOINT /root/testnnp

構(gòu)建鏡像:

$ docker build -t testnnp .
Step 1 : FROM fedora:latest
 ---> 760a896a323f
Step 2 : ADD testnnp /root/testnnp
 ---> 6c700f277948
Removing intermediate container 0981144fe404
Step 3 : RUN chmod +s /root/testnnp
 ---> Running in c1215bfbe825
 ---> f1f07d05a691
Removing intermediate container c1215bfbe825
Step 4 : ENTRYPOINT /root/testnnp
 ---> Running in 5a4d324d54fa
 ---> 44f767c67e30
Removing intermediate container 5a4d324d54fa
Successfully built 44f767c67e30

下面來做兩個(gè)實(shí)驗(yàn),先在沒有開啟 no-new-privileges 的情況下啟動(dòng)容器:

$ docker run -it --rm --user=1000  testnnp
Effective uid: 0

從輸出結(jié)果來看,只要給可執(zhí)行文件設(shè)置了 SUID 標(biāo)識(shí),即使我們使用普通用戶(UID=1000)來運(yùn)行容器,進(jìn)程的有效用戶也會(huì)變成 root。

接著在開啟 no-new-privileges 的前提下啟動(dòng)容器,以防止執(zhí)行設(shè)置了 SUID 標(biāo)識(shí)的可執(zhí)行文件進(jìn)行 UID 轉(zhuǎn)換:

$ docker run -it --rm --user=1000 --security-opt=no-new-privileges testnnp
Effective uid: 1000

可以看到,開啟了 no_new_privs 屬性之后,即使可執(zhí)行文件設(shè)置了 SUID 標(biāo)識(shí),線程的有效用戶 ID 也不會(huì)變成 root。這樣即使鏡像中的代碼有安全風(fēng)險(xiǎn),仍然可以通過防止其提升權(quán)限來避免受到攻擊。

Kubernetes 也可以開啟 no_new_privs,不過邏輯稍微復(fù)雜一點(diǎn)。當(dāng) Pod 的 SecurityContext 定義下的 allowPrivilegeEscalation 字段值為 false 時(shí)(默認(rèn)就是 false),如果不滿足以下任何一個(gè)條件,就會(huì)開啟 no_new_privs 屬性:

  • 設(shè)置了 privileged=true

  • 增加了 CAP_SYS_ADMIN capabilities,即 capAdd=CAP_SYS_ADMIN

  • 以 root 用戶運(yùn)行,即 UID=0

例如,當(dāng)設(shè)置了 privileged=trueallowPrivilegeEscalation=false 時(shí),就不會(huì)開啟 no_new_privs 屬性。同理,設(shè)置了 capAdd=CAP_SYS_ADMINallowPrivilegeEscalation=false 也不會(huì)開啟 no_new_privs 屬性。

管理 capabilities

可以通過 getcap 來查看文件的 capabilities,例如:

$ getcap /bin/ping /usr/sbin/arping

/bin/ping = cap_net_admin,cap_net_raw+p
/usr/sbin/arping = cap_net_raw+p

也可以使用 -r 參數(shù)來遞歸查詢:

$ getcap -r /usr 2>/dev/null

/usr/bin/ping = cap_net_admin,cap_net_raw+p
/usr/bin/newgidmap = cap_setgid+ep
/usr/bin/newuidmap = cap_setuid+ep
/usr/sbin/arping = cap_net_raw+p
/usr/sbin/clockdiff = cap_net_raw+p

如果想查看某個(gè)進(jìn)程的 capabilities,可以直接使用 getpcaps,后面跟上進(jìn)程的 PID:

$ getpcaps 1234

如果想查看一組相互關(guān)聯(lián)的線程的 capabilities(比如 nginx),可以這么來看:

$ getpcaps $(pgrep nginx)

這里你會(huì)看到只有主線程才有 capabilities,子線程和其他 workers 都沒有 capabilities,這是因?yàn)橹挥?master 才需要特殊權(quán)限,例如監(jiān)聽網(wǎng)絡(luò)端口,其他線程只需要響應(yīng)請(qǐng)求就好了。

設(shè)置文件的 capabilities 可以使用 setcap,語(yǔ)法如下:

$ setcap CAP+set filename

例如,將 CAP_CHOWNCAP_DAC_OVERRIDE capabilities 添加到 permittedeffective 集合:

$ setcap CAP_CHOWN,CAP_DAC_OVERRIDE+ep file1

如果想移除某個(gè)文件的 capabilities,可以使用 -r 參數(shù):

$ setcap -r filename

2 libcap-ng

安裝也很簡(jiǎn)單,以 CentOS 為例:

$ yum install libcap-ng-utils

用法

libcap-ng 使用 filecap 命令來管理文件的 capabilities。有幾個(gè)需要注意的地方:

  • filecap 添加刪除或查看 capabilities 時(shí),capabilities 的名字不需要帶 CAP_ 前綴(例如,使用 NET_ADMIN 代替 CAP_NET_ADMIN);

  • filecap 不支持相對(duì)路徑,只支持絕對(duì)路徑;

  • filecap 不允許指定 capabilities 作用的集合,capabilities 只會(huì)被添加到 permittedeffective 集合。

查看文件的 capabilities:

$ filecap /full/path/to/file

遞歸查看某個(gè)目錄下所有文件的 capabilities:

$ filecap /full/path/to/dir

例如:

$ filecap /usr/bin

file                 capabilities
/usr/bin/newgidmap     setgid
/usr/bin/newuidmap     setuid

> 注意:filecap 只會(huì)顯示“capabilities 被添加到 permittedeffective 集合中”的文件。所以這里沒有顯示 ping 和 arping。

遞歸查看整個(gè)系統(tǒng)所有文件的 capabilities:

$ filecap /
# or
$ filecap -a

設(shè)置文件的 capabilities 語(yǔ)法如下:

$ filecap /full/path/to/file cap_name

例如:

$ filecap /usr/bin/tac dac_override

移除某個(gè)文件的 capabilities:

$ filecap /full/path/to/file none

到此,關(guān)于“如何查看和設(shè)置文件linux capabilities”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


文章標(biāo)題:?如何查看和設(shè)置文件linuxcapabilities
文章鏈接:http://weahome.cn/article/gsdipi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部