Postgresql 사용자 로그인 오류 횟수를 제한하는 실례 코드

oracle에서 FAILED_ 를 설정할 수 있습니다.LOGIN_ATTEMPTS는 사용자 비밀번호의 로그인 오류 횟수를 제한하지만postgresql에서는 이 기능을 지원하지 않습니다.PostgreSQL은 이벤트 트리거를 지원하지만 이벤트는 DDL에 국한되어 로그인 로그인 이벤트에 이벤트 트리거를 사용할 수 없습니다.
그러나 새 세션에 로그인하여 어떤 이벤트를 촉발하는 것과 같은 수요는 훅을 통해 실현할 수 있지만 이 방법은 비교적 복잡하기 때문에 내부 코드를 수정하고 클라이언트 인증에 논리를 추가하여 입력 암호 횟수 통계를 판단해야 한다.여기에 비슷한 기능을 실현하는 비교적 간단한 방법을 추천한다.
여기 저희가 세션에 사용할 거예요_이 플러그인을 사용하면 로그인할 때 지정한 기능을 실행합니다.

다운로드 주소:


https://github.com/okbob/session_exec
압축 해제를 다운로드하려면 다음 구성이 필요합니다.
  • set session_preload_libraries to session_execset
  • session_exec.login_name to name of your login function
  • 이 플러그인은 다음과 같은 특징을 가지고 있습니다.
  • 함수가 존재하지 않으면 경고합니다
  • 함수 실행에 실패하면 연결이 허용되지 않습니다..
  • 이 플러그인을 이용하여 우리는 간단한 함수를 써서 사용자의 로그인 오류 횟수를 제한하는 기능을 실현할 수 있다.

    예:


    1. 외부 테이블을 만들어 데이터베이스 로그 정보를 기록한다.
    
    CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;
    
    CREATE FOREIGN TABLE pglog ( 
     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,
     backend_type text 
    ) SERVER pglog 
    OPTIONS ( program 'find $PGDATA/log -type f -name "*.csv" -mtime -1 -exec cat {} \;', format 'csv' ); 
    2, 테이블 만들기 t_login에서 데이터베이스 로그의 로그인 정보를 추출합니다.
    
    create table t_login
    (
    login_time timestamp(3) with time zone -- ,
    user_name text,
    flag int -- ,0 
    );
    로그인 정보를 삽입하려면 다음과 같이 하십시오.
    
    bill=# insert into t_login select log_time,user_name from pglog where command_tag='authentication' and error_severity= 'FATAL'
    bill-# ;
    INSERT 0 4
    3. 로그인 실행 function 만들기
    
    create or replace function lock_user() returns void as $$
    declare
    res text;
    c1 timestamp(3) with time zone;
    begin
    select login_time from t_login where flag = 0 order by login_time desc limit 1 into c1; -- 
    insert into t_login select log_time,user_name from pglog where command_tag='authentication' and error_severity= 'FATAL' and log_time > c1; -- t_login 
    update t_login set flag = 1 where login_time > c1; 
    for res in select user_name from t_login where flag = 1 group by user_name having count(*) >=3 -- 3, 3 
    loop
    EXECUTE format('alter user %I nologin',res); -- 
    EXECUTE 'select pg_terminate_backend(pid) from pg_stat_activity where usename=$1' using res; -- 
    raise notice 'Account % is locked!',res;
    end loop;
    end;
    $$ language plpgsql strict;
    4. postgresql를 편집합니다.conf 파일, 로그인 함수 설정
    
    session_preload_libraries='session_exec'
    session_exec.login_name='lock_user'
    5. 테스트
    아날로그 test1 사용자 로그인 오류가 3회 이상:
    
    bill=# select * from t_login;
         login_time     | user_name | flag 
    ----------------------------+-----------+------
     2020-08-26 07:26:45.42+08 | test1   |  1
     2020-08-26 07:26:50.179+08 | test1   |  1
     2020-08-26 07:26:52.487+08 | test1   |  1
     2020-08-26 07:26:54.537+08 | test1   |  1
    (4 rows)
    test1 사용자가 로그인할 때 연결할 수 없습니다
    
    pg13@cnndr4pptliot-> psql bill test1
    Password for user test1: 
    NOTICE: c1 = <NULL>
    psql: error: could not connect to server: FATAL: terminating connection due to administrator command
    CONTEXT: SQL statement "select pg_terminate_backend(pid) from pg_stat_activity where usename=$1"
    PL/pgSQL function lock_user() line 13 at EXECUTE
    다시 로그인하면 사용자가 잠겼다는 메시지가 표시됩니다.
    
    pg13@cnndr4pptliot-> psql bill test1
    Password for user test1: 
    psql: error: could not connect to server: FATAL: role "test1" is not permitted to log in
    6. 사용자 잠금 해제
    사용자를 잠금 해제하려면 다음을 수행해야 합니다.
    
    bill=# alter user test1 login;
    ALTER ROLE
    그리고 주의해야 할 것은 t_를login에서 만료된 데이터 수정.
    
    bill=# update t_login set flag = 0;
    UPDATE 4
    참조 링크:
    https://github.com/okbob/session_exec
    이 글은 Postgresql에서 사용자의 로그인 오류 횟수를 제한하는 것에 대해 소개합니다. 더 많은 Postgresql에서 사용자의 로그인 오류 횟수를 제한하는 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기