我有一个bash脚本,我需要编写密码才能运行程序。其他人可以看到它。有没有办法以不太明显的方式写密码?即使他可以在bash中执行相同的命令并获取密码,他也无法用文本阅读。
今天我这样做:
PASSWORD="1234567"
program --pass=$PASSWORD
我想这样做
PASSWORD="10101001001010010101010100101" #binary or other code
NEW_PASS=`decrypt $PASSWORD`
program --pass=$NEW_PASS
有什么想法吗?
答案 0 :(得分:6)
你要求的不仅仅是邪恶 - 它只是无效。
所有用户都需要查看您的密码才能运行bash -x your_script
,输出将包括
+program '--pass=decrypted-password-here'
......无论混淆有多么有效。
您尝试拨打的实际程序需要密码是什么?你能否在setuid包装器后隐藏你的密码,这样包装器就可以读取密码文件,即使运行它的用户不能?你能否(借用DigitalRoss的建议)建立一个拥有存储密码副本的用户帐户(或者更好的是证书或密钥对),只能将其配置为能够通过SSH运行你的脚本而不是其它任何东西,并给予应该能够以该用户身份运行SSH脚本权限的用户(或仅针对单个命令sudo给该用户,等等)?
等
简而言之:瞄准真正的安全,而不是混淆。
现在,如果你 想要混淆 - 传统方法是ROT-16:
obfuscated_password="qrpelcgrq-cnffjbeq-urer"
real_password="$(tr a-zA-Z n-za-mN-ZA-M <<<"$obfuscated_password")"
...但如果它是您真正关心的密码,请不要混淆 - 使用上面给出的一种方法来避免以用户可读的方式存储密码。
答案 1 :(得分:5)
您可以在Unix系统上使用经常安装的uuencode and uudecode,(并且始终可以通过软件包轻松获得)。由于编码没有意义,它可能会阻止观察者轻松记住密码,即stealing the password via shoulder-surfing.但是一个精心挑选的随机明文密码可以完成同样的事情,而不会产生错误的安全错觉。
现在everyone in DevOps面临着这个确切的问题,因为自动配置管理变得越来越必要。
以下是一些更好的解决方案:
在运行脚本的系统上有 secrets 文件。脚本可以在运行时从文件中读取其秘密。这样,您可以在不广播密码的情况下检查脚本到源代码控制,并且可以使用用户权限来保护机密文件。您可以在不传播密码的情况下重复使用脚本。
使用no-passphrase ssh公钥认证到达远程系统
将上述方法与角色限制用户结合使用。我通常在目标系统上创建一个除了脚本想要做的事情之外什么也做不了的用户。现代版本的ssh对此有所帮助,因为它们可以忽略传入的命令(请参阅sshd_config中的forcecommand或使用something like ssh-forcecommand)并且只是总是做一件具体的事情。
如果您要连接到网页,您仍然可以创建一个角色限制用户或至少一个可消耗的用户。也许您可以手动登录并建立持久会话。 Curl可以使用Cookie并配合此方法。
答案 2 :(得分:3)
A&#34;不太难&#34;方法是使用ROT13:
PASSWORD=cnffjbeq
REAL_PASSWORD=`echo $PASSWORD | rot13`
如果您没有rot13
计划,使用tr a-z n-za-m
也可以。
请注意,这提供绝对没有任何安全性。但是,您可以随意观看&#34;随意观看&#34;目的。
答案 3 :(得分:2)
将钥匙放在门垫下面并不安全。 但是'程序'需要采取的事实 - 通过.....意味着任何做'ps -ef'的人都可以看到它。 如果'program'有一个可以从管道读取密码的表单,那么你应该使用它。 例如program --pass = - ...&lt; /home/me/.something 并使文件只对您可读。