当前项目要求转储、加密数据库并将其推送到 s3。我想知道完成此类任务的“最佳实践”是什么。目前,我使用的是相当直接的方法,但希望在安全性方面有一些更好的想法。以下是我的脚本的开头:
mysqldump -u root --password="lepass" --all-databases --single-transaction > db.backup.sql
tar -c db.backup.sql | openssl des3 -salt --passphrase foopass > db.backup.tarfile
s3put backup/db.backup.tarfile db.backup.tarfile
# Let's pull it down again and untar it for kicks
s3get surgeryflow-backup/db/db.backup.tarfile db.backup.tarfile
cat db.backup.tarfile | openssl des3 -d -salt --passphrase foopass |tar -xvj
显然问题在于这个脚本提供了攻击者制造麻烦所需的一切。
对于这项任务的任何想法、批评和建议都将受到赞赏。
答案1
首先,您可以在 mysql 中创建一个对相关数据库具有只读权限的“用户”,这样可以减少潜在的破坏性损害,如果攻击者获得对您的备份脚本的访问权限。
然后您可以在压缩备份之前或之后使用gpg
或pgp
加密它,并且您可以使用公钥来执行此操作而无需提供密码。
当然,您应该chmod 700 backupscript.sh
防止任何人读取您的密码。
可能还有其他方法可以进行无密码数据库快照,但我还不知道有任何一种方法。
gpg
或者pgp
似乎是openssl
您提到的方法的更好的替代方法,因为它可以在没有密码的情况下完成。
#!/bin/sh
touch db.backup.sql.gz
chmod 600 db.backup.sql.gz
mysqldump -u nonprivuser --password="pass" --all-databases --single-transaction | gzip > db.backup.sql.gz
gpg -e -r [email protected] db.backup.sql.gz && rm -f db.backup.sql.gz
s3put backup/db.backup.sql.gz.gpg db.backup.sql.gz.gpg
答案2
在脚本中使用密码是一个非常糟糕的主意,因为ps aux
每个系统用户都可以看到和读出它。
我建议你看看mysqldump-安全openssl
。这是一个基于公私钥加密进行加密的shell脚本,性能比gpg好很多。
答案3
您也可以只使用 RDS,它会为您完成所有这些工作。