<< 返回文章列表

免密登录 openGauss / MogDB 的几种方式

2024年4月26日
o
p
e
n
G
a
u
s
s
,
S
S
L
,
,
M
o
g
D
B
,
罗海雄
81
在日常使用中,我们有时候会希望不输入密码即可登录数据库。本文总结一下免密登录 openGauss / MogDB 的几种方式。

1

初始用户本地免密登录

这一种是最常见的,也是免配置默认就能做到的,即用初始化并启动 openGauss MogD的操作系统用户直接登录:
  •  
  •  
  •  
  •  
  •  
  •  
  •  
gsqlgsql ((MogDB 3.1.1.100 build 501a8955) compiled at 2023-07-03 19:59:26 commit 0 last mr 1796 )Non-SSL connection (SSL connection is recommended when requiring high-security)Last login: 2023-08-16 15:08:17.350982+08 from gs_clean@::1Type "help" for help.
MogDB=#

2

本地非初始用户免密登录

在本地操作系统,也可以通过一定的配置,让其他操作系统用户以初始用户的身份通过unix_socket免密登录数据库。
假设:
    • 初始用户是 ommxxx

    • 其他操作系统用户数testxxx,为了安全,此用户和初始用户在同一操作系统用户组下

    • unix_socket目录为 /data/xxx/tmp

    • 监听端口为 44000

2.1 配置unix_socket目录及文件权限

修改postgresql.conf:
  •  
  •  
  •  
  •  
  •  
#postgresql.conf...unix_socket_directory=/data/xxx/tmpunix_socket_permision=0770...
操作系统赋予组控制权限:
  •  
chmod 0770 /data/xxx/tmp

2.2 配置pg_hba.conf

去掉local … trust;

增加local … peer map=mymap,当然,这里的mymap是可变的,和下一个修改对应即可:

  •  
  •  
  •  
  •  
  •  
#pg_hba.conf...#local   all             all                                     trustlocal   all             all                                     peer map=mymap...

2.3 配置pg_ident.conf

注意,首列是pg_hba.conf配置中的map=mymap里的mymap可以根据需要两边同时改;同时,记得增加一个初始用户–初始用户的对应,否则初始用户没法登录:
  •  
  •  
  •  
  •  
# pg_ident.conf# MAPNAME       SYSTEM-USERNAME         PG-USERNAMEmymap   ommxxx ommxxxmymap   testxxx ommxxx

2.4 重启数据库

  •  
gs_ctl restart

2.5 其他操作系统用户即可免密登录

  •  
  •  
  •  
  •  
  •  
[testxxx@node156 ~]$ gsql -r -h /data/xxx/tmp -p 44000 -Uommxxx -d postgresgsql ((MogDB 3.1.1.100 build 501a8955) compiled at 2023-07-03 19:59:26 commit 0 last mr 1796 )Non-SSL connection (SSL connection is recommended when requiring high-security)Last login: 2023-08-16 15:28:07.131802+08 from gs_clean@::1Type "help" for help.
当然,需要有对应gsql执行权限(PATH/LD_LIBRARY_PATH),可以是独立安装的,也可以是借用初始用户安装好的。

3

SSL免密登录

通过SSL认证证书也可以进行免密登录。
假设:
    • 需免密登录用户为 testssl

    • 客户端ip为 172.16.3.250

    • 服务器ip为 172.16.3.156

    • 数据监听端口为 61234

3.1 生成SSL认证文件

把数据库安装目录下的openssl.cnf拷到当前目录下:
  •  
cp $GAUSSHOME/share/sslcert/gsql/openssl.cnf .

生成SSL CA

  •  
  •  
openssl req -new -x509 -days 9999 -nodes -config openssl.cnf \-out CA.crt -keyout CA.key -subj "/CN=CA"
此操作生成两个文件 CA.crt 和 CA.key。

生成服务器key

  •  
  •  
  •  
  •  
openssl req -new -nodes -text -config openssl.cnf \-out server.csr -keyout server.key -subj "/CN=server"openssl x509 -req -text -days 9999 -CA CA.crt -CAkey CA.key -CAcreateserial \-in server.csr -out server.crt

生成客户端key

注意,这里的 “/CN=testssl” 必须为数据库里的用户名,也可根据需要生成多个文件,对应多个可登录用户。为了方便区分,文件名(testssl.*)也使用用户名为前缀:
  •  
  •  
  •  
  •  
openssl req -new -nodes -text -config openssl.cnf  \-out testssl.csr -keyout testssl.key -subj "/CN=testssl"openssl x509 -req -text -days 9999 -CA CA.crt -CAkey CA.key -CAcreateserial \-in testssl.csr  -out testssl.crt

3.2 数据库创建对应用户

  •  
gsql -r -c "create user testssl password 'test@123';"

3.3 修改数据库参数

把CA.*、server.*拷到$PGDATA,理论上也可放在其他合适的目录下,目录权限为0600,但下面的配置得写全路径。
修改postgresql.conf:
  •  
  •  
  •  
  •  
  •  
# postgresql.confssl=onssl_cert_file= 'server.crt'ssl_key_file= 'server.key'ssl_ca_file='CA.crt'
修改pg_hba.conf:
  •  
  •  
  •  
# pg_hba.conf...hostssl all all 172.16.3.250/32 cert
根据需要,也可把172.16.3.250/32改为需要的网段。
重启数据库:
  •  
gs_ctl restart

3.4 客户端可通过SSL认证文件免密登录

将 CA.*、testssl.*传输到对应客户端主机某目录下,这里选用/tmp。

方式1:在gsql命令行加入几个SSL文件的对应关系

  •  
  •  
gsql "sslrootcert=/tmp/CA.key sslcert=/tmp/testssl.crt sslkey=/tmp/testssl.key" \-h 172.16.3.156 -p 61234 -U testssl

方式2:设置SSL变量后登录

  •  
  •  
  •  
  •  
  •  
  •  
  •  
export PGSSLROOTCERT=/tmp/CA.crtexport PGSSLCERT=/tmp/testssl.crtexport PGSSLKEY=/tmp/testssl.keygsql  -h172.16.3.156 -p61234 -Utestsslgsql ((MogDB 3.0.3 build 23ba838d) compiled at 2022-10-22 09:50:39 commit 0 last mr  )SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)Type "help" for help.

4

以PG客户端psql进行免密登录

除了上述的三种以外,其实还有一种方法,就是使用PG客户端psql进行免密登录,但这个所谓免密是事先把密码写在客户端的配置文件或者环境变量中,对于服务器端来说,其实是接收到密码的,具体可参考此文章:
https://www.modb.pro/db/81998