安全提示与实践¶
如今的黑客并不挑剔,他们的背景从无聊的青少年到国际情报机构不等。他们的脚本和机器人不断地在网络上爬行,寻找可以入侵的漏洞系统。系统的所有者无关紧要——无论是属于你还是五角大楼,目标都是利用安全性差的系统,看看可以控制或窃取什么资源。
如果你打算部署到基于云的主机上,你有必要保护你的应用程序——因为你可能在主机上存有信用卡信息,主机可以自由扣费。黑客利用你的 CPU 挖掘加密货币或饱和你的网络连接以参与僵尸网络或发送垃圾邮件,可能会导致你的托管费用增加、服务被暂停或你的地址/网站被 ISP 列入黑名单。事后要修复这些损害可能是一场艰难的法律或政治斗争。
作为即将把 Web 应用程序暴露在现代互联网威胁环境中的开发者,这里有一些提示可以帮助你提高 Evennia 安装的安全性。
了解你的日志¶
在紧急情况下,检查你的日志!默认情况下,它们位于 server/logs/
文件夹中。以下是一些重要的日志以及你应该关注的原因:
http_requests.log
显示了对 Evennia 内置 Web 服务器(TwistedWeb)的 HTTP 请求。这是查看人们是否在无意中浏览你的网站或试图通过代码注入破坏它的好方法。portal.log
显示了各种与网络相关的信息。这是检查游戏中是否有奇怪或异常的连接类型或数量,或其他与网络相关的问题的好地方——例如当用户报告无法连接时。server.log
是 MUX 管理员的好帮手。这里可以找到关于谁试图通过猜测密码进入系统、谁创建了什么对象等信息。如果你的游戏无法启动或崩溃而你找不到原因,这是你应该首先寻找答案的地方。与安全相关的事件以[SS]
为前缀,所以当出现问题时,你可能需要特别注意这些。
禁用开发/调试选项¶
在你第一次创建游戏时,有一些 Evennia/Django 选项被设置为使你更容易发现问题。这些选项在你将游戏推向生产环境之前应该被禁用——如果它们保持开启状态,可能会暴露一些变量或代码,使得恶意用户可以轻易地利用这些来破坏你的环境。
在 server/conf/settings.py
中:
# 禁用 Django 的调试模式
DEBUG = False
# 禁用游戏内等效功能
IN_GAME_ERRORS = False
# 如果你已注册域名,请强制 Django 检查主机头。否则保持原样。
# 注意前导点——这不是拼写错误!
ALLOWED_HOSTS = ['.example.com']
小心处理用户上传的图片¶
如果你决定允许用户上传自己的图片以从你的网站提供服务,必须特别小心。Django 会读取文件头以确认它是图片(而不是文档或压缩档案),但代码可以在文件头之后注入到图像文件中,这些代码可以被解释为 HTML 和/或给攻击者一个 Web shell,通过它可以访问其他文件系统资源。
Django 有更全面的关于如何处理用户上传文件的概述,但简而言之,你应该注意做到以下两点之一:
从独立域或 CDN(不是你已有的子域)提供所有用户上传的资源。例如,你可能正在浏览
reddit.com
,但注意到所有用户提交的图片都是从redd.it
域提供的。这在安全性和性能上都有好处(Web 服务器往往逐个加载本地资源,而会批量请求外部资源)。如果你不想为第二个域名付费,不理解这些意味着什么或不想处理额外的基础设施,那么在收到用户图片后,简单地使用图像库重新处理它们。例如,将它们转换为不同的格式。销毁原件!
禁用 Web 界面(如果你只想使用 telnet)¶
Web 界面允许访问者查看信息页面以及登录到基于浏览器的 telnet 客户端以访问 Evennia。它还提供了身份验证端点,攻击者可以尝试验证被盗的凭据列表,看看哪些可能被你的用户共享。Django 的安全性是稳健的,但如果你不想/不需要这些功能并完全打算强制你的用户使用传统客户端访问你的游戏,你可以考虑禁用其中一个或两个以最小化攻击面。
在 server/conf/settings.py
中:
# 禁用 Javascript webclient
WEBCLIENT_ENABLED = False
# 完全禁用网站
WEBSERVER_ENABLED = False
更改 SSH 端口¶
自动攻击通常会针对 22 端口,因为它是 SSH 流量的标准端口。此外,许多公共 WiFi 热点会阻止 22 端口的 SSH 流量,因此如果你喜欢远程工作或没有家庭互联网连接,可能无法从这些地方访问服务器。
如果你不打算运行网站或用 TLS 保护它,你可以通过将 SSH 使用的端口更改为 443 来缓解这两个问题,大多数/所有热点提供商假定这是 HTTPS 流量并允许通过。
(Ubuntu)在 /etc/ssh/sshd_config 中,更改以下变量:
# 我们监听的端口、IP 和协议
Port 443
保存、关闭,然后运行以下命令:
sudo service ssh restart
设置防火墙¶
Ubuntu 用户可以使用简单的 ufw 工具。其他人可以使用 iptables。
# 安装 ufw(如果尚未安装)
sudo apt-get install ufw
UFW 的默认策略是拒绝所有。我们必须指定我们想要通过防火墙允许的内容。
# 允许终端连接到你的游戏
sudo ufw allow 4000/tcp
# 允许浏览器连接到你的网站
sudo ufw allow 4001/tcp
根据你的 SSH 守护进程监听的端口,选择以下两个命令之一:
sudo ufw allow 22/tcp
sudo ufw allow 443/tcp
最后:
sudo ufw enable
现在唯一开放的端口将是你的管理 SSH 端口(无论你选择哪个),以及 Evennia 的 4000-4001 端口。
使用外部 Web 服务器/代理¶
在你的 Evennia 服务器前部署一个代理有一些好处;特别是它意味着你可以从 HTTPS URL(带加密)提供 Evennia 网站和 webclient 数据。可以使用任何代理,例如:
Nginx
等等。