1

도커 states의 용기는 기본적으로사용자 및 파일 권한 설정 (고정 표시기-작성 버전 3)

"... 매우 안전한지, 당신 안에 당신의 실행중인 프로세스를 돌봐 특히

  1. 사용 공식 IMA : 권한이없는 사용자로 용기 (즉, 루트가 아닌) "

결과, 나는에 시도했다 사용자 실행을 처리 GES 적절하게

  • 피 생산에 호스트 볼륨을 장착, 나는 내 컨테이너 볼륨 COPY 코드 및 구성 파일, 디렉토리의 모든 파일이 "만들 때 대신
  • COPY를 사용하여 ... 문서 here에 명시된대로 UID와 GID가 0입니다 (루트 소유권).

    질문 : 보안 위험 파일과 디렉토리가 루트가 소유하지만, 실행중인 프로세스가 www-data처럼 루트가 아닌 사용자가 소유 한 경우는 아직이 있습니까? php-fpm와 예를 들어

    [email protected]:/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 
    
    [email protected]:/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 
    

    방법 (어디)에 올바르게 chownchmod 내 파일 그래서, 내가 궁금합니다. 내 연구에서, 이것은 docker-compose를 사용하는 경우 덜 직관적 인 것처럼 보입니다. 나는 docker-compose YAML 파일 (버전 3)과 컨테이너 별 Dockerfiles를 모두 사용하고 있습니다. 컨테이너의 Dockerfile 끝에 chown을 삽입하면 변경 사항이 적용되지 않는 것 같습니다. 아마도 docker-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 {} \; 
    

    , 그것은 어려운 여기에 두 가지 구성의 일부 조각을이다 이 주제를 둘러싼 다양한 웹 기사, 버그 수정 및 기능 요청을 분류 할 수 있습니다. 도커 작성 버전 3을 목표로 확실한 방향/응답을 얻으려고합니다.

    답변

    1

    질문 : 파일과 디렉토리 는 루트가 소유하는 경우 보안 위험이 여전히 존재하지만 실행중인 프로세스가 루트가 아닌 사용자가 소유, www가 데이터와 같은 ?

    아니요. php-fpm에 이러한 파일에 대한 읽기 권한이 있는지 확인해야 할 수도 있습니다.

    /var/www/html의 내용을 이미지에 복사하고 빌드 타임 (Dockerfile)에서 소유권/사용 권한을 설정합니다. 괜찮습니다. 이것이 이미지를 만드는 일반적인 경우입니다.

    그러나 docker-compose.ymldata_volume을 실행 컨테이너에 탑재하고 이미지에서 /var/www/html을 바꿉니다. 그래서 그 디렉토리에 있던 것은 무엇이든 숨겨집니다. 대신 마운트 된 볼륨의 내용이 표시됩니다.

    컨테이너 데이터를 유지하는 데 필요한 전략을 선택하는 것이 좋습니다. 빌드시에 /var/www/html을 채우는 것은 대개의 경우 대개는 정상입니다. 그러나 응용 프로그램에서 해당 디렉토리 어딘가에 데이터를 쓰는 경우 해당 경로를 변경하는 것이 좋습니다. 컨테이너가 파괴되면, 마운트 된 볼륨을 넘어서 작성된 데이터는 손실됩니다. 그러므로 yoru 앱이 볼륨으로 마운트 된 디렉토리에 쓰기를 시도했는지 확인하십시오. docker-compose.yml.

    +0

    귀하의 설명은 용기가 용적을 필요로하지 않는다는 것을 인식하는 데 도움이되었습니다. 소스 코드 및 구성을 작성시 직접 Dockerfiles에 복사 할 수 있습니다. 또한 그 시점에서 파일 소유권과 사용 권한을 설정할 수 있습니다. 그러나 버전 3에서는 공유 볼륨에 데이터를 복사하고 권한을 설정하는 가장 좋은 방법은 무엇입니까? 내 nginx 및 php 컨테이너는 동일한 파일 및 폴더에 대한 액세스가 필요하며 동일한 데이터를 두 개의 다른 이미지로 두 번 복사하지 않아도됩니다. – littleK

    +0

    예, 컨테이너간에 데이터를 공유하려면 볼륨이 표준입니다. 또한 해당 태스크에 특화된 다른 컨테이너에서 볼륨을 작성하고 관리 할 수 ​​있습니다. 공유되는 내용에 대해 구체적으로 설명해 주실 수 있습니까? – JulioHM

    +0

    그것은 모두 서버 측 PHP 코드입니다. 내가 읽은 것부터 PHP 코드는 php-fpm 컨테이너에서만 액세스 할 수 있어야하지만 내 nginx 컨테이너에도 액세스해야한다는 것을 알게됩니다. 그렇지 않으면 404가됩니다. – littleK

    0

    도커의 명명 된 볼륨은 해당 마운트 지점의 이미지 내용으로 초기화됩니다. 그 후에 볼륨이 완전히 비어 있지 않으면 초기화 단계가 결코 다시 실행되지 않아 데이터가 손실되지 않습니다.

    data_volume을 처음 만들 때 /var/www/html을 가리키면 파일 허가를 포함하여 해당 디렉토리의 복사본이 생성됩니다. 그러나 data_volume을 삭제하거나 비우지 않는 한 Dockerfile을 변경하면 이미지가 업데이트되고 해당 볼륨은 해당 디렉토리를 볼륨 내용과 겹치게됩니다. 당신이 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 
    

    을 -compose.yml이며 디렉토리는 모두 소문자입니다. 그렇지 않으면 $(basename $(pwd))_data_volumedocker volume ls에 표시된 볼륨 이름으로 바꿉니다. 위 컨테이너 내부에서 find 명령을 실행하여 소유권과 사용 권한을 업데이트 할 수 있습니다.