СУБД. Лекция 8

СУБД
Навроцкий Артем
Лекция 8

Резервное копирование. Конфигурирование. Безопасность.

Резервное копирование

Резервное копирование: Зачем?

Логические резервные копии

Логические резервные копии

Физические резервные копии

Физические резервные копии

Что копировать?

Неочевидные данные
Не забудьте о данных, которые не бросаются в глаза, например: журнал транзакций.
Код
В частности, триггеры и хранимые процедуры.
Конфигурация репликации
Для восстановления сервера, участвующего в репликации, следует включать в резервную копию все необходимые для репликации файлы.
Конфигурация сервера
Если потребуется восстановить данные после настоящей катастрофы.
Отдельные файлы операционной системы
На UNIX-сервере это могут быть таблицы cron, конфигурация пользователей, групп и правила sudo.

Физическая копия: ОС

LVM

lvcreate --size 100M --snapshot --name snap /dev/vg00/lvol1

btrfs, zfs

zfs snapshot datapool/docs@version1
btrfs subvolume snapshot /btrfs/sub1 /btrfs/sub1/snapshot

Физическая копия: ОС

Плюсы:

Минусы:

Физическая копия: pg_basebackup

Конфигурация:

archive_mode = on
archive_command = 'test ! -f /backup/%f && cp %p /backup/%f'
wal_writer_delay = 1s
wal_level = hot_standby
max_wal_senders = 5

Резервная копия:

pg_basebackup -D /tmp/backup -Ft -z -P
pg_basebackup -D - -Ft -P    > backup.tar
pg_basebackup -D - -Ft -P -z > backup.tgz

Физическая копия: pg_basebackup

Плюсы:

Минусы:

Логическая копия: pg_dump/pg_dumpall

Резервная копия:

pg_dump     movielens > db.sql
pg_dump -Fc movielens > db.dump
pg_dump -Fd movielens -j 5 -f dumpdir

Восстановление:

psql movielens < db.sql
pg_restore -d movielens -Fc db.dump
pg_restore -d movielens -Fd dumpdir

Логическая копия: pg_dump/pg_dumpall

Плюсы:

Минусы:

Обновление PostgreSQL

pg_upgradecluster

sudo pg_upgradecluster -v 9.5 9.4 main

pg_upgrade

/usr/lib/postgresql/9.5/bin/pg_upgrade
  --old-datadir /var/lib/postgresql/9.4/main/ \
  --new-datadir /var/lib/postgresql/9.5/main/ \
  --old-bindir /usr/lib/postgresql/9.4/bin/ \
  --new-bindir /usr/lib/postgresql/9.4/bin/

Конфигурирование

Конфигурирование

Рекомендуется добавить в конец файла postgresql.conf строки вида:

# include files ending in '.conf' from
include_dir = 'conf.d'

Специфические настройки при этом хранить в директории conf.d.

Если один параметр указан несколько раз - то побеждает последний.

Конфигурирование: durability

synchronous_commit = on

Определяет, будет ли сервер при фиксировании транзакции ждать, пока записи из WAL сохранятся на диске.

Допустимые значения: on, remote_apply, remote_write, local и off.

Этот параметр можно изменить в любое время:

SET LOCAL synchronous_commit = ON
wal_writer_delay = 200ms

Определяет, как часто процесс записи WAL будет сбрасывать WAL на диск.

Контрольные суммы

/usr/lib/postgresql/9.5/bin/initdb \
    --data-checksums main

Указывает на необходимость проверки системой ввода/вывода контрольных сумм страниц для обнаружения повреждённых данных, так как по умолчанию проверка не производится.

Включение проверки может в значительной мере оказать влияние на производительность.

Устанавливается на этапе развёртывания кластера, и далее не может быть изменена.

Настройка использования памяти

Настройка использования памяти

shared_buffers (integer)
Задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой памяти (~25-40% RAM).
effective_cache_size (integer)
Определяет представление планировщика об эффективном размере дискового кеша, доступном для одного запроса.
work_mem (integer)
Задаёт объём памяти, который будет использоваться для внутренних операций сортировки и хеш-таблиц.
maintenance_work_mem (integer)
Задаёт максимальный объём памяти для операций обслуживания БД, в частности VACUUM, CREATE INDEX и ALTER TABLE ADD FOREIGN KEY.

Сетевые подключения

Внешний интерфейс

listen_addresses = '*'

Лимит на общее кол-во подключений

max_connections = 100

Табличные пространства

CREATE TABLESPACE fastspace
    LOCATION '/ssd1/postgresql/data';

CREATE TABLE cinemas (
        id serial,
        name text,
        location text
) TABLESPACE fastspace;

CREATE INDEX code_idx ON films (code)
        TABLESPACE indexspace;

Мониторинг: инструменты Unix

