婷婷久久综合九色综合,欧美成色婷婷在线观看视频,偷窥视频一区,欧美日本一道道一区二区

<tt id="bu9ss"></tt>
  • <span id="bu9ss"></span>
  • <pre id="bu9ss"><tt id="bu9ss"></tt></pre>
    <label id="bu9ss"></label>

    當(dāng)前位置:首頁(yè) >  站長(zhǎng) >  數(shù)據(jù)庫(kù) >  正文

    PostgreSQL用戶登錄失敗自動(dòng)鎖定的處理方案

     2021-04-21 17:05  來(lái)源: 腳本之家   我來(lái)投稿 撤稿糾錯(cuò)

      阿里云優(yōu)惠券 先領(lǐng)券再下單

    墨墨導(dǎo)讀:PostgreSQL使用session_exec插件實(shí)現(xiàn)用戶密碼驗(yàn)證失敗幾次后自動(dòng)鎖定,本文介紹一種處理方案。

    一、插件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'

     

    注意:上面第一個(gè)變量是設(shè)置session_preload_libraries而不是通常設(shè)置的shared_preload_libraries。

    第二個(gè)變量是需要自定義實(shí)現(xiàn)的登錄函數(shù)。

    重啟數(shù)據(jù)庫(kù)服務(wù)。

    1$ sudo systemctl restart postgresql-12

    二、自定義登錄函數(shù)篇

    創(chuàng)建t_login表用于存儲(chǔ)提取自數(shù)據(jù)庫(kù)日志中登錄失敗的信息。

    create table t_login
    (
    login_time timestamp(3) with time zone --插入時(shí)間,
    user_name text --數(shù)據(jù)庫(kù)登錄用戶,
    flag int4 --標(biāo)志位,0代表過(guò)期數(shù)據(jù),1代表正常狀態(tài)數(shù)據(jù)
    );

     

    使用file_fdw外部表記錄數(shù)據(jù)庫(kù)日志信息。

    file_fdw如果未配置過(guò),參見(jiàn)下面步驟。

    $ 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,關(guān)聯(lián)數(shù)據(jù)庫(kù)日志中登錄失敗的信息。

    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需要修改為實(shí)際環(huán)境日志目錄。

    2. 不同PG版本csv日志格式可能有所差異,參考PG官網(wǎng)文檔runtime-config-logging章節(jié)(http://postgres.cn/docs/12/runtime-config-logging.html)。

    此時(shí)連接數(shù)據(jù)庫(kù)因未創(chuàng)建登錄函數(shù)會(huì)出現(xiàn)下面的警告信息。

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

     

    創(chuàng)建登錄函數(shù)login。

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

    --獲取當(dāng)前日志中最新時(shí)間
    select login_time
    from public.t_login
    where flag = 0
    order by login_time
    desc limit 1
    into c1;

     --將最新的數(shù)據(jù)插入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;

    --檢查登錄失敗次數(shù)是否大于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);
    --斷開(kāi)當(dāng)前被鎖定用戶會(huì)話
    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';

     

    測(cè)試使用篇

    創(chuàng)建測(cè)試用戶。

    1create user test1 encrypted password 'XXX';

    模擬test1用戶登錄失敗,輸入錯(cuò)誤密碼。

    $ psql -h192.168.137.11 -Utest1 postgres
    Password for user test1:
    psql: error: FATAL: password authentication failed for user "test1"

     

    通過(guò)外部表查看登錄失敗的日志。

    1select * from postgres_log where command_tag='authentication' and error_severity= 'FATAL';

    可以看到1條數(shù)據(jù),手工插入一條登錄失敗的信息到t_login表。

    insert into t_login select log_time,user_name,0
     from postgres_log
     where command_tag='authentication'
     and error_severity= 'FATAL';

     

    參考上面登錄失敗測(cè)試,接著再測(cè)試2次。

    然后使用postgres用戶登錄數(shù)據(jù)庫(kù),觀察t_login表數(shù)據(jù)。

    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)

     

    再測(cè)試兩次失敗登錄,然后使用postgres用戶登錄數(shù)據(jù)庫(kù),看到提示該用戶被鎖定。

    [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)

     

    解鎖用戶。

    1update t_login set flag = 0 where user_name='test1' and flag=1;

    總結(jié)

    session_exec通過(guò)用戶登錄成功后調(diào)用login函數(shù)去實(shí)現(xiàn)鎖定登錄失敗次數(shù)過(guò)多的用戶。

    此種方式有點(diǎn)繁瑣且會(huì)造成數(shù)據(jù)庫(kù)連接變慢。

    不支持自動(dòng)解鎖,需要管理用戶手工處理。

    文章來(lái)源:腳本之家

    來(lái)源地址:https://www.jb51.net/article/208017.htm

    申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!

    相關(guān)文章

    熱門(mén)排行

    信息推薦