【问题标题】:Learning Python fast how can I protect some private connections from been exposed快速学习 Python 如何保护一些私有连接不被暴露
【发布时间】:2021-08-01 07:52:45
【问题描述】:

您好,我是社区的新手,也是 Python 的新手,在其他高级语言方面经验丰富但生疏,所以我的问题很简单。

我编写了一个简单的脚本来连接到私人 ftp 服务器,并从中检索日常信息。

from ftplib import FTP

#Open ftp connection
#Connect to server to retrieve inventory
#Open ftp connection

def FTPconnection(file_name):

    ftp = FTP('ftp.serveriuse.com')
    ftp.login('mylogin', 'password')

#List the files in the current directory
    print("Current File List:")
    file = ftp.dir()
    print(file)


# # #Get the latest csv file from server
#     ftp.cwd("/pub")

    gfile = open(file_name, "wb")
    ftp.retrbinary('RETR '+ file_name, gfile.write)
    gfile.close()
    ftp.quit()
    
FTPconnection('test1.csv')
FTPconnection('test2.csv')

这就是整个脚本,它传递我的凭据,然后在我正在检索的两个不同文件上调用函数 FTPconnection

然后我处理它们的另一个脚本有一个导入语句,因为我试图将此脚本称为模块,我的导入只是连接到 FTP 服务器并获取信息。

import ftpconnect as ftpc

这是在另一个 Python 脚本上进行处理的。 它可以工作,但我想改进它,所以我需要一些关于如何做到这一点的最佳实践的指导,因为在 Spyder 4.1.5 中我收到“模块 ftpconnect 已调用但未使用”警告..​​....所以我可能在这里遗漏了一些东西,我正在使用 Anaconda 和 Python 3.8.5 在 MacOS 上进行开发。

我正在尝试构建一个应用程序,以自动化一些任务,但我找不到任何关于指导我编写更好代码的模块的信息,它只是说你必须导入你使用的任何 .py 文件名,这将被视为一个模块... 我的最后一个问题是您通常如何保护私人信息(ftp 凭据)不被暴露?这与保护我的代码无关,而是凭据。

【问题讨论】:

  • 通常导入模块只定义函数和变量,导入它的脚本调用函数。导入模块来实际完成传输文件等所有工作是不寻常的。您的 IDE 假设是这种情况,因此当它看不到您从未调用任何导入的函数时会发出警告。
  • 好的@Barmar,感谢您的洞察力,如何支持您的回复?所以我无能为力,所以如果不是调用 ftpconnect.py 脚本上的函数以在我用于处理的脚本中调用它们,那么它会起作用,那么我该如何保护私人信息?这些凭据足以使用 Unix 权限还是有另一种常见做法?
  • 我的评论只是关于 Module ftpconnect called but unused 警告,与凭证存储无关。
  • 您可以通过在导入的脚本中调用 ftpc.FTPconnection('test1.csv') 来解决这个问题。

标签: python python-3.x ftp credentials python-module


【解决方案1】:

有一些选项可用于存储 Python 程序需要使用的密码和其他机密,尤其是需要在后台运行的程序,它不能只要求用户输入密码。

要避免的问题:

  1. 将密码签入到其他开发人员甚至公众可以看到的源代码控制中。
  2. 同一服务器上的其他用户从配置文件或源代码中读取密码。
  3. 将密码保存在源文件中,以便其他人在您编辑时可以看到。

选项 1:SSH

这并不总是一种选择,但它可能是最好的。您的私钥永远不会通过网络传输,SSH 只是运行数学计算来证明您拥有正确的密钥。

为了使其工作,您需要以下内容:

  • 需要通过 SSH 访问数据库或您正在访问的任何内容。尝试搜索“SSH”以及您正在访问的任何服务。例如,"ssh postgresql"。如果这不是您数据库中的一项功能,请转到下一个选项。
  • 创建一个帐户来运行将调用数据库的服务和generate an SSH key
  • 要么将公钥添加到您要调用的服务中,要么在该服务器上创建一个本地帐户,然后在其中安装公钥。

选项 2:环境变量

