Содержание
  1. postgres.conf logs
    1. 1. Настройки логирования
    2. 2. Уровень детализации логов
    3. 3. Логирование активности
    4. 4. Логирование выполнения запросов
    5. 5. Настройки безопасности
    6. Пример конфигурации
  2. ROLE
  3. 100 команд для администрирования postgres
    1. Управление ролями и пользователями
    2. Управление правами доступа
    3. Политики безопасности строк (Row Level Security)
    4. Управление аудитом и журналированием
    5. Управление сертификатами и шифрованием
    6. Резервное копирование и восстановление
    7. Мониторинг и управление производительностью
    8. Управление подключениями
    9. Полезные запросы для безопасности
    10. Примеры использования схем и контекстов безопасности
    11. Команды для управления таблицами
    12. Работа с индексами
    13. Управление представлениями
    14. Управление триггерами
    15. Расширения безопасности
    16. Резервное копирование и восстановление с помощью утилит
    17. Управление логами и мониторингом
    18. Управление точками восстановления и транзакциями
    19. Полезные функции и утилиты
    20. Управление таблицами партиций
    21. Настройки безопасности на уровне сети
    22. Управление резервным копированием на уровне файлов
    23. Управление репликацией
    24. Управление миграцией данных
    25. Управление данными в JSON
    26. Настройки производительности
    27. Полезные команды для администрирования

postgres.conf logs

Для обеспечения безопасности и эффективного расследования инцидентов в PostgreSQL важно настроить параметры логирования. Вот основные параметры, которые следует учитывать:

1. Настройки логирования

  • logging_collector: Включите сборщик логов, установив этот параметр в on. Это позволит PostgreSQL записывать логи в файлы.

  • log_directory: Укажите директорию для хранения логов. Рекомендуется использовать отдельную директорию, чтобы облегчить управление логами.

  • log_filename: Настройте формат имени файлов логов, например, postgresql-%Y-%m-%d_%H%M%S.log.

  • log_rotation_age: Установите время, через которое логи будут ротироваться. Например, 1d (один день).

  • log_rotation_size: Определите максимальный размер файла лога до его ротации. Например, 100MB.

2. Уровень детализации логов

  • log_min_messages: Установите уровень сообщений, которые должны записываться. Рекомендуется warning или error для общего логирования, но можно использовать info для более детальной информации.

  • log_min_error_statement: Определите уровень ошибок, для которых будут записываться SQL-запросы. Рекомендуется error для безопасности.

  • log_statement: Настройте, какие SQL-запросы логировать. Вы можете установить ddl (только DDL-запросы) или all (все запросы) для более детального мониторинга.

3. Логирование активности

  • log_connections: Включите логирование успешных подключений к базе данных.

  • log_disconnections: Включите логирование отключений от базы данных.

  • log_duration: Записывайте время выполнения каждого запроса. Это может помочь в анализе производительности и выявлении аномалий.

  • log_lock_waits: Включите логирование ожидания блокировок для выявления проблем с производительностью и потенциальных инцидентов.

4. Логирование выполнения запросов

  • track_activities: Включите отслеживание активностей для мониторинга текущих запросов.

  • track_counts: Включите отслеживание статистики, чтобы иметь возможность анализировать частоту выполнения запросов.

5. Настройки безопасности

  • log_line_prefix: Настройте префикс для строк логов. Например, можно добавить метку времени, имя пользователя и IP-адрес клиента для удобства анализа.

Пример конфигурации

Вот пример конфигурации для файла postgresql.conf:

logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = '1d'
log_rotation_size = '100MB'
log_min_messages = warning
log_min_error_statement = error
log_statement = 'ddl'
log_connections = on
log_disconnections = on
log_duration = on
log_lock_waits = on
track_activities = on
track_counts = on
log_line_prefix = '%m [%p]: [%l-1] user=%u,db=%d,client=%h '
# Включаем сборщик логов
logging_collector = on

# Указываем директорию для логов
log_directory = 'pg_log'

# Формат имени файлов логов
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

# Ротация логов по времени — один раз в день
log_rotation_age = '1d'

