问题现象
OBServer 内核内部实现的 IP 匹配函数 ObHostnameStuct::is_ip_match 实现存在缺陷,导致有使用了 IP 匹配功能的模块工作不正常,可能会有非预期的 IP 成功匹配,特别的,当用户使用旧版本时,可能因为运维错误的设置使用了某些错误的 IP 可以通过匹配,但是在升级到修复此问题的版本后,就会出现错误IP无法通过校验的情况。
租户白名单,参见:ob_tcp_invited_nodes。
在设置了租户的 IP 白名单
ob_tcp_invited_nodes后,可登录的 IP 不符合预期,会有非白名单内的IP也能通过认证的情况。例如,当白名单
ob_tcp_invited_nodes = ''192.168.0.155'时,192.168.0.1也能通过白名单校验。create user 指定 hostname 参见:创建用户。
在创建用户时候指定了用户所在的主机 IP,但可登陆的 IP 不符合预期,可能会有非匹配的 IP 也能通过该用户连接。
例如,通过 SQL 语句
create user user1@192.168.0.155 identified by '******';创建用户 tenant1 并指定用户的IP=192.168.0.155,但 IP 为192.168.0.1的主机也可通过此用户进行连接。
问题原因
在 OceanBase 数据库的版本中,ObAddr 最大 IP 或者说最大子网掩码被错误的定义为 1.1.1.1 而不是 255.255.255.255,这样意味着两个IP的四个字节只用奇偶性相同即可匹配的上。
由于在代码实现上,单 IP 会与最大子网掩码相与进行计算,而最大子网掩码的实现错误导致结果也会出现错误,会出现错误的匹配结果,因此 IP 列表匹配是不准确的。(只需要客户 IP 和名单IP的四个字节均奇偶相同即可匹配上)
对于使用了 '%' 或 '_' 设置的模糊匹配 IP,在进行模糊匹配校验失败后,仍然会将该模糊匹配表达式中强转成 '0.0.0.0' 再进行单 IP 匹配,因此模糊匹配是不准确的。(只需要客户IP的四个字节均为偶数即可匹配上)
掩码匹配使用的是用户设置的子网掩码,并不会使用最大子网掩码 255.255.255.255,因此掩码匹配是符合预期的。
问题的风险及影响
非白名单IP可能也能成功登录,存在安全风险。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.2 GA(oceanbase-3.2.2-20211130225726)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220419)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本、V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本、V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本、V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本、V4.2.2 GA(oceanbase-4.2.2.0-100000082024011317)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V2.2.77 BP19(oceanbase-2.2.77-119000122024060513)、V3.2.3 BP11(oceanbase-3.2.3.3-111000032024070822)、V3.2.4 BP7(oceanbase-3.2.4.7-107000012023113010)、V4.2.1 BP2(oceanbase-4.2.1.2-102010012023120119)、V4.2.2 BP1(oceanbase-4.2.2.1-101000012024030619)。
规避方式
只使用掩码匹配规则来设置白名单:
例如,192.168.0.1 可以使用 192.168.0.1/32 替代;192.168.0.% 可以使用 192.168.0.0/24 替代。