# 컨테이너 보안

### 컨테이너 런타임&#x20;

1. CIS Docker Benchmark 리뷰 - <https://www.cisecurity.org/benchmark/docker>
2. 리소스 정리&#x20;

   ```
   {
       docker container rm $(docker container ls -aq) --force
       docker volume prune --force
       docker image prune --all --force
   }
   ```
3. Docker Bench for Security 다운로드&#x20;

   ```
   {
       cd ~/environment
       git clone https://github.com/docker/docker-bench-security.git
       cd docker-bench-security
   }
   ```
4. Docker Bench for Security 실행&#x20;

   ```
   sudo sh docker-bench-security.sh
   ```
5. 컨테이너 실행&#x20;

   ```
   docker run --name nginx -d nginx
   ```
6. Docker Bench for Security 실행&#x20;

   ```
   sudo sh docker-bench-security.sh
   ```
7. 해결 방안 출력&#x20;

   ```
   sudo sh docker-bench-security.sh -p
   ```
8. 리소스 정리&#x20;

   ```
   {
       docker container rm $(docker container ls -aq) --force
       docker volume prune --force
       docker image prune --all --force
       cd ~/environment
       sudo rm -rf docker-bench-security
   }
   ```

### 컨테이너 이미지

1. 해당 [컨테이너 이미지](https://hub.docker.com/r/youngwjung/nginx/tags)에 대한 보안 취약점에 대한 정보를 Docker Hub에서 확인&#x20;
2. Trivy 설치&#x20;

   ```
   curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin v0.18.3
   ```
3. Trivy 설치 확인&#x20;

   ```
   trivy --version
   ```
4. 컨테이너 이미지 스캔

   ```
   trivy image youngwjung/nginx
   ```
5. 스캔 결과를 간소화

   ```
   trivy image --light=true youngwjung/nginx
   ```
6. 심각도가 높은 취약점만 출력

   ```
   trivy image --light=true --severity="HIGH,CRITICAL" youngwjung/nginx
   ```
7. 새로운 컨테이너 이미지 빌드

   ```
   cat <<EOF | docker image build -t nginx:updated -
   FROM youngwjung/nginx
   RUN apt update && apt upgrade -y
   EOF
   ```
8. 새로 생성한 컨테이너 이미지 스캔

   ```
   trivy image --light=true --severity="HIGH,CRITICAL" nginx:updated
   ```
9. 리소스 정리&#x20;

   ```
   docker image prune --all --force
   ```

### 권한 최소화&#x20;

1. 컨테이너 생성&#x20;

   ```
   docker container run --name nginx -d nginx 
   ```
2. NGINX 컨테이너에서 실행중인 프로세스 목록 확인

   ```
   docker container top nginx
   ```
3. 컨테이너 이미지 상세 내용 확인&#x20;

   ```
   docker image history nginx --format '{{.CreatedBy}}' --no-trunc
   ```
4. NGINX 컨테이너 재생성하고 nginx 유저로 프로세스 실행

   ```
   {
       docker container rm nginx --force
       docker container run --name nginx -d -u nginx nginx
   }
   ```
5. 컨테이너 로그 확인&#x20;

   ```
   docker container logs nginx
   ```
6. 새로운 컨테이너 이미지 빌드

   ```
   cat <<EOF | docker image build -t nginx:unprivileged -
   FROM nginx
   RUN chown -R nginx:nginx /var/cache/nginx && \
       chown -R nginx:nginx /var/log/nginx && \
       chown -R nginx:nginx /etc/nginx/conf.d
   RUN touch /var/run/nginx.pid && \
       chown -R nginx:nginx /var/run/nginx.pid
   USER nginx
   EOF
   ```
7. NGINX 컨테이너 재생성

   ```
   {
       docker container rm nginx --force
       docker container run --name nginx -d nginx:unprivileged
   }
   ```
8. NGINX 컨테이너에서 실행중인 프로세스 목록 확인

   ```
   docker container top nginx
   ```
9. 리소스 정리&#x20;

   ```
   {
       docker container rm $(docker container ls -aq) --force
       docker image prune --all --force
   }
   ```

### OPA

1. 컨테이너 생성

   ```
   docker container run --name nginx -d nginx
   ```
2. Docker 데몬 로그 확인&#x20;

   ```
   journalctl -u docker -n 3 --no-pager
   ```
3. Docker 데몬 로그 레벨 변경&#x20;

   ```
   cat <<EOF | sudo tee /etc/docker/daemon.json
   {
       "debug": true
   }
   EOF
   ```
4. Docker 데몬 재기동&#x20;

   ```
   {
       sudo systemctl daemon-reload
       sudo systemctl restart docker
   }
   ```
5. 컨테이너 재생성&#x20;

   ```
   {
       docker container rm nginx --force
       docker container run --name nginx -d nginx
   }
   ```
6. Docker 데몬 로그 확인&#x20;

   ```
   journalctl -u docker -n 100 --no-pager
   ```
7. 컨테이너 삭제&#x20;

   ```
   docker container rm nginx --force
   ```
8. Docker API 문서 확인 - <https://docs.docker.com/engine/api/v1.43/#tag/Container/operation/ContainerCreate>
9. OPA 정책 파일을 저장할 디렉토리 생성

   ```
   sudo mkdir -p /etc/docker/opa-policy
   ```
10. OPA 정책 파일 생성

    ```
    cat <<EOF | sudo tee /etc/docker/opa-policy/authz.rego
    package docker.authz

    default allow = false

    allow {
        not deny
    }

    deny {
        imagename := input.Body.Image
        not startswith(imagename, "youngwjung/")
        input.Method = "POST"
        contains(input.Path, "containers/create")
    }
    EOF
    ```
11. opa-docker-authz 플러그인 설치&#x20;

    ```
    docker plugin install openpolicyagent/opa-docker-authz-v2:0.8 opa-args="-policy-file /opa/opa-policy/authz.rego"
    ```
12. 설치된 플러그인 목록 확인&#x20;

    ```
    docker plugin ls
    ```
13. Docker 데몬 설정 파일 생성&#x20;

    <pre><code><strong>cat &#x3C;&#x3C;EOF | sudo tee /etc/docker/daemon.json
    </strong>{
        "authorization-plugins": ["openpolicyagent/opa-docker-authz-v2:0.8"]
    }
    EOF
    </code></pre>
14. Docker 데몬 재기동&#x20;

    ```
    {
        sudo systemctl daemon-reload
        sudo systemctl restart docker
    }
    ```
15. 컨테이너 생성 시도

    ```
    docker container run --name nginx -d nginx
    ```
16. Docker 데몬 로그 확인&#x20;

    ```
    journalctl -u docker -n 10 --no-pager | grep containers/create
    ```
17. OPA 플레이 그라운드에서 정책 검증 - <https://play.openpolicyagent.org/>
18. 컨테이너 생성 시도

    ```
    docker container run --name nginx -d youngwjung/nginx
    ```
19. 컨테이너 생성 확인&#x20;

    ```
    docker container ls
    ```
20. Docker 데몬 로그 확인&#x20;

    ```
    journalctl -u docker -n 10 --no-pager | grep containers/create
    ```
21. OPA 플레이 그라운드에서 정책 검증 - <https://play.openpolicyagent.org/>
22. 리소스 정리&#x20;

    ```
    {
        docker container rm $(docker container ls -aq) --force
        docker image prune --all --force
        docker plugin disable openpolicyagent/opa-docker-authz-v2:0.8 
        docker plugin rm openpolicyagent/opa-docker-authz-v2:0.8
        sudo rm /etc/docker/daemon.json
        sudo rm -rf /etc/docker/opa-policy
        sudo systemctl daemon-reload
        sudo systemctl restart docker
    }
    ```
