Docker 컨테이너 보호 팁 7개


소개하다.

In this article, I'm going to share 7 tips that I've included while developing a docker based spring boot micro-services application.


선결 조건:
볼륨, Docker compose, linux 명령을 포함한 Docker의 기초 지식을 먼저 알아야 합니다.
대상:
본고의 주요 목표는 용기를 튼튼하게 하여 어떠한 유형의 공격이나 빈틈도 피하는 것이다.

카탈로그

1. Running container as non-root user

2. Encrypting the secret information

3. Verifying base image source and the tag

4. Use volumes in appropriate mode like read-only mode etc.

5. Container capabilities should be only what needed or limited

6. Container shouldn’t be running in privileged mode

7. Defining resource consumption

1. 비루트 사용자로 컨테이너 실행
컨테이너에서 실행되는 프로세스는 리눅스에서 실행되는 다른 프로세스와 다를 것이 없습니다. 단지 컨테이너에 있는 작은 메타데이터가 있을 뿐입니다.용기는 신뢰 경계가 아니기 때문에 용기에서 실행되는 모든 내용은 호스트 자체에서 실행되는 모든 내용과 똑같이 고려해야 한다.서버에서 루트로 아무것도 실행하지 않거나 실행하지 말아야 하는 것처럼, 서버의 용기에서 루트로 아무것도 실행하지 말아야 합니다.
비 루트 사용자가 변경하기 전의 Dockerfile
FROM openjdk:8u121-jre-alpine
COPY target/springboot-app-0.0.1-SNAPSHOT.jar springboot-app-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/springboot-app-0.0.1-SNAPSHOT.jar"]
우리는 다음과 같은 변경을 했다
Dockerfile
FROM openjdk:8u121-jre-alpine
#adding a non-root user and group to the container’s system
RUN addgroup -g 2000 -S appuser && adduser -u 2000 -S appuser -G appuser -h /home/appuser
#setting our root directory because we cannot put contents on root now 
WORKDIR /home/appuser
#copying executable jar there from target folder
COPY target/springboot-app-0.0.1-SNAPSHOT.jar springboot-app-0.0.1-SNAPSHOT.jar
#changing owner and permissions of that jar
RUN chown appuser:appuser springboot-app-0.0.1-SNAPSHOT.jar && chmod 700 springboot-app-0.0.1-SNAPSHOT.jar
#specifying newly created user
USER appuser
#EXPOSE instruction is a way of documenting which ports are used, but does not actually map or open any ports. Exposing ports is optional.
EXPOSE 8080
#finally to execute the jar the ENTRYPOINT instruction is used
ENTRYPOINT ["java","-jar","springboot-app-0.0.1-SNAPSHOT.jar"]
주의: linux에서는 1024 이하의 포트는 루트 사용자만 열 수 있기 때문에 기본적으로 포트 80은 제한됩니다.( reference1 , reference2 )

2. 기밀 정보 암호화
docker 기밀은 docker Swarm에만 사용할 수 있기 때문에 암호화된 민감한 정보를 볼륨에 저장하고 응용 프로그램 단계에서 복호화합니다.
하지만 Docker Swarm을 사용하면 참고할 수 있습니다this article

3. 기본 이미지 소스 및 레이블 확인
최신 태그를 사용하지 않은 신뢰 원본을 검증하고 검사합니다. docker history 명령을 사용하여 받침대나 그림에서 발생하는 상황을 검사할 수 있습니다.
$ docker history openjdk:8u121-jre-alpine --no-trunc

