在shell/Perl脚本中保存密码的最佳实践?
我最近不得不磨练我的Perl和shell脚本技能来帮助一些同事。这些同事的任务是从一个具有大型Oracle数据库后端的内部应用程序中提供一些报告,但他们根本不具备这样做的技能。虽然有些人可能会质疑我是否具备这些技能(咧嘴一笑),但显然有足够多的人认为我具备这些技能,这意味着我无法逃避 所以我的问题是——为了从数据库中提取报告,我的脚本显然必须连接并运行查询。到目前为止,我还没有找到一个很好的解决方案来存储数据库的用户名和密码,所以它目前以明文形式存储在脚本中 是否有其他人已经编写的很好的解决方案,可能是作为CPAN模块?或者还有其他更好的方法吗?比如将用户/密码组合保存在一个完全独立的文件中,该文件隐藏在文件系统的其他地方?或者我应该对它们进行简单的加密,以避免它们被系统范围的grep从我的脚本中拉出 编辑: Oracle数据库位于HP-UX服务器上。在shell/Perl脚本中保存密码的最佳实践?,perl,oracle,bash,ksh,Perl,Oracle,Bash,Ksh,我最近不得不磨练我的Perl和shell脚本技能来帮助一些同事。这些同事的任务是从一个具有大型Oracle数据库后端的内部应用程序中提供一些报告,但他们根本不具备这样做的技能。虽然有些人可能会质疑我是否具备这些技能(咧嘴一笑),但显然有足够多的人认为我具备这些技能,这意味着我无法逃避 所以我的问题是——为了从数据库中提取报告,我的脚本显然必须连接并运行查询。到目前为止,我还没有找到一个很好的解决方案来存储数据库的用户名和密码,所以它目前以明文形式存储在脚本中 是否有其他人已经编写的很好的解决方案
应用服务器(运行shell脚本)是Solaris。
将脚本设置为仅由我拥有是不可能的,它们必须由多个支持人员可以访问的服务帐户拥有。
脚本将作为cron作业运行。
我很想使用公钥身份验证,但我不知道如何使用Oracle来实现这一点——如果有这样的方法的话——请告诉我 没有好的解决办法。你可以稍微混淆一下密码,但你无法保护它们 如果您可以控制DB设置,您可以尝试使用命名管道(至少mysql支持)进行连接,而无需密码,并让操作系统处理权限
您还可以将凭据存储在具有限制权限的文件中。最佳做法是在shell/Perl脚本中不保存任何密码。这就是公钥身份验证的目的。既然您已经标记了ksh和bash,我将假设为Linux 大多数问题是,如果用户可以读取脚本并找到用于隐藏/加密文件的方法,那么他们也可以手动执行相同的操作 更好的方法可能是执行以下操作:
通过这种方式,用户可以看到您的启动程序脚本,检查它,以查看它只有一个命令行。他们可以运行它,但他们没有权限读取sudo'd脚本的源代码。在UNIX中,我总是将这些脚本设置为setuid,并将用户和密码信息存储在一个受到严格保护的文件中(常规用户无法读取/搜索整个目录树,文件本身只能由脚本所有者读取).将它们保存在一个单独的文件中,进行简单的加密,并使数据库中的一个单独用户对必要的表具有只读访问权限。如果您认为该文件已被读取,则可以仅关闭对该用户的访问
如果您想了解更多,SUID程序可以检查/proc//exe和cmdline(在Linux中),然后才释放用户名。如果脚本是从服务器远程运行的
这样,用户所能做的就是为其报告选择数据。即使有人碰巧获得了密码,他们也会受限于如何使用密码。我不确定您正在运行的Oracle版本。在旧版本的Oracle(9i之前的高级安全性)上一些DBA将
创建由外部
标识的用户OPS$SCOTT,并将远程操作系统授权
设置为true
这意味着您的远程sun计算机可以将您认证为SCOTT,然后您的Oracle DB将接受该认证
这是个坏主意。
因为您可以想象任何带有本地用户SCOTT的Windows XP,所以无需密码即可登录到您的数据库
不幸的是,据我所知,Oracle 9i DBs的唯一选项是不将用户名/密码存储在脚本中或客户端计算机可以访问的其他地方
您的解决方案是什么?在提交之前,值得先浏览一下Oracle的解决方案。我遇到过一个类似的问题,即开发人员将SQL代码部署到MSSQL(事实上,部署到该MSSQL服务器上的任何数据库,所以角色必须是SysAdmin)在Solaris服务器上使用ANT。同样,我不想在ANT build.xml文件中存储用户名和密码,因此我知道我的解决方案并不理想,如下所示:
JB我个人在配置文件中保存密码,然后这些文件独立于应用程序分发,并且可以更改为特定的机器/环境