mirror of https://github.com/postgres/postgres
This removes pg_audit, per discussion: 20150528082038.GU26667@tamriel.snowman.netpull/14/head
parent
32f628be74
commit
e5f1a4f1e3
@ -1,5 +0,0 @@ |
||||
log/ |
||||
results/ |
||||
tmp_check/ |
||||
regression.diffs |
||||
regression.out |
@ -1,21 +0,0 @@ |
||||
# contrib/pg_audit/Makefile
|
||||
|
||||
MODULE_big = pg_audit
|
||||
OBJS = pg_audit.o $(WIN32RES)
|
||||
|
||||
EXTENSION = pg_audit
|
||||
DATA = pg_audit--1.0.sql
|
||||
PGFILEDESC = "pg_audit - An audit logging extension for PostgreSQL"
|
||||
|
||||
REGRESS = pg_audit
|
||||
|
||||
ifdef USE_PGXS |
||||
PG_CONFIG = pg_config
|
||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||
include $(PGXS) |
||||
else |
||||
subdir = contrib/pg_audit
|
||||
top_builddir = ../..
|
||||
include $(top_builddir)/src/Makefile.global |
||||
include $(top_srcdir)/contrib/contrib-global.mk |
||||
endif |
File diff suppressed because it is too large
Load Diff
@ -1,22 +0,0 @@ |
||||
/* pg_audit/pg_audit--1.0.sql */ |
||||
|
||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION |
||||
\echo Use "CREATE EXTENSION pg_audit" to load this file.\quit |
||||
|
||||
CREATE FUNCTION pg_audit_ddl_command_end() |
||||
RETURNS event_trigger |
||||
LANGUAGE C |
||||
AS 'MODULE_PATHNAME', 'pg_audit_ddl_command_end'; |
||||
|
||||
CREATE EVENT TRIGGER pg_audit_ddl_command_end |
||||
ON ddl_command_end |
||||
EXECUTE PROCEDURE pg_audit_ddl_command_end(); |
||||
|
||||
CREATE FUNCTION pg_audit_sql_drop() |
||||
RETURNS event_trigger |
||||
LANGUAGE C |
||||
AS 'MODULE_PATHNAME', 'pg_audit_sql_drop'; |
||||
|
||||
CREATE EVENT TRIGGER pg_audit_sql_drop |
||||
ON sql_drop |
||||
EXECUTE PROCEDURE pg_audit_sql_drop(); |
File diff suppressed because it is too large
Load Diff
@ -1,5 +0,0 @@ |
||||
# pg_audit extension |
||||
comment = 'provides auditing functionality' |
||||
default_version = '1.0' |
||||
module_pathname = '$libdir/pg_audit' |
||||
relocatable = true |
@ -1,669 +0,0 @@ |
||||
-- Load pg_audit module |
||||
create extension pg_audit; |
||||
|
||||
-- |
||||
-- Audit log fields are: |
||||
-- AUDIT_TYPE - SESSION or OBJECT |
||||
-- STATEMENT_ID - ID of the statement in the current backend |
||||
-- SUBSTATEMENT_ID - ID of the substatement in the current backend |
||||
-- CLASS - Class of statement being logged (e.g. ROLE, READ, WRITE) |
||||
-- COMMAND - e.g. SELECT, CREATE ROLE, UPDATE |
||||
-- OBJECT_TYPE - When available, type of object acted on (e.g. TABLE, VIEW) |
||||
-- OBJECT_NAME - When available, fully-qualified table of object |
||||
-- STATEMENT - The statement being logged |
||||
-- PARAMETER - If parameter logging is requested, they will follow the |
||||
-- statement |
||||
|
||||
select current_user \gset |
||||
|
||||
-- |
||||
-- Set pg_audit parameters for the current (super)user. |
||||
ALTER ROLE :current_user SET pg_audit.log = 'Role'; |
||||
ALTER ROLE :current_user SET pg_audit.log_level = 'notice'; |
||||
|
||||
CREATE FUNCTION load_pg_audit( ) |
||||
RETURNS VOID |
||||
LANGUAGE plpgsql |
||||
SECURITY DEFINER |
||||
AS $function$ |
||||
declare |
||||
begin |
||||
LOAD 'pg_audit'; |
||||
end; |
||||
$function$; |
||||
|
||||
-- After each connect, we need to load pg_audit, as if it was |
||||
-- being loaded from shared_preload_libraries. Otherwise, the hooks |
||||
-- won't be set up and called correctly, leading to lots of ugly |
||||
-- errors. |
||||
\connect - :current_user; |
||||
select load_pg_audit(); |
||||
|
||||
-- |
||||
-- Create auditor role |
||||
CREATE ROLE auditor; |
||||
|
||||
-- |
||||
-- Create first test user |
||||
CREATE USER user1; |
||||
ALTER ROLE user1 SET pg_audit.log = 'ddl, ROLE'; |
||||
ALTER ROLE user1 SET pg_audit.log_level = 'notice'; |
||||
|
||||
-- |
||||
-- Create, select, drop (select will not be audited) |
||||
\connect - user1 |
||||
select load_pg_audit(); |
||||
CREATE TABLE public.test (id INT); |
||||
SELECT * FROM test; |
||||
DROP TABLE test; |
||||
|
||||
-- |
||||
-- Create second test user |
||||
\connect - :current_user |
||||
select load_pg_audit(); |
||||
|
||||
CREATE USER user2; |
||||
ALTER ROLE user2 SET pg_audit.log = 'Read, writE'; |
||||
ALTER ROLE user2 SET pg_audit.log_catalog = OFF; |
||||
ALTER ROLE user2 SET pg_audit.log_level = 'warning'; |
||||
ALTER ROLE user2 SET pg_audit.role = auditor; |
||||
ALTER ROLE user2 SET pg_audit.log_statement_once = ON; |
||||
|
||||
\connect - user2 |
||||
select load_pg_audit(); |
||||
CREATE TABLE test2 (id INT); |
||||
GRANT SELECT ON TABLE public.test2 TO auditor; |
||||
|
||||
-- |
||||
-- Role-based tests |
||||
CREATE TABLE test3 |
||||
( |
||||
id INT |
||||
); |
||||
|
||||
SELECT count(*) |
||||
FROM |
||||
( |
||||
SELECT relname |
||||
FROM pg_class |
||||
LIMIT 1 |
||||
) SUBQUERY; |
||||
|
||||
SELECT * |
||||
FROM test3, test2; |
||||
|
||||
GRANT INSERT |
||||
ON TABLE public.test3 |
||||
TO auditor; |
||||
|
||||
-- |
||||
-- Create a view to test logging |
||||
CREATE VIEW vw_test3 AS |
||||
SELECT * |
||||
FROM test3; |
||||
|
||||
GRANT SELECT |
||||
ON vw_test3 |
||||
TO auditor; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- select on vw_test3 |
||||
-- select on test2 |
||||
SELECT * |
||||
FROM vw_test3, test2; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- insert on test3 |
||||
-- select on test2 |
||||
WITH CTE AS |
||||
( |
||||
SELECT id |
||||
FROM test2 |
||||
) |
||||
INSERT INTO test3 |
||||
SELECT id |
||||
FROM cte; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- insert on test3 |
||||
WITH CTE AS |
||||
( |
||||
INSERT INTO test3 VALUES (1) |
||||
RETURNING id |
||||
) |
||||
INSERT INTO test2 |
||||
SELECT id |
||||
FROM cte; |
||||
|
||||
GRANT UPDATE ON TABLE public.test2 TO auditor; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- insert on test3 |
||||
-- update on test2 |
||||
WITH CTE AS |
||||
( |
||||
UPDATE test2 |
||||
SET id = 1 |
||||
RETURNING id |
||||
) |
||||
INSERT INTO test3 |
||||
SELECT id |
||||
FROM cte; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- insert on test2 |
||||
WITH CTE AS |
||||
( |
||||
INSERT INTO test2 VALUES (1) |
||||
RETURNING id |
||||
) |
||||
UPDATE test3 |
||||
SET id = cte.id |
||||
FROM cte |
||||
WHERE test3.id <> cte.id; |
||||
|
||||
-- |
||||
-- Change permissions of user 2 so that only object logging will be done |
||||
\connect - :current_user |
||||
select load_pg_audit(); |
||||
alter role user2 set pg_audit.log = 'NONE'; |
||||
|
||||
\connect - user2 |
||||
select load_pg_audit(); |
||||
|
||||
-- |
||||
-- Create test4 and add permissions |
||||
CREATE TABLE test4 |
||||
( |
||||
id int, |
||||
name text |
||||
); |
||||
|
||||
GRANT SELECT (name) |
||||
ON TABLE public.test4 |
||||
TO auditor; |
||||
|
||||
GRANT UPDATE (id) |
||||
ON TABLE public.test4 |
||||
TO auditor; |
||||
|
||||
GRANT insert (name) |
||||
ON TABLE public.test4 |
||||
TO auditor; |
||||
|
||||
-- |
||||
-- Not object logged |
||||
SELECT id |
||||
FROM public.test4; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- select (name) on test4 |
||||
SELECT name |
||||
FROM public.test4; |
||||
|
||||
-- |
||||
-- Not object logged |
||||
INSERT INTO public.test4 (id) |
||||
VALUES (1); |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- insert (name) on test4 |
||||
INSERT INTO public.test4 (name) |
||||
VALUES ('test'); |
||||
|
||||
-- |
||||
-- Not object logged |
||||
UPDATE public.test4 |
||||
SET name = 'foo'; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- update (id) on test4 |
||||
UPDATE public.test4 |
||||
SET id = 1; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- update (name) on test4 |
||||
-- update (name) takes precedence over select (name) due to ordering |
||||
update public.test4 set name = 'foo' where name = 'bar'; |
||||
|
||||
-- |
||||
-- Drop test tables |
||||
DROP TABLE test2; |
||||
DROP VIEW vw_test3; |
||||
DROP TABLE test3; |
||||
DROP TABLE test4; |
||||
|
||||
-- |
||||
-- Change permissions of user 1 so that session logging will be done |
||||
\connect - :current_user |
||||
select load_pg_audit(); |
||||
alter role user1 set pg_audit.log = 'DDL, READ'; |
||||
\connect - user1 |
||||
select load_pg_audit(); |
||||
|
||||
-- |
||||
-- Create table is session logged |
||||
CREATE TABLE public.account |
||||
( |
||||
id INT, |
||||
name TEXT, |
||||
password TEXT, |
||||
description TEXT |
||||
); |
||||
|
||||
-- |
||||
-- Select is session logged |
||||
SELECT * |
||||
FROM account; |
||||
|
||||
-- |
||||
-- Insert is not logged |
||||
INSERT INTO account (id, name, password, description) |
||||
VALUES (1, 'user1', 'HASH1', 'blah, blah'); |
||||
|
||||
-- |
||||
-- Change permissions of user 1 so that only object logging will be done |
||||
\connect - :current_user |
||||
select load_pg_audit(); |
||||
alter role user1 set pg_audit.log = 'none'; |
||||
alter role user1 set pg_audit.role = 'auditor'; |
||||
\connect - user1 |
||||
select load_pg_audit(); |
||||
|
||||
-- |
||||
-- ROLE class not set, so auditor grants not logged |
||||
GRANT SELECT (password), |
||||
UPDATE (name, password) |
||||
ON TABLE public.account |
||||
TO auditor; |
||||
|
||||
-- |
||||
-- Not object logged |
||||
SELECT id, |
||||
name |
||||
FROM account; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- select (password) on account |
||||
SELECT password |
||||
FROM account; |
||||
|
||||
-- |
||||
-- Not object logged |
||||
UPDATE account |
||||
SET description = 'yada, yada'; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- update (password) on account |
||||
UPDATE account |
||||
SET password = 'HASH2'; |
||||
|
||||
-- |
||||
-- Change permissions of user 1 so that session relation logging will be done |
||||
\connect - :current_user |
||||
select load_pg_audit(); |
||||
alter role user1 set pg_audit.log_relation = on; |
||||
alter role user1 set pg_audit.log = 'read, WRITE'; |
||||
\connect - user1 |
||||
select load_pg_audit(); |
||||
|
||||
-- |
||||
-- Not logged |
||||
create table ACCOUNT_ROLE_MAP |
||||
( |
||||
account_id INT, |
||||
role_id INT |
||||
); |
||||
|
||||
-- |
||||
-- ROLE class not set, so auditor grants not logged |
||||
GRANT SELECT |
||||
ON TABLE public.account_role_map |
||||
TO auditor; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- select (password) on account |
||||
-- select on account_role_map |
||||
-- Session logged on all tables because log = read and log_relation = on |
||||
SELECT account.password, |
||||
account_role_map.role_id |
||||
FROM account |
||||
INNER JOIN account_role_map |
||||
on account.id = account_role_map.account_id; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- select (password) on account |
||||
-- Session logged on all tables because log = read and log_relation = on |
||||
SELECT password |
||||
FROM account; |
||||
|
||||
-- |
||||
-- Not object logged |
||||
-- Session logged on all tables because log = read and log_relation = on |
||||
UPDATE account |
||||
SET description = 'yada, yada'; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- select (password) on account (in the where clause) |
||||
-- Session logged on all tables because log = read and log_relation = on |
||||
UPDATE account |
||||
SET description = 'yada, yada' |
||||
where password = 'HASH2'; |
||||
|
||||
-- |
||||
-- Object logged because of: |
||||
-- update (password) on account |
||||
-- Session logged on all tables because log = read and log_relation = on |
||||
UPDATE account |
||||
SET password = 'HASH2'; |
||||
|
||||
-- |
||||
-- Change back to superuser to do exhaustive tests |
||||
\connect - :current_user |
||||
select load_pg_audit(); |
||||
SET pg_audit.log = 'ALL'; |
||||
SET pg_audit.log_level = 'notice'; |
||||
SET pg_audit.log_relation = ON; |
||||
SET pg_audit.log_parameter = ON; |
||||
|
||||
-- |
||||
-- Simple DO block |
||||
DO $$ |
||||
BEGIN |
||||
raise notice 'test'; |
||||
END $$; |
||||
|
||||
-- |
||||
-- Create test schema |
||||
CREATE SCHEMA test; |
||||
|
||||
-- |
||||
-- Copy account to stdout |
||||
COPY account TO stdout; |
||||
|
||||
-- |
||||
-- Create a table from a query |
||||
CREATE TABLE test.account_copy AS |
||||
SELECT * |
||||
FROM account; |
||||
|
||||
-- |
||||
-- Copy from stdin to account copy |
||||
COPY test.account_copy from stdin; |
||||
1 user1 HASH2 yada, yada |
||||
\. |
||||
|
||||
-- |
||||
-- Test prepared statement |
||||
PREPARE pgclassstmt (oid) AS |
||||
SELECT * |
||||
FROM account |
||||
WHERE id = $1; |
||||
|
||||
EXECUTE pgclassstmt (1); |
||||
DEALLOCATE pgclassstmt; |
||||
|
||||
-- |
||||
-- Test cursor |
||||
BEGIN; |
||||
|
||||
DECLARE ctest SCROLL CURSOR FOR |
||||
SELECT count(*) |
||||
FROM |
||||
( |
||||
SELECT relname |
||||
FROM pg_class |
||||
LIMIT 1 |
||||
) subquery; |
||||
|
||||
FETCH NEXT FROM ctest; |
||||
CLOSE ctest; |
||||
COMMIT; |
||||
|
||||
-- |
||||
-- Turn off log_catalog and pg_class will not be logged |
||||
SET pg_audit.log_catalog = OFF; |
||||
|
||||
SELECT count(*) |
||||
FROM |
||||
( |
||||
SELECT relname |
||||
FROM pg_class |
||||
LIMIT 1 |
||||
) subquery; |
||||
|
||||
-- |
||||
-- Test prepared insert |
||||
CREATE TABLE test.test_insert |
||||
( |
||||
id INT |
||||
); |
||||
|
||||
PREPARE pgclassstmt (oid) AS |
||||
INSERT INTO test.test_insert (id) |
||||
VALUES ($1); |
||||
EXECUTE pgclassstmt (1); |
||||
|
||||
-- |
||||
-- Check that primary key creation is logged |
||||
CREATE TABLE public.test |
||||
( |
||||
id INT, |
||||
name TEXT, |
||||
description TEXT, |
||||
CONSTRAINT test_pkey PRIMARY KEY (id) |
||||
); |
||||
|
||||
-- |
||||
-- Check that analyze is logged |
||||
ANALYZE test; |
||||
|
||||
-- |
||||
-- Grants to public should not cause object logging (session logging will |
||||
-- still happen) |
||||
GRANT SELECT |
||||
ON TABLE public.test |
||||
TO PUBLIC; |
||||
|
||||
SELECT * |
||||
FROM test; |
||||
|
||||
-- Check that statements without columns log |
||||
SELECT |
||||
FROM test; |
||||
|
||||
SELECT 1, |
||||
substring('Thomas' from 2 for 3); |
||||
|
||||
DO $$ |
||||
DECLARE |
||||
test INT; |
||||
BEGIN |
||||
SELECT 1 |
||||
INTO test; |
||||
END $$; |
||||
|
||||
explain select 1; |
||||
|
||||
-- |
||||
-- Test that looks inside of do blocks log |
||||
INSERT INTO TEST (id) |
||||
VALUES (1); |
||||
INSERT INTO TEST (id) |
||||
VALUES (2); |
||||
INSERT INTO TEST (id) |
||||
VALUES (3); |
||||
|
||||
DO $$ |
||||
DECLARE |
||||
result RECORD; |
||||
BEGIN |
||||
FOR result IN |
||||
SELECT id |
||||
FROM test |
||||
LOOP |
||||
INSERT INTO test (id) |
||||
VALUES (result.id + 100); |
||||
END LOOP; |
||||
END $$; |
||||
|
||||
-- |
||||
-- Test obfuscated dynamic sql for clean logging |
||||
DO $$ |
||||
DECLARE |
||||
table_name TEXT = 'do_table'; |
||||
BEGIN |
||||
EXECUTE 'CREATE TABLE ' || table_name || ' ("weird name" INT)'; |
||||
EXECUTE 'DROP table ' || table_name; |
||||
END $$; |
||||
|
||||
-- |
||||
-- Generate an error and make sure the stack gets cleared |
||||
DO $$ |
||||
BEGIN |
||||
CREATE TABLE bogus.test_block |
||||
( |
||||
id INT |
||||
); |
||||
END $$; |
||||
|
||||
-- |
||||
-- Test alter table statements |
||||
ALTER TABLE public.test |
||||
DROP COLUMN description ; |
||||
|
||||
ALTER TABLE public.test |
||||
RENAME TO test2; |
||||
|
||||
ALTER TABLE public.test2 |
||||
SET SCHEMA test; |
||||
|
||||
ALTER TABLE test.test2 |
||||
ADD COLUMN description TEXT; |
||||
|
||||
ALTER TABLE test.test2 |
||||
DROP COLUMN description; |
||||
|
||||
DROP TABLE test.test2; |
||||
|
||||
-- |
||||
-- Test multiple statements with one semi-colon |
||||
CREATE SCHEMA foo |
||||
CREATE TABLE foo.bar (id int) |
||||
CREATE TABLE foo.baz (id int); |
||||
|
||||
-- |
||||
-- Test aggregate |
||||
CREATE FUNCTION public.int_add |
||||
( |
||||
a INT, |
||||
b INT |
||||
) |
||||
RETURNS INT LANGUAGE plpgsql AS $$ |
||||
BEGIN |
||||
return a + b; |
||||
END $$; |
||||
|
||||
SELECT int_add(1, 1); |
||||
|
||||
CREATE AGGREGATE public.sum_test(INT) (SFUNC=public.int_add, STYPE=INT, INITCOND='0'); |
||||
ALTER AGGREGATE public.sum_test(integer) RENAME TO sum_test2; |
||||
|
||||
-- |
||||
-- Test conversion |
||||
CREATE CONVERSION public.conversion_test FOR 'SQL_ASCII' TO 'MULE_INTERNAL' FROM pg_catalog.ascii_to_mic; |
||||
ALTER CONVERSION public.conversion_test RENAME TO conversion_test2; |
||||
|
||||
-- |
||||
-- Test create/alter/drop database |
||||
CREATE DATABASE contrib_regression_pgaudit; |
||||
ALTER DATABASE contrib_regression_pgaudit RENAME TO contrib_regression_pgaudit2; |
||||
DROP DATABASE contrib_regression_pgaudit2; |
||||
|
||||
-- |
||||
-- Test that frees a memory context earlier than expected |
||||
CREATE TABLE hoge |
||||
( |
||||
id int |
||||
); |
||||
|
||||
CREATE FUNCTION test() |
||||
RETURNS INT AS $$ |
||||
DECLARE |
||||
cur1 cursor for select * from hoge; |
||||
tmp int; |
||||
BEGIN |
||||
OPEN cur1; |
||||
FETCH cur1 into tmp; |
||||
RETURN tmp; |
||||
END $$ |
||||
LANGUAGE plpgsql ; |
||||
|
||||
SELECT test(); |
||||
|
||||
-- |
||||
-- Delete all rows then delete 1 row |
||||
SET pg_audit.log = 'write'; |
||||
SET pg_audit.role = 'auditor'; |
||||
|
||||
create table bar |
||||
( |
||||
col int |
||||
); |
||||
|
||||
grant delete |
||||
on bar |
||||
to auditor; |
||||
|
||||
insert into bar (col) |
||||
values (1); |
||||
delete from bar; |
||||
|
||||
insert into bar (col) |
||||
values (1); |
||||
delete from bar |
||||
where col = 1; |
||||
|
||||
drop table bar; |
||||
|
||||
-- |
||||
-- Grant roles to each other |
||||
SET pg_audit.log = 'role'; |
||||
GRANT user1 TO user2; |
||||
REVOKE user1 FROM user2; |
||||
|
||||
-- Cleanup |
||||
-- Set client_min_messages up to warning to avoid noise |
||||
SET client_min_messages = 'warning'; |
||||
|
||||
ALTER ROLE :current_user RESET pg_audit.log; |
||||
ALTER ROLE :current_user RESET pg_audit.log_level; |
||||
|
||||
DROP TABLE test.account_copy; |
||||
DROP TABLE test.test_insert; |
||||
DROP SCHEMA test; |
||||
DROP TABLE foo.bar; |
||||
DROP TABLE foo.baz; |
||||
DROP SCHEMA foo; |
||||
DROP TABLE hoge; |
||||
DROP TABLE account; |
||||
DROP TABLE account_role_map; |
||||
DROP USER user2; |
||||
DROP USER user1; |
||||
DROP ROLE auditor; |
||||
|
||||
RESET client_min_messages; |
Loading…
Reference in new issue