我通过ansible配置了nginx安装和配置(以及https
网站的设置SSL证书)。 SSL证书使用密码短语。
我想编写重启nginx的ansilbe任务。问题如下。
通常情况下,内部有https网站的nginx会在重启期间询问PEM pass phrase
。在执行剧本期间,Ansible不会要求该密码短语。
在某些私人目录中有solution存储解密的证书和密钥。但我真的不想把我的证书和密钥留在未加密的地方。
如何在重启期间通过ansible
将密码传递给nginx(或openssl)?完美的场景如下:
vars_promt
)。另一种选择是使用ansible vault。PEM pass phrase
时,ansible将密码传递给nginx。有可能吗?
答案 0 :(得分:24)
Nginx有ssl_password_file
参数。
指定带有密码密码的文件,其中每个密码在单独的行上指定。在加载密钥时依次尝试密码短语。
示例:
http {
ssl_password_file /etc/keys/global.pass;
...
server {
server_name www1.example.com;
ssl_certificate_key /etc/keys/first.key;
}
server {
server_name www2.example.com;
# named pipe can also be used instead of a file
ssl_password_file /etc/keys/fifo;
ssl_certificate_key /etc/keys/second.key;
}
}
你可以做的是将ssl_password_file
保留在ansible-vault中,复制它,重新启动nginx然后成功删除它。
我没有第一手经验,如果它实际上有效或者其他可能产生的副作用(例如手动service nginx restart
可能会失败),但这对我来说似乎是一种合乎逻辑的方法
答案 1 :(得分:4)
如果您对私钥具有足够的权限限制(例如,只让nginx能够读取它),这可能就足够了。无论如何,Nginx必须将它保存在内存中;这对于攻击者来说可能更难恢复,但是如果他们具有对该框的root访问权限,那么无论如何都应该考虑密钥泄露。
或者,您可以将密码传递给正在重新启动的命令(例如echo mypass | service nginx restart
)。这将导致它在流程列表上以纯文本显示,不应被视为更安全。
我建议锁定文件的权限,并且没有密码。我不相信Ansible有任何方法可以指定对除sudo之外的个别提示的响应。