踩过等保的坑:KingbaseES身份验证全攻略,从口令管理到客户端认证实操
一、先理明白KingbaseES身份验证到底是啥为啥它这么重要很多刚从Oracle转KES的朋友容易混淆一个概念Oracle里面用户、权限、身份验证是一套体系KES其实是把身份验证拆成了两层逻辑非常清晰账户层身份验证就是你这个数据库账户本身的安全包括口令怎么设、口令过期了怎么办、输错密码多少次锁账户核心是证明「你是不是这个账户的合法使用者」接入层身份验证就是你从哪个IP来、用什么客户端连、能不能连我的数据库核心是控制「谁能接入我的数据库」相当于数据库门口的门禁。为啥现在这块越来越重要两个大背景第一是数据库等保的硬性要求现在等保2.0三级要求里明确要求口令必须有复杂度要求、必须定期过期、必须有失败登录锁定机制、必须限制接入IP少一样都是高危直接卡你过不了测评。第二是数据安全的实际需求现在核心业务数据都存在数据库里80%的数据泄露都是弱密码、未授权接入导致的身份验证就是数据库的第一道也是最后一道安全防线门没锁好再牛的加密、审计都没用。我见过最离谱的情况是一个区县政务系统迁移完KES之后直接沿用了原来开发时候的配置sysdba密码和用户名一样所有IP都能连上线三个月被黑产拖走了一半的业务数据最后负责人背了处分得不偿失。所以真的别拿这个不当回事。二、核心基础口令保护与全生命周期管理附实操步骤口令是身份验证的基础也是最容易出问题的地方我见过太多项目迁移完了口令还是默认的、还是弱密码真的太危险了。KES给我们提供了非常完善的口令管理能力只要配置对就能满足等保的所有要求一步步来2.1 第一步启用口令复杂度检查拒绝弱密码KES自带了password_check扩展专门用来做口令复杂度检查默认安装包里就有不用额外下载很多人不知道怎么开我把步骤一步步写清楚实操步骤1加载扩展预库首先要修改KES的主配置文件kingbase.conf找到shared_preload_libraries这一行把password_check加进去格式大概是这样# 原来的配置可能是这样 # shared_preload_libraries # 修改成这样 shared_preload_libraries password_check⚠️第一个坑来了我第一次配置的时候就是漏了这一步只创建了扩展结果怎么测弱密码都能创建查了快两个小时才发现password_check必须预加载才能生效只创建扩展是没用的这个坑我敢说一半刚接触KES的DBA都踩过。改完之后需要重启数据库生效如果你是生产环境不想重启不对这个配置必须重启其实重启个RAC集群也就几分钟趁业务低峰做就好而且一次配置终身生效值当。实操步骤2创建扩展配置复杂度参数重启完之后用sysdba登录数据库执行创建扩展的命令CREATEEXTENSION password_check;然后回到kingbase.conf配置你需要的口令复杂度参数我给大家一个符合等保三级要求的参考配置直接拿去用就行# 口令最小长度等保要求至少8位这里设8 password_check.min_length 8 # 要求至少1个大写字母 password_check.upper_case_count 1 # 要求至少1个小写字母 password_check.lower_case_count 1 # 要求至少1个数字 password_check.digit_count 1 # 要求至少1个特殊字符 password_check.special_char_count 1 # 口令不能和用户名相同 password_check.password_match_username off # 口令不能和当前时间倒过来相同防止用日期当密码 password_check.password_match_current_date off # 禁止最近5次用过的旧密码重复使用等保要求至少3次这里设5更安全 password_check.password_history_size 5改完之后不用重启执行SELECT sys_reload_conf();就可以生效了。验证一下配置有没有生效我们来测一下创建一个不符合要求的用户看看会不会报错-- 试一下创建密码为12345678的用户不符合复杂度要求CREATEUSERtest_userWITHPASSWORD12345678;正常情况下你会得到这个报错说明配置生效了ERROR: Password must contain at least 1 upper case characters, 1 lower case characters and 1 special characters.那我们再创建一个符合要求的CREATEUSERtest_userWITHPASSWORDTest1234;这个就能正常创建成功说明没问题。再测一下旧密码重复使用我们改密码改成刚用过的那个ALTERUSERtest_userWITHPASSWORDNewpass5678;ALTERUSERtest_userWITHPASSWORDTest1234;你会得到报错ERROR: Password has been used recently, please select a new one.完美说明历史密码禁用也生效了。2.2 第二步配置口令过期策略强制定期换密码等保要求口令最多90天必须更换KES支持全局配置默认过期时间也支持给单个用户单独配置非常灵活全局配置默认过期时间改kingbase.conf加一行password_expiration 90这样所有新建用户的口令默认都是90天过期改完重载配置就生效了。如果你已经创建了用户想统一给所有用户设过期时间执行这条SQLALTERROLEALLSETpassword_expiration90;给单个用户单独配置过期时间比如你给应用账户因为应用密码存在配置中心改起来麻烦可以设180天给运维账户要求30天换一次直接改就行-- 应用账户设180天过期ALTERUSERapp_business PASSWORD EXPIRATION180;-- 运维账户设30天过期ALTERUSERops_admin PASSWORD EXPIRATION30;单个用户的配置优先级比全局高会覆盖全局设置这个没问题。怎么查看哪些用户口令已经过期了执行这条SQL就能一目了然SELECTusenameAS用户名,valuntilAS口令过期时间,CASEWHENvaluntilnow()THEN已过期ELSE未过期ENDAS状态FROMsys_userWHEREusesysid10-- 过滤系统内置用户ORDERBYvaluntil;提前一周发通知提醒用户换密码避免过期了影响业务这个好习惯一定要养成。2.3 口令加密升级别用老的MD5赶紧换SCRAM-SHA-256KES默认的口令加密算法现在已经支持更安全的scram-sha-256比老的MD5安全太多MD5早就被破解烂了一定要换掉。怎么改两步搞定第一步改kingbase.conf把加密算法改成SCRAMpassword_encryption scram-sha-256重载配置生效之后新建用户的密码都会自动用SCRAM加密。第二步把原来老用户的MD5加密密码升级成SCRAM只要让用户重新设置一次密码就行-- 比如给test_user升级密码ALTERUSERtest_user PASSWORDNewTest8888;重新设完之后密码就自动换成SCRAM加密了完美这个改完之后就算数据文件被偷了密码也很难被破解安全等级提升好几个档次。三、防范暴力破解账户异常锁定机制实操你知道吗现在黑产扫数据库端口一天就能试几十万次密码只要你的弱密码分分钟就被攻破KES自带了失败登录锁定机制输错几次密码直接锁账户从根源上防暴力破解配置非常简单。3.1 配置全局锁定规则还是改kingbase.conf加两个参数就行同样给大家一个符合等保要求的参考配置# 连续输错3次密码就锁定账户 failed_login_attempts 3 # 锁定时间单位是秒这里设86400就是锁24小时 password_lock_time 86400如果设置password_lock_time 0那就是永久锁定只能管理员手动解锁适合那种已经离职的员工账户直接设成永久锁定更安全。3.2 给单个用户配置不同的锁定规则和口令过期一样你也可以给单个用户单独设锁定规则比如给超级用户设更严格的规则给普通应用账户放宽一点-- 给sysdba设错2次就锁定24小时ALTERROLE sys FAILED_LOGIN_ATTEMPTS2PASSWORD_LOCK_TIME86400;-- 给应用账户设错5次锁定1小时ALTERROLE app_business FAILED_LOGIN_ATTEMPTS5PASSWORD_LOCK_TIME3600;3.3 查看锁定状态和解锁账户怎么看哪些账户被锁定了执行这条SQL就行SELECTusenameAS用户名,account_lockedAS锁定状态FROMsys_userWHEREaccount_lockedt;如果需要手动解锁执行一条命令就搞定ALTERUSERtest_user ACCOUNTUNLOCK;⚠️第二个大坑来了很多人不知道默认情况下超级用户是不启用失败登录锁定的也就是说不管你输错多少次密码超级用户都不会被锁这个默认配置太危险了尤其是sysdba这种超级权限账户一定要手动给它加上锁定规则我那个医保中心客户原来就是默认配置差点被暴力破解进去这个一定要改别忘了四、KES支持的多种身份验证方式不同场景怎么选除了最基础的口令认证KES还支持多种身份验证方式适合不同规模、不同安全要求的场景我一个个讲每个都给适用场景和实操4.1 口令认证Password/SCRAM最常用的中小场景方案这个就是我们上面讲的用户名口令的认证方式也是现在用得最多的适合中小规模的企业、内部系统优点是简单易维护不用额外搭其他服务缺点是每个数据库都要单独管用户密码适合用户数不多的场景。现在一定要用SCRAM-SHA-256别用老的MD5或者明文刚才已经讲过升级方法了这里不再重复。4.2 Peer认证本地运维的安全便捷方案Peer认证是啥意思就是你用本地操作系统登录只要你的操作系统用户名和数据库用户名一模一样就不用输密码直接登录非常适合DBA本地运维登录不用记复杂的超级用户密码又比trust认证就是不用认证随便进安全太多因为操作系统已经做了一层身份认证。实操配置编辑KES的客户端认证配置文件pg_hba.conf在data目录下加一行# 本地连接所有本地操作系统用户对应同名数据库用户用peer认证 local all all peer如果你只想给sysdba开peer认证就改成这样local all sys peer改完之后重载配置SELECT sys_reload_conf();然后你在本地服务器用sys操作系统用户登录直接执行ksql就能进数据库不用输密码非常方便又安全。⚠️ 别把peer和trust搞混了trust是任何本地用户都能随便进任何账户完全不安全生产环境绝对不能开trustpeer只有用户名匹配才能进安全多了一定要记住。4.3 LDAP集中认证大型企业统一身份管理方案如果你是千人以上的大企业有自己统一的LDAP身份管理服务几百上千个数据库用户一个个在数据库里建用户改密码太麻烦了KES直接支持LDAP集中认证所有用户的身份都在LDAP管数据库不用单独存密码完美对接企业统一SSO非常方便。实操配置第一步改kingbase.conf配置LDAP连接信息# LDAP服务器地址 ldapserver ldap://192.168.1.100 # LDAP的根DN ldapbasedn dccompany,dccom # LDAP绑定用的管理员DN和密码 ldapbinddn cnadmin,dccompany,dccom ldapbindpasswd LdapAdmin123第二步改pg_hba.conf添加LDAP认证规则# 所有IP段的所有用户用LDAP认证用户存在于oupeople host all all 0.0.0.0/0 ldap ldapprefixuid ldapsuffix,oupeople,dccompany,dccom改完重载配置就生效了只要你LDAP里有这个用户用LDAP的密码就能直接登录数据库不用在数据库里再建一遍密码管理员在LDAP里删用户数据库这边直接就不能登录了非常适合统一管理。⚠️第三个大坑我第一次配LDAP的时候折腾了半天一直认证失败最后发现是防火墙没开LDAP的389端口数据库连不上LDAP服务器所以一直失败大家配的时候先ping一下LDAP服务器telnet一下389端口通了再配省得瞎折腾。4.4 Kerberos/GSSAPI认证金融政务高安全场景方案对于金融、政务这种最高安全等级要求的核心系统KES还支持Kerberos/GSSAPI认证也就是我们常说的第三方集中身份认证防重放攻击整个认证过程不用传明文密码安全等级最高适合核心业务系统用。这个配置比较复杂需要提前搭好Kerberos服务生成票据核心配置思路就是在kingbase.conf开启GSSAPI支持然后在pg_hba.conf里把对应连接的认证方式改成gssapi配置好keytab文件路径就行因为不同企业的Kerberos配置差异比较大这里就不展开写具体步骤了有需要的朋友可以留言我单独讲。四种身份验证方式对比表直接选就行认证方式安全性运维成本适用场景SCRAM口令认证高低中小团队、中小规模系统Peer认证高极低本地DBA运维登录LDAP认证高中大型企业、统一身份管理场景Kerberos认证极高高金融政务核心高安全等级系统五、客户端接入认证把好数据库门口的门禁刚才我们讲的都是账户层面的验证接下来讲接入层面的验证也就是谁能连我的数据库从哪连这个太重要了很多人数据库被暴力破解就是因为接入配置没做好随便哪个IP都能连。KES的客户端接入认证是通过data/pg_hba.conf这个文件配置的规则非常简单从上到下匹配匹配到第一条就生效不再往下走这个顺序非常重要很多人配置错了不生效就是顺序搞反了。我给大家几个生产常用的配置场景直接拿去用就行场景1限制高权限账户只能从运维内网连接这个是最基本的安全要求sysdba这种超级权限账户绝对不能让公网IP能连只允许运维内网的IP段连接配置如下# 允许192.168.1.0/24段的IP连sysdba用SCRAM认证 host all sys 192.168.1.0/24 scram-sha-256 # 拒绝所有其他IP连sysdba host all sys 0.0.0.0/0 reject放在pg_hba.conf的最前面这样匹配顺序就对了只有内网能连外面直接拒绝完美。场景2只允许应用服务器IP段连接应用账户应用账户只有应用服务器需要用其他地方不需要连所以限制死IP段# 允许业务库的app账户从10.0.0.0/8段应用服务器段连接 host business_db app_business 10.0.0.0/8 scram-sha-256场景3本地DBA运维用Peer认证就是我们之前讲的加一行local all sys peer场景4默认拒绝所有连接最小权限原则最后一定要在pg_hba.conf的最后一行加一条host all all 0.0.0.0/0 reject这个就是默认拒绝所有没有明确允许的连接符合最小权限原则很多人默认配置最后一行是允许所有太危险了一定要改成这个。改完所有配置之后执行SELECT sys_reload_conf();就生效了不用重启数据库非常方便。常见客户端连接问题排查我碰到最多的客户端连接报错就是这个no pg_hba.conf entry for host xxx.xxx.xxx.xxx, user xxx, database xxx遇到这个报错按照这个步骤排查10分钟就能搞定先看客户端的IP地址对不对是不是你允许的IP段看pg_hba.conf里的规则顺序是不是被前面的reject规则拦截了规则一定要把允许的放前面拒绝的放后面改完配置有没有执行sys_reload_conf()重载没重载肯定不生效检查数据库的端口54321KES默认端口有没有被防火墙挡了服务器上telnet一下端口通不通。六、生产环境身份验证合规检查清单直接拿去用我整理了一个等保三级要求的检查清单做测评之前对着查一遍保证不会漏项已经把password_check加到shared_preload_libraries并创建扩展生效口令复杂度符合要求最小8位包含大小写、数字、特殊字符禁止和用户名相同禁止用最近5次旧密码口令过期策略配置默认90天过期特殊账户最多不超过180天账户锁定配置连续3次输错密码锁定24小时超级用户也配置了锁定规则口令加密算法已经升级为scram-sha-256没有用MD5pg_hba.conf配置高权限账户只允许运维内网IP连接默认拒绝所有连接闲置超过90天的账户已经锁定或者删除没有共享账户一人一号每个用户用自己的账户登录大型企业已经对接LDAP/Kerberos集中身份管理七、我踩过的常见坑汇总最后把我这么多年碰到的常见坑汇总一下大家碰到问题直接对应配置了口令复杂度还是能创建弱密码90%是因为没把password_check加到shared_preload_libraries重启数据库就好了剩下10%是没重载配置重载一下就行。用户密码对的还是登录失败先看账户有没有被锁定再看口令有没有过期最后看IP有没有被pg_hba.conf拒绝三步就能找到问题。LDAP配置完一直认证失败先检查网络通不通LDAP的389端口有没有开再查绑定DN和密码对不对最后查用户DN的拼接规则对不对。超级用户输错N次都不锁定默认超级用户不启用锁定手动给超级用户加FAILED_LOGIN_ATTEMPTS规则就行。改完配置不生效pg_hba.conf的规则顺序错了把允许的规则放前面拒绝的放后面还有记得重载配置。总结身份验证是数据库安全的第一道门也是最容易被忽略的一环很多人做数据库迁移把所有精力都放在了性能和兼容上结果最后栽在安全配置上过不了等保甚至被黑产攻破真的得不偿失。KES给我们提供了非常完善的身份验证能力从口令管理到锁定从多种认证方式到客户端接入控制完全能满足从中小企业到金融政务核心系统的安全要求只要按照上面的步骤配置就能把这道门关好我那个医保中心客户整改完之后第二次测评一次性就过了现在跑了快一年一点问题都没有。