Monthly Archives: Февраль 2022

Маршрутизация Logstash

Предположим, что мы используем для сбора логов стек ELK (Elasticsearch-Logstash-Kibana).

Логи приложений можно собирать как в один индекс, так и отдельные индексы для каждого из приложений.

В этом блоге рассмотрим маршрутизацию записей логов в разные индексы.

Для доставки файлов в Logstash будем использовать Filebeat

Рассмотрим пример маркирования логов системной утилитой auditd маркером "auditd: true" и маркирование логов PostgreSQL маркером "postgres: true". В примере Filebeat отправляет записи логов в Logstash по порту 5044.

Пример конфигурации filebeat.yml:

- input_type: log
  paths:
    - /var/log/audit/*.log
  fields:
    auditd: true
- input_type: log
  paths:
    - /var/lib/pgsql/12/data/log/postgresql-*.log
  fields:
    postgres: true
output.logstash:
  hosts: ["localhost:5044"]

Теперь, непосредственно, рассмотрим маршрутизацию логов в Logstash в logstash.conf.

input {
  beats {
    port => 5044
  }
}
output {
        if [fields][auditd] {
                elasticsearch {
                        hosts => ["localhost:9200"]
                        index => "auditd-%{+YYYY.MM.dd}"
                }
        } else if [fields][postgres] {
                elasticsearch {
                        hosts => ["localhost:9200"]
                        index => "pgaudit-%{+YYYY.MM.dd}"
                }
        } else {
                elasticsearch {
                        hosts => ["localhost:9200"]
                        index => "unknown-%{+YYYY.MM.dd}"
                }
        }
	stdout { codec => rubydebug }
}

В примере описанном выше Logstash ведет прием записей логов по порту 5044 и делает маршрутизацию в зависимости от флагов fields.auditd и fields.postgres. Если не получается распределить сообщения в требуемый индекс, то отправляем его в индекс под названием unknown.

Индексы в Elasticsearch записываются по дневным партициям: %{+YYYY.MM.dd}.

Аудит PostgreSQL

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

База данных была на PostgreSQL, и особого выбора, кроме как pgAudit, не было.

Приступим к установке и настройке pgAudit.

Расширение pgAudit инсталируется из исходных кодов.

Установка

  1. Склонируйте официальный репозиторий:
    git clone https://github.com/pgaudit/pgaudit.git
    
  2. Открываем созданную директорию pgaudit:
    cd pgaudit
    
  3. Переключите ветку на необходимый релиз (вашу версию PostgreSQL)
    git checkout REL_12_STABLE
    
  4. Сделайте сборку и установку pgAudit (обратите внимание на правильность пути к утилите pg_config):
    sudo make install USE_PGXS=1 PG_CONFIG=/usr/pgsql-12/bin/pg_config
    
    Может потребоваться установка утилиты make и других зависимостей.

Настройка

  1. Внесем корректировки в конфигурационный файл /var/lib/pgsql/12/data/postgresql.conf:
    shared_preload_libraries = 'pgaudit'
    
  2. Перезапустите PostgreSQL
    sudo service postgresql-12.service restart
    
  3. Зайдите в консоль psql под пользователем postgres
    sudo -u postgres psql
    
  4. Установить расширение pgaudit:
    CREATE EXTENSION pgaudit
    
  5. В конфигурационном файле /var/lib/pgsql/12/data/postgresql.conf с помощью опции pgaudit.log укажите какие классы запросов/команд необходимо аудировать (весь перечень и другие опции можно посмотреть в описании на github):
    pgaudit.log = 'write, role, ddl'
    
  6. В конфигурационном файле postgresql.conf укажите роль, которая будет использоваться для аудита в опции pgaudit.role:
    pgaudit.role = 'auditor'
    
  7. В конфигурационном файле postgresql.conf дополните префикс логирования следующим образом:
    log_line_prefix = '%m %d %u %h '
    

    Префикс содержит следующие данные и добавляется к каждой строке лога: дату(%m), название базы данных (%d), логин пользователя (%u) и удаленный адрес пользователя (%h).

  8. После изменения настроек postgresql.conf не забывайте перезагружать PostgreSQL, чтобы настройки применились.
  9. Создайте роль auditor:
    create role auditor;
     

    Аудит настраивается путем предоставления/отзыва прав на определенные операции для роли auditor.

  10. Добавить аудит на определенные действия можно следующими командами:
    grant insert ON your_table to auditor;
    grant insert ON your_table to auditor;
    grant update ON your_table to auditor;
    grant delete ON your_table to auditor;
    
  11. Убрать аудит на определенные действия можно следующими командами:
    revoke insert ON your_table to auditor;
    revoke insert ON your_table to auditor;
    revoke update ON your_table to auditor;
    revoke delete ON your_table to auditor;