最近,我不得不重新学习 Perl 和 shell 脚本技能来帮助一些同事。相关同事的任务是从具有大型 Oracle 数据库后端的内部应用程序中提供一些报告,但他们根本不具备执行此操作的技能。虽然有些人可能会质疑我是否具备这些技能(笑),但显然有足够多的人认为我具备这些技能,这意味着我无法逃避这些技能。

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

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

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

有帮助吗?

解决方案

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

其他提示

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

  1. 让您的报告视图
  2. 只授予您登录的用户在报告视图上进行选择的权限
  3. 只需存储密码即可。

这样,用户所能做的就是选择其报告的数据。即使有人碰巧获得了密码,他们能用它做什么也会受到限制。

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

然而,在 Perl 中,有多种方法。您可能想调查一下 Getopt::长 对于命令行选项(另外 Getopt::ArgvFile 将它们存储在一个简单的配置文件中),或者看看类似的东西 配置::Ini文件 对于一些背后有更多力量的东西。这是我通常使用的两种类型,但还有其他可用的配置文件模块。

没有好的解决办法。您可以稍微混淆密码,但无法保护它们。

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

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

既然你已经标记了 ksh 和 bash,我将假设使用 Linux。

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

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

  1. 制作您的脚本,使其只能由您查看/读取/打开。chmod 700 它。对密码进行硬编码。
  2. 有一个可由用户执行并执行 sudo 的“启动器”脚本。

这样用户就可以看到您的启动器脚本,检查它以查看它只有一个命令行。他们可以运行它并且它可以工作,但他们无权读取 sudo 脚本的源代码。

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

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

这是一个坏主意。

正如您可以想象的那样,任何具有 SCOTT 本地用户的 Windows XP 都可以无需密码即可登录到您的数据库。

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

无论您的解决方案是什么,都值得查看 Oracle 的解决方案 项目锁定 在提交之前。

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

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

没有完美的解决方案,因为您必须能够解密并获取明文密码……如果您能做到,其他人也可以(如果他们有正确的信息)。

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

有关如何实施的一些实际示例是 这里

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

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

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

我曾经遇到过类似的问题,开发人员使用 Solaris 服务器上的 ANT 将 SQL 代码部署到 MSSQL(实际上是该 MSSQL 服务器上的任何数据库,因此角色必须是系统管理员)。同样,我不想将用户名和密码存储在 ANT build.xml 文件中,因此我的解决方案(我知道这并不理想)如下:

  1. 将用户名和密码的名称/值对存储在纯文本文件中
  2. 加密文件(在 Solaris 上)并使用只有某些管理员知道的密码短语
  3. 仅将加密文件保留在 Solaris 系统上
  4. ANT build.xml 运行 sudo 解密并提示输入由管理员输入的密码
  5. ANT 源解密文件加载用户名和密码作为 SQL 字符串的变量
  6. ANT立即删除明文文件
  7. ANT部署代码并退出

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

我确信它可以更好,但是......

柔佛州

很遗憾我以前从未见过这个帖子——它看起来很有趣。我将为将来遇到该线程的任何人添加我的两分钱。

我建议在数据库服务器本身上使用操作系统身份验证 - REMOTE_OS_AUTHENT 仍然是 FALSE。

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

这样做可以避免在任何地方编写密码。当然,如果恶意管理员劫持无短语密钥并使用它,他或她还可以访问数据库主机上的用户帐户,然后可以执行操作系统验证的数据库用户可以执行的任何操作。为了缓解这种情况,您可以将该操作系统用户的数据库权限减少到最低限度——假设“只读”。

因戈

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

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

关键词:密码硬编码

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

我就是这样做的:

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

  2. 使用SSH公共密钥对字符串进行加密并存储在同一.ssh目录中$ echo“ sertrontord” | openssl rsautl -enkey〜/.ssh/id_rsa.pub -pubin -out〜/.ssh/necret.dat

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

PS - 我一直在尝试 CYBERARK AIM 无代理解决方案。这有点痛苦,需要对 API/脚本进行重大更改/API 更改。我们会随时通知您进展情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top