【问题标题】:plain Password is logged via my python script普通密码是通过我的 python 脚本记录的
【发布时间】:2015-07-02 20:02:09
【问题描述】:

我有一个示例 python 脚本:sample.py。该脚本将参数作为连接到某个远程服务器的用户名和密码。当我运行脚本 sample.py --username --password 时,密码被记录在 linux 消息文件中。我知道这是一种 linux 行为,但想知道我们是否可以在我的脚本中做任何事情来避免这种日志记录。我能想到的一种方法是以交互方式提供密码。还有其他建议吗?

【问题讨论】:

  • 为什么你的命令会被放到系统日志文件中?
  • 一方面,history 将使用包含密码的脚本调用存储一段时间。
  • 这可能会有所帮助:stackoverflow.com/q/157938/2382792

标签: python linux passwords


【解决方案1】:

这可能会有所帮助:

$ export HISTIGNORE="your_python_script_name *"

这需要在您调用脚本之前完成,因此您可能需要编写一个简单地调用此命令的 shell 脚本,然后使用 args 调用您的 python 脚本。

【讨论】:

  • 问题不在于历史。问题是它记录在系统日志消息文件中。
【解决方案2】:

Python 有 getpass 模块来处理用户和密码信息,尽管这些是按照您的建议以交互方式提供的,但具有额外的安全层。它使用起来也很简单,有getpassgetuser 方法可用。

例子:

import getpass

password = getpass.getpass() # Prompts "Password:" automatically

【讨论】:

  • 我已经实现了这个。但我正在寻找某种方式,我可以避免交互方式,也不会在消息文件中记录密码。
  • 您希望避免密码显示在消息日志中,historyps,对吧?一种可能性是将密码存储在文本文件中,然后传递文件本身或带有密码的行?
【解决方案3】:

快速阅读此答案:Command lines will always be visible

简而言之,您不应该将密码作为命令行参数传递,因为它们在很多地方都可见。例如,当您尝试按照您的建议进行操作时,MySQL 会显示 Warning: Using a password on the command line interface can be insecure.

使用getpass 以交互方式传递它当然可以解决问题。

另一种解决方案是复制sudo -S,它允许您通过标准输入(或其他文件描述符,如果您喜欢冒险)提供密码。那将变成:

import sys
sys.stdin.readline().rstrip()

rstrip 用于删除尾随的新行( sudo -S 也希望如此),但它也会删除密码中的任何空格。如果不需要尾随的新行:

import sys
sys.stdin.read()

另一种方法是使用环境变量。这依赖于操作系统的安全性,但对于任何最近的 Linux 来说显然是 valid,并且被 12 因素推荐。对于成熟的部署环境,这将是我最喜欢的方法。

最后,可以选择将密码存储在文件中并依靠文件系统权限来控制访问。在我看来,这有点直截了当。

“最佳”解决方案可能是结合使用这些方法,在各种方法之间进行回退,并对最初使用的不安全方法发出 MySQL 样式的警告。

【讨论】:

    【解决方案4】:

    我发现最好的方法是通过 sudo 命令禁用它: Cmnd_Alias 脚本 = 默认值!脚本!系统日志

    sudoers.conf 中的上述行应该有助于防止登录 syslog。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 2018-01-05
      • 2013-05-12
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2021-04-10
      • 2012-06-29
      相关资源
      最近更新 更多