提问人:Brendan 提问时间:8/21/2008 最后编辑:Brendan 更新时间:5/31/2017 访问量:12953
在类 Linux/UNIX 上将网络代理密码隐藏在纯文本文件中
Obscuring network proxy password in plain text files on Linux/UNIX-likes
问:
通常,在大型网络中,计算机需要在经过身份验证的代理后面运行——与外界的任何连接都需要用户名/密码,这通常是用户用于登录电子邮件、工作站等的密码。
这意味着必须将网络密码以及apt.conf
http_proxy, ftp_proxy
https_proxy
~/.profile
我意识到你可以设置它(在 Ubuntu/Debian 上不是默认的!),但在我们的系统上,有些人需要 root 权限。apt.conf
chmod 600
我还意识到,从技术上讲,从具有root访问权限的人那里获得密码是不可能的,但是我想知道是否有办法掩盖密码以防止意外发现。Windows 以管理员身份与用户一起运行,但以某种方式存储网络密码(可能以某种方式存储在注册表的深处),因此在典型使用中,您不会以纯文本形式偶然发现它
我只是从前几天开始问,在比较跨系统的配置文件时,我完全偶然发现了别人的密码。
@monjardin - 恐怕公钥身份验证不是这个网络上的替代方案。另外,我怀疑大多数命令行工具是否支持它。
@Neall - 我不介意其他用户拥有网络访问权限,他们可以使用我的凭据访问网络,我只是不希望它们以纯文本形式出现在我的密码中。
答:
公钥身份验证对您来说是一个有效的替代方案吗?
只要这三件事都是真的,你就不走运了:
- 服务器需要 Web 访问
- 用户需要对服务器(root)进行绝对控制
- 您不希望用户拥有服务器的 Web 访问权限
如果无法删除 #2 或 #3,则唯一的选择是删除 #1。设置托管所有软件更新的内部服务器。将该服务器锁定在对其他用户之外,并且不允许其他服务器访问网络。
你试图做的任何其他事情都只是在愚弄自己。
首选与 Gnome Keyring 集成的应用程序。另一种可能性是使用到外部计算机的 SSH 隧道,并通过该隧道运行应用程序。查看用于创建本地 SOCKS 代理接口的选项,而不是单服务转发。-D
-L
除非您使用的特定工具允许混淆格式,或者您可以创建某种工作流程以从混淆到按需纯化,否则您可能不走运。
在这种情况下,我看到的一件事是创建每服务器、每用户或每服务器/每用户的专用凭据,这些凭据只能从特定 IP 访问代理。它不能解决您的核心混淆问题,但它可以减轻某人看到密码的影响,因为它的价值很小。
关于后一种选择,我们在工作中提出了一个“反向加密”密码编码,用于此类操作。这只是混淆,因为解码 pw 所需的所有数据都存储在编码字符串中,但它可以防止人们意外地看到纯文本中的密码。例如,您可以以这种格式存储上述密码之一,然后为 apt 编写一个包装器,该包装器动态构建 apt.conf,调用真正的 apt,并在退出时删除 apt.conf。在一段时间内,您仍然会得到纯文本的 pw,但它会最小化窗口。
有很多方法可以隐藏密码:您可以将凭据存储在 rot13 格式或 BASE64 中,或者使用 CVS 使用的相同密码加扰算法。不过,真正的诀窍是让您的应用程序了解加扰算法。
对于其中的环境变量,您可以对其进行编码存储,然后在设置变量之前对其进行解码,例如:~/.profile
encodedcreds="sbbone:cnffjbeq"
creds=`echo "$encodedcreds" | tr n-za-mN-ZA-M a-zA-Z`
这将设置为 ,然后您可以嵌入其中等。creds
foobar:password
http_proxy
我假设你知道这一点,但值得重复一遍:这不会增加任何安全性。它只是防止无意中看到其他用户的密码。
我们通过不要求在 rpm、apt 或其他类似更新(病毒库、Windows 内容等)上提供代理密码来解决这个问题 这是要添加到代理的已知存储库的小型白名单。
评论
我想您可以创建一个本地代理,通过它指向这些工具,然后让本地代理以交互方式向用户询问外部代理密码,然后应用该密码。它可以选择在混淆的内部存储中记住几分钟。
一个明显的攻击媒介是特权用户修改此本地代理以使用输入的密码执行其他操作(就像他们使用其他任何操作一样,例如请求它的电子邮件客户端或窗口系统本身),但至少您可以避免无意中查看。
使用以下方法,您永远不必以纯文本形式保存代理密码。您只需要在需要 http/https/ftp 访问时立即以交互方式输入密码:
- 使用 openssl 将您的纯文本代理密码加密到文件中,例如 AES256 加密:
openssl enc -aes-256-cbc -in pw.txt -out pw.bin
- 使用(不同的)密码来保护编码的文件
- 删除纯文本 pw.txt
- 在 ~/.alias 中创建一个别名来设置 http_proxy/https_proxy/ftp_proxy 环境变量(为 $USER/proxy/$PORT 设置适当的值)
别名 myproxy='PW='openssl aes-256-cbc -d -in pw.bin';代理=“http://$USER:$PW@proxy:$PORT”;导出 http_proxy=$PROXY;导出 https_proxy=$PROXY;导出 ftp_proxy=$PROXY'
- 您应该将此文件源到您的普通 shell 环境中(在某些系统上,这是自动完成的)
- 键入“myproxy”并输入用于加密文件的 OpenSSL 密码
- 做。
注意:在 shell 会话期间,密码在用户环境中可用(且可读)。如果要在使用后将其从环境中清除,可以使用其他别名:
别名 clearproxy='export http_proxy=;导出 https_proxy=;出口 ftp_proxy='
评论
read -s PW
我做了一个修改后的解决方案:
编辑并添加以下行:/etc/bash.bashrc
alias myproxy='read -p "Username: " USER;read -s -p "Password: " PW
PROXY="$USER:[email protected]:80";
export http_proxy=http://$PROXY;export Proxy=$http_proxy;export https_proxy=https://$PROXY;export ftp_proxy=ftp://$PROXY'
从下次登录开始,输入并输入您的用户/密码组合!现在使用myproxy
sudo -E
-E, --preserve-env 向安全策略指示用户希望保留其 现有环境变量。
例如sudo -E apt-get update
备注:代理设置仅在 shell 会话期间有效
评论