強化Docker容器:禁用SUID程式
大部分人考慮強化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業務流程管理軟體擔任多年系統測試工作。對虛擬化,中介軟體技術有濃厚的興趣。
相關文章
- docker容器化.NET程式Docker
- .NET Core容器化(Docker)Docker
- .NET Core容器化@DockerDocker
- 教你使用Docker容器化Node.js應用程式DockerNode.js
- Docker容器與虛擬化技術:OpenEuler 部署 docker容器應用Docker
- Docker最全教程——MongoDB容器化(十二)DockerMongoDB
- 除錯 Docker 容器內部程式除錯Docker
- Docker容器化部署Python應用DockerPython
- Docker容器化技術初體驗Docker
- Docker容器學習梳理 - 應用程式容器環境部署Docker
- Docker容器Docker
- win10如何禁用驅動程式強制簽名 win10禁用驅動程式強制簽名的方法Win10
- .NET Core容器化之多容器應用部署(Docker-Compose)Docker
- Docker容器化部署嘗試——多容器通訊(node + mongoDB + nginx)DockerMongoDBNginx
- .NET Core容器化之多容器應用部署@Docker-ComposeDocker
- Docker技術( 容器虛擬化技術 )Docker
- Docker最全教程——資料庫容器化(十)Docker資料庫
- Docker容器視覺化監控中心搭建Docker視覺化
- 容器化-Docker-1-速查手冊-Docker常用命令Docker
- win10禁用驅動程式強制簽名的方法_win10怎麼禁用驅動程式強制簽名Win10
- docker 容器互通Docker
- Docker 容器操作Docker
- 操作Docker容器Docker
- Docker容器操作Docker
- 容器引擎-DockerDocker
- Docker最全教程之MySQL容器化 (二十四)DockerMySql
- 自動化整合:Docker容器入門簡介Docker
- 自動化整合:Pipeline整合Docker容器Docker
- Docker容器的自動化監控實現Docker
- docker4dotnet #2 容器化主機Docker
- 如何在Docker容器中執行GUI程式DockerGUI
- 使用 Docker 開發 PHP 專案(三):命令容器化DockerPHP
- 利用TICK搭建Docker容器視覺化監控中心Docker視覺化
- 詳解Docker容器視覺化監控中心搭建Docker視覺化
- docker筆記49-容器虛擬化網路Docker筆記
- zabbix容器化安裝及監控docker應用Docker
- 利用ELK搭建Docker容器化應用日誌中心Docker應用日誌
- 如何使用Docker容器化改善你的開發流程Docker