- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 Python 项目,该项目涉及在可通过互联网访问的位置(例如数据库和存储桶)安全地检索和存储信息。根据各种因素,我可能会在本地计算机上运行代码,也可能在 Amazon AWS 或 Google Compute Engine 的数百个虚拟机上运行代码。
我使用 Github 存储库来维护版本控制并方便这些虚拟机访问代码。我不希望将诸如密码之类的凭据存储在存储库的平面文件中,即使存储库是私有(private)的。但是,我不知道如何自动向所有需要它们的各种机器提供必要的凭据。将凭据存储在虚拟机镜像中并不是最佳选择,因为我不想在凭据更改时创建新镜像。
是否有一种轻量级解决方案可以将此类凭据分发到不同的计算环境?
最佳答案
嗯 - 我是新人,但是这个请求真的偏离主题吗?我觉得还可以...
如果您使用 Python 和 GIT,那么我们使用 RC4 编写了一个将密码(和其他配置信息)存储为常规变量的解决方案。它使我们可以轻松地在开发计算机上以明文形式维护密码,自动加密密码,并在每次 git 推送时自动分发加密版本。您需要在每台生产计算机上手动安装私钥,但此后生产计算机上的 git pull 将提取更新的加密文件,并在运行时自动解密以在代码中使用。
该代码的一个很好的功能是,密码的解密(明文)副本永远不会永远到达生产计算机上的硬盘驱动器。然而,您可以直接在 python 代码中引用您的密码,并且大多数智能感知系统(例如 pyCharm 的)可以在生产计算机上编码期间查看密码变量。更改密码也非常容易 - 只需更新明文文件和 git push 即可。
我还没有为 SO 贡献任何东西,所以我不妨现在就开始。我将代码以及完整的自述文件放在 GitHub 存储库上:
获取 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/
我是一名优秀的程序员,十分优秀!