2016-08-03 2 views
2

RedHat OpenShift는 고정 된 사용자 ID로 도커 컨테이너를 실행합니다.OpenShift에서 nginx 도커 컨테이너를 실행하는 올바른 방법은 무엇입니까?

일부 컨테이너에서는 정상적으로 작동하지만 NGINX 컨테이너의 경우 파일 권한이 읽기/쓰기/실행으로 설정되어 있어야 작동합니다.

OpenShift와 함께 사용할 컨테이너를 빌드/실행하는 더 정확한 방법이 있습니까?

예를 들어, OpenShift는 모든 종류의 프로세스 소유권 그룹 또는 규칙을 제공합니까?

다음은 nginx 이미지이며, 우리는 현재 OpenShift에서 작동하도록 chmod 명령을 실행합니다.

registry-nginxinc.rhcloud.com/nginx/rhel7-nginx:1.9.2

RUN chmod -R 777 /var/log/nginx /var/cache/nginx/ \ 
&& chmod -R 777 /var/run \ 
&& chmod -R 777 /etc/nginx/* 

참고 :

http://mailman.nginx.org/pipermail/nginx-devel/2015-November/007511.html

https://github.com/fsimorbrian/openshift-secure-routes

Why does this openshift route succeed in CDK but fail in RHEL7 Atomic?

답변

2

최저 연습 나는 컨테이너를 루트로 실행하지 마십시오. 많은 수의 Docker 이미지, 심지어 일부 공식 이미지는 이것을 무시하고 루트로 실행해야합니다. 조언은 일반적으로 응용 프로그램이 루트를 필요로하지 않고 Dockerfile에 설정 한 루트가 아닌 사용자로 시작할 수 있도록 이미지를 설정해야한다는 것입니다. 이 충고조차도 몇 가지 이유로 가장 안전한 옵션은 아닙니다.

첫 번째는 USER username이라고 말하고, username은 분명히 root이 아닙니다. 해당 이미지를 호스팅하는 플랫폼의 경우 응용 프로그램이 root으로 실행되지 않는다고 실제로 보장하지는 않습니다. 이는 username과 같은 명명 된 사용자가 uid0으로 컨테이너에 매핑되어 여전히 root 권한으로 실행될 수 있기 때문입니다. 플랫폼에서 이미지가 root으로 실행되도록 설정되지 않았는지 제대로 확인하려면 username 대신 uid을 사용해야합니다. 그것은 0의 uid를 제외한 모든 것입니다.

두 번째 문제는 사용자의 Docker 서비스 인스턴스에서 특정 비 root 사용자로 실행하는 것이 좋을 수도 있지만 멀티 테넌트 환경을 고려할 때, 다른 사용자 또는 다른 응용 프로그램이 될 때가 아닙니다. 서로 다른 응용 프로그램이 어떤 식 으로든 서로 액세스 할 수 없도록하는 것이 중요합니다.

멀티 테넌트 환경에서 가장 안전한 방법은 특정 계정 또는 다른 프로젝트에서 다른 사용자가 소유 한 모든 응용 프로그램을 실행하는 것입니다. 이것이 가져 오기 한 이유는 영구 볼륨에 대한 데이터 액세스의 관점에서입니다. 모든 사용자가 동일한 사용자로 실행 중이 어서는 안되는 영구 볼륨에 액세스 할 수 있다면 다른 응용 프로그램의 데이터를 볼 수 있습니다.

기본적으로 OpenShift는 기본적으로 보안을 유지하기 위해 최고 수준의 보안으로 실행됩니다. 따라서 한 프로젝트의 응용 프로그램은 다른 사용자와 함께 다른 프로젝트의 응용 프로그램과 함께 실행됩니다.

보안 조치를 줄이고 적절한 권한이있는 경우이 정책을 무시할 수 있지만 수행중인 응용 프로그램의 위험 프로필이 낮을 때만 변경해야합니다. 즉, 당신은 인터넷에서 벗어난 임의의 Docker 이미지를 알지 못하고 루트로 실행되도록합니다. 당신은 기본을 무시하고 이미지가 사용자로 실행할 수 있습니다 말할 수

:

은 끝까지 읽고 특정 응용 프로그램 시작에 보안 컨텍스트 제약 조건을 변경하는 방법에 대한 자세한 내용은 Dockerfile에서 선언하거나 필요한 경우 root으로 실행합니다.

최고의 보안을 원한다면 Docker 이미지를 구성하여 특정 사용자가 아닌 모든 사용자로 실행할 수있는 더 좋은 방법입니다. 이 작업을 수행하는 방법에 대한

일반적인 지침은 다음과 같습니다

  • 이 같은 응용 프로그램을 실행하는 컨테이너에 새 사용자 계정을 만듭니다. 이 계정의 기본 그룹을 그룹 ID 0으로 설정하십시오. 즉, 해당 그룹은 root이지만 사용자는 그렇지 않습니다. UNIX passwd 파일에 항목이없는 사용자로 실행중인 경우 UNIX가 그룹을 기본값으로 설정하는 그룹 ID 0이어야합니다.
  • 응용 프로그램이 읽기 액세스 권한이 필요한 모든 디렉토리/파일은 다른 사용자가 읽고 쓸 수 있어야하며 그룹 root이 읽고 액세스 할 수 있어야합니다.
  • 응용 프로그램에서 쓰기 액세스가 필요한 모든 디렉토리/파일은 그룹 root에 의해 쓰기 가능해야합니다.
  • 응용 프로그램에서 권한있는 포트를 바인딩 할 필요가 없습니다. 기술적으로는 Linux 기능을 사용하여 해결할 수 있지만 Docker 이미지 자동화 빌드와 같은 Docker 이미지 용 일부 빌드 시스템은 Linux 기능의 측면을 사용하는 사용자를 지원하지 않으므로 필요에 따라 이미지를 빌드 할 수 없습니다. setcap을 사용하십시오.

마지막으로, 당신은 레드햇에서 OpenShift 지역 (CDK)를 사용하는 경우, 또는 복합기 VM이 OpenShift 원산지를 들어,이 중 어느 것도 필요하지 않다는 것을 발견 할 것이다. 이러한 VM 이미지는 기본적으로 루트로 실행하려는 이미지까지 모든 이미지를 실행할 수있는 기능을 허용하도록 의도적으로 설정 되었기 때문입니다. 이는 다운로드 한 임의의 이미지를 시험해보기 쉽도록 제작되었지만, 프로덕션 시스템에서는 기본적으로 이미지를 루트 권한으로 실행하는 기능과 함께보다 안전한 방식으로 이미지를 실행하려고합니다.

루트로 컨테이너를 실행하는 것과 관련된 문제와 플랫폼에서 컨테이너를 임의의 사용자 ID로 컨테이너를 실행할 때 발생할 수있는 문제에 대해 자세히 알고 싶으면

에서 일련의 블로그 게시물을 살펴보십시오.
+0

이 우수한 쓰기까지입니다, 감사합니다! –

+0

도움이 더 필요하면 https://groups.google.com/forum/#!forum/openshift에서 OpenShift 용 Google 그룹을 사용하는 것이 가장 좋습니다. –

관련 문제