暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

PostgreSQL用户登录失败自动锁定

原创 多米爸比 2021-02-07
3877

插件session_exec安装配置篇

下载插件并编译安装
https://github.com/okbob/session_exec

$ unzip session_exec-master.zip 
$ cd session_exec-master/
$ make pg_config=/opt/pgsql/bin/pg_config
$ make pg_config=/opt/pgsql/bin/pg_config install

配置postgresql.conf

session_preload_libraries='session_exec'
session_exec.login_name='public.login'

注意:上面第一个变量是设置session_preload_libraries而不是通常设置的shared_preload_libraries。

第二个变量是需要自定义实现的登录函数

重启数据库服务

$ sudo systemctl restart postgresql-12

自定义登录函数篇

使用file_fdw外部表映射数据库日志文件记录
file_fdw如果未配置过,参见下面步骤

$ cd /opt/postgresql-12.5/contrib/file_fdw
$ make && make install

create extension file_fdw;
CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;

建立外部表postgres_log,并赋予表的select权限给public角色。

CREATE FOREIGN TABLE public.postgres_log(  
  log_time timestamp without time zone,  
  user_name text,  
  database_name text,  
  process_id integer,
  connection_from text,
  session_id text,  
  session_line_num bigint,  
  command_tag text,  
  session_start_time timestamp with time zone,  
  virtual_transaction_id text,  
  transaction_id bigint,  
  error_severity text,  
  sql_state_code text,  
  message text,  
  detail text,  
  hint text,  
  internal_query text,  
  internal_query_pos integer,  
  context text,  
  query text,  
  query_pos integer,  
  location text,  
  application_name text
) SERVER pglog  
OPTIONS ( program 'find /opt/pg_log_5432 -type f -name "*.csv" -mtime -1 -exec cat {} \;', format 'csv' );

grant SELECT on postgres_log to PUBLIC ;

注意:1./opt/pg_log_5432需要修改为实际环境日志目录。
2.不同PG版本csv日志格式可能有所差异,参考修改runtime-config-logging

此时连接数据库因未创建登录函数会出现下面的警告信息

$ psql -Upostgres
WARNING:  function "login()" does not exist
psql (12.7)
Type "help" for help.  

创建登录函数login,文件下载连接<<PostgreSQL用户登录失败自动锁定函数>>

测试使用篇

创建测试用户

create user test1 encrypted password 'XXX';
create user test2 encrypted password 'XXX';
create user test3 encrypted password 'XXX';

test1和test2连续三次输入错误密码,然后test3登录数据库可查看到test1和test2已经不能登录。

$ psql -Utest3 postgres
psql (12.7)
Type "help" for help.

postgres=> \du test*
            List of roles
 Role name |  Attributes  | Member of 
-----------+--------------+-----------
 test1     | Cannot login | {}
 test2     | Cannot login | {}
 test3     |              | {}

使用管理用户解锁用户

alter user test1 login ;
alter user test2 login ;

如果是当天登录失败的记录,需要清除日志文件失败的记录,可通过外部表postgres_log或者直接处理日志文件。

总结

1.session_exec通过用户登录成功后调用login函数去实现锁定登录失败次数过多的用户。
2.此种方式有点繁琐且会造成数据库连接变慢。
3.不支持自动解锁,需要管理用户手工处理。

参考链接:
https://blog.csdn.net/weixin_39540651/article/details/108227188

推荐阅读<<PostgreSQL安全加固>>

保持联系

从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴进群吹牛唠嗑,交流技术,互赞文章。

123.png

如果群二维码失效可以加我微信。

456.png

最后修改时间:2022-10-23 10:07:04
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论