乐于分享
好东西不私藏

离线模式服务器的安全基石,这个插件让盗号变得不可能

离线模式服务器的安全基石,这个插件让盗号变得不可能

离线模式(Offline mode)的 Minecraft 服务器有一个天然的安全漏洞:任何人都可以用任何用户名连接。服务器无法验证你到底是不是你声称的那个玩家——因为离线模式不连接 Mojang 的认证服务器。如果有人知道服务器上某个管理员的用户名,他只需要把游戏 ID 改成管理员的名字连上去,就能获得管理员权限。这就是所谓的「盗号」攻击(username stealing)。AuthMe 就是解决这个问题的。

AuthMe Reloaded 目前有 872 个 Star,采用 GPL-3.0 协议,用 Java 写成。它是 MC 服务端最流行的身份验证插件,README 中自称「The best authentication plugin for the Bukkit modding API」。bStats 统计数据显示它在离线模式服务器中的使用量长期排名第一。从老版本的 AuthMe 到现在的 AuthMeReloaded,项目已经持续维护了超过十年。

工作原理

AuthMe 的机制很直白:玩家进服后不能做任何事——不能移动、不能放方块、不能打命令、不能用物品栏——直到完成身份验证。验证方式是输入密码。第一次进服需要注册密码(/register 密码 确认密码),之后每次进服需要登录(/login 密码)。验证通过后限制解除,玩家可以正常游戏。

如果有人盗用管理员用户名连接,他不知道密码就无法通过验证,只能站在原地什么都做不了。管理员上线后输入密码验证通过,踢掉那个盗号者就行了。

Session Login 功能让这个流程不那么烦人。启用后玩家在同一 IP 的 Session 有效期内重连不需要重新输入密码,只在 IP 变化或 Session 过期时才需要重新验证。这对于频繁掉线重连的服务器体验很重要。

密码存储安全

AuthMe 存储的不是明文密码,而是密码哈希。支持的哈希算法覆盖了从简单到高安全的多个级别。

基础算法 SHA256 是默认选项,速度快但安全性一般。推荐使用的是现代密码哈希算法:ARGON2(2015 年密码哈希竞赛冠军,目前最安全的密码哈希算法之一)、BCRYPT(业界标准,带 salt 的自适应哈希)、PBKDF2(NIST 标准的密钥派生函数)。

AuthMe 还能兼容外部系统的密码哈希——XFBCRYPT(XenForo 论坛系统)、MYBB(MyBB 论坛)、PHPBB(phpBB 论坛)、JOOMLA(Joomla CMS)、WORDPRESS(WordPress)、WBB3/WBB4(WoltLab 论坛)、IPB3(Invision 论坛)。这意味着如果你的 MC 服务器和一个论坛共用账号系统,AuthMe 可以直接读取论坛数据库中的密码哈希做验证,用户在论坛注册的账号密码和 MC 登录密码完全一致,零迁移成本。

数据库支持覆盖 MySQL、MariaDB、PostgreSQL 和 SQLite 四种后端。缓存机制将常用查询结果缓存在内存中,避免每次登录都查数据库。

反机器人系统

离线模式服务器经常面临的一种攻击是机器人注册攻击(bot registration attack)。攻击者写脚本用随机用户名批量注册账号,短时间内创建上万个垃圾账号,污染数据库甚至导致服务器崩溃。

AuthMe 内置了 AntiBot 系统来防御这种攻击。它通过监控注册频率来检测异常——如果短时间内出现大量来自不同 IP 的注册请求,系统会自动开启 AntiBot 模式,暂时阻止新注册。管理员可以配置触发阈值(如 30 秒内超过 5 次注册触发 AntiBot)。

此外 AuthMe 还支持基于 GeoIP 的国家黑名单/白名单。通过 MaxMind 的 GeoIP 数据库检测连接者的 IP 地理位置,管理员可以配置只允许或禁止特定国家的连接。比如只允许中国 IP 连接的服务器可以配置 GeoIP 白名单为中国,从源头阻止海外 bot 攻击。

图形化登录界面

AuthMe 的一个现代特性是图形化登录对话框。传统的 AuthMe 登录是通过聊天框输入命令——/login password。这对于 MC 新玩家来说不够直观,而且密码会出现在聊天记录里。

新的 Dialog UI 功能(需要 Paper/Folia 1.21.11+)提供了图形化的登录界面。玩家进服后会弹出一个类似书与笔的对话框,里面有密码输入框和确认按钮。密码输入不会出现在聊天记录中,体验更接近现代游戏的安全登录界面。

