我有一个 Bash 脚本,可以使用我的用户名和密码自动对服务进行身份验证。凭据当前以纯文本形式存储在脚本中。
我应该采取哪些预防措施来最安全地存储这些凭据,同时仍允许脚本访问?
澄清要点:
- 我理解,如果可用,应该使用其他身份验证方法。但我仍然想知道如果密码身份验证是唯一的选择,该怎么办。
- 完全不存储密码在这里不是一个可接受的答案。我问的是脚本必须无人值守访问密码的情况。
答案1
不要将密码硬编码在文件中,而是将密码存储在单独的文件中并保护该文件(chmod 700
或chmod 500
),以便只有授权用户才能访问它。
cat /dir/to/file/with/.password
用而不是读取文件并将其内容存储到变量中来检索密码。
答案2
什么样的服务?某些服务有其他身份验证方法,例如与 SSH 代理结合使用的 SSH 密钥。
我会将密码与脚本分开存储,并确保所有路径组件都设置了正确的权限。例如,确保路径中的、和/path/to/file
由/
您信任的用户拥有(),并且不允许无权查看您的文件的人写入这些文件。最后,建议的权限为600 或 400。/path
/path/to
root
file
看起来可能file
是这样的:
PASSWORD='something that you cannot remember'
在您的脚本中,使用以下代码导入变量:
. /path/to/file
至于您的脚本,请确保它不包含可能允许攻击者在脚本上下文中执行代码的漏洞(例如,不受控制的环境可能具有任意$PATH
变量集或无效使用其他文件(例如,获取全球可写文件))。
至于密码的实际保护,您不能。它必须以某种方式提供给其他服务。作为替代方案,您可以使用openssl
或加密包含密码的文件/脚本gpg
,因此您需要在解锁凭据之前输入密码。如果您的服务密码很难记住,这尤其有用。
答案3
我知道这是一个老问题,但我遇到了类似的问题,我使用 Ubuntu 的密钥环解决了它。这是 ubuntu 18.04LTS 上的解决方案打开终端写下keyring set {{service}} {{username}}
例如如果你用它来记录学校密码:
keyring set school mohamed
它会记录你的密码并输入密码。现在你输入的密码存储在 Ubuntu 密钥环中。
要获取此密码,请在终端中写入:
keyring get school mohamed
在脚本上下文中使用它:
password=$(keyring get school mohamed)
现在密码包含您之前输入的密码。