強化Docker容器:禁用SUID程式

軒墨發表於2017-09-11
本文講的是強化Docker容器:禁用SUID程式【編者的話】Docker的安全問題一直是大家關心的熱點,本文重點提出啟用SUID的程式所帶來的安全隱患,提出了對應的解決方法,從而加強Docker的安全保障,值得一讀。

大部分人考慮強化Docker容器的時候,首先想到的是將預設使用者設定為非root賬戶。在黑客攻擊容器之前,他們需要得到該容器的root許可權。如果以非root賬戶執行容器就會使攻擊更為困難。

執行docker run或者docker create命令時,通過-u或者-user引數,可以以任意已經存在在目標映象裡的非root使用者啟動容器。可以先用docker history檢視容器命令歷史記錄,在其中查詢adduser命令,這樣可以查出現存使用者。可以檢視USER命令確定是否設定了預設使用者。或者,直接從映象啟動一個容器並進入shell命令列直接手動檢查。如果你不喜歡這麼查來查去,通常也可以直接使用“nobody”使用者。

我覺得Tutum最近不會提供特定的介面幫助檢視正在容器裡執行的使用者。因此如果你想要以非root使用者執行,必須確保你想啟動的映象服務的預設使用者設定成了這個非root使用者。

以非root使用者執行是一個好的開始,但是還可以做得更好。其中一件有趣的事情是去取消檔案裡SUID引數的設定,或者直接從映象裡刪除帶這個引數的檔案。現在你可能會問:“SUID引數到底是什麼?”

SUID引數是指Linux檔案許可權。大多數Linux使用者對Linux檔案許可權都有一定的瞭解。較為熟知的9引數描述了檔案擁有者,組以及其他使用者對某個特定檔案享有的許可權。比如:
"-rwxr-xr-x 1 root root" (or 755)


  • 檔案擁有者可以讀、寫和執行該檔案
  • 在檔案組裡的使用者可以讀和執行該檔案
  • 其他任何使用者可以讀和執行該檔案


SUID引數是可執行引數的細化。它告訴Linux在執行該檔案時,將活動的組或使用者設定為該檔案的擁有組或使用者。

"-rwsr-xr-x 1 root root"


或者

"-rwxr-sr-x 1 root root"


很多時候普通使用者需要訪問某個需要特定許可權才能訪問的程式。最常見的時ping命令。我喜歡這個例子因為它有時候顯得很微不足道而無害。ping要求root許可權因為它要使用ICMP協議。一個典型的Linux安裝後會包含多個這樣的工具。在ubuntu:latest映象裡有22個帶有SUID設定的程式。

/sbin/unix_chkpwd
/usr/bin/chage
/usr/bin/passwd
/usr/bin/mail-touchlock
/usr/bin/mail-unlock
/usr/bin/gpasswd
/usr/bin/crontab
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/wall
/usr/bin/mail-lock
/usr/bin/expiry
/usr/bin/dotlockfile
/usr/bin/chsh
/usr/lib/eject/dmcrypt-get-device
/usr/lib/pt_chown
/bin/ping6
/bin/su
/bin/ping
/bin/umount
/bin/mount


如下例子展示SUID引數如何工作。有如下Dockerfile:

FROM ubuntu:latest

RUN chmod u+s /usr/bin/whoami

RUN adduser --system --no-create-home --disabled-password --disabled-login --shell /bin/sh example

USER example

CMD printf "Container running as:          %s
" `id -u -n` && printf "Effectively running whoami as: %s
" `whoami`


從這個Dockerfile構建並執行映象會得到如下輸出:

docker build -t tutumblog/suid_whoami . 
&& docker run --rm tutumblog/suid_whoami

…

Container running as:                  example
Effectively running whoami as:  root


在這個例子裡,我從基礎Ubuntu映象啟動,將whoami命令設定上SUID引數。然後為這個映象新增example使用者,並且設定其為從此映象建立出的容器的預設使用者。可以看出問題是,展示了兩個不同的當前使用者。當example使用者執行whoami時,因為其帶有SUID引數設定,Linux用root使用者執行它,所以顯示檔案的擁有者是root。

現在很明顯whoami不是一個需要由其擁有者才能執行的程式。實際上它顯示了錯誤的結果。現在需要解決的問題是:“在執行時裡我需要帶有SUID設定的程式嗎?”我認為大部分時候的回答是:“不需要。”

我知道你能找到一些例子說明執行時需要帶有SUID引數設定的程式。有些人需要crontab。有些人需要ping來診斷問題。但是如果這22個程式的其中某個程式有bug怎麼辦?如果這個程式設定了SUID引數,黑客又探測到這個bug,那麼他們將控制整個容器。

取消SUID引數的設定就可以解決這個問題。可以考慮在Dockerfile裡增加一行來取消映象裡所有SUID引數的設定。如下示例:

FROM ubuntu:latest

RUN adduser --system --no-create-home --disabled-password --disabled-login --shell /bin/sh example

RUN for i in `find / -perm +6000 -type f`; do chmod a-s $i; done

USER example

CMD /bin/bash


或者,可以直接刪除這些程式來解決問題:

…
RUN for i in `find / -perm +6000 -type f`; do rm -f $i; done
…


容器是用來隔離而不是虛擬化的。基於這一點,Docker映象是用來提供應用或服務啟動所需最小的檔案集。如果你的確需要其中一些程式以root使用者執行,那麼可以選擇哪些容器需要加強,哪些容器不需要。但是要意識到其中存在的風險。

原文連結:Hardening Docker Containers: Disable SUID Programs (翻譯:崔婧雯)

===========================
譯者介紹
崔婧雯,現就職於VMware,高階軟體工程師,負責桌面虛擬化產品的質量保證工作。曾在IBM WebSphere業務流程管理軟體擔任多年系統測試工作。對虛擬化,中介軟體技術有濃厚的興趣。

原文釋出時間為:2015-02-10
本文作者:崔婧雯 
本文來自雲棲社群合作伙伴DockerOne,瞭解相關資訊可以關注DockerOne。
原文標題:強化Docker容器:禁用SUID程式


相關文章