前言

将题目部署至远程服务器可大大释放靶场比赛环境资源。让题目服务和靶场比赛环境独立增加了系统安全性,防止用户通过逃逸等方式对靶场比赛系统进行破坏。当然服务器开启docker远程访问时需要注意权限控制,通过加密的方式防止api被远程攻击,所以这里需要给docker远程端口添加tls加密证书,只比赛环境能和其通讯,为了安全起见你也可以将docker远程端口设置安全组规则只需要比赛环境IP访问。

一、准备服务器并安装docker环境

自行准备一台linux服务器并安装好docker环境,并开放2376安全组端口和防火墙规则。以下简称题目环境,

二、生成tls加密证书

执行下面脚本会生成服务端和客户端的证书

vim generate_tls.sh
chmod +x generate_tls.sh 
./generate_tls.sh 题目环境IP
#!/usr/bin/env bash
#
# 一键生成 TLS 自签 CA / 服务端证书 / 客户端证书
# 用法: ./generate_tls.sh <SERVER_IP_OR_FQDN>
# 例:  ./generate_tls.sh 21.109.xxx.xx

set -euo pipefail

[[ $# -eq 1 ]] || { echo "Usage: $0 <SERVER_IP_OR_FQDN>"; exit 1; }
SERVER_IP=$1
DAYS=36500               # 约 100 年,俗称“永久”
KEY_SIZE=2048
DIR="certs"
CA_KEY="${DIR}/ca-key.pem"
CA_CRT="${DIR}/ca.pem"
SRV_KEY="${DIR}/server-key.pem"
SRV_CSR="${DIR}/server.csr"
SRV_CRT="${DIR}/server.pem"
CLI_KEY="${DIR}/client-key.pem"
CLI_CSR="${DIR}/client.csr"
CLI_CRT="${DIR}/client.pem"

mkdir -p "$DIR"

# 1. 生成 CA
echo "==> 1. 生成自签 CA (${DAYS} 天有效期)"
openssl req -new -x509 -nodes -days "$DAYS" \
  -newkey rsa:"$KEY_SIZE" -keyout "$CA_KEY" -out "$CA_CRT" \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=LocalDev/CN=LocalCA" \
  2>/dev/null

# 2. 生成服务端私钥与 CSR
echo "==> 2. 生成服务端私钥 & CSR"
openssl req -new -nodes -newkey rsa:"$KEY_SIZE" \
  -keyout "$SRV_KEY" -out "$SRV_CSR" \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=LocalDev/CN=server" \
  2>/dev/null

# 3. 创建 SAN 扩展文件(包含 IP 与 localhost)
SAN_FILE="${DIR}/san.conf"
cat > "$SAN_FILE" <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions     = v3_req
prompt             = no

[req_distinguished_name]
CN = server

[v3_req]
basicConstraints = CA:FALSE
keyUsage         = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName   = @alt_names

[alt_names]
IP.1   = ${SERVER_IP}
DNS.1  = localhost
DNS.2  = ${SERVER_IP}
EOF

三、docker开启远程访问API并添加加密证书

编辑docker.service文件,注意此文件一般在/usr/lib/systemd/system/docker.service 目录下或者/etc/systemd/system/docker.service目录。将ExecStart字段替换以下内容,tlscert、tlskey、tlscacert为刚生成的证书信息。这里注意/opt/certs/server-cert.pem等证书的路径是否正确。

ExecStart=/usr/bin/dockerd --host=unix:///var/run/docker.sock \
           --host=tcp://0.0.0.0:2376 \
           --tlsverify \
           --tlscert=/opt/certs/server.pem \
           --tlskey=/opt/certs/server-key.pem \
           --tlscacert=/certs/ssl/ca.pem

重启docker.service和docker

# 1. 重新加载 systemd 配置
sudo systemctl daemon-reload

# 2. 重启 docker.service
sudo systemctl restart docker.service

# 3. 确认状态
sudo systemctl status docker.service

# 3. 重新docker
sudo systemctl restart docker

三、后台添加docker远程引擎

主机类型选择模式,地址为题目服务器IP、端口设置2376,域名按需配置如有需将IP解析到此域名。然后开启TLS,上传刚才生成的ca证书和客户端证书,然后启用此引擎。这样就可以将题目部署到远程服务器了。

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.secsnow.cn/wiki/subject/article/set-docker-api/

许可协议:署名-非商业性使用 4.0 国际许可协议