Пользователи, права и резервные копии
267 мин
В настоящей базе данные ценны: персональные сведения, деньги, оценки. Защищать их от чужого доступа и от потери — неотъемлемая часть работы с базой.
Пользователи и роли
Каждая программа и каждый человек подключаются со своей учётной записью и могут делать только то, что им нужно.
В PostgreSQL всё — роль: и пользователь, и группа.
CREATE ROLE report_reader LOGIN PASSWORD 'kuchli-parol';
GRANT CONNECT ON DATABASE university TO report_reader;
GRANT SELECT ON students, grades TO report_reader;Права
| Право | Разрешает |
|---|---|
SELECT |
чтение |
INSERT, UPDATE, DELETE |
запись, изменение, удаление |
CREATE, DROP, ALTER |
изменение структуры |
ALL PRIVILEGES |
всё |
Отозвать право: REVOKE INSERT ON students FROM report_reader;
Принцип минимальных прав: для отчётов — только SELECT; для сайта — запись в свои таблицы, но не DROP; учётная запись администратора — только для администраторов. Общим базам SQLab выдано именно такое право «только чтение» — поэтому DELETE в них даёт ошибку.
SQL-инъекция
Самая известная атака. Если программа вставляет текст пользователя прямо в запрос:
-- программа собирает такой запрос:
SELECT * FROM users WHERE email = '<введённый текст>';
-- злоумышленник вместо email вводит: ' OR '1'='1
SELECT * FROM users WHERE email = '' OR '1'='1'; -- все пользователи!Защита — параметризованные запросы: значение передаётся отдельно от запроса и никогда не читается как SQL.
db.query('SELECT * FROM users WHERE email = $1', [email]) -- PostgreSQL
db.query('SELECT * FROM users WHERE email = ?', [email]) -- MySQLПравило простое: никогда не склеивайте текст пользователя с запросом как строку.
Пароли
Пароли в базе никогда не хранят в открытом виде — только их хеш (bcrypt, scrypt, argon2). Даже если базу украдут, пароли узнать не получится.
Резервная копия (backup)
Поломка диска, ошибочный DELETE, вирусы — без резервной копии каждое из этого становится катастрофой.
pg_dump -U postgres university > university.sql # создать копию
psql -U postgres -d university_new < university.sql # восстановитьХорошая практика: автоматическая ежедневная копия, хранение на другом сервере и регулярная проверка восстановления — непроверенная резервная копия — это не резервная копия.
Запомните
- У каждой программы своя учётная запись и только нужные права (
GRANT/REVOKE). - Защита от SQL-инъекций — параметризованные запросы.
- Пароль — только хеш; резервная копия — регулярная и проверенная.