# 컨테이너 보안

### 컨테이너 런타임&#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
    }
    ```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://container.youngwjung.com/undefined.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
