11

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

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

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

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

4

13 回答 13

7

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

于 2008-09-17T06:55:10.030 回答
5

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

  1. 制作您的报告视图
  2. 授予您正在登录的用户仅访问以在报告视图上进行选择的权限
  3. 只需存储密码。

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

于 2008-09-17T07:07:16.693 回答
4

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

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

于 2008-09-17T12:58:16.257 回答
1

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

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

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

于 2008-09-17T06:53:38.363 回答
1

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

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

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

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

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

于 2008-09-17T06:57:09.557 回答
1

我不确定您运行的是什么版本的 Oracle。在旧版本的 Oracle(9i 之前的高级安全性)上,一些 DBA 会CREATE USER OPS$SCOTT IDENTIFIED BY EXTERNALLY设置REMOTE_OS_AUTHENT为 true。

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

这是一个坏主意。

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

不幸的是,这是我所知道的 Oracle 9i DB 的唯一选择,即不在您的脚本或客户端计算机可访问的其他地方存储用户名/密码。

无论您的解决方案是什么,都值得在提交之前查看一下 Oracle 的Project Lockdown 。

于 2008-09-17T09:19:50.043 回答
1

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

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

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

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

如何实现的一些实际示例是here

于 2008-09-17T16:22:55.767 回答
0

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

于 2008-09-17T06:57:56.123 回答
0

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

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

于 2008-09-17T07:01:32.700 回答
0

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

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

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

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

JB

于 2008-09-17T11:15:07.877 回答
0

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

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

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

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

英戈

于 2009-06-12T21:31:38.803 回答
0

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

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

关键字:密码硬编码

于 2009-07-14T10:21:23.800 回答
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 私钥对密钥进行解密,并将参数实时传递给脚本/AP。包含要实时解密的行的脚本/程序:string=openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in ~/.ssh/secret.dat

PS - 我一直在尝试 CYBERARK AIM 无代理解决方案。这是一种痛苦,需要对 API/脚本进行重大更改/API 更改。将让您随时了解情况。

于 2017-11-20T22:34:49.467 回答