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

时间:2008-09-17 06:50:46

标签: perl oracle bash ksh

我最近不得不放弃我的Perl和shell脚本技能来帮助一些同事。有问题的同事的任务是从内部应用程序提供一些带有大型Oracle数据库后端的报告,他们根本没有这方面的技能。虽然有些人可能会质疑我是否具备这些技能(咧嘴笑),显然有人认为我的意思是我无法摆脱它。

所以我的问题 - 为了从数据库中提取报告,我的脚本显然必须连接并运行查询。到目前为止,我还没有设法找到一个很好的解决方案来存储数据库的用户名和密码,因此它目前在脚本中以明文形式存储。

有没有其他人已经写过的好的解决方案,可能作为CPAN模块?或者还有其他更好的事情 - 比如将用户/密码组合保存在一个完全独立的文件中,该文件隐藏在文件系统的其他位置?或者我应该对它们进行简单的加密,以避免它们被系统范围的grep从我的脚本中拉出来?

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

13 个答案:

答案 0 :(得分:7)

最佳做法,恕我直言,将不在shell / Perl脚本中保存任何密码。这就是公钥认证的用途。

答案 1 :(得分:5)

如果脚本是从服务器远程运行的。

  1. 制作报告视图
  2. 为您登录的用户提供仅在报告视图上选择的权限
  3. 只需存储密码。
  4. 这样,用户可以做的就是选择报告的数据。即使有人碰巧得到了密码,他们也可以限制使用密码。

答案 2 :(得分:4)

我个人在配置文件中保存密码,然后独立于应用程序分发,并且可以更改为特定的机器/环境。在shell脚本中,您可以在主脚本中提供这些脚本。

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

答案 3 :(得分:1)

没有好的解决方案。您可以对密码进行模糊处理,但无法保护它们。

如果您可以控制数据库设置,您可以尝试通过命名管道(至少mysql支持)连接而无需密码,并让操作系统处理权限。

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

答案 4 :(得分:1)

因为你已经标记了ksh& bash我将假设Linux。

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

更好的方法可能是:

  1. 制作您的脚本,以便您只能看到/阅读/打开它。 chmod 700它。硬编码密码。
  2. 拥有一个可由用户执行的“启动器”脚本并执行sudo。
  3. 这样,用户可以看到您的启动器脚本,检查它以查看它只有单个命令行。他们可以运行它并且它可以工作,但他们没有权限读取sudo的脚本的源。

答案 5 :(得分:1)

我不确定您运行的是哪个版本的Oracle。在旧版本的Oracle(pre 9i Advanced Security)上,某些DBA会CREATE USER OPS$SCOTT IDENTIFIED BY EXTERNALLY并将REMOTE_OS_AUTHENT设置为true。

这意味着您的远程sun计算机可以将您作为SCOTT进行身份验证,然后您的Oracle DB将接受该身份验证。

这是一个坏主意。

因为您可以使用SCOTT的本地用户对任何Windows XP进行映像,然后可以在没有密码的情况下登录到您的数据库。

不幸的是,这是我知道Oracle 9i数据库中唯一没有在您的脚本中存储用户名/密码或客户端计算机可以访问的其他地方的选项。

在提交之前,通过Oracle Project Lockdown了解您的解决方案是值得的。

答案 6 :(得分:1)

对于存储密码,您可以执行两步加密例程,首先在脚本本身使用硬编码密钥,也可以选择第二次使用存储在文件中的密钥(使用文件许可设置以限制访问)。

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

没有完美的解决方案,因为不知何故,你必须能够解密并获得明文密码......如果你能做到这一点,如果他们有正确的信息,别人也可以。

特别是在我们为他们提供perl脚本(相对于exe)的情况下,他们可以很容易地看到你如何进行加密(以及硬编码的密钥)......这就是你应该允许选项使用密钥文件的原因(也可以受文件系统权限保护)。

如何实施的一些实际例子是here

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

我有一个类似的问题,开发人员使用来自Solaris服务器的ANT将SQL代码部署到MSSQL(实际上是MSSQL服务器上的任何数据库,因此角色必须是SysAdmin)。我再次不想在ANT build.xml文件中存储用户名和密码,所以我的解决方案,我知道并不理想,如下所示:

  1. 以纯文本文件存储用户名和密码的名称/值对
  2. 加密文件(在Solaris上)并使用仅为某些管理员所知的密码短语
  3. 仅保留Solaris系统上的加密文件
  4. ANT build.xml运行sudo decrypt并提示输入密码,由admin
  5. 输入
  6. ANT源解密文件加载用户名和密码作为SQL字符串的变量
  7. ANT立即删除了明文文件
  8. ANT部署代码并退出
  9. 这一切都在几秒钟内发生,并且在服务器上永远无法访问sql用户名和密码。由于生产中允许的管理员部署代码,开发人员永远不需要将其包含在他们的代码中。

    我相信它会更好,但是......

    JB

答案 10 :(得分:0)

我很遗憾以前从未见过这个帖子 - 看起来非常有趣。我将为将来出现在线程上的任何人加上我的两分钱。

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

如果您从另一台计算机调用该脚本,请设置一个无短语的SSH密钥并使用SSH来实现。然后,您可以将SQL结果反馈回调用计算机,它可以进一步处理此信息。

这样做可以避免在任何地方编写密码。当然,如果恶意管理员劫持了无短语密钥并使用它,他或她也可以访问数据库主机上的用户帐户,然后可以对经过OS身份验证的数据库用户执行任何操作。为了缓解这种情况,您可以将该操作系统用户的数据库权限降至最低限度 - 让我们说“只读”。

英戈

答案 11 :(得分:0)

  

在Windows上创建一个文件夹和一个包含明文密码的文件。   将运行预定作业(脚本或批处理)的用户设置为对此文件夹和文件具有读/写访问权限的唯一人员。 (甚至删除管理员)。   对于所有其他脚本,添加代码以从此受限文件中读取明文密码。

这对少数人来说应该足够了。

关键字:密码硬编码

答案 12 :(得分:0)

有商业或更先进的解决方案,例如cyberark AIM可以做得更好,但是免费和开箱即用,我一直在捎带SSH公钥/私钥,因为对于一个,SSH密钥对很可能已经创建符合安全策略;其次,SSH密钥对已经有一套标准协议,通过文件权限,连续系统加固(如tripwire)或密钥轮换来保护密钥。

我就这样做了:

  1. 生成ssh密钥对(如果尚未生成)。密钥对和目录将受默认系统协议/权限的保护。 ssh-keygen -t rsa -b 2048

  2. 使用ssh公钥加密字符串并存储在同一个.ssh目录中 $ echo" secretword" | openssl rsautl -encrypt -inkey~ / .ssh / id_rsa.pub -pubin -out~ / .ssh / secret.dat

  3. 使用ssh私钥解密密钥,并将参数实时传递给scripts / AP。脚本/程序包括实时解密的行: 字符串= openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in ~/.ssh/secret.dat

  4. PS - 我一直在试验CYBERARK AIM无代理解决方案。它的痛苦需要对API /脚本进行重大更改/ API更改。会告诉你这是怎么回事。