在Shell / Perl脚本中保存密码的最佳做法?

时间:2020-03-05 18:58:06  来源:igfitidea点击:

最近,我不得不浪费我的Perl和Shell脚本技能来帮助一些同事。有问题的同事的任务是从具有大型Oracle数据库后端的内部应用程序提供一些报告,而他们根本不具备执行此操作的技能。尽管有些人可能会质疑我是否也具备这些技能(咧嘴笑),但显然有足够多的人认为我这样做意味着我不能感到疲倦。

因此,对于我的问题,为了从数据库中提取报告,我的脚本显然必须连接并运行查询。到目前为止,我还没有想出一个好的解决方案来存储数据库的用户名和密码,因此当前将其以纯文本格式存储在脚本中。

是否有其他人已经写过的一个好的解决方案,也许是作为CPAN模块?还是还有其他更好的方法,例如将用户/密码组合保存在一个完全独立的文件中,该文件隐藏在文件系统上的其他位置?还是我应该对其进行简单加密,以免它们被系统级grep从脚本中删除?

编辑:
Oracle数据库位于HP-UX服务器上。
应用服务器(运行shell脚本)是Solaris。
将脚本设置为仅由我自己拥有是不行的,它们必须由多个支持人员可以访问的服务帐户所拥有。
这些脚本旨在作为cron作业运行。
我很乐意使用公钥身份验证,但是如果有这样的方法启发我,我不知道使该方法与Oracle一起使用的方法!

解决方案

回答

没有好的解决方案。我们可以稍微混淆密码,但是不能保护它们。

如果我们可以控制数据库的设置,则可以尝试通过命名管道(至少mysql支持)进行连接,而无需输入密码,并由OS处理权限。

我们还可以将凭据存储在具有限制性权限的文件中。

回答

恕我直言,最佳实践是不要在shell / Perl脚本中保存任何密码。那就是公钥认证的目的。

回答

既然我们已经标记了ksh&bash,那么我将假设使用Linux。

大部分问题是,如果用户可以阅读脚本并找到用于隐藏/加密文件的方法,那么他们也将能够手动执行相同的操作。

更好的方法可能是执行以下操作:

  • 编写脚本,使其只能由我们查看/读取/打开。 chmod 700它。硬编码密码消失了。
  • 有一个"启动程序"脚本,该脚本可由用户执行并执行sudo。

这样,用户可以查看启动器脚本,对其进行检查以查看它只有一个命令行。他们可以运行它并且可以运行,但是他们没有权限读取sudo'd脚本的源代码。

回答

在UNIX中,我总是使这些脚本为setuid,并将用户名和密码信息存储在受严格保护的文件中(普通用户无法读取/搜索整个目录树,并且文件本身仅可由脚本所有者读取) 。

回答

将它们保存在单独的文件中,并进行简单加密,并在数据库中创建单独的用户,并具有对必要表的只读访问权限。如果我们认为该文件已被读取,则可以关闭对该用户的访问。

如果想花哨的话,SUID程序可以检查/ proc // exe和cmdline(在Linux中),然后才释放用户名。

回答

如果脚本正在从服务器远程运行。

  • 制作报告视图
  • 授予我们登录的用户仅访问权限以在报告视图中进行选择
  • 只需存储密码即可。

这样,用户所能做的就是为报告选择数据。即使有人碰巧获得了密码,他们在使用密码方面的工作也会受到限制。

回答

我不确定我们正在运行哪个版本的Oracle。在旧版本的Oracle(9i之前的高级安全性)上,某些DBA会"通过外部身份创建用户OPS $ SCOTT"并将" REMOTE_OS_AUTHENT"设置为true。

这意味着远程sun机器可以将我们认证为SCOTT,然后Oracle DB将接受该认证。

这是一个坏主意。

正如我们可以使用SCOTT的本地用户来镜像任何Windows XP一样,然后可以在没有密码的情况下登录数据库。

不幸的是,这是我所知道的Oracle 9i DB的唯一选项,它不将用户名/密码存储在脚本或者客户端计算机可访问的其他位置。

无论我们采用哪种解决方案,都值得在提交之前先了解一下Oracle的Project Lockdown。

回答

对于使用SQL Server上的ANT将SQL代码部署到MSSQL(实际上是该MSSQL服务器上的任何数据库,因此角色必须是SysAdmin)的开发人员,我遇到了类似的问题。再次,我不想将用户名和密码存储在ant build.xml文件中,因此我所知的解决方案如下:

  • 将用户名和密码的名称/值对存储在纯文本文件中
  • 加密文件(在Solaris上)并使用仅某些管理员已知的密码
  • 仅将加密文件保留在Solaris系统上
  • ANT build.xml运行sudo解密并提示输入密码,由管理员输入
  • ANT将解密的文件加载用户名和密码作为SQL字符串的变量
  • ANT立即删除了纯文本文件
  • ANT部署代码并退出

这一切仅需几秒钟,并且sql用户名和密码在服务器上从未可见。由于代码是由允许的管理员在生产中部署的,因此开发人员无需将其包含在他们的代码中。

我相信可能会更好,但是...

JB

回答

我个人将密码保存在配置文件中,然后独立于应用程序分发密码,可以将其更改为特定的计算机/环境。在外壳程序脚本中,我们可以在主脚本中提供它们。

但是,在Perl中有多种方法。我们可能希望研究Getopt :: Long的命令行选项(以及另外的Getopt :: ArgvFile来将它们存储在简单的配置文件中),或者查看类似Config :: IniFiles的内容,以获得更多功能。这是我通常使用的两种类型,但是还有其他可用的配置文件模块。

回答

要存储密码,我们可以执行两步加密例程,首先在脚本本身中使用硬编码密钥,然后第二次使用存储在文件中的密钥(使用文件权限设置为具有受限访问权限)进行第二次加密。

在给定的情况下,我们可以使用密钥文件(脚本中的+密钥),或者如果情况要求不是那么好,他可以使用在密钥中硬编码的密钥来使用加密。在这两种情况下,密码都将在配置文件中加密。

没有完美的解决方案,因为我们必须以某种方式必须能够解密并获得明文密码...如果我们能够做到这一点,那么其他人也可以在他们拥有正确信息的情况下也可以这样做。

尤其是在我们给他们一个perl脚本(相对于exe)的情况下,他们可以轻松地看到我们如何进行加密(以及硬编码的密钥)...这就是为什么我们应该允许使用密钥文件的选项(也受文件系统权限的保护)。

有关如何实现的一些实际示例

回答

真遗憾,我以前没看过这个主题-看起来很有趣。我将为以后遇到问题的任何人加收2美分。

我建议在数据库服务器本身上使用OS身份验证-REMOTE_OS_AUTHENT仍然为FALSE。

如果要从另一台计算机上调用脚本,请设置无短语的SSH密钥,然后使用SSH到达那里。然后,我们可以将SQL结果通过管道传输到调用计算机,它可以进一步处理此信息。

这样做避免了必须在任何地方编码密码。当然,如果恶意管理员要劫持无短语密钥并使用它,则他或者她还可以访问数据库主机上的用户帐户,然后可以执行操作系统身份验证的数据库用户可以执行的任何操作。为了减轻这种情况,我们可以将该OS用户的数据库权限降低到最低限度,例如说"只读"。

英戈

回答

On windows create a Folder and a File within it containing the passwords in clear text. 
  Set the user who would run the scheduled job(script or batch) as the only person with read/write access to this folder and file. (remove even administrator). 
  To all other scripts, add code to read the clear text password from this restricted file.

这应该足够了。

关键字:密码硬编码