将确保应用程序安全的责任推卸给 QA 测试人员或信息安全部门是很诱人的,但安全是每个人的责任。Django Admin 是我们最喜欢的 Django 功能之一,但除非正确锁定,否则它会带来被利用的机会。为了使用户免受数据泄露之苦,以下是使 Django Admin 更安全的 10 个技巧。
1. 使用 SSL
在 HTTPS 后部署您的站点。如果您没有使用 HTTPS,那么当您在咖啡店、机场或其他公共场所时,其他人可能会窥探您(或您的用户)的密码。阅读有关启用 SSL 以及您可能需要采取的额外步骤的更多信息,请参阅 Django 文档)。
2. 更改 URL
将默认管理 URL 从 /admin/
更改为其他内容。说明在 Django 文档 中,但简而言之,将 URL conf 中的 admin/
替换为其他内容
urlpatterns = [
path('my-special-admin-login/', admin.site.urls),
]
为了更高的安全性,请将管理站点完全托管在不同的域上。如果您需要更高的安全性,请在 VPN 或非公开的地方提供管理站点。
3. 使用“django-admin-honeypot”
将管理站点移动到新 URL(甚至决定将其托管在自己的域上)后,在旧的 /admin/
URL 上安装库 django-admin-honeypot 以捕获黑客攻击您站点的尝试。django-admin-honeypot
生成一个虚假的管理员登录屏幕,并在有人尝试登录您旧的 /admin/
URL 时通过电子邮件通知您的站点管理员。
django-admin-honeypot
生成的电子邮件将包含攻击者的 IP 地址,因此为了增加安全性,如果您注意到来自同一 IP 地址的重复登录尝试,您可以阻止该地址使用您的站点。
4. 要求更强的密码
您的大多数用户都会选择弱密码。启用密码验证可以确保您的用户选择更强的密码,这将反过来提高他们的数据以及他们在管理站点中访问的数据的安全性。通过启用密码验证来要求强密码。Django 文档 对如何启用 Django 附带的密码验证器进行了很好的介绍。查看第三方密码验证器,如 django-zxcvbn-password,以使您用户的密码更加安全。Scot Hacker 发表了一篇关于 一篇很棒的文章,介绍了什么才是强密码以及如何在 Python 项目中实现 python-zxcvbn
库。
5. 使用双因素身份验证
双因素身份验证 (2FA) 是指您需要密码加上其他内容来验证用户对您站点的身份。您可能熟悉一些应用程序,它们需要密码,然后向您发送第二个登录代码短信,然后才允许您登录;这些应用程序正在使用 2FA。
您可以通过三种方式在您的站点上启用 2FA
- 使用短信进行 2FA,您可以在其中发送登录代码短信。这比仅要求密码要好,但短信消息非常容易被拦截。
- 使用像 Google Authenticator 这样的应用程序进行 2FA,它可以为您注册的任何服务生成唯一的登录代码。要设置这些应用程序,用户需要扫描您站点上的二维码,以将您的站点注册到他们的应用程序。然后,该应用程序将生成登录代码,他们可以使用该代码登录到您的站点。
- 使用 YubiKey 进行 2FA 是在您的站点上启用 2FA 最安全的方式。此方法要求您的用户拥有一个物理设备 YubiKey,当他们尝试登录时,他们将其插入 USB 端口。
库 django-two-factor-auth 可以帮助您启用上述任何 2FA 方法。
6. 使用最新版本的 Django
始终使用最新的 Django 小版本来跟上安全更新和错误修复。在撰写本文时,它是 Django 2.0.1。尽快升级到最新的长期发布版本 (LTS),但一定要确保您的项目在超出支持范围之前升级(请参阅 下载 页面上的受支持版本)。
7. 永远不要在生产环境中运行 `DEBUG`
当 DEBUG
在您的设置文件中设置为 True
时,错误将显示完整的追溯信息,其中可能包含您不希望最终用户看到的信息。您可能还有其他仅在调试模式下启用的设置或方法,这些设置或方法可能会对您的用户及其数据构成风险。
为避免这种情况,请为本地开发和生产部署使用不同的设置文件。查看 Vitor Freitas 撰写的关于 使用多个设置文件的精彩介绍。
8. 记住您的环境
管理站点应明确说明您所处的环境,以防止用户意外删除生产数据。您可以使用 django-admin-env-notice 库轻松完成此操作,该库将在您的管理站点顶部放置一个 颜色编码的横幅。
9. 检查错误
这并非 Django Admin 特有,但它仍然是保护您的应用程序的好习惯。使用 python manage.py check --deploy
查找安全错误。如果您在本地运行项目时运行此命令,您可能会看到一些在生产环境中无关紧要的警告。例如,您的 DEBUG
设置可能为 True
,但您已经在使用单独的设置文件来处理生产环境,对吗?
此命令的输出将如下所示
?: (security.W002) You do not have 'django.middleware.clickjacking.XFrameOptionsMiddleware' in your MIDDLEWARE, so your pages will not be served with an 'x-frame-options' header. Unless there is a good reason for your site to be served in a frame, you should consider enabling this header to help prevent clickjacking attacks.
?: (security.W012) SESSION_COOKIE_SECURE is not set to True. Using a secure-only session cookie makes it more difficult for network traffic sniffers to hijack user sessions.
?: (security.W016) You have 'django.middleware.csrf.CsrfViewMiddleware' in your MIDDLEWARE, but you have not set CSRF_COOKIE_SECURE to True. Using a secure-only CSRF cookie makes it more difficult for network traffic sniffers to steal the CSRF token.
System check identified 3 issues (0 silenced).
请注意,每个警告都包含对您的风险以及您应该更改的内容的解释。Django 文档 中提供了有关此检查的更多信息。
10. 进行检查
这是另一个并非管理站点特有的技巧,但仍然是一个很好的实践。部署到暂存站点后,通过 Sasha's Pony Checkup 运行您的网站。该站点将为您提供安全评分以及改进该评分的清晰列表。它将测试您的站点是否存在我们上面列出的一些问题,并建议其他方法来保护您的站点免受特定漏洞和攻击类型的侵害。
进一步阅读
想要了解有关 Django 安全性的更多信息?
- Haki Benita 写了关于 使 Django Admin 更安全的 5 种方法。
- Kelsey Gilmore-Innis 汇编了一个 Python 开发者安全资源列表。
1 条评论