gpt4 book ai didi

python - 如何在云计算环境中安全地分发凭证?

转载 作者:行者123 更新时间:2023-12-01 04:51:54 25 4
gpt4 key购买 nike

我正在开发一个 Python 项目,该项目涉及在可通过互联网访问的位置(例如数据库和存储桶)安全地检索和存储信息。根据各种因素,我可能会在本地计算机上运行代码,也可能在 Amazon AWS 或 Google Compute Engine 的数百个虚拟机上运行代码。

我使用 Github 存储库来维护版本控制并方便这些虚拟机访问代码。我不希望将诸如密码之类的凭据存储在存储库的平面文件中,即使存储库是私有(private)的。但是,我不知道如何自动向所有需要它们的各种机器提供必要的凭据。将凭据存储在虚拟机镜像中并不是最佳选择,因为我不想在凭据更改时创建新镜像。

是否有一种轻量级解决方案可以将此类凭据分发到不同的计算环境?

最佳答案

嗯 - 我是新人,但是这个请求真的偏离主题吗?我觉得还可以...

如果您使用 Python 和 GIT,那么我们使用 RC4 编写了一个将密码(和其他配置信息)存储为常规变量的解决方案。它使我们可以轻松地在开发计算机上以明文形式维护密码,自动加密密码,并在每次 git 推送时自动分发加密版本。您需要在每台生产计算机上手动安装私钥,但此后生产计算机上的 git pull 将提取更新的加密文件,并在运行时自动解密以在代码中使用。

该代码的一个很好的功能是,密码的解密(明文)副本永远不会永远到达生产计算机上的硬盘驱动器。然而,您可以直接在 python 代码中引用您的密码,并且大多数智能感知系统(例如 pyCharm 的)可以在生产计算机上编码期间查看密码变量。更改密码也非常容易 - 只需更新明文文件和 git push 即可。

我还没有为 SO 贡献任何东西,所以我不妨现在就开始。我将代码以及完整的自述文件放在 GitHub 存储库上:

https://github.com/KenYounge/security

获取 security.py 文件后,实现就很简单:

import security
for line in security.secure(): exec line in globals()

github 存储库中有完整的 README.md 文件和 helloworld.py 示例。下面是实现代码,供大家评论:

"""Secure python variables: encrypt, decrypt, import into global namespace."""
__module__ = 'security.py'
__author__ = "Kenneth A Younge"
__copyright__ = "Copyright (c) 2014, Kenneth A. Younge"
__license__ = "GNU General Public License"
__email__ = "kenyounge@gmail.com"

import os

def crypt(data, key):
x = 0
box = range(256)
for i in range(256):
x = (x + box[i] + ord(key[i % len(key)])) % 256
box[i], box[x] = box[x], box[i]
x = 0
y = 0
out = []
for char in data:
x = (x + 1) % 256
y = (y + box[x]) % 256
box[x], box[y] = box[y], box[x]
out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))
return ''.join(out)

def secure(file_names=('passwords.py',),
key_name='security.key',
key_path='~/',
pvt_path='_private/',
verbose=False):
"""Transform files (encrypt and/or decrypt _private files).

Keyword arguments:
filenames -- sequence of file names to encrypt/decrypt
key_name -- file name of your personal rc4 encryption key
key_path -- location of encryption key on production machines
pvt_path -- location of private files and encryption key during dev
verbose -- print info

Defaults:
filenames -- passwords.py currently a tuple with one file
key_name -- security.key
key_path -- ~/
pvt_path -- _private/
verbose -- False
"""

# Load key (try production location first)
if os.path.exists(os.path.join(key_path, key_name)):
key = open(os.path.join(key_path, key_name), 'r').read()
elif os.path.exists(os.path.join(
os.path.dirname(__file__), pvt_path + key_name)):
key = open(os.path.join(
os.path.dirname(__file__), pvt_path + key_name), 'r').read()
else:
key = open(os.path.join(
os.path.dirname(__file__), key_name), 'r').read()

# secure each file
code_lines = []
for filename in file_names:

filename_raw = os.path.join(
os.path.dirname(__file__), pvt_path + filename)
filename_rc4 = os.path.join(
os.path.dirname(__file__),
os.path.basename(filename).replace('.py', '.rc4'))

# Encrypt
try:
if os.path.exists(filename_raw):
with open(filename_raw, 'r') as f:
text = f.read()
with open(filename_rc4, 'w') as f:
f.write(crypt(str(text).strip(), key).encode('hex'))
if verbose:
print 'Encrypted ' + filename_raw
else:
if verbose:
print('File (' + filename_raw + ') not found')
except Exception as e:
print(str(e))

# Decrypt
try:
if os.path.exists(filename_rc4):
with open(filename_rc4, 'r') as f:
text = crypt(str(f.read()).strip().decode('hex'), key)
lines = [str(line).strip() for line in text.splitlines()]
if lines: code_lines.extend(lines)
if verbose:
print 'Encrypted ' + filename_rc4
else:
print('File ' + filename_rc4 + ' not found')
except Exception as e:
print(str(e))
return code_lines

关于python - 如何在云计算环境中安全地分发凭证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28246804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com