背景:项目组中有用到keycloak给两个应用进行登录认证使用。其中有一个应用放在公网,安全部门同事说 不能直接账号密码登录,容易破解,需要进行二次验证。

刚好查到keycloak支持OTP(one time password 一次性密码),刚好满足安全要求。

 

但是放在内网的应用是不用加这个的,需要筛选出配置了外网应用权限的用户。然后给用户加上OTP。

暂且将内网应用叫做应用N,外网应用叫做 gis-web 。只有用户规则中,gis-web这个客户端下,已分配权限包含edit或者view权限的用户,才需要加OTP。

 

 

 

 

 

冷静分析:

首先,用户数量上百个,一个个查看虽然可行,但是效率太低。

那有没有从数据库查的方法呢? 

 

keycloak数据库总共92个表。由于不太清楚各个表结构,所以索性直接导出整个库,数据也不大,966KB。

 

 

然后我根据用户名查,发现整个库只有一个地方包含用户名:user_entity  表的字段 username 。

通过这个表的username字段,找到用户名对应的 ID :bda51819-b9e1-409f-a90d-b8e93c79cc**

 

再,在整个库范围检索 bda51819-b9e1-409f-a90d-b8e93c79cc** ,发现了蛛丝马迹:

 

看起来是user_rule_mapping 这个表。但是这个表信息也是加密的。

 

换个思虑。

整个库检索:gis-web 。

发现了这串加密字符:野蛮一点。再次整个库检索:

 

 

 

终于盲生发现了华点:edit 和view,对应的好像正好是gis-web的编辑和查询权限?

最终,根据 user_role_mapping 表的 role_id 和 user_id,查找 user_entity 表的username,得出的就是拥有gis-web权限的 用户名了!

 

 

 

 

最后,就是把这9个用户配置OTP即可。

 

 

 

 

 

 

《完》

 posted on 2022-05-09 16:04  Laijx  阅读(264)  评论(0编辑  收藏  举报