PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

SAU KHI LOGON (Oracle) kích hoạt trong PostgreSQL với phần mở rộng - login_hook

Trước khi đi vào chi tiết, cảm ơn tác giả của tiện ích mở rộng 'login hook' đã phát triển và duy trì nó.

Nhiều lần, trong bài tập di chuyển Oracle sang Postgres, tôi đã thấy việc sử dụng trình kích hoạt Sự kiện Cơ sở dữ liệu Oracle - SAU KHI BẬT ĐĂNG NHẬP. Một loại cơ sở dữ liệu Oracle / trình kích hoạt sự kiện người dùng (LOGON) kích hoạt khi người dùng kết nối với cơ sở dữ liệu, thường được sử dụng để thiết lập môi trường người dùng và thực hiện các chức năng liên quan đến vai trò ứng dụng an toàn.

Ví dụ:giả sử chúng tôi có một người dùng ứng dụng mà chúng tôi muốn anh ta kết nối từ ứng dụng CHỈ và không phải từ bất kỳ chương trình hoặc ứng dụng khách nào khác (Oracle / SQL * Plus). Điều này có thể đạt được bằng cách tạo trình kích hoạt sự kiện cơ sở dữ liệu SAU KHI BẬT ĐĂNG NHẬP trong Oracle.

Postgres hỗ trợ hầu hết các trình kích hoạt tiêu chuẩn, nhưng không có trình kích hoạt SAU KHI ĐĂNG NHẬP. Để giải quyết vấn đề, tôi đã chọn login_hook tiện ích mở rộng hoạt động khá tốt.

Hãy xem những gì chúng ta sẽ chuyển đổi từ Oracle sang Postgres với sự trợ giúp của tiện ích mở rộng. Có một trình kích hoạt trong Oracle ngăn người dùng ứng dụng kết nối với cơ sở dữ liệu từ các chương trình / ứng dụng khách khác (sqlplus).

CREATE OR REPLACE TRIGGER program_restrict
AFTER LOGON ON DATABASE
BEGIN
    FOR x IN (SELECT username, program FROM SYS.v_$session WHERE audsid = USERENV ('sessionid'))
    LOOP
    IF LTRIM (RTRIM (x.username)) = 'MIGUSER' AND UPPER(substr(x.program,1,7)) = 'SQLPLUS'
    THEN
      raise_application_error(-20999,'Not authorized to use in the Production environment!');
    END IF;
    END LOOP;
END program_restrict;

Từ đoạn mã trên, rõ ràng là MIGUSER (người dùng ứng dụng) bị hạn chế kết nối qua SQL*PLUS khách hàng và bất kỳ nỗ lực nào mà người dùng thực hiện sẽ dẫn đến lỗi sau:

[oracle@rrr ~]$ rlsqlplus miguser/miguser
... <trimmed banner>
ERROR:
ORA-04088: error during execution of trigger 'SYS.PROGRAM_RESTRICT'
ORA-00604: error occurred at recursive SQL level 1
ORA-20999: Not authorized to use in the Production environment!
ORA-06512: at line 6
ORA-06512: at line 6

Để giải quyết yêu cầu trên, trước tiên chúng ta cần biên dịch phần mở rộng login_hook trong Postgres. Các bước rất đơn giản giống như bất kỳ quá trình biên dịch tiện ích mở rộng nào khác

--Download zip/Git clone the extension
https://github.com/splendiddata/login_hook

-- Set the pg_config in your path
[root@node1-centos8 ~]# export PATH=/usr/pgsql-13/bin:$PATH

-- change to login_hook directory and run make/make install
[root@node1-centos8 ~]# cd login_hook
[root@node1-centos8 login_hook]# make
[root@node1-centos8 login_hook]# make install

-- add the login_hook.so to session_preload_libraries and restart the database

[root@node1-centos8 ~]# grep -i session_preload /var/lib/pgsql/13/data/postgresql.conf
session_preload_libraries = 'login_hook'
[root@node1-centos8 ~]# systemctl restart postgresql-13.service

