如何为 Django 应用程序配置数据库权限?
Posted
技术标签:
【中文标题】如何为 Django 应用程序配置数据库权限?【英文标题】:How to configure database permissions for a Django app? 【发布时间】:2011-01-20 08:01:19 【问题描述】:我正在寻找有关如何正确配置数据库权限以保护 Django 应用程序的链接或答案?需要明确的是,我正在寻找专门处理数据库授权的材料,而不是 Django 框架本身的权限。
【问题讨论】:
【参考方案1】:来自 django 文档:
https://docs.djangoproject.com/en/dev/topics/install/
如果您打算使用 Django 的 manage.py syncdb 命令为您的模型自动创建数据库表(在首次安装 Django 并创建项目之后),您需要确保 Django 有权在您正在使用的数据库;如果您计划手动创建表,您可以简单地授予 Django SELECT、INSERT、UPDATE 和 DELETE 权限。在某些数据库上,Django 在 syncdb 期间需要 ALTER TABLE 权限,但在 syncdb 创建表后不会在表上发出 ALTER TABLE 语句。创建具有这些权限的数据库用户后,您将在项目的设置文件中指定详细信息,请参阅 DATABASES 了解详细信息。
【讨论】:
【参考方案2】:我刚刚测试了 mysql 的初始设置。对于python manage.py migrate
,至少您需要以下授权才能进行简单操作(如果您使用 db-preparation):
-
创建、更改、索引
选择、更新、插入、删除
顺便说一句 - 安全很重要。您可以通过限制系统暴露来减少攻击影响。在这种情况下——你可以限制“DROP”——这是相当大的优势。如果您留下一些具有 SQL 注入能力的棘手漏洞 - 您可能会减少损失。如果删除 DELETE 关键字不会造成任何伤害,我将在未来进行研究——这也会限制潜在的威胁。只是因为我们都会不时留下错误:)
【讨论】:
GRANT CREATE, ALTER, INDEX, SELECT, UPDATE, INSERT, DELETE ON django_db.* TO django_user@localhost IDENTIFIED BY 'django_password'; 不要忘记显然为 MySQL 5.7+ 授予 REFERENCES。今天第一次遇到这种情况。 在您的 django 项目中提供多个可以访问同一个数据库表但具有不同权限集的数据库用户也会很好。例如,2 个数据库用户申请同一张表,其中一个获得完全访问权限并用于您后端的内部操作,如备份/迁移,另一个具有最小访问权限(例如,ready-only、update-only ...等)并用于处理前端请求。【参考方案3】:我通常:
grant all privileges on my_db.* to my_user@localhost identified by 'my_user_pass'
grant all privileges on test_my_db.* to my_user@localhost identified by 'my_user_pass'
我想如果 django 中存在错误,您可能会在打开数据库时遇到可怕的事情,但是如果 django 中存在那么大的安全漏洞,您可能会遇到其他问题。
django 最少需要选择、插入、更新和删除来操作。如果您完全使用 test 或 syncdb,您还需要能够创建表和索引(可能还有加载 sql 固定装置的文件权限)。
因此,对于 mysql 数据库,我猜想最佳权限集可能是选择、插入、更新、删除、创建、索引和文件。如果您想获得真正的细节,您可以在表级别(而不是数据库级别)有选择地授予这些权限。
就个人而言,我发现grant all ...
更容易输入。
【讨论】:
谢谢赛斯。我也这样做。但是,正如您所说,我正在寻找“真正的细节”。不久前我在网上看到了一些详细介绍了这一点的东西,似乎值得强化。很遗憾我没有给它添加书签... 这个不用说了,不过在上面:flush privileges;
@mlissner 你能解释一下原因吗?
@NatanYellin:不知道为什么有必要——例如,它不在 Postgres 中。但是在 MySQL 中,这只是你授予权限后总是要做的事情。
万一其他人尝试这样做,对于 MySQL,FILE 权限不能放在特定数据库上,但必须是全局的:preetul.wordpress.com/2009/08/03/…【参考方案4】:
在数据库级别配置权限的目的是什么?如果您的服务器受到威胁,那么攻击者将能够对您的数据库做任何事情(因为他有登录名/密码)并且权限将无济于事。如果您的服务器是安全的,那么权限将毫无用处。
如果您的数据库服务器可从外部世界获得,则权限可能有意义,但这样做不是一个好主意。
【讨论】:
通过添加数据库权限,您有机会限制 SQL 注入等攻击可以实现的目标。如果 Web 服务器受到损害,数据库权限有可能限制损害 - 例如Web 应用登录可能没有任何理由能够删除数据库等。 使用 django 很容易避免 SQL 注入,我认为清除所有表和删除数据库之间没有太大区别。无论哪种方式,您的数据都会丢失,并且应该在消除漏洞后从备份中恢复任何内容。数据库级别的权限使您的项目更安全并不明显。我认为 django 没有内置对 DB 级权限的支持,因为最好努力解决实际问题:XSS、CSRF、SQL 注入等,而不是半途而废。 以下是 Microsoft 对 ASP.NET 应用程序的建议“...仅授予应用程序运行所需的最低权限。”和 SANS “......解决这个问题的方法应该是只授予应用程序运行所需的最低权限。”等缺陷可能存在于应用程序堆栈中的任何级别 - 为什么您不想使用所有可能的工具来防止攻击传播。 这些都是很好的建议。以 root 权限运行您的 Web 服务器确实是一个非常糟糕的主意。在同一台服务器上为不同站点设置不同的 unix 和 DB 用户是一个好主意。在许多情况下,这会有所帮助。但我看不出粒度 DB 级权限有什么帮助。如果攻击者在低于 django 或 django 级别的东西上成功,那么他至少具有与 django 实例相同的权限,因此他可以破坏数据库。 安全性是分层的。每一层都可以有所作为。以上是关于如何为 Django 应用程序配置数据库权限?的主要内容,如果未能解决你的问题,请参考以下文章
Django Rest Framework api如何为所有人添加身份验证权限