ApliNi/blog

Minecraft Server 网络安全指北 `#1`

Opened this issue · 0 comments

ApliNi commented

配图与内容无关

尝试以最低的成本解决部分网络攻击.

  1. 不要为网络攻击花太多钱
    只要你为网络攻击出钱, 攻击者的目的就已达到.

对于 DDOS 等网络层的攻击

使用流量转发代理, 比如FRP(推荐)等内网穿透服务.
购买FRP服务商的非免费服务, 尽可能使用最多的节点且不重复.
发现攻击时关闭源服务器的端口并更换IP地址, 即使攻击影响了几个FRP节点, 也不会影响业务.

用分布式对抗分布式

从代理中获取访问者IP地址

FRP支持Proxy Protocol(代理协议), 可以向源服务器发送客户端的IP地址. 搜索proxy_protocol_version.
不过需要服务端安装用于支持代理协议的插件, 如HAProxyDetector.

误区

  1. 将服务器的域名解析到gov域或别人的域名上
    这样操作责任大概率属于你, 如果需要可以设置停止解析或127.0.0.1.

对于 假人/MOTD-PING 等应用层的攻击 (离线服务器)

对于非开放服务器可使用白名单解决, 同时请勿公开白名单中的玩家, 使用定时任务清理白名单中的旧账户防止被利用.

方案

  1. 防假人插件
    注意: 大部分防假人插件无法防御分布式假人攻击.
    建议: 登录队列 / 白名单 / 外置登录(参考对于在线服务器的解决方案) / 屏蔽IP段或地区.
  2. 防MOTD-PING插件
    注意: 大部分此类插件通过异步处理MOTD-PING请求并设置一段时间内回应请求的最大数量来降低服务器负载.
    推荐: 使用BC等代理服务器处理MOTD-PING请求. 使用尽可能简洁的MOTD信息和服务器图标(节省流量).
  3. 防止Spigot类服务端在Ping包中添加一部分玩家名称
    spigot.yml > settings.sample-count: 0.

对于 API调用次数消耗 等应用层的攻击 (在线服务器)

继承上方离线服务器的方案
正版服务器处理玩家登录时会向正版验证服务器的API发送NAME转UUID等请求, 此API对于每个IP地址有使用限制(每10分钟只能调用600次), 当遇到每10分钟超过600个假人的攻击时将会影响业务.
对此我没有一个好的方法, 对于非分布式的假人压测可以通过屏蔽IP段或通过IP归属地插件屏蔽地区来解决(屏蔽单个IP通常效果不好).
计划: 通过一个前置的代理服务器离线验证用户名(是否在白名单中), 对1分钟内使用超过2个用户名正版验证失败的IP进行屏蔽.
待补充....


对于游戏内部的攻击

安装反作弊插件可以解决大部分客户端作弊模组造成的漏洞利用和资源消耗. 建议所有服务器安装反作弊插件(非验证客户端模组类型的反作弊), 可以使用非常宽松以及没有请出玩家功能的配置.
安装漏洞修复插件以及保留Paper类服务端的默认反作弊配置可以解决大部分服务端的漏洞利用.
安装指令白名单插件, 防止客户端通过指令补全和信息指令了解服务器的插件.
及时更新插件, 通过Github, Spigot等开发者发布插件的地方下载, 而不是古老的搬运帖.
尽可能使用经常更新且使用人数多的开源插件, 并尽可能的防止插件向玩家显示版本号一类信息.
尽可能要求定制的插件开源并发布到MC论坛, 除非了解定制插件的开发者.

对于系统

  1. 对于全局备份: 使用外置的备份程序
    尽可能使用单独的备份程序备份服务器, 而不是备份插件.
  2. 不要使用ROOT/管理员权限运行MC服务器
    特别是不完全了解服务器中的插件时(如果插件要求管理员权限请检查或更换插件).

对于主机中其他服务的防攻击

大部分服务器会开放多个端口以添加更多功能或方便管理服务器, 而这一部分的攻击和漏洞利用应该不占少数.

  1. 避免使用常用端口, 一部分攻击者的端口扫描为了节约时间只扫描固定的几个常用端口, 如25565, 3306, 3389, 5900, 445, 20, 21, 22, 1080, 8080, 8888等.
    方案: 更改端口, 使用高强度密码(即使是将密码复制一遍用来添加长度).
  2. 对于WEB服务器, 避免证书扫描漏洞找出代理服务器背后的源站IP.
    如果WEB服务器开放的443端口与域名的证书相同, 即使使用代理服务器也可能被找出源站IP.
    方案: 使用CDN发放的源服务器证书 / 自签证书.
  3. 对于WEB服务器的后台扫描攻击.
    攻击者通过扫描目录找出可能存在的管理后台或未写完的后端程序, 类似MC服务器中的指令补全找插件.
    方案: 1. 所有错误均返回同一个错误页面以及200状态码. 2. 在管理页面使用验证码. 3. 防止访问后端的文件(如xxlib.php).
  4. 对于一些流行应用.
    1. 通用
      1. 尽可能使用FRP服务器或流量转发CDN(比如CloudFlare).
    2. 一些流行应用 (带有*号表示我使用过)
      1. *网页地图(Dynmap, HDMAP)
        1. 使用外部WEB服务器 - 降低MC服务器的负载.
        2. 使用服务端代理(NGINX)并调整配置 - 优化性能, 记录日志.
        3. 若使用内部服务器, 可配置最大连接数量等功能防止超载.
      2. 皮肤库/外置登录
        1. 避免访客浏览皮肤库 - 防止泄露玩家名称(对于离线的白名单服务器).
        2. 玩家登录页面添加验证码 - 防止爆破.
      3. *网页控制台(WebConsole)
        1. 为WebSocket添加证书 - 加密流量.
        2. 避免开放WEB面板(建议自带WEB面板使用) - 防止攻击者知道服务器可能有此功能.
        3. 避免使用公用主机 - 防止窃取地址和密码.
      4. 待补充...

对于玩家

服务器不仅要注意网络和应用层的攻击, 还要注意玩家(内鬼)带来更多攻击.

恶意宣传

恶意宣传服务器到其他服务器群, 恶意宣传的成本很低并且途径很多, 能对服务器和服务器的交流群造成破坏.

记录:

开几个 (或者买几个) qq号, 添加一堆服务器群, 藏几天然后发一大堆宣传链接和文字即可
并且受害方说不清, 如果再整几个假服务器做视频发网上, 服务器差不多就没了
不仅会有人来破坏服务器群, 还会有人直接破坏服务器
不需要去添加那些高门槛的服务器群, 因为那里面的人不容易整事

一个比较简单的方法是准备严格的白名单审核机制和与内群完全隔离的外群(审核群). 大部分情况会做这些破坏的人没有很多耐心.
但可能大部分受害的是开放的服务器, 对此我没有经验, 此部分等待补充...