zoukankan      html  css  js  c++  java
  • docker 2375 vulnerability and self-signatuer certifications

    Docker暴露2375端口,引起安全漏洞

    今天有小伙伴发现Docker暴露出2375端口,引起了安全漏洞。我现在给大家介绍整个事情的来龙去脉,并告诉小伙伴们,怎么修复这个漏洞。

    为了实现集群管理,Docker提供了远程管理接口。Docker Daemon作为守护进程,运行在后台,可以执行发送到管理接口上的Docker命令。正是因为错误的使用了Docker远端接口,引起安全漏洞。

    Docker暴露2375端口,引起安全漏洞

    启动Docker Daemon时,加入-H 0.0.0.0:2375,Docker Daemon就可以接收远端的Docker Client发送的指令。注意,Docker是把2375端口作为非加密端口暴露出来,一般是用在测试环境中。此时,没有任何加密和认证过程,只要知道Docker主机的IP,任何人都可以管理这台主机上的容器和镜像。

    漏洞是什么

    国内牛人开发了一套牛逼的搜索引擎-钟馗之眼,可以扫描出主机上的暴露的端口。在ZoomEye.org上输入关键字docker port:2375,立即可以扫描出所有暴露了2375端口的Docker主机。因为没有加密,知道了主机IP以后,黑客就可以为所欲为了。 目前全球有717台机器暴露出2375端口!真是太可怕了!

    Docker暴露2375端口,引起安全漏洞

    这些主机分布在全球各个国家,其中,美国的主机最多。这是因为Docker是美国的使用率最高,国内也会在一两年内大规模使用Docker。所有小伙伴们必须解决安全问题。

    Docker暴露2375端口,引起安全漏洞

    黑客在查询到主机IP以后,就可以管理这些主机上的容器了。

    docker -H IP:2375 infoContainers: 8 Running: 8 Paused: 0 Stopped: 0 Images: 62 Server Version: 1.11.0 

    通过这个漏洞,甚至可以获取主机信息。攻击者简直就能为所欲为。

    docker -H IP:2375 run --rm -v /:/root alpine cat /root/etc/hostnamedocker-node-5 

    如何发现漏洞

    小伙伴们,赶快检查一下你的Docker是否暴露了2375端口。

    1.检查docker daemon进程,查看是否开启2375端口。

    ps -ef | grep docker/usr/bin/docker daemon -H=tcp://0.0.0.0:2375 

    2.通过远程管理的方式,向Docker主机发送命令。

    docker -H 192.168.0.10:2375 infoContainers: 41 Running: 16 Paused: 0 Stopped: 25 Images: 821 Server Version: 1.10.3

    如何修复该漏洞

    如果要安全的管理远程Docker主机,应该怎么做呢?其实,Docker本身提供了加密的远程管理端口2376,配合CA证书,就能提供TLS连接了。

    首先要准备5个证书和秘钥文件,分别是ca.pem、server-cert.pem、server-key.pem、client-cert.pem和client-key.pem。其中,server-cert.pem中限制了能够访问Docker主机的客户端列表。

    启动Docker Deamon时,需要设置-H、–tls、–tlscacert=ca.pem、–tlscert=server-cert.pem和–tlskey=server-key.pem。此时,只有客户端列表中的主机能够访问Docker主机。

    具体配置比较复杂,我现在为大家详细介绍这些步骤。

    1.生成CA私钥ca-key.pem,使用该私钥对CA证书签名。

    ca-key.pem是一个临时文件,最后可以删除。

    openssl genrsa -out ~/docker/ca-key.pem 4096

    2.使用CA私钥生成自签名CA证书ca.pem。生成证书时,通过-days 365设置证书的有效期。单位为天,默认情况下为30天。

    openssl
     req -x509 -sha256 -batch -subj '/C=CN/ST=Sichuan/L=Chengdu/O=Ghostcloud
     Co.,Ltd/OU=Laboratory/CN=www.ghostcloud.cn' -new -days 365 -key 
    ~/docker/ca-key.pem -out ~/docker/ca.pem

    生成CA证书时,需要提供一些公司信息。

    C表示国家,中国为CN。

    ST表示省,比如Sichuan。

    L表示城市,比如Chengdu。

    O表示公司,比如Ghostcloud Co.,Ltd。

    OU表示部门名字,比如Laboratory。

    CN表示公司域名,比如www.ghostcloud.cn。

    3.生成服务器私钥server-key.pem和CSR(Certificate Signing Request)server-csr.pem。CN为DockerDaemon。

    server-csr.pem是一个临时文件,生成server-cert.pem以后,可以删除。

    openssl
     genrsa -out ~/docker/server-key.pem 4096openssl req -subj 
    '/CN=DockerDaemon' -sha256 -new -key ~/docker/server-key.pem -out 
    ~/docker/server-csr.pem

    4.使用CA证书生成服务器证书server-cert.pem。TLS连接时,需要限制客户端的IP列表或者域名列表。只有在列表中的客户端才能通过客户端证书访问Docker Daemon。在本例中,只允许127.0.0.1和192.168.1.100的客户端访问。如果添加0.0.0.0,则所有客户端都可以通过证书访问Docker Daemon。

    allow.list是一个临时文件,生成server-cert.pem以后,可以删除。

    echo
     subjectAltName = IP:127.0.0.1,IP:192.168.1.100 > 
    ~/docker/allow.listopenssl x509 -req -days 365 -sha256 -in 
    ~/docker/server-csr.pem -CA ~/docker/ca.pem -CAkey ~/docker/ca-key.pem 
    -CAcreateserial -out ~/docker/server-cert.pem -extfile 
    ~/docker/allow.list

    5.生成客户端私钥client-key.pem和CSRclient-csr.pem。CN为DockerClient。

    client-csr.pem是一个临时文件,生成client-cert.pem以后,可以删除。

    openssl
     genrsa -out ~/docker/client-key.pem 4096openssl req -subj 
    '/CN=DockerClient' -new -key ~/docker/client-key.pem -out 
    ~/docker/client-csr.pem

    6.使用CA证书生成客户端证书client-cert.pem。需要加入extendedKeyUsage选项。

    echo
     extendedKeyUsage = clientAuth > ~/docker/options.listopenssl x509 
    -req -days 365 -sha256 -in ~/docker/client-csr.pem -CA ~/docker/ca.pem 
    -CAkey ~/docker/ca-key.pem -CAcreateserial -out ~/docker/client-cert.pem
     -extfile ~/docker/options.list

    7.成功生成了需要的证书和秘钥,可以删除临时文件。

    rm -f ~/docker/server-csr.pem ~/docker/client-csr.pem ~/docker/allow.list ~/docker/options.list

    8.为了保证证书和私钥的安全,需要修改文件的访问权限。

    chmod
     0444 ~/docker/ca.pem ~/docker/server-cert.pem 
    ~/docker/client-cert.pemchmod 0400 ~/docker/ca-key.pem 
    ~/docker/server-key.pem ~/docker/client-key.pem

    9.重启Docker Daemon,加入ca.pem、server-cert.pem和server-key.pem。-H=0.0.0.0:2376表示Docker Daemon监听在2376端口。

    docker
     daemon --tlsverify --tlscacert=~/docker/ca.pem 
    --tlscert=~/docker/server-cert.pem --tlskey=~/docker/server-key.pem 
    -H=0.0.0.0:2376

    10.在客户端,运行docker命令时,加入ca.pem、client-cert.pem和client-key.pem。本例中,只有127.0.0.1和192.168.1.100的客户端可以访问Docker Daemon。

    docker
     --tlsverify --tlscacert=~/docker/ca.pem 
    --tlscert=~/docker/client-cert.pem --tlskey=~/docker/client-key.pem 
    -H=tcp://127.0.0.1:2376 infoContainers: 41 Running: 16 Paused: 0 
    Stopped: 25 Images: 821 Server Version: 1.10.3 

    现在小伙伴们就可以安全的远程控制Docker主机了。


  • 相关阅读:
    Building a Space Station POJ
    Networking POJ
    POJ 1251 Jungle Roads
    CodeForces
    CodeForces
    kuangbin专题 专题一 简单搜索 POJ 1426 Find The Multiple
    The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool
    The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold'em Poker
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
    robotparser (File Formats) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/SZLLQ2000/p/8175608.html
Copyright © 2011-2022 走看看