# Ротация логов по размеру — если файл достигает 100 MB
log_rotation_size = '100MB'

# Минимальный уровень сообщений для логирования — предупреждения и ошибки
log_min_messages = warning

# Логирование SQL-запросов, которые вызвали ошибки
log_min_error_statement = error

# Логировать команды, изменяющие данные (INSERT, UPDATE, DELETE)
log_statement = 'ddl'

# Логирование успешных подключений
log_connections = on

# Логирование отключений
log_disconnections = on

# Логирование продолжительности выполнения запросов
log_duration = on

# Логирование ожидания блокировок
log_lock_waits = on

# Включаем отслеживание активности пользователей
track_activities = on

# Включаем сбор статистики запросов
track_counts = on

# Префикс для строк логов с указанием времени, процесса, пользователя, базы данных и клиента
log_line_prefix = '%m [%p]: [%l-1] user=%u,db=%d,client=%h '

ROLE

В PostgreSQL атрибуты роли (roles) определяют права и возможности, предоставляемые роли. Роли в PostgreSQL могут быть либо пользователями (логинами), либо группами пользователей. Вот основные атрибуты роли:

  1. LOGIN - роль может выполнять вход в систему. Это атрибут по умолчанию для новых пользователей.
  2. NOLOGIN - роль не может выполнять вход в систему. Обычно используется для групп ролей.
  3. SUPERUSER - роль является суперпользователем и имеет все права в базе данных.
  4. NOSUPERUSER - роль не является суперпользователем.
  5. CREATEDB - роль может создавать базы данных.
  6. NOCREATEDB - роль не может создавать базы данных.
  7. CREATEROLE - роль может создавать и изменять другие роли.
  8. NOCREATEROLE - роль не может создавать и изменять другие роли.
  9. INHERIT - роль наследует права от ролей, которые ей назначены.
  10. NOINHERIT - роль не наследует права от ролей, которые ей назначены.
  11. REPLICATION - роль может выполнять действия, связанные с репликацией (например, создавать слот репликации).
  12. NOREPLICATION - роль не может выполнять действия, связанные с репликацией.
  13. BYPASSRLS - роль может обходить политику управления доступом к строкам (Row Level Security).
  14. NOBYPASSRLS - роль не может обходить политику управления доступом к строкам.
  15. CONNECTION LIMIT - ограничивает количество одновременных соединений, которые может установить роль.

Примеры создания ролей с различными атрибутами:

-- Создание роли пользователя с правами суперпользователя
CREATE ROLE superuser_role WITH SUPERUSER LOGIN PASSWORD 'password';

-- Создание роли пользователя без прав суперпользователя и без возможности создавать базы данных
CREATE ROLE normal_user WITH NOSUPERUSER NOCREATEDB LOGIN PASSWORD 'password';

-- Создание группы ролей без возможности входа
CREATE ROLE readonly_group WITH NOLOGIN;

Для изменения атрибутов существующей роли используется команда ALTER ROLE:

-- Добавление прав на создание баз данных роли normal_user
ALTER ROLE normal_user CREATEDB;

-- Удаление прав суперпользователя у роли superuser_role
ALTER ROLE superuser_role NOSUPERUSER;

Эти атрибуты позволяют гибко управлять правами доступа и возможностями пользователей в базе данных PostgreSQL.

100 команд для администрирования postgres

Управление ролями и пользователями

  1. Создание роли:
    CREATE ROLE role_name;
    
  2. Создание пользователя:
    CREATE USER user_name WITH PASSWORD 'password';
    
  3. Удаление роли:
    DROP ROLE role_name;
    
  4. Удаление пользователя:
    DROP USER user_name;
    
  5. Изменение роли:
    ALTER ROLE role_name WITH LOGIN;
    
  6. Назначение роли другой роли:
    GRANT role_name TO another_role;
    
  7. Отзыв роли у другой роли:
    REVOKE role_name FROM another_role;
    
  8. Добавление прав на создание баз данных:
    ALTER ROLE role_name CREATEDB;
    
  9. Удаление прав на создание баз данных:
    ALTER ROLE role_name NOCREATEDB;
    
  10. Добавление прав суперпользователя:
    ALTER ROLE role_name SUPERUSER;
    
  11. Удаление прав суперпользователя:
    ALTER ROLE role_name NOSUPERUSER;
    