Dialog UI 有两种模式。Post-Join 模式在玩家进入服务器后弹出对话框,玩家在验证前被冻结在原地。Pre-Join 模式(仅 Paper/Folia 支持)在玩家完全加入服务器之前就弹出对话框,未验证的玩家连实体都不会在世界上出现。Pre-Join 更安全——防止盗号者利用登录前的短暂窗口做任何事。

Premium Bypass:正版玩家免密登录

Premium Bypass 是 AuthMe 最巧妙的功能。它让拥有正版 Minecraft 账号(Mojang 账号)的玩家跳过密码验证,直接进服。

原理是这样的:当正版玩家连接时,AuthMe 通过 Mojang 的会话服务器验证玩家身份——如果 Mojang 确认「这个连接确实是拥有此用户名的正版玩家」,AuthMe 直接放行不需要密码。验证过程使用加密握手,安全性等同于 Mojang 官方认证。

这个功能对混合模式服务器特别有价值——服务器既有正版玩家(花了钱买了 MC 的)也有离线模式玩家(用启动器免费玩的)。正版玩家不需要输密码(因为他们已经通过了 Mojang 认证),离线模式玩家需要输密码(因为他们无法被 Mojang 认证)。两种玩家可以在同一服务器共存,体验差异最小化。

Premium Bypass 在不同部署模式下的要求不同。直连模式(服务器直接面向玩家,offline mode)需要安装 PacketEvents 插件来实现登录阶段的身份验证。通过在线代理(Velocity/BungeeCord,online mode)时代理层已完成 Mojang 认证,后端 AuthMe 不需要额外依赖。通过离线代理时需要在代理层安装 authme-velocity 或 authme-bungee。

多平台支持

AuthMe 的构建系统为不同服务端平台输出不同的 jar 包,覆盖了 MC 服务端生态的全谱系。

AuthMe-Spigot-Legacy.jar:适用于 Spigot 1.16 到 1.19,Java 17+。AuthMe-Spigot-1.21.jar:适用于 Spigot 1.20 到 1.21,Java 21+。AuthMe-Paper.jar:适用于 Paper 1.21+,Java 21+。AuthMe-Folia.jar:适用于 Folia 1.21+,Java 21+(专门适配了 Folia 的多线程架构)。AuthMe-Bungee.jar:适用于 BungeeCord/Waterfall 代理,Java 21+。AuthMe-Velocity.jar:适用于 Velocity 3.4+代理,Java 21+。

BungeeCord 和 Velocity 的原生代理插件是一个重要的架构选择。在多服网络中,把认证逻辑放在代理层而不是后端游戏服上有一个好处:玩家只需验证一次,然后可以在网络内所有子服间自由跳转,不需要每个子服都做认证。AuthMe 的代理插件通过转发已验证的 UUID 到后端来实现这一点。

账号迁移和导入

AuthMe 支持从其他认证插件导入账号数据。支持导入的来源包括 Auth+、LibreLogin、LimboAuth、nLogin、OpeNLogin、tiAuth——这些都是 MC 社区中常见的认证插件。如果你的服务器之前用的是这些插件之一,迁移到 AuthMe 时不需要让所有玩家重新注册。

数据库类型之间也支持迁移。/authme converter sqliteToSql 命令可以把 SQLite 数据库迁移到 MySQL/MariaDB/PostgreSQL。这对于从小型服务器升级到大型服务器(SQLite 扛不住了换 MySQL)的场景很有用。

安全细节

AuthMe 在安全细节上做得相当到位。玩家在验证前不能移动——位置被锁定在登录点。物品栏被隐藏——通过 PacketEvents 拦截客户端数据包,防止玩家在验证前看到或操作物品栏。末影珍珠在验证前投出会被退还——防止利用末影珍珠在验证瞬间传送。玩家退出时的位置会被记录——防止利用重连绕过区域限制。

这些细节看起来小,但每一个都对应一种可能的攻击手段。MC 服务端的安全攻防历史中,登录验证阶段是漏洞高发区——玩家在验证前虽然不能正常游戏,但可以通过各种数据包操作(移动、投掷物品、打开物品栏)来探测服务器状态或触发 bug。AuthMe 的这些防护措施堵住了这些攻击面。

写在最后

AuthMe 是 MC 离线模式服务器的安全基石。在中国 MC 服务器生态中,由于正版购买门槛和历史原因,大量服务器运行在离线模式下。AuthMe 几乎是中国 MC 服务器的标配插件——没有它,任何知道你管理员用户名的人都能在 5 分钟内接管你的服务器。

即使你的服务器是正版模式(Online mode),AuthMe 也有价值——Premium Bypass 让正版玩家无感登录、AntiBot 防御机器人攻击、GeoIP 国家过滤等功能在正版服务器上同样有用。

项目地址:github.com/AuthMe/AuthMeReloaded 文档:github.com/AuthMe/AuthMeReloaded/blob/master/docs/config.md