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