关于安全性:在类似Linux / UNIX的纯文本文件中隐藏网络代理密码

关于安全性:在类似Linux / UNIX的纯文本文件中隐藏网络代理密码

Obscuring network proxy password in plain text files on Linux/UNIX-likes

通常,在大型网络中,计算机需要在经过身份验证的代理之后进行操作-与外界的任何连接都需要用户名/密码,这通常是用户登录电子邮件,工作站等所使用的密码。

这意味着必须将网络密码以及通常在~/.profile中定义的http_proxy, ftp_proxyhttps_proxy环境变量放置在apt.conf文件中

我意识到使用apt.conf可以设置chmod 600(在Ubuntu / Debian上默认情况下不是这样),但是在我们的系统上,有些人需要root特权。

我也意识到,从具有root用户访问权限的人那里获取密码在技术上是不可能的,但是我想知道是否存在一种方法可以隐藏密码以防止意外发现。 Windows以管理员身份与用户一起运行,但仍以某种方式存储网络密码(可能以某种方式隐藏在注册表的深处),因此在典型的用法中,您不会以纯文本形式偶然浏览

我只是从那天起才问,在跨系统比较配置文件时,我完全是偶然地以这种方式发现了别人的密码。

@monjardin-恐怕此网络上的公钥认证不是替代方案。另外,我怀疑大多数命令行工具都支持它。

@Neall-我不介意其他具有Web访问权的用户,他们可以使用我的凭据访问Web,我只是不希望他们在我的密码中以纯文本形式出现。


使用以下方法,您不必将代理密码保存为纯文本格式。您只需要在需要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设置适当的值)

alias myproxy='PW=`openssl aes-256-cbc -d -in pw.bin`; PROXY="http://$USER:$PW@proxy:$PORT"; export http_proxy=$PROXY; export https_proxy=$PROXY; export ftp_proxy=$PROXY'

  • 您应该将此文件来源到常规的shell环境中(在某些系统上,这是自动完成的)
  • 键入" myproxy",然后输入用于加密文件的openssl密码
  • 完成。

注意:在Shell会话期间,密码在用户环境中可用(并且可读)。如果要在使用后从环境中清除它,可以使用另一个别名:

alias clearproxy='export http_proxy=; export https_proxy=; export
ftp_proxy='


我做了一个修改的解决方案:

编辑/etc/bash.bashrc并添加以下行:

1
2
3
alias myproxy='read -p"Username:" USER;read -s -p"Password:" PW
PROXY="$USER:$PW@proxy.com: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
Indicates to the security policy that the user wishes to reserve their
existing environment variables.

例如sudo -E apt-get update

备注:代理设置仅在Shell会话期间有效


有很多方法可以使密码模糊:您可以将证书存储为rot13格式或BASE64,或者使用与CVS相同的密码加密算法。但是,真正的技巧是使您的应用程序意识到加扰算法。

对于~/.profile中的环境变量,您可以将其编码后存储,然后在设置变量之前对其进行解码,例如:

1
2
encodedcreds="sbbone:cnffjbeq"
creds=`echo"$encodedcreds" | tr n-za-mN-ZA-M a-zA-Z`

这会将creds设置为foobar:password,然后您可以将其嵌入到http_proxy等中。

我想您知道这一点,但需要重复:这不会增加任何安全性。它只是防止意外看到另一个用户的密码。


首选与Gnome Keyring集成的应用程序。另一种可能性是使用SSH隧道连接到外部计算机,并通过该隧道运行应用程序。查看用于创建本地SOCKS代理接口的-D选项,而不是单服务-L转发。


除非您使用的特定工具允许使用混淆格式,或者除非您可以创建某种工作流以从混淆状态转换为按需普通操作,否则您可能很不幸。

在这种情况下,我看到的一件事是创建每个服务器,每个用户或每个服务器/每个用户的专用凭据,这些凭据只能从特定IP访问代理。它并不能解决您的核心混淆问题,但可以减轻别人看到密码的影响,因为它的价值太低了。

关于后一种选择,我们在工作中提出了一种"反向加密"密码编码,用于类似这样的事情。这只是混淆,因为对pw进行解码所需的所有数据都存储在编码的字符串中,但是它可以防止人们意外地以纯文本形式看到密码。因此,例如,您可以以此格式存储上述密码之一,然后为apt编写包装程序,以动态构建apt.conf,调用真正的apt,然后在退出时删除apt.conf。您仍然会以纯文本形式使用pw一段时间,但是它将窗口最小化。


我想您可以创建一个本地代理,通过它们指向这些工具,然后让本地代理交互地询问用户要使用的外部代理密码。它可以选择在混淆的内部存储中记住这一点几分钟。

一个明显的攻击媒介是特权用户修改此本地代理,以使用输入的密码进行其他操作(就像其他操作,例如请求它的电子邮件客户端或窗口系统本身一样),但至少您会d避免疏忽观看。


我们通过不要求rpm,apt或其他类似更新(病毒数据库,Windows程序等)的代理密码来解决此问题
那是要添加到代理的已知存储库的白名单。


只要这三个条件都是正确的,您就很不走运:

  • 服务器需要Web访问
  • 用户需要对服务器(根)的绝对控制
  • 您不希望用户具有服务器的Web访问权限
  • 如果您无法删除#2或#3,则唯一的选择是删除#1。设置一个托管所有软件更新的内部服务器。保持与其他用户的锁定,并且不允许其他服务器访问Web。

    您尝试做的其他任何事情只是在欺骗自己。


    公钥身份验证是否对您有效?


    推荐阅读