You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何安全地通过SSH套接字在Docker容器中使用主机SSH密钥

安全在Docker容器中使用主机SSH密钥拉取私有仓库的方案

问题背景

需要在Docker容器内使用主机的SSH密钥拉取私有代码仓库,但拒绝以下不安全操作:

  • 构建镜像时复制SSH密钥
  • 容器内使用root用户
  • 设置与主机匹配的UID和GID
  • 使用sudo进行SSH套接字转发

尝试通过SSH套接字转发实现,但遇到连接拒绝错误。

操作步骤

  1. 启动容器命令:
docker run -it --rm -v $(dirname $SSH_AUTH_SOCK):/home/slomka/ssh-agent/ -e SSH_AUTH_SOCK=/home/slomka/ssh-agent/$(basename $SSH_AUTH_SOCK) -v ~/.ssh/:/home/slomka/.ssh example-container
  1. 容器内执行socat命令:
socat -dddd UNIX-LISTEN:/home/slomka/.ssh/socket,fork,user=slomka,group=build,mode=777 \
UNIX-CONNECT:/home/slomka/ssh-agent/
  1. 设置环境变量:
export SSH_AUTH_SOCK=/home/slomka/.ssh/socket

注:已尝试将/ssh-agent目录及其内容的所有者和组设置为容器内使用的用户和组

错误日志

2023/09/21 09:26:31 socat[196] I close(5)
2023/09/21 09:26:31 socat[196] N opening connection to AF=1 "/home/slomka/ssh-agent/"
2023/09/21 09:26:31 socat[196] I socket(1, 1, 0) -> 5
2023/09/21 09:26:31 socat[196] E connect(5, AF=1 "/home/slomka/ssh-agent/", 25): Connection refused
2023/09/21 09:26:31 socat[196] N exit(1)
2023/09/21 09:26:31 socat[196] I shutdown(6, 2)
2023/09/21 09:26:31 socat[196] I shutdown(5, 2)
2023/09/21 09:26:31 socat[165] N childdied(): handling signal 17
2023/09/21 09:26:31 socat[165] I childdied(signum=17)
2023/09/21 09:26:31 socat[165] I childdied(17): cannot identify child 196
2023/09/21 09:26:31 socat[165] I waitpid(): child 196 exited with status 1
2023/09/21 09:26:31 socat[165] I waitpid(-1, {}, WNOHANG): No child processes
2023/09/21 09:26:31 socat[165] I childdied() finished

解决方案

核心问题定位

你的socat命令存在路径错误:挂载主机SSH_AUTH_SOCK的目录到容器后,你尝试连接的是容器内的/home/slomka/ssh-agent/目录,而非该目录下具体的套接字文件,导致连接被拒绝。

修正方案

方案1:直接挂载SSH套接字(推荐)

无需使用socat转发,直接将主机的SSH_AUTH_SOCK完整路径挂载到容器,确保容器内用户能访问该套接字:

docker run -it --rm -v $SSH_AUTH_SOCK:/home/slomka/ssh-agent.sock -e SSH_AUTH_SOCK=/home/slomka/ssh-agent.sock -v ~/.ssh/known_hosts:/home/slomka/.ssh/known_hosts example-container
  • 仅挂载known_hosts而非整个.ssh目录,避免暴露主机私钥等敏感文件
  • 若容器内用户无访问权限,可在主机上临时调整套接字权限(仅当前会话有效):
    chmod o+r $SSH_AUTH_SOCK
    

方案2:修正socat转发命令

若必须使用socat,需指定具体的套接字文件路径:

socat -dddd UNIX-LISTEN:/home/slomka/.ssh/socket,fork,user=slomka,group=build,mode=770 \
UNIX-CONNECT:/home/slomka/ssh-agent/$(basename $SSH_AUTH_SOCK)

然后设置环境变量:

export SSH_AUTH_SOCK=/home/slomka/.ssh/socket

内容的提问来源于stack exchange,提问作者Sebastian Słomka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:41:29