我有一个简单的 Django 应用程序,需要使用 MySQL 数据库。有一个文件settings.py
包含一个简单的 Python 字典,我必须在其中输入 MySQL 凭据,它看起来像这样:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'django',
'PASSWORD': 'django',
'HOST': 'localhost',
}
}
在服务器 (Debian) 上,我使用应用程序的最新 git 版本进行签出。在该 git repo 中,我有一个分支,production
其中包含我为此服务器选择的数据库凭据。
现在我想完全自动化部署。目前,我使用 Ansible 来执行
git checkout production
git pull origin master
service apache2 restart
可以。问题是这个数据库凭证补丁只在服务器上。我更希望这个补丁也集中安装。
我觉得可以让 Ansible 先部署 vanilla 版本,然后再用 Ansible 交换线路
PASSWORD
。缺点是下次运行 Ansible 时会检测到 checkout 已更改,然后重新执行所有操作,效率很低。然后我想到了一个 Debian 软件包来装整个东西。这需要将凭证嵌入到软件包中,而我无法做到这一点,因为软件包是公开的(使用 Launchpad PPA)。
无论哪种方式,我可能需要将凭证放在原始部署可以找到的某个位置,例如/etc/myapp/db.ini
。
什么是合理的方法来做到这一点?
答案1
机密管理是一个极其困难的问题。你永远都不想在代码中保存明文密码。
有一些工具可以处理机密,包括 Ansible Vault、Hashicorp Vault 和 Keywhiz。我个人使用 KMS 加密将机密存储在 S3 中。
这是一个难题,有几种工具可以解决这个问题。我不敢妄自揣测,不知道哪种解决方案最适合您,但我建议您查看各种机密管理工具,然后选择一种适合您需求的工具。