1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    PostgreSQL用戶登錄失敗自動鎖定的處理方案_PostgreSQL

    來源:腳本之家  責任編輯:小易  

    墨墨導讀:PostgreSQL使用session_exec插件實現用戶密碼驗證失敗幾次后自動鎖定,本文介紹一種處理方案。

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

    二、自定義登錄函數篇

    創建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.

    創建登錄函數login。

    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';

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

    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函數去實現鎖定登錄失敗次數過多的用戶。 此種方式有點繁瑣且會造成數據庫連接變慢。 不支持自動解鎖,需要管理用戶手工處理。

    參考鏈接:

    http://www.yu113.com/article/208018.htm

    到此這篇關于PostgreSQL用戶登錄失敗自動鎖定的解決辦法的文章就介紹到這了,更多相關PostgreSQL登錄失敗自動鎖定內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

    您可能感興趣的文章:PostgreSQL 實現登錄及修改密碼操作Postgresql限制用戶登錄錯誤次數的實例代碼

  3. 本文相關:
  4. pgsql 變量賦值方法及注意事項
  5. postgresql 實現sql放入文件批量執行
  6. postgresql表膨脹監控案例(精確計算)
  7. postgresql中wal_level的三個參數用法說明
  8. postgresql 查看數據庫,索引,表,表空間大小的示例代碼
  9. postgresql 實現給查詢列表增加序號操作
  10. postgresql的generate_series()函數的用法說明
  11. linux下創建postgresql數據庫的方法步驟
  12. windows下postgresql數據庫的下載與配置方法
  13. postgresql數據庫中如何保證like語句的效率(推薦)
  14. PostgreSQL的用戶,角色跟權限管理怎么解決
  15. win10下,postgresql 連接失敗,用戶驗證失敗
  16. postgressql數據庫登錄提示"postgres" password 認...
  17. PostgreSQL建立索引如何避免寫數據鎖定
  18. PostgresQL建立索引如何避免寫數據鎖定
  19. 寫數據到PostgreSQL數據庫錯誤問題,怎么解決
  20. 急!!使用命令行進入psql時總是提示我“用戶admini...
  21. PostgreSQL 密碼過期如何設置
  22. 如何重置postgresql用戶密碼
  23. Postgresql 連接錯誤
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess數據庫文摘數據庫其它首頁postgresql 實現登錄及修改密碼操作postgresql限制用戶登錄錯誤次數的實例代碼pgsql 變量賦值方法及注意事項postgresql 實現sql放入文件批量執行postgresql表膨脹監控案例(精確計算)postgresql中wal_level的三個參數用法說明postgresql 查看數據庫,索引,表,表空間大小的示例代碼postgresql 實現給查詢列表增加序號操作postgresql的generate_series()函數的用法說明linux下創建postgresql數據庫的方法步驟windows下postgresql數據庫的下載與配置方法postgresql數據庫中如何保證like語句的效率(推薦)postgresql 角色與用戶管理介紹windows下postgresql數據庫的下載windows下postgresql安裝圖解postgresql中的oid和xid 說明15個postgresql數據庫實用命令分postgresql alter語句常用操作小windows postgresql 安裝圖文教程postgresql 安裝和簡單使用postgresql 創建表分區postgresql新手入門教程postgresql 中的 like 查詢優化方案pgsql 實現用戶自定義表結構信息獲取postgresql timestamp類型 時間戳操作postgresql 查詢表引用或被引用的外鍵操作postgresql忘記postgres賬號密碼的解決方ubuntu中卸載postgresql出錯的解決方法postgresql數據合并,多條數據合并成1條的postgresql 賦予用戶權限和撤銷權限的實例postgresql 修改列類型操作postgresql數據類型格式化函數操作
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载