$ ps auxww | grep ^postgres
postgres  15551  0.0  0.1  57536  7132 pts/0  S   18:02  0:00 postgres -i
postgres  15554  0.0  0.0  57536  1184 ?      Ss  18:02  0:00 postgres: writer process
postgres  15555  0.0  0.0  57536   916 ?      Ss  18:02  0:00 postgres: checkpointer process
postgres  15556  0.0  0.0  57536   916 ?      Ss  18:02  0:00 postgres: wal writer process
postgres  15557  0.0  0.0  58504  2244 ?      Ss  18:02  0:00 postgres: autovacuum launcher process
postgres  15558  0.0  0.0  17512  1068 ?      Ss  18:02  0:00 postgres: stats collector process
postgres  15582  0.0  0.0  58772  3080 ?      Ss  18:04  0:00 postgres: joe runbug 127.0.0.1 idle
postgres  15606  0.0  0.0  58772  3052 ?      Ss  18:07  0:00 postgres: tgl regression [local] SELECT waiting
postgres  15610  0.0  0.0  58772  3056 ?      Ss  18:07  0:00 postgres: tgl regression [local] idle in transaction

Мониторинг: системная инфомация

pg_stat_activity
Информацией по текущей активности процесса.
pg_stat_all_tables
Статистика по обращениям к таблицам.
pg_stat_all_indexes
Статистика по обращениям к индексам.
pg_statio_all_tables
Статистика по операциям ввода/вывода.
pg_locks
Блокировки.

Безопасность

Терминология

Аутентификация
Кто вы такой?
Авторизация
Что вам разрешено делать?
Контроль доступа
Какие данные вам разрешено видеть и/или изменять?
Привилегии и разрешения
Способ представления в PostgreSQL права доступа.

Объектные привилегии разрешают доступ к конкретным объектам.

Глобальные привилегии позволяют что-то делать с самим сервером.

Аутентификация: pg_hba.conf

local      database  user  auth-method  [auth-options]
host       database  user  address  auth-method  [auth-options]
hostssl    database  user  address  auth-method  [auth-options]
hostnossl  database  user  address  auth-method  [auth-options]
host       database  user  IP-address  IP-mask  auth-method  [auth-options]
hostssl    database  user  IP-address  IP-mask  auth-method  [auth-options]
hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-options]

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust
host    postgres        all             192.168.12.10/32        md5
host    all             all             .example.com            md5 map=omicron
host    all             all             192.168.54.1/32         reject
local   all             @admins,+support                        md5

Аутентификация: методы

trust
Разрешает безусловное подключение.
reject
Отклоняет подключение безусловно.
md5, password
Требует от клиента предоставить для аутентификации пароль.
gss, sspi
Для SSO-аутентификации: GSSAPI (Kerberos), SSPI (Windows).
peer
Получает имя пользователя операционной системы (unix socket).
ldap, radius
Проводит аутентификацию, используя сервер LDAP или RADIUS.

Аутентификация: ошибки

Подключение успешно, но не понятно как авторизовать

FATAL: no pg_hba.conf entry for host "1.2.3.4", user "foo", database "bar"

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

FATAL: password authentication failed for user "foo"

Указанное имя пользователя базы данных не найдено

FATAL: user "foo" does not exist

Указанная база данных не найдена

FATAL: database "testdb" does not exist

Аутентификация: pg_ident.conf


# map-name system-username            database-username
mymap      /^(.*)@mydomain\.com$      \1
mymap      /^(.*)@otherdomain\.com$   guest

omicron    bryanh                     bryanh
omicron    ann                        ann
omicron    robert                     bob
omicron    bryanh                     guest1

Авторизация: роли

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

CREATE ROLE bar;
CREATE ROLE foo WITH LOGIN PASSWORD 'passw0rd';
CREATE ROLE admin WITH CREATEDB CREATEROLE;

DROP ROLE foo;
SELECT rolname FROM pg_roles;

Роли: параметры

SUPERUSER, NOSUPERUSER
Будет ли эта роль «суперпользователем».
CREATEDB, NOCREATEDB
Сможет ли роль создавать базы данных.
CREATEROLE, NOCREATEROLE
Сможет ли роль создавать новые роли.
INHERIT, NOINHERIT
Будет ли роль «наследовать» права ролей, членом которых она является.
LOGIN, NOLOGIN
Разрешается ли новой роли вход на сервер.
REPLICATION, NOREPLICATION
Сможет ли новая роль запускать потоковую репликацию.
CONNECTION LIMIT предел_подключений
Лимит на колчиство параллельных подключений.
PASSWORD пароль
Задаёт пароль роли.
IN ROLE имя_роли, IN GROUP имя_роли
Перечисляются одна или несколько существующих ролей, в которые будет включена новая роль.

Авторизация: роли

Наследование

CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;

Ограничение полномочий

SET ROLE admin;
SET ROLE wheel;

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

Права на объекты

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE
        | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] имя_таблицы [, ...]
         | ALL TABLES IN SCHEMA имя_схемы [, ...] }
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...]
        | ALL [ PRIVILEGES ] }
    ON DATABASE имя_бд [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;

SQL-injection

SQL-injection: Строковой параметр

SQL-injection: Авторизация

SELECT * FROM users
WHERE login='$login' AND pass='$pass'

SELECT * FROM users
WHERE login='Admin' -- ' AND pass='123'
  
SELECT * FROM users
WHERE login='Admin' AND pass='123' OR login='Admin' -- '

SELECT * FROM users
WHERE (login='Admin' AND pass='123') OR (login='Admin')

SQL-injection: UNION

SQL-injection: GROUP BY/ORDER BY

SQL-injection: INFORMATION_SCHEMA

SQL-injection: Работа с файлами

SQL-injection: DOS ататка

SQL-injection: Fatality

Навроцкий Артем
E-mail: bozaro@yandex.ru
Спасибо за внимание!