Управление правами доступа

  1. Предоставление прав на таблицу:
    GRANT SELECT, INSERT ON table_name TO role_name;
    
  2. Отзыв прав на таблицу:
    REVOKE SELECT, INSERT ON table_name FROM role_name;
    
  3. Предоставление прав на все таблицы в схеме:
    GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA schema_name TO role_name;
    
  4. Отзыв прав на все таблицы в схеме:
    REVOKE SELECT, INSERT ON ALL TABLES IN SCHEMA schema_name FROM role_name;
    
  5. Предоставление прав на схему:
    GRANT USAGE ON SCHEMA schema_name TO role_name;
    
  6. Отзыв прав на схему:
    REVOKE USAGE ON SCHEMA schema_name FROM role_name;
    
  7. Предоставление прав на базу данных:
    GRANT CONNECT ON DATABASE db_name TO role_name;
    
  8. Отзыв прав на базу данных:
    REVOKE CONNECT ON DATABASE db_name FROM role_name;
    
  9. Предоставление прав на функцию:
    GRANT EXECUTE ON FUNCTION func_name TO role_name;
    
  10. Отзыв прав на функцию:
    REVOKE EXECUTE ON FUNCTION func_name FROM role_name;
    
  11. Предоставление прав на последовательность:
    GRANT USAGE, SELECT ON SEQUENCE seq_name TO role_name;
    
  12. Отзыв прав на последовательность:
    REVOKE USAGE, SELECT ON SEQUENCE seq_name FROM role_name;
    

Политики безопасности строк (Row Level Security)

  1. Включение политики RLS для таблицы:
    ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;
    
  2. Отключение политики RLS для таблицы:
    ALTER TABLE table_name DISABLE ROW LEVEL SECURITY;
    
  3. Создание политики RLS:
    CREATE POLICY policy_name ON table_name FOR SELECT TO role_name USING (condition);
    
  4. Удаление политики RLS:
    DROP POLICY policy_name ON table_name;
    

Управление аудитом и журналированием

  1. Включение параметра журнала:
    ALTER SYSTEM SET log_statement = 'all';
    
  2. Отключение параметра журнала:
    ALTER SYSTEM SET log_statement = 'none';
    
  3. Включение аудита для определенной таблицы:
    CREATE EXTENSION IF NOT EXISTS pgaudit;
    ALTER SYSTEM SET pgaudit.log = 'read, write';
    
  4. Настройка журнала сессий:
    ALTER SYSTEM SET log_connections = 'on';
    ALTER SYSTEM SET log_disconnections = 'on';
    
  5. Настройка уровня журналирования ошибок:
    ALTER SYSTEM SET log_min_error_statement = 'error';
    

Управление сертификатами и шифрованием

  1. Настройка SSL для сервера:
    ALTER SYSTEM SET ssl = 'on';
    
  2. Указание пути к сертификатам:
    ALTER SYSTEM SET ssl_cert_file = '/path/to/server.crt';
    ALTER SYSTEM SET ssl_key_file = '/path/to/server.key';
    ALTER SYSTEM SET ssl_ca_file = '/path/to/root.crt';
    
  3. Включение шифрования SSL для клиентов:
    ALTER SYSTEM SET ssl_prefer_server_ciphers = 'on';
    

Резервное копирование и восстановление

  1. Создание резервной копии базы данных:
    pg_dump db_name > db_name_backup.sql
    
  2. Восстановление базы данных из резервной копии:
    psql db_name < db_name_backup.sql
    

Мониторинг и управление производительностью

  1. Настройка параметров журналирования запросов:
    ALTER SYSTEM SET log_duration = 'on';
    
  2. Просмотр текущих процессов:
    SELECT * FROM pg_stat_activity;
    
  3. Завершение процесса:
    SELECT pg_terminate_backend(pid);
    

