PostgreSQL 사용자 로그인 실패 자동 잠금 처리 방안
6021 단어 PostgreSQL로그인 실패자동 잠금
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;
총결산https://www.jb51.net/article/208018.htm
PostgreSQL 사용자 로그인 실패 자동 잠금 해결 방법에 대한 이 글을 소개합니다. 더 많은 PostgreSQL 로그인 실패 자동 잠금 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redmine 데이터베이스를 MySQL에서 PostgreSQL로 마이그레이션 (보충)Redmine 의 Database 를 MySQL 로 운용하고 있었습니다만, MySQL 5.6 이상이나 MariaDB 에는 , , 이러한 티켓이 수년 동안 방치된 상황을 감안하여, PostgreSQL로 마이그레이션하기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.