有些程序会直接操作宿主机的 /var/run/docker.sock,这相当于拿到了宿主机的 root 权限。这个项目提供一个“原样转发”的 Unix Socket 代理:
- 监听:
/var/run/docker.sock.protected - 转发到:
/var/run/docker.sock - 记录审计日志:连接来源(Linux 下可拿到 peer pid/uid/gid)、请求第一行(Docker API 的 HTTP request line)、连接时长、上下行字节数
注意:它只做审计,不做鉴权/拦截;拿到 docker.sock.protected 的程序仍然可以做任何 Docker API 操作。
docker build -t dockersock-audit-proxy:latest .最简单的做法是把宿主机的 /var/run 整个 bind mount 进容器,这样容器既能访问 docker.sock,也能在同目录创建 docker.sock.protected:
docker run --rm -d \
--name dockersock-audit-proxy \
-v /var/run:/var/run \
dockersock-audit-proxy:latest运行后,宿主机上会出现新的 socket:
/var/run/docker.sock.protected
你可以让需要“受保护 socket”的程序改用它,例如:
docker -H unix:///var/run/docker.sock.protected ps或者:
export DOCKER_HOST=unix:///var/run/docker.sock.protected
docker ps查看审计日志:
docker logs -f dockersock-audit-proxyservices:
dockersock-audit-proxy:
build: .
container_name: dockersock-audit-proxy
volumes:
- /var/run:/var/run
restart: unless-stopped支持参数或环境变量(环境变量优先级更高):
LISTEN_PATH/-listen:默认/var/run/docker.sock.protectedUPSTREAM_PATH/-upstream:默认/var/run/docker.sockSOCKET_MODE/-socket-mode:默认0660LOG_JSON/-log-json:默认falseLOG_REQUEST/-log-request:默认true,打印完整 HTTP 请求(按连接捕获;可能被截断)LOG_REQUEST_MAX_BYTES/-log-request-max-bytes:默认1048576(1MiB),0表示不限制(注意内存/日志体积)LOG_REQUEST_ENCODING/-log-request-encoding:默认text,可选text|base64LOG_RESPONSE/-log-response:默认true,打印完整 HTTP 响应(按连接捕获;可能被截断;流式响应可能很大)LOG_RESPONSE_MAX_BYTES/-log-response-max-bytes:默认1048576(1MiB),0表示不限制(注意内存/日志体积)LOG_RESPONSE_ENCODING/-log-response-encoding:默认text,可选text|base64MAX_SNIFF_BYTES/-max-sniff-bytes:默认8192DIAL_TIMEOUT/-dial-timeout:默认5s
例如输出 JSON 日志:
docker run --rm -d \
--name dockersock-audit-proxy \
-e LOG_JSON=1 \
-v /var/run:/var/run \
dockersock-audit-proxy:latest打印完整请求/响应可能包含敏感信息(例如 build 参数、环境变量、registry 凭据、日志输出等)。如果你担心泄露,建议:
-e LOG_REQUEST_ENCODING=base64(避免控制字符/二进制污染日志)-e LOG_RESPONSE_ENCODING=base64(避免控制字符/二进制污染日志)- 降低
LOG_REQUEST_MAX_BYTES或关闭LOG_REQUEST - 降低
LOG_RESPONSE_MAX_BYTES或关闭LOG_RESPONSE