如何安全地通过SSH套接字在Docker容器中使用主机SSH密钥
安全在Docker容器中使用主机SSH密钥拉取私有仓库的方案
问题背景
需要在Docker容器内使用主机的SSH密钥拉取私有代码仓库,但拒绝以下不安全操作:
- 构建镜像时复制SSH密钥
- 容器内使用root用户
- 设置与主机匹配的UID和GID
- 使用sudo进行SSH套接字转发
尝试通过SSH套接字转发实现,但遇到连接拒绝错误。
操作步骤
- 启动容器命令:
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
- 容器内执行socat命令:
socat -dddd UNIX-LISTEN:/home/slomka/.ssh/socket,fork,user=slomka,group=build,mode=777 \ UNIX-CONNECT:/home/slomka/ssh-agent/
- 设置环境变量:
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
相关产品推荐
相关产品推荐

