如何管理生产服务器的 MySQL 凭证?

如何管理生产服务器的 MySQL 凭证?

我有一个简单的 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 中。

这是一个难题,有几种工具可以解决这个问题。我不敢妄自揣测,不知道哪种解决方案最适合您,但我建议您查看各种机密管理工具,然后选择一种适合您需求的工具。

相关内容