在Linux / UNIX-like上以纯文本文件模糊networking代理密码

通常在大型networking中,计算机需要在经过authentication的代理之后进行操作 – 任何与外部世界的连接都需要用户名/密码,这通常是用户用来login到电子邮件,工作站等的密码。

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

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

我也意识到从技术上来说不可能从拥有root权限的用户那里获得密码,但是我想知道是否有一种模糊密码来防止意外发现。 Windows以用户身份与pipe理员一起操作,但是却以某种方式存储networking密码(可能以某种方式存储在registry中的深层),因此在典型的使用中,您不会以纯文本

我只问了一天以后,我完全意外地发现有人在这个系统比较configuration文件的时候发现了这样的密码。

@monjardin – 公钥authentication不是这个networking上的另一种select。 另外我怀疑它是支持大多数命令行工具。

@Neall – 我不介意其他用户有networking访问权限,他们可以使用我的凭据访问networking,我不想让他们以纯文本的密码发生。

通过以下方法,您不必以纯文本格式保存代理密码。 只要您需要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`; PROXY = “HTTP:// $ USER:$ @ PW代理:$ PORT”; 导出http_proxy = $ PROXY; 导出https_proxy = $ PROXY; export ftp_proxy = $ PROXY'

  • 你应该把这个文件放到你正常的shell环境中(在一些系统上这是自动完成的)
  • 键入“myproxy”并输入用于加密文件的openssl密码
  • 完成。

注意:在shell会话的持续时间内,用户环境内的密码是可用的(并且是可读的)。 如果你想在使用后从环境中清除它,你可以使用另一个别名:

别名clearproxy ='导出http_proxy =; 导出https_proxy =; export ftp_proxy ='

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

有很多方法可以隐藏密码:可以使用rot13格式或BASE64格式存储凭据,也可以使用CVS使用的相同密码加扰算法 。 但真正的技巧是让你的应用程序知道加扰算法。

对于~/.profile的环境变量,可以将它们存储起来,然后在设置变量之前对它们进行解码,例如:

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

这将设置foobar:password ,然后你可以嵌入http_proxy

我假设你知道这一点,但重复一遍:这不会增加任何安全性。 它只是防止无意中看到另一个用户的密码。

除非您使用的特定工具允许使用混淆格式,或者您可以创建某种类型的工作流程以从混淆模式转为简单模式,否则您可能不太顺利。

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

关于后一种选择,我们在工作中提出了一种“反向隐藏”密码编码,这种编码我们用于这样的东西。 这只是模糊处理,因为解码pw所需的所有数据都存储在编码字符串中,但是它可以防止人们意外地以纯文本形式查看密码。 例如,你可能会以这种格式存储上面的密码之一,然后为apt编写一个封装器,动态地创建apt.conf,调用真正的apt,并在exit处删除apt.conf。 你仍然以纯文本的形式结束了一段时间,但它最小化窗口。

公钥认证是您的有效选择吗?

只要所有这三件事情都是真的,那么你倒霉了:

  1. 服务器需要Web访问
  2. 用户需要绝对控制服务器(root)
  3. 您不希望用户拥有服务器的Web访问权限

如果你不能删除#2或#3,你唯一的选择就是删除#1。 设置一个托管所有软件更新的内部服务器。 让其他用户锁定,不要让其他服务器访问网络。

你想做的任何事情只是自欺欺人。

我们通过不要求在rpm,apt或其他类似的更新(病毒数据库,窗口的东西等)上的代理密码来解决这个问题。这是一个知名存储库的小白名单,以添加到代理。

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

一个明显的攻击媒介将是一个特权用户修改这个本地代理与输入的密码做别的事情(因为他们可以与其他任何东西,如电子邮件客户端,请求它或窗口系统本身),但至少你' d可以安全无意的观看。

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

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

 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指示用户希望保留其现有环境变量的安全策略。

例如sudo -E apt-get update

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