Docker의 보안 문제를 해결하는 방법은 무엇입니까?

1. Docker 컨테이너와 가상 머신의 세부적인 차이점

  • 격리 및 공유

    • ① Hypervisor 계층을 추가하여 가상 머신은 네트워크 카드, 메모리, CPU 등의 가상 하드웨어를 가상화 한 후 가상 머신을 구축하며 각 가상 머신에는 자체 시스템 커널이 있습니다.
    • ② Docker 컨테이너는 격리를 통해 파일 시스템, 프로세스, 장비, 네트워크 및 기타 리소스를 격리 한 다음 권한, CPU 리소스 등을 제어하여 컨테이너가 서로 영향을주지 않고 컨테이너가 호스트에 영향을 미치지 않도록합니다. 컨테이너는 커널, 파일 시스템, 하드웨어 및 기타 리소스를 호스트와 공유합니다.
  • 성능 및 손실

    • ① 가상 머신에 비해 컨테이너 자원 소모가 적습니다. 동일한 호스트 아래에는 가상 머신보다 더 많은 컨테이너를 만들 수 있습니다. 그러나 가상 머신의 보안은 컨테이너의 보안보다 약간 낫습니다.
    • ② 가상 머신을 호스트 나 다른 가상 머신으로 돌파하려면 먼저 하이퍼 바이저 계층을 돌파해야하는데, 이는 매우 어렵습니다. 도커 컨테이너는 커널 및 파일 시스템과 같은 리소스를 호스트와 공유하므로 다른 컨테이너 및 호스트에 영향을 미칠 가능성이 더 큽니다.

둘째, Docker의 보안 문제

2.1 Docker 고유의 취약성

  • 애플리케이션으로서 Docker 자체에는 구현에 코드 결함이 있습니다. CVE는 이전 버전의 Docker에 공식적으로 20 개 이상의 취약점을 기록합니다.
  • 해커가 일반적으로 사용하는 주요 공격 방법은 코드 실행, 권한 상승, 정보 유출 및 권한 우회입니다. 현재 Docker 버전은 매우 빠르게 변경되며 Docker 사용자는 Docker를 최신 버전으로 업그레이드하는 것이 가장 좋습니다.

2.2 Docker 소스 코드 문제

  • Docker는 사용자가 생성 된 이미지를 업로드하여 다른 사용자가 환경을 다운로드하고 빠르게 구축 할 수 있도록하는 Docker 허브를 제공합니다.
    그러나 또한 몇 가지 보안 문제가 발생합니다. 예를 들어, 다음 세 가지 방법 :
    • ① 해커가 악성 이미지를 업로드하고 생성 된 이미지에 트로이 목마, 백도어 등의 멀웨어를 삽입하면 처음부터 환경이 안전하지 않고 향후 보안이되지 않습니다.
    • ② 이미지는 취약한 소프트웨어를 사용하고 있으며, Docker Hub에서 다운로드 할 수있는 이미지 중 75 %가 취약한 소프트웨어가 설치되어 있습니다. 따라서 미러 이미지를 다운로드 한 후
      내부 소프트웨어의 버전 정보, 해당 버전에 취약점이 있는지 확인하고 적시에 업데이트 및 패치해야합니다.
    • ③ 미러 이미지를 변조하는 중간자 공격은 전송 중에 변조 될 수 있으며, 새 버전의 Docker는 이러한 문제를 방지하기 위해 해당 검증 메커니즘을 제공합니다.

