[英]User and file permission configuration in Docker containers (docker-compose version 3)
碼頭工人稱 ,它的容器
“...默認情況下,非常安全;特別是如果您負責將容器內的進程作為非特權用戶(即非root用戶)運行”
結果,我試圖:
COPY
當我COPY
代碼和配置文件到我的集裝箱量,所有的目錄和文件的創建” ......一個UID和0"的GID(根所有權),如文檔中說明這里 。
問題:如果文件和目錄由root擁有但是運行進程由非root用戶擁有,如www-data
,是否還存在安全風險? 例如,使用php-fpm :
root@7bf71145c18c:/var/www/html# ls -l
total 1220
-rw-rw-r-- 1 root root 5931 May 10 12:28 index.php
drwxrwxr-x 3 root root 4096 May 10 12:28 logs
-rw-rw-r-- 1 root root 28 May 10 12:28 robots.txt
root@7bf71145c18c:/var/www/html# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:14 ? 00:00:00 php-fpm: master process (/usr/lo
www-data 5 1 0 14:14 ? 00:00:00 php-fpm: pool www
www-data 6 1 0 14:14 ? 00:00:00 php-fpm: pool www
root 7 0 0 14:19 ? 00:00:00 bash
root 12 7 0 14:19 ? 00:00:00 ps -ef
如果是這樣,我想知道如何(和在哪里)正確chown
和chmod
我的文件。 從我的研究來看,如果你使用的是docker-compose,這似乎不太直白,我就是這樣 - 我正在使用docker-compose YAML文件(版本3)和特定於容器的Dockerfiles。 看來,當我chown
在容器的Dockerfile結束,所做的更改不會生效-可能是因為體積(這是在泊塢窗,compose.yml定義)是繼創建。 以下是兩種配置的一些片段:
泊塢窗,compose.yml:
version: '3'
services:
fpm:
build: ./fpm
container_name: "fpm"
volumes:
- data_volume:/var/www/html
ports:
- "9000"
restart: always
volumes:
data_volume:
./fpm Dockerfile:
FROM php:7-fpm
RUN mkdir -p /var/www/html/
COPY . /var/www/html/
RUN find /var -exec chown www-data:www-data {} \;
RUN find /var -type d -exec chmod 755 {} \;
RUN find /var -type f -exec chmod 644 {} \;
使用不同的docker-compose版本,很難對圍繞此主題的各種Web文章,錯誤修復和功能請求進行排序。 我希望在這里獲得一些明確的方向/答案,面向docker-compose第3版。
問題:如果文件和目錄由root擁有但是運行進程由非root用戶擁有,如www-data,是否還存在安全風險?
並不是的。 您可能只需要確保php-fpm具有對這些文件的讀取權限。
您正在將/var/www/html
的內容復制到映像中,並在構建時設置所有權/權限(Dockerfile)。 還行吧。 這是創建圖像的常用用例。
但是,你的docker-compose.yml
坐騎data_volume
到正在運行的容器,替換/var/www/html
從圖像。 因此,無論您在該目錄中擁有什么,都將被隱藏。 您將看到已安裝卷的內容。
您可能希望選擇持久化容器數據所需的策略。 在構建時/var/www/html
在大多數情況下可能都可以。 但是,如果您的應用程序將數據寫入該目錄中的某個位置,那么您可以考慮更改該路徑。 當容器被銷毀時,寫入outisde已安裝卷的任何數據都將丟失。 因此,請確保yoru app寫入從docker-compose.yml
作為卷掛載的目錄。
docker中的命名卷初始化為其掛載點處圖像的內容。 之后,除非卷完全為空,否則永遠不會再次運行該初始化步驟以避免數據丟失。
因此,當您第一次創建指向/var/www/html
data_volume
時,它獲得了該目錄的副本,包括文件權限。 但除非您刪除或清空data_volume
,否則您對data_volume
任何更改都只會更新映像,而卷將使用卷的內容覆蓋該目錄。
如果您不需要data_volume
的內容,可以使用data_volume
docker-compose down -v
來刪除容器和卷。 然后,當您再次運行docker-compose up -d
時,將使用具有新權限的文件創建卷。
如果確實需要保留data_volume
的內容,則可以裝入卷並在卷本身上運行命令:
docker run -it --rm -v $(basename $(pwd))_data_volume:/var/www/html busybox
以上假設您與docker-compose.yml位於同一文件夾中,並且該目錄均為小寫字符。 否則,將$(basename $(pwd))_data_volume
替換$(basename $(pwd))_data_volume
docker volume ls
顯示的卷名。 從上面的容器中,您可以運行find
命令來更新所有權和權限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.