2008-09-17 72 views
11

我最近不得不掸掉我的Perl和shell脚本技能来帮助一些同事。有问题的同事的任务是从内部应用程序提供一些带有大型Oracle数据库后端的报告,而他们根本没有这方面的技能。虽然有些人可能会质疑我是否拥有这些技能(笑),显然足够的人认为我的意思是我无法摆脱它。在shell/Perl脚本中保存密码的最佳实践?

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

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

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

回答

7

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

+0

用Oracle(10g我认为)很容易建立吗? – GodEater 2008-09-17 06:57:54

+1

经过在Oracle网站上的一些狩猎之后,似乎“Oracle钱包”就是我想要的。现在让我的数据库管理员参与实施。非常感谢:) – GodEater 2008-09-17 07:18:27

1

没有好的解决方案。您可以混淆一些密码,但是无法保护它们。

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

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

+0

数据库运行在与执行shell脚本的服务器不同的服务器上。更糟糕的是,数据库服务器的操作系统是HP-UX,而shell脚本服务器的操作系统是Solaris,所以我不确定命名管道方法是否可行。 – GodEater 2008-09-17 06:57:21

1

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

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

一种更好的方式,可以做到以下几点:

  1. 使你的脚本所以它只能被看作/读/被你打开。 chmod 700吧。硬编码密码了。
  2. 有一个“启动器”脚本,可由用户执行并执行sudo。

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

+0

针对数据库服务器的HP-UX,实际上正在执行shell脚本的服务器的Solaris;) 脚本旨在作为许多人有权访问的“服务帐户”执行(用于支持的原因),并由cron工作启动。在这种情况下,sudo方法仍然有效吗? – GodEater 2008-09-17 06:59:55

0

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

0

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

如果你想要看起来,SUID程序可以检查/ proc/exe和cmdline(在Linux中),然后才能释放用户名。

5

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

  1. 让您的报告中的观点
  2. 给您登录到只能访问到在报表中选择用户查看
  3. 只是存储密码。

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

1

我不确定你运行的是哪个版本的Oracle。在较早版本的Oracle(预9i高级安全性)中,一些DBA将CREATE USER OPS$SCOTT IDENTIFIED BY EXTERNALLYREMOTE_OS_AUTHENT设置为true。

这意味着您的远程Sun机器可以将您认证为SCOTT,然后您的Oracle数据库将接受该认证。

这是一个坏主意。

正如你可以用SCOTT的本地用户镜像任何Windows XP,然后可以不用密码登录到你的数据库。

不幸的是,我知道Oracle 9i数据库不能将用户名/密码存储在您的脚本或客户机可访问的其他位置。

什么是您的解决方案,值得在提交之前查看Oracle的Project Lockdown

0

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

  1. 存储在用户名和密码的名称/值对纯文本文件
  2. 加密文件(在Solaris)和只使用已知某些管理员
  3. 通行短语仅保留加密文件的Solaris系统
  4. ANT构建上。XML运行须藤解密,并提示输入密码短语,这是由管理员
  5. ANT来源解密文件加载的用户名和密码作为SQL字符串变量
  6. ANT立即删除明文文件
  7. ANT部署代码和退出进入

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

我相信它可以更好,但...

JB

4

我个人持在配置文件中的口令然后将它们分发独立于应用程序,并可以改变的具体机/环境。在shell脚本中,您可以在主脚本中获取这些脚本。

然而,在Perl有多种方法。你不妨调查Getopt::Long的命令行选项(和另外Getopt::ArgvFile存储那些在一个简单的配置文件),或在看东西像Config::IniFiles的东西与它背后多了几分动力。这些是我通常使用的两种类型,但还有其他可用的配置文件模块。

1

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

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

没有完美的解决方案,因为在某种程度上,你必须能够解密,并获得明文密码......如果你能做到别人能过,如果他们有正确的信息。

特别是在我们给他们一个perl脚本的情况下(他们可以很容易地看到你是如何做加密的(和硬编码键) keyfile(也可以通过文件系统权限来保护)。

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

0

这是一个耻辱,我从来没有看到这个线程之前 - 它看起来很有趣。我会为未来的任何人添加我的两分钱。

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

如果你调用从另一台机器,设置一个词组少SSH密钥的脚本,并使用SSH到那里。然后,您可以将SQL结果返回给调用机器,并且可以进一步处理这些信息。

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

英戈

0

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

这应该足够少。

关键词:密码硬编码

0

有商业或更高级的解决方案,如cyberark AIM可以做的更好,但这样做是为了自由和开箱的,我一直背负的SSH公钥/私钥,因为一方面,最有可能已经创建的SSH密钥对符合安全策略;其次,SSH密钥对已经有一套标准协议,通过文件许可,连续系统强化(如tripwire)或密钥轮换来保护密钥。

这是我做的:

  1. 生成SSH密钥对,如果没有。密钥对和目录将受默认系统协议/权限的保护。 SSH-凯基-t RSA -b 2048

  2. 使用SSH公钥来加密字符串并存储在同一个.ssh目录 $回声 “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

PS - 我一直在尝试CYBERARK AIM无代理解决方案。这是一种痛苦,需要对API /脚本进行重大更改/ API更改。会让你张贴如何。