3, Docker 아키텍처 결함 및 보안 메커니즘

  • Docker의 자체 아키텍처 및 메커니즘은 문제를 일으킬 수 있습니다. 예를 들어, 이러한 공격 시나리오에서 해커는 호스트의 일부 컨테이너를 제어하거나 공용 클라우드에 컨테이너를 구축 한 다음 호스트 또는 다른 컨테이너 공격.

    • ① 컨테이너 간 LAN 공격
      호스트 의 컨테이너 는 LAN을 형성 할 수 있으므로 ARP 스푸핑, 스니핑, 브로드 캐스트 스톰 및 기타 LAN 공격 방법을 사용할 수 있습니다. 따라서 호스트에 여러 컨테이너를 배포하려면 합리적인 네트워크 구성과 iptable 규칙이 필요합니다.

    • ②DDoS 공격은 자원을 소모합니다 .Cgroup의
      보안 메커니즘은 이러한 공격을 방지하는 것입니다. 이러한 문제를 피하기 위해 단일 컨테이너에 너무 많은 자원을 할당하지 마십시오.


    • ③ 취약한 시스템 호출 Docker와 가상 머신의 중요한 차이점은 Docker와 호스트가 동일한 운영 체제 커널을 공유한다는 것입니다. Docker가 일반 사용자를 사용하여 실행하지만 호스트 커널에 재정의 또는 상승 할 수있는 취약성이 있으면 컨테이너가 침입 할 때 공격자는 커널 취약성을 사용하여 호스트로 이동하여 더 많은 작업을 수행 할 수 있습니다.

    • ④ 루트 사용자 권한 공유 루트 사용자 권한
      으로 컨테이너를 실행하면 컨테이너의 루트 사용자도 호스트에 대한 루트 권한을 갖습니다.

네, Docker 보안 기준 표준

  • 즉, 나타나는 보안 문제에 대한 솔루션입니다
    . 다음은 커널, 호스트, 네트워크, 이미지, 컨테이너 등 6 가지 측면에서 Docker 보안 기준 표준을 요약 한 것입니다.

4.1 커널 수준

1)及时更新内核。 
(2)User NameSpace(容器内的 root 权限在容器之外处于非高权限状态)。 
(3)Cgroups(对资源的配额和度量)。 
(4)SELiux/AppArmor/GRSEC(控制文件访问权限)。 
(5)Capability(权限划分)。 
(6)Seccomp(限定系统调用)。 
(7)禁止将容器的命名空间与宿主机进程命名空间共享。

4.2 호스트 수준

1)为容器创建独立分区。 
(2)仅运行必要的服务。 
(3)禁止将宿主机上敏感目录映射到容器。 
(4)对 Docker 守护进程、相关文件和目录进行审计。 
(5)设置适当的默认文件描述符数。
(文件描述符:内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。
打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件) 
(6)用户权限为 root 的 Docker 相关文件的访问权限应该为 644 或者更低权限。 
(7)周期性检查每个主机的容器清单,并清理不必要的容器。

4.3 네트워크 수준

1)通过 iptables 设定规则实现禁止或允许容器之间网络流量。 
(2)允许 Docker 修改 iptables。 
(3)禁止将 Docker 绑定到其他 IP/Port 或者 Unix Socket。 
(4)禁止在容器上映射特权端口。 
(5)容器上只开放所需要的端口。 
(6)禁止在容器上使用主机网络模式。
(7)若宿主机有多个网卡,将容器进入流量绑定到特定的主机网卡上。

4.4 미러 레벨

1)创建本地镜像仓库服务器。 
(2)镜像中软件都为最新版本。 
(3)使用可信镜像文件,并通过安全通道下载。
(4)重新构建镜像而非对容器和镜像打补丁。 
(5)合理管理镜像标签,及时移除不再使用的镜像。 
(6)使用镜像扫描。 
(7)使用镜像签名。

4.5 컨테이너 레벨

1)容器最小化,操作系统镜像最小集。 
(2)容器以单一主进程的方式运行。 
(3)禁止 privileged 标记使用特权容器。 
(4)禁止在容器上运行 ssh 服务。 
(5)以只读的方式挂载容器的根目录系统。 
(6)明确定义属于容器的数据盘符。 
(7)通过设置 on-failure 限制容器尝试重启的次数,容器反复重启容易丢失数据。 
(8)限制在容器中可用的进程树,以防止 fork bomb。(fork炸弹,迅速增长子进程,耗尽系统进程数量)

4.6 기타 설정

1)定期对宿主机系统及容器进行安全审计。 
(2)使用最少资源和最低权限运行容器。 
(3)避免在同一宿主机上部署大量容器,维持在一个能够管理的数量。 
(4)监控 Docker 容器的使用,性能以及其他各项指标。 
(5)增加实时威胁检测和事件响应功能。 
(6)使用中心和远程日志收集服务

