我有一个bash脚本,我需要写我的密码来运行程序.其他人可以看到它.有没有办法以不太明显的方式写密码?即使他可以在bash中执行相同的命令并获取密码,他也无法在文本中阅读.
今天我这样做:
PASSWORD="1234567"
program --pass=$PASSWORD
Run Code Online (Sandbox Code Playgroud)
我想做这个
PASSWORD="10101001001010010101010100101" #binary or other code
NEW_PASS=`decrypt $PASSWORD`
program --pass=$NEW_PASS
Run Code Online (Sandbox Code Playgroud)
任何的想法?
你所要求的不仅仅是邪恶 - 它根本行不通.
用户只需查看您的密码即可运行bash -x your_script,输出将包括在内
+program '--pass=decrypted-password-here'
Run Code Online (Sandbox Code Playgroud)
......无论混淆有多么有效.
您尝试拨打的实际程序需要密码是什么?你能否在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")"
Run Code Online (Sandbox Code Playgroud)
...但如果它是您实际关心的密码,请不要混淆 - 使用上面给出的方法之一来避免以用户可读的方式存储密码.
您可以使用uuencode和uudecode,它们通常在Unix系统上安装(并且始终可以通过软件包轻松获得).由于编码没有意义,它可能会阻止观察者轻易记住密码,即通过肩膀冲浪窃取密码.但是,一个精心挑选的随机明文密码可以完成同样的事情,而不会产生错误的安全错觉.
随着自动化配置管理变得越来越必要,DevOps中的每个人都面临着这个确切的问题.
这是一些更好的解决方案:
在脚本运行的系统上有一个秘密文件.脚本可以在运行时从文件中读取其秘密.这样,您可以在不广播密码的情况下检查脚本到源代码控制,并且可以使用用户权限来保护机密文件.您可以在不传播密码的情况下重用脚本.
使用no-passphrase ssh公钥认证到达远程系统
将上述方法与角色限制用户结合使用.我通常在目标系统上创建一个除了脚本想要做的事情之外什么也做不了的用户.现代版本的ssh对此有所帮助,因为它们可以忽略传入的命令(请参阅sshd_config中的forcecommand或使用ssh-forcecommand之类的东西)并且只是总是做一个特定的事情.
如果您要连接到网页,您仍然可以创建一个角色限制用户或至少一个可消耗的用户.也许您可以手动登录并建立持久会话. Curl可以使用cookie并配合这种方法.