Управление подключениями

  1. Ограничение количества подключений:
    ALTER ROLE role_name CONNECTION LIMIT 5;
    
  2. Отключение роли от возможности подключения:
    ALTER ROLE role_name NOLOGIN;
    

Полезные запросы для безопасности

  1. Проверка прав на таблицы:
    SELECT grantee, table_catalog, table_schema, table_name, privilege_type
    FROM information_schema.role_table_grants
    WHERE grantee = 'role_name';
    
  2. Просмотр всех пользователей:
    SELECT usename FROM pg_user;
    
  3. Просмотр всех ролей:
    SELECT rolname FROM pg_roles;
    
  4. Просмотр прав пользователей на функции:
    SELECT nspname AS schema, proname AS function, proowner::regrole AS owner
    FROM pg_proc p
    JOIN pg_namespace n ON p.pronamespace = n.oid;
    

Примеры использования схем и контекстов безопасности

  1. Создание схемы и назначение прав:
    CREATE SCHEMA schema_name AUTHORIZATION role_name;
    GRANT USAGE ON SCHEMA schema_name TO another_role;
    
  2. Перемещение таблицы в другую схему:
    ALTER TABLE table_name SET SCHEMA new_schema_name;
    
  3. Создание контекста безопасности (security context):
    CREATE EXTENSION IF NOT EXISTS sepgsql;
    ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;
    
  4. Применение контекста безопасности к пользователям:
    ALTER ROLE role_name SET sepgsql.enable = 'on';
    

Команды для управления таблицами

  1. Создание таблицы с определенными правами:
    CREATE TABLE table_name (id SERIAL PRIMARY KEY, name TEXT) WITH (OIDS=FALSE);
    GRANT SELECT, INSERT ON table_name TO role_name;
    
  2. Удаление таблицы:
    DROP TABLE table_name;
    
  3. Изменение владельца таблицы:
    ALTER TABLE table_name OWNER TO new_owner;
    
  4. Добавление столбца в таблицу:
    ALTER TABLE table_name ADD COLUMN new_column TEXT;
    
  5. Удаление столбца из таблицы:
    ALTER TABLE table_name DROP COLUMN column_name;
    

Работа с индексами

  1. Создание индекса:
    CREATE INDEX idx_name ON table_name (column_name);
    
  2. Удаление индекса:
    DROP INDEX idx_name;
    
  3. Создание уникального индекса:
    CREATE UNIQUE INDEX unique_idx_name ON table_name (column_name);
    

Управление представлениями

  1. Создание представления:
    CREATE VIEW view_name AS SELECT column1, column2 FROM table_name;
    
  2. Удаление представления:
    DROP VIEW view_name;
    
  3. Обновление представления:
    CREATE OR REPLACE VIEW view_name AS SELECT column1, column2 FROM table_name;
    

Управление триггерами

  1. Создание триггера:
    CREATE TRIGGER trigger_name
    AFTER INSERT ON table_name
    FOR EACH ROW
    EXECUTE FUNCTION trigger_function();
    
  2. Удаление триггера:
    DROP TRIGGER trigger_name ON table_name;
    
  3. Создание функции триггера:
    CREATE FUNCTION trigger_function()
    RETURNS TRIGGER AS $$
    BEGIN
      -- код триггера
      RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    

Расширения безопасности

  1. Установка расширения pgcrypto для шифрования:
    CREATE EXTENSION IF NOT EXISTS pgcrypto;
    
  2. Использование функции для хэширования:
    SELECT crypt('my_password', gen_salt('bf'));
    
  3. Использование функции для генерации UUID:
    SELECT gen_random_uuid();
    

Резервное копирование и восстановление с помощью утилит

  1. Резервное копирование только структуры базы данных:
    pg_dump -s db_name > db_schema_backup.sql
    
  2. Восстановление только данных в существующую базу данных:
    pg_restore -d db_name db_data_backup.dump
    
  3. Полное резервное копирование базы данных:
    pg_basebackup -D /path/to/backup -F tar -z -P
    

