安全地远程调用Docker API

这篇具有很好参考价值的文章主要介绍了安全地远程调用Docker API。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

安全地远程调用Docker API

引言

你也许知道如何在一台安装了 docker 的机器上创建、停止、删除容器。但是如果发号施令的程序和 docker 不在同一台机器上该怎么办?

本文将介绍如何开启 docker api 远程调用、使用 http api 或者 java sdk 操作另一台机器上的 docker、以及如何确保 docker api 不被他人调用。

开启 docker api 远程调用(简单,不鉴权,快速体验)

默认 docker 只允许本机使用docker命令进行操作,我们现在来开启 http api 调用,使得其他机器可以通过 http 请求来操作 docker。

注意:这种方法不对调用者权限进行校验,也就是说互联网上任何一个人都可以控制你的 docker。我们这里为了快速体验临时使用这种方法,长期使用请务必使用 tls 来鉴权,具体方法下文会介绍。

vim /lib/systemd/system/docker.service 编辑 docker 启动命令,找到 service 模块下的 ExecStart=xxx 这一行,在其末尾添加`-H=tcp://0.0.0.0:2375

其中,0.0.0.0 意为允许任何来源的访问,docker 将会在 2375 端口监听 http 请求。(记得开放安全组或者防火墙)

重启 docker:

systemctl daemon-reload
sudo service docker restart

然后你就可以通过 http 请求远程操控 docker 了,例如通过curl http://ip:2375/images/json 来获取镜像列表。同样你也可以通过各种编程语言的 sdk 来发起请求,详见:https://docs.docker.com/engine/api/sdk/

接下来我们用 java sdk 举例

使用 java sdk 远程调用 docker api

我们使用 star 最多的 sdk:https://github.com/docker-java/docker-java

我的使用的 maven 依赖如下,其他版本可能会报错:

<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java</artifactId>
    <version>3.3.4</version>
</dependency>
<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java-transport-httpclient5</artifactId>
    <version>3.3.4</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.2.1</version>
</dependency>

假设我有一台安装了 docker 的 ubuntu 服务器,下面这段代码将初始化一个 dockerClient,然后通过远程调用获取 docker 的镜像列表。

DockerClientConfig config = DefaultDockerClientConfig
        .createDefaultConfigBuilder()
        .withDockerHost("tcp://服务端 ip 地址:2375")
        .withDockerTlsVerify(false)
        .build();
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
        .dockerHost(config.getDockerHost())
        .sslConfig(config.getSSLConfig())
        .maxConnections(100)
        .connectionTimeout(Duration.ofSeconds(30))
        .responseTimeout(Duration.ofSeconds(45))
        .build();
dockerClient = DockerClientImpl.getInstance(config, httpClient);
dockerClient.listImagesCmd().exec().forEach(System.out::println);

开启鉴权,防止 docker api 被他人调用

现在我们对 docker api 远程调用有了一个基本认识,接下来我们将使用 tls 自签证书为 docker api 开启鉴权,只有持有配对证书的客户端和服务端才可以通信,防止被他人调用。

服务端

找一个目录存放等下要生成的证书文件,本文以/root/docker/cert/ 为例。

进入这个目录,逐一运行以下命令:

# 这里要你设定一个密码,找个地方存下来,等下运行其他命令还要再输入这个密码
openssl genrsa -aes256 -out ca-key.pem 4096

# 这一步的问题可以不回答,一路回车即可
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

openssl genrsa -out server-key.pem 4096

# 把$HOST替换成运行着 docker 的服务器的 ip 或者域名
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

# 把$HOST替换成运行着 docker 的服务器的域名,把$IP替换成 ip。二者至少填一个,不填的就删掉,总之你最终要通过 ip 远程调用就填 ip,通过域名调用就填域名
echo subjectAltName = DNS:$HOST,IP:$IP >> extfile.cnf

echo extendedKeyUsage = serverAuth >> extfile.cnf

openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

openssl genrsa -out key.pem 4096

openssl req -subj '/CN=client' -new -key key.pem -out client.csr

echo extendedKeyUsage = clientAuth > extfile-client.cnf

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile-client.cnf

# 可选,删除以后没用的配置文件
rm -v client.csr server.csr extfile.cnf extfile-client.cnf

现在这个目录里应该会有一些 .pem 文件,其中,ca.pem, server-cert.pem, server-key.pem 是服务端要用的,ca.pem, cert.pem, key.pem 是客户端要用的。

vim /lib/systemd/system/docker.service 编辑 docker 启动命令,找到我们之前编辑过的 service 模块下的ExecStart=xxx 这一行,把之前的-H tcp://0.0.0.0:2375改成-H tcp://0.0.0.0:2376 ,(2376是 docker 在启用 https 情况下的惯用端口),然后再在后面追加--tlsverify --tlscacert=/path/to/ca.pem tlscert=/path/to/server-cert.pem --tlskey=/path/to/server-key.pem ,以指定启用 ssl 及其用到的证书文件路径(根据自己情况修改)

下面的代码示例指定了服务端所需要的证书文件,并监听 2376 端口接收远程调用,允许所有 ip 来源(但是客户端必须持有配对的证书)

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/root/docker/cert/ca.pem --tlscert=/root/docker/cert/server-cert.pem --tlskey=/root/docker/cert/server-key.pem

重启 docker:

systemctl daemon-reload
sudo service docker restart

客户端

我们从服务端把ca.pem, cert.pem, key.pem这三个文件拷贝到客户端的一个目录里放下,然后修改客户端的代码:

DockerClientConfig config = DefaultDockerClientConfig
        .createDefaultConfigBuilder()
        .withDockerHost("tcp://服务端 ip 地址:2376")
        .withDockerTlsVerify(true)
        .withDockerCertPath("你存放客户端证书的目录路径")
        .build();
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
        .dockerHost(config.getDockerHost())
        .sslConfig(config.getSSLConfig())
        .maxConnections(100)
        .connectionTimeout(Duration.ofSeconds(30))
        .responseTimeout(Duration.ofSeconds(45))
        .build();
dockerClient = DockerClientImpl.getInstance(config, httpClient);
dockerClient.listImagesCmd().exec().forEach(System.out::println);

如果你能够正常获取服务端的 docker 镜像列表,说明你成功地实现了安全远程调用 docker api

结论

本文介绍了如何开启 docker api 远程调用,并用 java sdk 控制远程 docker 服务器,以及如何通过自签 tls 证书来确保 docker api 不被他人调用

参考资料

https://docs.docker.com/engine/security/protect-access/#use-tls-https-to-protect-the-docker-daemon-socket

https://www.youtube.com/watch?v=cjm_NqteLLA&ab_channel=CodeWithRajRanjan文章来源地址https://www.toymoban.com/news/detail-841060.html

到了这里,关于安全地远程调用Docker API的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 Docker 和 Nginx 反向代理访问 ChatGPT API

    在许多应用程序中,我们需要从一个外部服务中获取数据。然而,由于种种原因(例如跨域问题、API 访问限制等),我们可能无法直接从客户端访问这些服务。这时,反向代理可以成为我们的救星。在这篇文章中,我们将介绍如何使用 Docker 和 Nginx 反向代理访问 OpenAI API 接口

    2023年04月09日
    浏览(32)
  • Docker 开启远程安全访问

    如果你的服务器是公网IP,并且开放了docker的远程访问,如果没有进行保护是非常危险的,任何人都可以向你的docker中推送镜像、运行实例。我曾开放过阿里云服务器中docker的远程访问权限,在没有开启保护的状态下,几小时内就被植入了挖矿程序,导致CPU的占用率一直在1

    2024年04月28日
    浏览(35)
  • 云安全攻防(八)之 Docker Remote API 未授权访问逃逸

    Docker Remote API 是一个取代远程命令行界面(rcli)的REST API,其默认绑定2375端口,如管理员对其配置不当可导致未授权访问漏洞。攻击者利用 docker client 或者 http 直接请求就可以访问这个 API,可导致敏感信息泄露,甚至可进一步利用Docker自身特性,借助容器逃逸,最终完全控

    2024年02月13日
    浏览(33)
  • 【docker系列】docker API管理接口增加CA安全认证

    前文中我们曾经介绍过《使用IDEA远程工具》连接Docker REST API,我们会发现一个问题,任何知道Docker 服务器IP、端口的第三方都可以访问这个API,非常的不安全。为了保证Docker API的安全性,我们有必要使用数字证书进行安全验证。 为docker服务端配置服务端证书,用于验证客户

    2024年02月06日
    浏览(28)
  • Docker安全开放远程访问连接权限

    Docker服务完全开放对外访问权限操作如下: 出现如下信息则代表修改Docker服务设置远程访问成功。 特别注意的点: 完全开放Docker对外访问权限有可能会遭到别人攻击,这是很不安全的,只要别人知道你的服务器地址就能够随意连接你的Docker服务,而不需要任何认证,因此,

    2024年02月12日
    浏览(37)
  • Docker开启并配置远程安全访问

    在工作学习中,为了提高项目部署效率,一般会在Idea中直接使用Docker插件连接服务器Docker容器,然后将项目打包与DockerFile一起build成Docker镜像部署运行。但是不可能服务器总是跟着主机的,因此呢时常会面临的一个问题就是从A端访问B端服务器上的Docker从而引发的Docker的远程

    2024年02月09日
    浏览(31)
  • Docker版 E5续订的E5调用API续订服务:Microsoft 365 E5 Renew X

    本文是基于作者SundayRX提出的E5 调用API续订服务:Microsoft 365 E5 Renew X的基础上提出的Docker版本的E5调用API续订服务。 基础的账号注册等过程见SundayRX的博客:账号注册 更新日志:具体看github链接 【20240115更新】内测:更新了通用版本。支持了多种CPU架构,包括linux/amd64,linux/a

    2024年02月08日
    浏览(35)
  • Linux开启Docker远程访问并设置安全访问(证书密钥),附一份小白一键设置脚本哦!

    前言 喜欢折腾慢慢看,不喜欢折腾直接跳到小简下文的一键脚本那里,两分钟搞好。 我的博客:https://blog.ideaopen.cn 我的公众号:小简聊开发 开启远程访问 编辑 docker.service 文件 找到 Service 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375 这样相当于对外开放的是 2375 端口,

    2024年02月02日
    浏览(37)
  • Linux Docker图形化工具Portainer如何进行远程访问

    Portainer 是一个轻量级的容器管理工具,可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可视化的界面,使得用户可以更加方便地管理 Docker 容器、镜像、网络和数据卷等资源。下面介绍如何将本地Portainer 管理界面结合cpolar内网穿透工具实现远程任意浏览器访问! 远程

    2024年02月08日
    浏览(40)
  • Linux Docker图形化工具Portainer如何进行远程访问?

    Portainer 是一个轻量级的容器管理工具,可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可视化的界面,使得用户可以更加方便地管理 Docker 容器、镜像、网络和数据卷等资源。下面介绍如何将本地Portainer 管理界面结合cpolar内网穿透工具实现远程任意浏览器访问! 远程

    2024年02月05日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包