如何绕过Docker Secrets中SSH密钥0644权限过高的限制?
Docker Compose存在Bug,无法为容器内挂载的私有SSH密钥设置mode: 600。手动执行ssh -i /run/secrets/cmk_ssh_key连接主机时失败,报错如下:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/run/secrets/cmk_ssh_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/run/secrets/cmk_ssh_key": bad permissions
但CheckMK执行的非交互式SSH服务检查可正常使用该密钥,希望通过非交互模式实现连接。
以下几种非交互方式可绕过文件权限限制:
通过管道传递密钥内容
直接将密钥内容通过管道传给ssh,避免读取权限不符合要求的文件:cat /run/secrets/cmk_ssh_key | ssh -i - user@target-host这里
-i -表示从标准输入读取密钥。使用ssh-agent临时加载密钥
先启动ssh-agent并加载密钥,之后连接时无需指定密钥文件:# 启动ssh-agent并设置环境变量 eval $(ssh-agent) # 从文件读取密钥内容并添加到agent ssh-add - <<< "$(cat /run/secrets/cmk_ssh_key)" # 直接连接目标主机 ssh user@target-host修改SSH配置忽略权限检查(不推荐)
在容器内的/etc/ssh/ssh_config或用户目录下的~/.ssh/config中添加配置,关闭严格权限检查:Host target-host IdentityFile /run/secrets/cmk_ssh_key StrictModes no注意:
StrictModes no会关闭SSH对密钥文件权限的检查,存在安全风险,仅建议在测试环境使用。
内容的提问来源于stack exchange,提问作者peterge

