• <nav id="26o4m"><source id="26o4m"></source></nav>
  • opengauss安全认证源码解析

    Mevenats 西北工业大学 计算机科学与技术? 2021-12-11 22:57:15
    加精

    opengauss安全认证源码解析

    一.安全认证概览

    opengauss作为安全数据库,可能面临隐私泄露、信息篡改、数据丢失等风险。

    为了防止恶意攻击者访问、窃取、篡改和破坏数据库中的数据,阻止未经授权用户通过一些系统的漏洞进行仿冒、提权等路径恶意使用数据库,opengauss提供了一系列安全措施。典型的有认证机制、对象访问控制、用户角色管理、审计机制、数据安全技术等。本次我要解析的是安全认证机制源码。

    ?????? 整个OpenGauss系统通过安全认证模块来限制用户对数据库的访问,是数据库系统的最外层防线,是所有安全措施的基础。通过安全认证措施,能够达到解决访问源的可信问题,并且拦截非法用户的恶意访问和非法操作。

    ?????? 安全认证模块分为用户身份管理识别、用户口令安全存储、认证机制三个子模块,分别对应认证配置文件管理、用户身份识别、口令校验三个流程。

    ?

    openGauss 是一款基于客户端\服务器(C\S)模式的数据库系统,每次会话连接会有一个如下所示的大致认证过程:

    1. 客户端与服务器之间建立连接。
    2. 连接建立完成后,客户端发送访问所需的连接请求信息给服务端,对请求信息的验证工作都在服务器后端线程上完成。
    3. 服务器端首先需要进行访问源的检验,依据配置文件对访问的端口号、访问IP地址、允许用户访问的范围以及数据对象进行检验。在完成检验后连同认证方式和必要的信息返回客户端。
    4. 客户端依据认证方式加密口令并发送认证所需的信息给服务器端。
    5. 服务器端对收到的认证消息进行验证。认证通过,则启动会话与客户端进行通信,数据库就真正的被运行起来了。没通过的话,拒绝连接并退出会话。

    ?

    二.身份认证

    身份认证也就是基于主机的认证,研究的核心问题是规定谁可以访问数据库,并且描述访问用户,定义何种方法访问、从何处访问、访问哪个数据库。

    服务器端根据客户端的IP地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证

    ??????? 服务器端在HBA(host-based authentication file)也就是pg_hba.conf配置文件中定义了一系列访问规则。

    ??????

    为了描述这些访问规则,opengauss对此定义了存储访问规则的数据结构HbaLine。

    linenumber: 规则编号

    conntype 连接套接字的方法

    databases: 允许访问的数据库集合

    roles: 允许访问的用户组

    hostname: 允许访问的IP地址

    auth_method: 认证方法

    ?

    opengauss在校验用户身份和口令之前,首先要干的一件事的验证最外层访问源是否安全,也就是会限制端口和IP地址。

    现在当某个用户发起认证请求时,连接相关信息存在另一个关键数据结构port (\src\include\libpq\libpq-be.h)中。

    laddr(internet protocol):本地进程IP地址信息

    raddr:远端客户端进程IP地址信息

    remote_host:远端主机IP地址

    remote_hostname:远端主机名称

    认证相关的用户信息、访问数据库信息以及IP地址信息。

    SSL安全套阶层认证信息

    kerberos认证相关的数据结构信息

    有了port端口信息之后,后台的服务器线程会根据前端传入的信息与Habline中记录的规则进行比较匹配,完成对应的身份识别。

    完整的身份识别的过程在check_hba函数(\src\common\backend\libpq\hba.cpp)里

    获取连接用户的ID

    ?

    服务器端的进程会认证连接行为是本地连接请求还是远程连接请求。

    如果是本地连接行为,不会认证IP地址端口等信息,而opengauss规定本地连接只允许初始安装用户本地登录直接登录。

    基于本地环境的UID信息获取当前系统用户名。

    记录下当前的系统用户名

    用访问用户名与记录的本地系统用户名进行匹配,不匹配时,会返回uaSHA256认证方法,要求输入密码。

    如果不是初始用户的话,同样需要输入密码。

    ?

    如果是远程访问的话,需要逐条判断包括认证方式在内的所有信息正确性。

    ?

    检查IP地址,也就是IP白名单校验。

    检验数据库信息和用户信息

    当都未匹配时,拒绝当前连接请求。

    ?

    三. 口令存储

    口令是安全认证中的重要凭证。opengauss数据库每在创建用户和修改用户时,会将口令通过一定方式单项哈希加密后存放在pg_authid系统表中。OpenGauss支持的口令加密方式有三种,主要用的是SHA256加密。

    口令存储详细流程图如下:

    sha256的加密算法流程图如下:

    加密后系统表中包含了sha256md5两种哈希值。

    ?

    四.认证机制

    最后一步认证识别,服务器端通过发送来的用户名与密码验证数据库用户身份,究竟是不是它所声称的自己。

    opengauss使用的是一套名为RFC5802协议(基于盐值的质询响应身份验证机制)的认证方案,是一套双向确认的用户认证体系。

    服务器端存储的是StoredKey和ServerKey:

    (1) StoredKey用来验证客户端用户身份。

    服务端认证客户端通过计算ClientSignature与客户端发来的ClientProof进行异或运算,从而恢复得到ClientKey,然后将其进行HMAC(hash-based message authentication code,散列信息认证码)运算,将得到的值与StoredKey进行对比,如果相等,证明客户端验证通过。其中ClientSignature通过StoredKey和token(随机数)进行HMAC计算得到。

    (2) ServerKey用来向客户端表明自己身份的。

    客户端认证服务端,通过计算ServerSignature与服务端发来的值进行比较,如果相等,则完成对服务端的认证。其中ServerSignature通过ServerKey和token(随机数)进行HMAC计算得到。

    (3) 在认证过程中,服务端可以计算出来ClientKey,验证完后直接丢弃不必存储。

    认证流程:

    1. 客户端将username发送给服务器端
    2. 服务端返回盐值salt 迭代次数、ServerSignature以及随机生成的字符串token给客户端。(token是随机生成字符串。服务端通过计算得到的ServerSignature返回给客户端。)
    3. 客户端认证服务端并发送认证响应。响应信息包含客户端认证信息ClientProofClientProof证明客户端拥有ClientKey,但是不通过网络的方式发送。在收到信息后,计算ClientProof

    客户端利用saltiteration-count,从password计算得到SaltedPassword,然后通过图9-9中的公式计算得到ClientKeyStoryKeyServerKey。客户端通过StoredKeytoken进行哈希计算得到ClientSignature:通过将ClientKeyClientSignature进行异或得到ClientProof将计算得到的ClientProof和第(2)步接收的随机字符串发送给服务端进行认证。

    1. 服务端接收并校验客户端信息。

    使用其保存的StoredKeytoken通过HMAC算法进行计算,然后与客户端传来的ClientProof进行异或,恢复ClientKey;再对ClientKey进行哈希计算,得到的结果与服务端保存的StoredKey进行比较。如果相等则服务端对客户端的认证通过,否则认证失败。

    \src\common\backend\libpq\auth.cpp

    客户端:clientAuthentication()

    客户端认证的过程通过调用ClientAuthentication函数完成,该函数只有一个类型Port的参数,Port结构中存储着客户端相关信息

    调用hba_getauthmethod函数

    调用check——hba,检查客户端地址、所连接数据库、用户名在文件HBA中是否有能匹配的HBA记录。

    使用SHA256认证方法,禁止初始用户远程连接。

    生成随机数token保存到retval

    发送认证请求以及相应的认证码到前端。

    完成认证。

    认证服务端

    password_sendauth

    通过SHA256方式加密密码

    通过server_key和token调用HMAC算法计算,用来验证服务端传来的server_signature

    调用strcmp函数判断计算的client_server_signature和服务器传过来的server_signature是否相等,不想等则认证失败。

    同时通过stored_key和token计算得到的结果

    与client_key相异或得到H,将其H发送给服务端,用于验证客户端。

    ?

    ?

    ...全文
    109 回复 1 打赏 收藏 举报
    写回复
    回复
    切换为时间正序
    请发表友善的回复…
    发表回复
    相关推荐
    发帖
    Gauss松鼠会
    创建于2021-07-06

    1.0w+

    社区成员

    汇集数据库的爱好者和关注者,大家共同学习、探索、分享数据库前沿知识和技术,像松鼠一样剥开科学的坚果;交流Gauss及其他数据库的使用心得和经验,互助解决问题,共建数据库技术交流圈。
    帖子事件
    创建了帖子
    2021-12-11 22:57
    社区公告

    欢迎大家同时关注Gauss松鼠会专家酷哥。

    https://www.zhihu.com/people/ku-ge-78-98

    天天躁夜夜躁狠狠综合2020,日本二区三区欧美亚洲国,自拍另类欧美图区视频一区,青青草国产免费无码