PostgreSQL 사용자 로그인 실패 자동 잠금 처리 방안

잉크 가이드: PostgreSQL 사용 session_exec 플러그인은 사용자 암호 검증에 몇 번 실패하면 자동으로 잠깁니다. 본고는 처리 방안을 소개합니다.

1. 플러그인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='login'
참고: 위의 첫 번째 변수는 session_ 설정입니다.preload_libraries 일반 설정이 아닌shared_preload_libraries.
두 번째 변수는 사용자 정의가 필요한 로그인 함수입니다.
데이터베이스 서비스를 다시 시작합니다.

$ sudo systemctl restart postgresql-12

2. 사용자 정의 로그인 함수편


t_ 만들기login 테이블은 데이터베이스 로그에서 로그인에 실패한 정보를 추출하는 데 사용됩니다.

create table t_login
(
login_time timestamp(3) with time zone -- ,
user_name text -- ,
flag int4 -- ,0 ,1 
);
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, 관련 데이터베이스 로그에 로그인하지 못한 정보입니다.

CREATE FOREIGN TABLE postgres_log( 
 log_time timestamp(3) with 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' );
참고:
1./opt/pg_log_5432는 실제 환경 로그 디렉터리로 수정해야 합니다.
2. PG 버전에 따라 csv 로그 형식이 다를 수 있습니다. PG 홈페이지 문서 runtime-config-logging 장 참조(http://postgres.cn/docs/12/runtime-config-logging.html).
이 때 연결 데이터베이스가 로그인 함수를 만들지 않았기 때문에 아래의 경고 메시지가 나타납니다.

$ psql -Upostgres
WARNING: function "login()" does not exist
psql (12.5)
Type "help" for help.
로그인 함수 로그인을 만듭니다.

create or replace function login() returns void as $$
declare
res text;
c1 timestamp(3) with time zone;
begin

-- 
select login_time 
from public.t_login 
where flag = 0 
order by login_time 
desc limit 1 
into c1; 

 -- t_login 
insert into public.t_login 
select log_time,user_name 
from public.postgres_log 
where command_tag='authentication' 
and error_severity= 'FATAL' 
and log_time > c1;

update public.t_login set flag = 1 where login_time > c1; 

-- 3, 3 
for res in select user_name from public.t_login where flag = 1 group by user_name having count(*) >=3 
loop
-- 
EXECUTE format('alter user %I nologin',res); 
-- 
EXECUTE 'select pg_catalog.pg_terminate_backend(pid) from pg_catalog.pg_stat_activity where usename=$1' using res; 
raise notice 'Account % is locked!',res;
end loop;
end;
$$ language plpgsql strict security definer set search_path to 'public';
테스트 사용편
테스트 사용자를 만듭니다.

create user test1 encrypted password 'XXX';
아날로그test1 사용자 로그인 실패, 오류 비밀번호 입력.

$ psql -h192.168.137.11 -Utest1 postgres
Password for user test1: 
psql: error: FATAL: password authentication failed for user "test1"
외부 테이블을 통해 로그인에 실패한 로그를 보십시오.

select * from postgres_log where command_tag='authentication' and error_severity= 'FATAL';
로그인 실패 정보를 t_에 수동으로 삽입하는 데이터 1개를 볼 수 있습니다로그인 테이블.

insert into t_login select log_time,user_name,0
 from postgres_log 
 where command_tag='authentication' 
 and error_severity= 'FATAL';
위의 로그인 실패 테스트를 참고하여 다시 2회 테스트합니다.
그리고postgres 사용자를 사용하여 데이터베이스에 로그인하여 t_ 관찰login표 데이터.

postgres=# select * from t_login;
  login_time  | user_name | flag 
-------------------------+-----------+------
 2021-02-08 06:24:47.101 | test1  | 0
 2021-02-08 06:25:16.581 | test1  | 1
 2021-02-08 06:25:18.429 | test1  | 1
(3 rows)
두 번 더 로그인에 실패한 후postgres 사용자를 사용하여 데이터베이스에 로그인하면 이 사용자가 잠겼다는 알림을 볼 수 있습니다.

[postgres@node11 ~]$ psql
NOTICE: Account test1 is locked!
psql (12.5)
Type "help" for help.

postgres=# select * from t_login;
  login_time  | user_name | flag 
-------------------------+-----------+------
 2021-02-08 06:45:38.017 | test1  | 0
 2021-02-08 06:45:58.809 | test1  | 1
 2021-02-08 06:45:58.809 | test1  | 1
 2021-02-08 06:46:08.116 | test1  | 1
 2021-02-08 06:46:11.986 | test1  | 1
(5 rows)
사용자 잠금을 해제합니다.

update t_login set flag = 0 where user_name='test1' and flag=1;
총결산
  • session_exec는 사용자 로그인 성공 후login 함수를 호출하여 로그인 실패 횟수가 너무 많은 사용자를 잠금합니다
  • 이런 방식은 좀 번거롭고 데이터베이스 연결이 느려질 수 있다..
  • 자동 잠금 해제는 지원되지 않으며 사용자가 수동으로 처리해야 합니다..
  • 참조 링크:
    https://www.jb51.net/article/208018.htm
    PostgreSQL 사용자 로그인 실패 자동 잠금 해결 방법에 대한 이 글을 소개합니다. 더 많은 PostgreSQL 로그인 실패 자동 잠금 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기