快速学习Python如何保护某些私有连接不被暴露

2024-04-26 01:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我是这个社区的新手,也是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

然后,我处理它们的另一个脚本有一个import语句,因为我试图将这个脚本作为一个模块调用,我的import所做的只是连接到FTP服务器并获取信息

import ftpconnect as ftpc

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

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


1条回答
网友
1楼 · 发布于 2024-04-26 01:29:47

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来获取任何机密Environment值可由任何使用systemctl show的用户查看

选项3:配置文件

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

使用配置文件考虑的三件事情:

  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模块更改为从这些环境变量读取

相关问题 更多 >