本地账户与初始化安全
开源独立服务器把鉴权限流状态保存在有界进程内存中,不要求 Redis 或其他外部组件。
账户登录
失败请求默认按 IPv4 /32 或 IPv6 /64 聚合。固定 15 分钟窗口内失败 20 次会触发 临时指数锁定,首次锁定 60 秒。登录成功会清除该网络身份的状态。锁定状态不跨进程, 重启后会清空;公网部署还应配合上游网络防护。
密码登录策略阈值固定;IPv6 聚合前缀和有界的登录 / 兑换容量档位可配置。 访问码兑换有独立的保护设置,见下文。
初始化令牌
首次初始化前设置 LRD_BOOTSTRAP_TOKEN,可以防止第一个匿名访问者抢注管理员账户。 只有错误令牌才消费 /api/init 与初始化前连接验证共享的预算:10 分钟内 20 次失败。 真正获得授权的外联探测使用独立的 10 分钟 60 次预算,并且只在即将访问网络时计数。
两个安全 quota 的有界表容量耗尽时都会 fail-closed。如果攻击已经停止但首次安装仍被 阻塞,可以重启进程或容器清空内存中的 bootstrap/probe 状态;持久化设置和环境变量中 的令牌不会改变。重启不能防御持续攻击,也不能代替常态 redeem 入口的容量治理。
令牌只能放在 POST body 中。跨主机访问时,请在服务器前终结 TLS,并设置 LRD_COOKIE_SECURE=true;明文 HTTP 可能让网络中的攻击者窃取令牌和会话 Cookie。
访问码兑换
在「设置 → 设备码 → 访问码保护」中,可调整请求窗口、每来源网络的次数上限、失败窗口和阈值、初始及最大锁定时长。秒数为 1~86400 的整数,次数为 1~100000 的整数;最大锁定不能短于初始锁定。开源兑换没有独立账号维度,不显示每账号限制。
Default 模式默认按来源网络限制为每 60 秒最多 5 次,成功和失败都占次数;不可用码默认在 15 分钟内累计 20 次后锁定 60 秒,后续失败指数退避,默认最多 1 小时。可单独关闭连续失败退避,基础频率限制仍保留。提示尝试过多时请等待后重试。独立 Signaling 模式不开放兑换。
保存后新的兑换请求采用新参数,不清空已有计数或锁。已有窗口和锁保留原到期时间,新上限用于判断已有次数,新建窗口及后续失败采用新参数。
兑换与密码登录使用独立状态,成功兑换或密码登录不会清除兑换失败记录。失败记录和锁 自然到期;有界表满时拒绝新来源,不驱逐有效失败记录。容量沿用 LRD_AUTH_RATE_LIMIT_MAX_BUCKETS(默认 65536);成功请求只占短期频次,不创建长期失败记录。 已有连接与已兑换授权不受尝试次数限制影响。限流返回业务码 32,HTTP 状态仍为 200。
反向代理
默认信任回环 peer(127.0.0.0/8、::1)。其他代理地址通过 LRD_TRUSTED_PROXIES 显式加入,不要为了方便信任整个局域网。只有直接 peer 可信时 才读取 X-Forwarded-For。可信判断和限流前会先规范化 IPv4-mapped IPv6 地址。
当前 server 没有 CORS 中间件,正常跨源浏览器预检无法经 loopback 连接发送自定义 XFF。未来任何 CORS 或 Private Network Access 调整都必须重新评审这一前提。