这个是最简单的,所以它可能是一个很好的起点。在Twelve Factor App 中有很好的描述。基本思想是您的源代码只是从环境变量中提取密码或其他机密,然后您在运行程序的每个系统上配置这些环境变量。如果您使用适用于大多数开发人员的默认值,这也可能是一个不错的选择。您必须在这与使您的软件“默认安全”之间取得平衡。

这是一个从环境变量中提取服务器、用户名和密码的示例。

import os

server = os.getenv('MY_APP_DB_SERVER', 'localhost')
user = os.getenv('MY_APP_DB_USER', 'myapp')
password = os.getenv('MY_APP_DB_PASSWORD', '')

db_connect(server, user, password)

查看如何在您的操作系统中设置环境变量,并考虑在自己的帐户下运行该服务。这样,当您在自己的帐户中运行程序时,环境变量中就不会有敏感数据。当您设置这些环境变量时,请特别注意其他用户无法读取它们。例如,检查文件权限。当然,任何具有 root 权限的用户都可以阅读它们,但这无济于事。如果您使用的是 systemd,请查看 service unit,并小心使用 EnvironmentFile 而不是 Environment 来获取任何秘密。任何使用systemctl show 的用户都可以查看Environment 值。

选项 3:配置文件

这与环境变量非常相似,但您是从文本文件中读取秘密。我仍然发现环境变量对于部署工具和持续集成服务器等更灵活。如果您决定使用配置文件,Python 支持标准库中的多种格式,例如 JSONINInetrcXML。您还可以找到像PyYAMLTOML 这样的外部包。就个人而言,我发现 JSON 和 YAML 使用起来最简单,而 YAML 允许使用 cmets。

配置文件需要考虑的三件事:

  1. 文件在哪里?可能是~/.my_app 之类的默认位置,以及使用不同位置的命令行选项。
  2. 确保其他用户无法读取该文件。
  3. 显然,不要将配置文件提交到源代码。您可能希望提交一个模板,用户可以将其复制到他们的主目录。

选项 4:Python 模块

有些项目只是将它们的秘密直接放入 Python 模块中。

# settings.py
db_server = 'dbhost1'
db_user = 'my_app'
db_password = 'correcthorsebatterystaple'

然后导入该模块以获取值。

# my_app.py
from settings import db_server, db_user, db_password

db_connect(db_server, db_user, db_password)

使用这种技术的一个项目是Django。显然,您不应该将 settings.py 提交到源代码控制,尽管您可能希望提交一个名为 settings_template.py 的文件,供用户复制和修改。

我发现这种技术存在一些问题:

  1. 开发人员可能会不小心将文件提交到源代码管理。将其添加到 .gitignore 可以降低这种风险。
  2. 您的某些代码不受源代码控制。如果你有纪律并且只在这里输入字符串和数字,那将不是问题。如果您开始在这里编写日志过滤器类,请停止!

如果您的项目已经使用此技术,则很容易过渡到环境变量。只需将所有设置值移动到环境变量中,然后更改 Python 模块以从这些环境变量中读取。

【讨论】:

  • 哇,谢谢@kinshukdua 提供的这些信息,是的,我也在学习 Django,我正在考虑这样做,当应用程序更成熟并且可以在线时,但在这些早期阶段,我是只是在本地开发,但我很好奇如何保护凭据,所以这些信息很棒,我从未考虑过使用环境变量,因为我什至没有接触 sys 或 os 模块(大约只使用了两次)......在这个早期阶段,都在一个目录中,我更专注于改进代码,但很高兴知道,这可以通过这种方式完成。
  • 没问题!如果它解决了您的问题,请点赞或选择它作为答案,以便将来搜索它的人可以找到它。快乐编码!
  • 嗯,这正是我想要做的,但由于模块只是另一个 .py 文件,我认为你可以让它变得更难,比如加密和解密或在 MySQL 中使用类似 PDO 的东西,我请记住,在 php 中使用 include 确实做到了这一点,但是 Python 就像 Basic,更加暴露,所以我做了一些研究,但找不到任何类似的东西。 @kinshukdua
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多