-- connect to the database and create the extension
[postgres@node1-centos8 ~]$ psql
psql (13.1)
Type "help" for help.

postgres=# create extension login_hook;
CREATE EXTENSION

Bây giờ, chúng tôi đã sẵn sàng để sử dụng tiện ích mở rộng này. Trong trường hợp của chúng tôi, chúng tôi sẽ ngăn người dùng ứng dụng sử dụng ứng dụng khách Postgres psql . Để thực hiện việc này, hãy sử dụng hàm mẫu được cung cấp trên login_hook và sửa đổi nó để lấy tên ứng dụng của khách hàng từ pg_stat_activity xem và chấm dứt nó bằng pg_termina_backend () chức năng hệ thống. Lưu ý:Bạn có thể sử dụng cùng một chức năng mẫu cho một số mục đích để quản lý người dùng ứng dụng.

CREATE OR REPLACE FUNCTION login_hook.login() RETURNS VOID LANGUAGE PLPGSQL AS $$
DECLARE
    ex_state   TEXT;
    ex_message TEXT;
    ex_detail  TEXT;
    ex_hint    TEXT;
    ex_context TEXT;
	rec record;
BEGIN
	IF NOT login_hook.is_executing_login_hook()
	THEN
	    RAISE EXCEPTION 'The login_hook.login() function should only be invoked by the login_hook code';
	END IF;
	
	BEGIN
    for rec in select pid,usename,application_name from pg_stat_activity where application_name ilike 'psql%'
    loop
          if rtrim(rec.usename) = 'miguser' and rtrim(rec.application_name) = 'psql' then
            raise notice 'Application users(%) restricted to connect with any clients(%)',rec.usename,rec.application_name;
            perform pg_terminate_backend(rec.pid);
          end if;
    end loop;
	EXCEPTION
	   WHEN OTHERS THEN
	       GET STACKED DIAGNOSTICS ex_state   = RETURNED_SQLSTATE
	                             , ex_message = MESSAGE_TEXT
	                             , ex_detail  = PG_EXCEPTION_DETAIL
	                             , ex_hint    = PG_EXCEPTION_HINT
	                             , ex_context = PG_EXCEPTION_CONTEXT;
	       RAISE LOG e'Error in login_hook.login()\nsqlstate: %\nmessage : %\ndetail  : %\nhint    : %\ncontext : %'
	               , ex_state
	               , ex_message
	               , ex_detail
	               , ex_hint
	               , ex_context;
    END	;       
END$$;

-- Give exeuction grant on the function. 
GRANT EXECUTE ON FUNCTION login_hook.login() TO PUBLIC;

Bây giờ, hãy xem liệu người dùng ứng dụng có thể sử dụng Postgres psql hay không để kết nối với cơ sở dữ liệu.

[postgres@node1-centos8 ~]$ psql -U miguser -d postgres -p 5432
NOTICE:  Application users(miguser) restricted to connect with any clients(psql)
psql: error: FATAL:  terminating connection due to administrator command
CONTEXT:  SQL statement "SELECT pg_terminate_backend(rec.pid)"
PL/pgSQL function login_hook.login() line 20 at PERFORM
SQL statement "select login_hook.login()

Ngầu. Chúng tôi có thể ngăn kết nối của người dùng ứng dụng với bất kỳ chương trình / ứng dụng khách nào khác trong Postgres.

Xin cảm ơn.

–Raghav


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. rake db:tạo cơ sở dữ liệu ném không tồn tại lỗi với postgresql

  2. Làm cách nào để khởi động PostgreSQL trên Windows?

  3. Làm thế nào để cung cấp một ứng dụng khách API với 1.000.000 kết quả cơ sở dữ liệu?

  4. tùy chỉnh máy nhắn tin trong psql

  5. Postgres SSL SYSCALL lỗi:Đã phát hiện thấy EOF với python và psycopg