Управление логами и мониторингом

  1. Просмотр текущих настроек логирования:
    SHOW log_statement;
    
  2. Включение логирования длительных запросов:
    ALTER SYSTEM SET log_min_duration_statement = '1000'; -- в миллисекундах
    
  3. Просмотр логов в реальном времени:
    tail -f /var/log/postgresql/postgresql.log
    

Управление точками восстановления и транзакциями

  1. Создание точки восстановления:
    SAVEPOINT savepoint_name;
    
  2. Откат к точке восстановления:
    ROLLBACK TO SAVEPOINT savepoint_name;
    
  3. Коммит транзакции:
    COMMIT;
    
  4. Откат транзакции:
    ROLLBACK;
    

Полезные функции и утилиты

  1. Проверка размер таблицы:
    SELECT pg_size_pretty(pg_total_relation_size('table_name'));
    
  2. Проверка размер базы данных:
    SELECT pg_size_pretty(pg_database_size('db_name'));
    
  3. Проверка активных блокировок:
    SELECT * FROM pg_locks;
    
  4. Анализ и очистка таблицы:
    VACUUM ANALYZE table_name;
    

    VACUUM ANALYZE выполняет очистку (VACUUM), а затем анализ (ANALYZE) всех указанных таблиц. Это удобная комбинация для регулярного обслуживания БД.

  5. Анализ всех таблиц в базе данных:
    VACUUM ANALYZE;
    

Управление таблицами партиций

  1. Создание таблицы с партициями:
    CREATE TABLE partitioned_table (
        id SERIAL,
        data TEXT,
        created_at TIMESTAMP
    ) PARTITION BY RANGE (created_at);
    
  2. Создание партиции для таблицы:
    CREATE TABLE partition_jan2024 PARTITION OF partitioned_table
    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
    

Настройки безопасности на уровне сети

  1. Ограничение доступа к базе данных по IP-адресу: В файле pg_hba.conf:
    host    all             all             192.168.0.0/24            md5
    

Управление резервным копированием на уровне файлов

  1. Резервное копирование конфигурационных файлов:
    cp /etc/postgresql/12/main/postgresql.conf /backup/path/
    cp /etc/postgresql/12/main/pg_hba.conf /backup/path/
    

Управление репликацией

  1. Настройка главного сервера для репликации: В файле postgresql.conf:
    wal_level = replica
    max_wal_senders = 5
    
  2. Создание слота репликации:
    SELECT * FROM pg_create_physical_replication_slot('replica_slot');
    

Управление миграцией данных

  1. Импорт данных из CSV файла:
    COPY table_name FROM '/path/to/file.csv' DELIMITER ',' CSV HEADER;
    
  2. Экспорт данных в CSV файл:
    COPY table_name TO '/path/to/file.csv' DELIMITER ',' CSV HEADER;
    

Управление данными в JSON

  1. Создание таблицы с JSON полем:
    CREATE TABLE json_table (id SERIAL, data JSONB);
    
  2. Добавление данных в JSON поле:
    INSERT INTO json_table (data) VALUES ('{"key": "value"}');
    
  3. Запрос данных из JSON поля:
    SELECT data->>'key' FROM json_table;
    

Настройки производительности

  1. Настройка параметров кеша:
    ALTER SYSTEM SET shared_buffers = '1GB';
    
  2. Настройка параметров воркера для параллельного выполнения:
    ALTER SYSTEM SET max_parallel_workers_per_gather = 4;
    

Полезные команды для администрирования

  1. Просмотр текущего состояния системы:
    SELECT * FROM pg_stat_database;
    
  2. Проверка состояния подключений:
    SELECT * FROM pg_stat_activity;
    
  3. Просмотр истории транзакций:
    SELECT * FROM pg_stat_xact_all_tables;
    
  4. Просмотр статистики выполнения запросов:
    SELECT * FROM pg_stat_statements;
    
  5. Удаление временных файлов:
    SELECT pg_catalog.pg_stat_file('base/pgsql_tmp', 'm');
    

Этот список включает наиболее часто используемые команды и действия для управления безопасностью и администрирования PostgreSQL. Он охватывает основные аспекты управления пользователями, ролями, правами доступа, а также настройки безопасности и производительности.