Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell/Perl脚本中保存密码的最佳实践?_Perl_Oracle_Bash_Ksh - Fatal编程技术网

在shell/Perl脚本中保存密码的最佳实践?

在shell/Perl脚本中保存密码的最佳实践?,perl,oracle,bash,ksh,Perl,Oracle,Bash,Ksh,我最近不得不磨练我的Perl和shell脚本技能来帮助一些同事。这些同事的任务是从一个具有大型Oracle数据库后端的内部应用程序中提供一些报告,但他们根本不具备这样做的技能。虽然有些人可能会质疑我是否具备这些技能(咧嘴一笑),但显然有足够多的人认为我具备这些技能,这意味着我无法逃避 所以我的问题是——为了从数据库中提取报告,我的脚本显然必须连接并运行查询。到目前为止,我还没有找到一个很好的解决方案来存储数据库的用户名和密码,所以它目前以明文形式存储在脚本中 是否有其他人已经编写的很好的解决方案

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

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

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

编辑: Oracle数据库位于HP-UX服务器上。
应用服务器(运行shell脚本)是Solaris。
将脚本设置为仅由我拥有是不可能的,它们必须由多个支持人员可以访问的服务帐户拥有。
脚本将作为cron作业运行。

我很想使用公钥身份验证,但我不知道如何使用Oracle来实现这一点——如果有这样的方法的话——请告诉我

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

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


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

最佳做法是在shell/Perl脚本中不保存任何密码。这就是公钥身份验证的目的。

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

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

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

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

  • 通过这种方式,用户可以看到您的启动程序脚本,检查它,以查看它只有一个命令行。他们可以运行它,但他们没有权限读取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文件中存储用户名和密码,因此我知道我的解决方案并不理想,如下所示:

  • 将用户名和密码的名称/值对存储在纯文本文件中
  • 加密文件(在Solaris上)并使用只有某些管理员知道的密码
  • 在Solaris系统上只保留加密文件
  • xml运行sudo解密并提示输入密码短语,密码短语由管理员输入
  • ANT源解密文件,将用户名和密码作为SQL字符串的变量加载
  • ANT立即删除了明文文件
  • ANT部署代码并退出
  • 这一切都发生在几秒钟之内,并且sql用户名和密码在服务器上永远都不可见。由于代码是由允许的管理员在生产中部署的,开发人员永远不需要将其包含在代码中

    我相信会更好,但是


    JB

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