다섯, Docker 원격 호출 및 트래픽 제한

5.1 Docker 원격 API 액세스 제어

  • Docker의 원격 호출 API 인터페이스에는 무단 액세스 취약성이 있으며 최소한 외부 네트워크 액세스를 제한해야합니다. 액세스하려면 Socket을 사용하는 것이 좋습니다.

  • 인트라넷 IP를 모니터링하기위한 docker 데몬 시작 방법은 다음과 같습니다.

docker -d -H unix:///var/run/docker.sock -H tcp://192.168.140.22:2375
或者
vim /usr/lib/systemd/system/docker.service
  • 로컬 수신 주소 및 포트 열기
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.140.22:2375

systemctl daemon-reload

systemctl restart docker
  • 그런 다음 호스트의 방화벽에서 IP 접근 제어를 할 수 있습니다.
    참고 : 소스 주소는 클라이언트 주소입니다.
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.140.21" port protocol="tcp" port="2375" accept"

firewall-cmd --reload		//重新加载防火墙策略
  • 마지막으로 원격 호출은 클라이언트 작업에서 구현됩니다.
docker -H tcp://192.168.140.22 images	//在客户端查看服务端的docker镜像

5.2 트래픽 흐름 제한

  • 방화벽 필터를 사용하여 외부 세계와 통신 할 수 있도록 Docker 컨테이너의 소스 IP 주소 범위를 제한합니다.
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.140.0/24" reject"
  • Docker 컨테이너 포트의 외부 릴리스로 인한 취약점으로 인해 많은 문제가 발생하고 있으며, 운영 체제 계정 권한 제어 문제 외에도 Docker Daemon의 프로세스 관리에 숨겨진 위험이 있습니다.
    • 현재 일반적으로 사용되는 Docker 버전은 호스트 iptables를 관리하기 위해 Docker Daemon을 지원하며 프로세스가 시작되고 -p host_port : guest_port의 포트 매핑이 추가되면 Docker Daemon은 해당 FORWARD Chain 및 -j ACCEPT를 직접 증가시킵니다. 기본 DROP 규칙은 INPUT 체인이 Docker를 제한하지 않으므로 심각한 보안 위험을 남깁니다. 따라서 다음을 권장합니다.
1. 不在有外网ip的机器上使用Docker服务

2. 使用k8s等docker编排系统管理Docker容器

3. 宿主上Docker daemon启动命令加一个--iptables=false,然后把常用iptables写进文件里,再用iptables-restore去刷。

여섯, 컨테이너 최소화 및 이미지 보안

6.1 용기 최소화

  • 컨테이너에서 필요한 서비스 만 실행하면 SSH와 같은 서비스를 쉽게 열어 컨테이너에 연결할 수 없습니다.
    다음 방법은 일반적으로 컨테이너에 들어가는 데 사용됩니다.
docker exec -it 容器ID bash

6.2 이미지 보안

  • Docker 이미지 보안 스캔, 미러웨어 하우스 클라이언트에서 인증서 인증을 사용하여 다운로드 된 이미지를 확인합니다.
    CVE 데이터베이스와 동기식으로 미러를 스캔하면 사용자에게 취약점이 발견되면이를 처리하라는 알림을 받거나 미러가 계속 구축되지 않도록 직접 방지 할 수 있습니다.
  • 노트:
    • ① 회사가 자체 미러 소스를 사용하는 경우이 단계를 건너 뛸 수 있습니다.
      그렇지 않으면베이스 이미지의 md5 및 기타 특성 값 이상을 확인해야하며,베이스 이미지를 기반으로 추가 구축 전에 기본 이미지가 일관성이 있는지 확인해야합니다. .

    • ② 정상적인 상황에서는 신뢰할 수있는 라이브러리에서만 이미지를 가져와야하며 –insecure-registry = [] 매개 변수는 사용하지 않는 것이 좋으며
      항구 개인 창고를 사용하는 것이 좋습니다.

추천

출처blog.csdn.net/weixin_42449832/article/details/114915149