3. 身份认证与访问控制(IAM):多因素认证(MFA)、基于角色的访问控制(RBAC)、最小权限原则

聊到跨境做市系统的安全,我第一个想到的就是「门锁」。你想想看,一个交易系统每天处理几亿甚至几十亿的资金流动,如果门锁不牢,那后果不堪设想。身份认证与访问控制(IAM),说白了就是给系统装上一套靠谱的门禁系统。

我个人习惯把 IAM 拆成三个层次来看:你是谁(认证)、你能干什么(授权)、你只能干必要的(最小权限)。这三个层次缺一不可,而且必须层层递进。

3.1 多因素认证(MFA):别只靠一把钥匙

我记得刚入行那会儿,很多系统还停留在「用户名+密码」的单一认证方式。那时候我就觉得不踏实——密码太容易被攻破了。后来在跨境做市项目中,我坚持必须上 MFA。

MFA 的核心逻辑很简单:至少使用两种不同类型的认证因子。常见的因子分三类:

  • 你知道的:密码、PIN码、安全问题答案
  • 你拥有的:手机(短信验证码)、硬件令牌、U盾
  • 你本身的:指纹、人脸、虹膜

在跨境做市系统里,我建议至少组合「你知道的」和「你拥有的」两种因子。举个例子:

// 伪代码:MFA 认证流程示例
function authenticateUser(username, password, totpCode) {
    // 第一步:验证密码(你知道的)
    if (!verifyPassword(username, password)) {
        return "密码错误";
    }
    
    // 第二步:验证 TOTP 动态码(你拥有的)
    if (!verifyTOTP(username, totpCode)) {
        return "动态码无效";
    }
    
    // 第三步:记录审计日志
    auditLog(username, "MFA_AUTH_SUCCESS", getClientIP());
    
    return "认证成功,生成会话令牌";
}
我的经验: 别用短信验证码作为唯一的第二因子。跨境场景下,短信可能延迟甚至丢失。我推荐使用 TOTP(基于时间的一次性密码)或硬件令牌,延迟低、可靠性高。

3.2 基于角色的访问控制(RBAC):给每个人贴个标签

认证通过之后,接下来就是授权。RBAC 是我最常用的授权模型,没有之一。为什么?因为它简单、直观、好管理。

RBAC 的核心思想是:不直接给用户分配权限,而是给角色分配权限,再把用户分配到角色里。你想想看,一个做市系统里可能有几十种操作权限,如果每个用户单独配,那运维人员得疯掉。

我一般会把跨境做市系统的角色分成这么几类:

角色名称 权限范围 典型用户
交易员 查看行情、提交订单、撤销订单 前台交易人员
风控员 查看所有订单、设置风控阈值、冻结账户 风险管理团队
审计员 查看所有日志、导出报表 合规与审计部门
系统管理员 用户管理、角色管理、系统配置 IT 运维团队

这里有个坑,我曾经踩过。一开始我把「查看所有订单」的权限同时给了风控员和审计员,后来发现审计员能看到交易员的个人信息,这其实是不合规的。所以 RBAC 的粒度一定要细,权限要精确到「能看什么字段」这个级别

避坑指南: 我曾经在一个项目中,因为角色定义太粗,导致一个实习生误操作删除了生产环境的交易配置。从那以后,我坚持每个角色都要经过「最小权限评审」才能上线。

3.3 最小权限原则:给得少,错得少

最小权限原则,说白了就是「够用就好」。一个交易员只需要下单和撤单的权限,你就不该给他配置风控参数的权限。这个道理听起来简单,但实际落地时很容易走样。

我见过不少系统,一开始权限控制做得挺好,但时间一长,各种「临时权限」越堆越多,最后变成了「最大权限」。嗯,这里要注意,权限的「膨胀」是安全的大敌。

在跨境做市系统里,我一般会这样落地最小权限原则:

  1. 默认拒绝:所有权限默认关闭,只有明确授权才开放
  2. 按需申请:用户需要某个权限时,必须提交申请并说明理由
  3. 定期审计:每季度检查一次所有用户的权限,清理不必要的授权
  4. 临时权限自动过期:临时权限设置有效期,到期自动回收

举个例子,一个交易员需要临时查看某个风控报表,正确的做法是:

// 临时权限授予示例
function grantTemporaryPermission(userId, permissionId, durationHours) {
    // 记录授权原因
    var reason = getApprovalReason(userId, permissionId);
    
    // 设置过期时间
    var expireTime = Date.now() + durationHours * 3600 * 1000;
    
    // 写入权限缓存
    tempPermissionCache.set(userId + ":" + permissionId, {
        expireAt: expireTime,
        reason: reason,
        grantedBy: getCurrentAdmin()
    });
    
    // 发送通知
    notifyUser(userId, "您已获得临时权限,将于 " + new Date(expireTime) + " 过期");
}
核心观点: 最小权限不是「不给权限」,而是「给得精准」。好的权限设计,能让业务顺畅运行,同时把风险降到最低。

3.4 三者如何协同工作?

MFA、RBAC、最小权限原则,这三者不是孤立的。我习惯把它们串成一条链路:

  • MFA 负责第一道门:确认「你是谁」
  • RBAC 负责第二道门:确认「你能进哪个房间」
  • 最小权限 负责第三道门:确认「你在房间里能碰哪些东西」

下面这张图是我自己总结的 IAM 三层防护模型,你可以看看:

跨境做市系统 IAM 三层防护模型 第一层:多因素认证(MFA) 密码 + TOTP / 硬件令牌 / 生物特征 目标:确认用户身份真实性,防止账号盗用 第二层:基于角色的访问控制(RBAC) 交易员 / 风控员 / 审计员 / 系统管理员 目标:通过角色分配权限,简化授权管理 第三层:最小权限原则 默认拒绝 / 按需申请 / 定期审计 / 自动过期 目标:权限精确到字段级别,防止权限滥用

你看,这三层就像三道防线。第一层防住外部攻击,第二层规范内部权限,第三层把权限精确到最小范围。少了任何一层,整个安全体系都会有漏洞。

我的建议: 在系统设计阶段就把 IAM 框架搭好,别等上线后再补。补丁式的安全设计,往往漏洞百出。

最后说一句,IAM 不是一次性的工作。用户会变、角色会变、业务需求也会变。定期 review 权限配置,及时清理僵尸账号和过期权限,这应该成为运维团队的常规操作。嗯,安全这件事,永远在路上。

专注资料整理