4.읽기 전용 모드와 같은 적절한 모드에서 볼륨을 사용합니다.
이를 실현하는 과정에서 docker 용기에 불러오는 디렉터리 권한은 호스트의 권한으로 반영됩니다.따라서, 우리의 예에서 루트가 아닌 사용자 appuser를 할당했습니다. 불러온 파일 시스템은 용기에 접근할 수 없습니다. 이 문제를 극복하기 위해서는 용기에 불러온 디렉터리에 접근할 수 있는 다른 사용자로부터 권한을 적용해야 합니다.
읽기 및 쓰기 액세스를 허용하려면 다음과 같이 하십시오.
$chmod -R 777 test_vol_dir
읽기 전용 액세스를 허용하려면 다음과 같이 하십시오.
$chmod -R 755 test_vol_dir
필요에 따라 마운트된 볼륨의 권한을 조정할 수도 있습니다.
그래서 이것은 가장 기본적이고 가장 중요한 단계입니다. docker조차 마운트 디렉터리에 대한 읽기 전용 접근 지원을 제공하고, 볼륨 설명에dd:ro 로고를 사용합니다.( reference )
윈도우즈에서 인라인 볼륨을 실행하려면 다음과 같이 하십시오.
docker container run -it --mount type=bind,src=D:/Tests/test_services/test_vol_dir,target=/home/appuser/apps -p 8998:8998 config:v1
linux에서 마운트 파일을 실행하려면 다음과 같이 하십시오.
docker container run -it --mount type=bind,src=/home/swadmin/test_vol_dir,target=/home/appuser/apps -p 8998:8998 config:v1
작성 파일에 동일한 컨텐트를 정의하려면 볼륨 설명을 사용합니다.( reference )

5. 용기 능력은 필요로 하거나 유한해야 한다
능력은 독립적으로 사용하거나 사용하지 않을 수 있는 독특한 특권 단원이다.
Docker 컨테이너에서 사용 가능한 권한이 있는 프로세스의 기본 기능 목록:
chown, dac_override, fowner, fsetid, kill, setgid, setuid, setpcap, net_bind_service, net_raw, sys_chroot, mknod, audit_write, setfcap
( reference )
용기는 최소한의 기능을 사용해서 지정해야 합니다. 기능을 추가하거나 삭제하려면compose 파일에서 다음 명령을 사용하십시오.
서비스:
  config-service: 
    cap_drop:
      - ALL
    cap_add:
      - SETGID
      - SETUID
alpine에서 실행되는 컨테이너의 기능을 확인하려면:
$apk update
$apk add libcap
$capsh --print

6. 용기는 특권 모드에서 실행되어서는 안 된다.
특권 용기를 가지는 것은 어떤 조직에도 안전 위험이다.그것은 악성 사용자가 호스트 시스템을 제어할 수 있는 기회를 만들었다.
컨테이너 루트 사용자가 시스템의 모든 내용에 접근할 수 있도록 허용함으로써 네트워크 공격에 기회의 창을 열었다.네트워크 공격자는 용기에서 호스트로 연결할 수 있으며 이미 구축된 인프라 시설과 배치를 위태롭게 할 수 있다.
요컨대, 특권 모드에서 운행하는 것은 용기에 모든 기능을 제공했다.( reference )
특권 모드에서 컨테이너를 실행하려면 -- privileged 옵션을 추가합니다.
$docker container run -it --privileged alpine
추가 발굴을 위해 --privileged 옵션을 사용하여 alpine에서 실행되는 컨테이너의 기능을 확인할 수 있습니다.
처음으로 alpine 용기를 실행하고libcap을 alpine에 추가합니다
$apk update
$apk add libcap
기능 확인
$capsh --print
같은 스냅숏을 한 장 찍다
$docker commit <container-id> alpine-cap:latest
지금
$docker container run --rm -it --cap-drop all alpine-cap
마지막으로 모든 내용을 삭제한 후 기능을 검사합니다
$capsh --print
자세히 보기: The most dangerous capability: SYS_ADMIN

7. 자원 소모 정의
일단 응용 프로그램의 자원 수요에 대해 합리적인 기대가 생기면 응용 프로그램이 이 자원만 사용하는 것을 제한해야 한다.이것은 기능 결함, 보안 빈틈, 오류 모델링 알고리즘으로 인한 통제불능 자원 소모의 영향을 제어하는 데 도움을 줄 것입니다.이러한 제한은 호스트에서 실행되는 다른 애플리케이션과 시스템 작업에 대한 자원을 보존할 수 있습니다.
파일 구성 작성reference
services:
  config-service: 
    cap_drop:
      - ALL
    #cap_add:
     # - SETGID
      #- SETUID
    deploy: 
      resources:
        limits:
          cpus: '0.50'
          memory: 300M
        reservations:
          cpus: '0.25'
          memory: 200M

좋은 웹페이지 즐겨찾기