JavaRush /Курсы /SQL SELF /Частые ошибки при настройке безопасности и способы их пре...

Частые ошибки при настройке безопасности и способы их предотвращения

SQL SELF
48 уровень , 4 лекция
Открыта

"Безопасность базы данных похожа на хороший пароль: вы можете придумать сложнейший ключ, но если напишете его на стикере и прикрепите на монитор — толку никакого." Поэтому наша задача — научиться не только настраивать механизмы защиты, но и избегать обычных ошибок, которые могут свести все усилия на нет.

1. Использование ролей с избыточными правами

Часто разработчики боятся ограничить доступ и создают роли с широкими привилегиями, например, предоставляя права SUPERUSER или ALL PRIVILEGES. Их аргумент звучит как: "Ну, вдруг понадобится!". Однако роли с избыточными правами становятся огромной дырой в безопасности.

Пример избыточных прав:

GRANT ALL PRIVILEGES ON DATABASE university TO student_role;

В данном случае student_role получает полный доступ ко всем данным в базе. Даже если роль должна была только читать данные, она теперь может удалять таблицы, изменять структуру и даже забрать доступ у администратора.

Как избежать?

Создавайте роли с минимальным набором прав. Это называется принципом минимальных привилегий. Например, роль для чтения данных должна выглядеть так:
GRANT CONNECT ON DATABASE university TO student_role;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO student_role;

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

2. Отсутствие шифрования конфиденциальных данных

Представьте таблицу users, где мы храним пароли в виде обычного текста:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username TEXT NOT NULL,
    password TEXT NOT NULL
);

Если злоумышленник получит доступ к этой таблице, он получит пароли всех пользователей. Это похоже на хранение ключей от квартиры под ковриком.

Во избежание используйте шифрование паролей с помощью pgcrypto. Например:

CREATE EXTENSION IF NOT EXISTS pgcrypto;

INSERT INTO users (username, password)
VALUES ('johndoe', pgp_sym_encrypt('secure_password', 'encryption_key'));

Для проверки пароля можно использовать дешифрование:

SELECT username
FROM users
WHERE pgp_sym_decrypt(password::BYTEA, 'encryption_key') = 'secure_password';

Никогда не храните конфиденциальную информацию в открытом виде!

3. Игнорирование SQL-инъекций

SQL-инъекции остаются одним из самых распространенных методов атак, и причина в том, что разработчики продолжают строить запросы, используя строковую интерполяцию. Вот пример:

DO $$
DECLARE
    username TEXT := 'John';
    query TEXT;
BEGIN
    query := 'SELECT * FROM users WHERE username = ''' || username || ''';';
    EXECUTE query;
END $$;

Если злоумышленник вместо имени пользователя отправит John' OR '1'='1, результатом станет утечка всех данных из таблицы users.

Как избежать? Используйте параметризованные запросы:

PREPARE user_query (TEXT) AS
SELECT * FROM users WHERE username = $1;

EXECUTE user_query('John');

Здесь переменная подставляется безопасно, исключая возможность инъекции.

4. Неправильная настройка pg_hba.conf

pg_hba.conf — это основной инструмент контроля доступа по IP-адресам. Ошибки в его настройке могут привести к тому, что доступ будет открыт шире, чем нужно.

Пример плохой конфигурации:

host    all     all     0.0.0.0/0       trust

Эта строка разрешает любому пользователю подключаться к любой базе данных с любого IP-адреса без ввода пароля.

Как избежать? Настраивайте доступ только для конкретных IP-адресов и используйте метод аутентификации md5 или scram-sha-256:

host    university    student_role    192.168.1.0/24    md5

Это ограничивает доступ для student_role только из локальной сети с паролем.

После внесения изменений в pg_hba.conf, не забудьте применить их командой:

pg_ctl reload

5. Неправильное использование ROW LEVEL SECURITY

RLS — мощный инструмент, но он бесполезен, если его неправильно настроить или забыть включить. Например, даже после написания политики доступа она не будет работать, если RLS выключен:

CREATE POLICY my_policy ON users
USING (username = current_user);

-- Но RLS не включён!
SELECT * FROM users; -- Получим все строки!

Как избежать? Не забудьте включить RLS:

ALTER TABLE users ENABLE ROW LEVEL SECURITY;

И проверяйте, как политика применяется:

SET ROLE student_role;

SELECT * FROM users; -- Видны только строки, соответствующие политике.

6. Неучтенные действия администраторов

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

Как избежать? Используйте разделение ролей. Для задач администрирования создайте отдельную роль без доступа к данным:

CREATE ROLE admin_role WITH LOGIN CREATEDB CREATEROLE;

Для доступа к данным создайте другую роль с минимальными правами:

CREATE ROLE data_analyst_role;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO data_analyst_role;

Назначьте роли пользователю в зависимости от его задач:

GRANT admin_role TO some_user;
GRANT data_analyst_role TO another_user;

7. Недостаточное логирование

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

Пример отсутствия логирования:

-- Никаких настроек в файле postgresql.conf
log_statement = 'none';

Как избежать? Включите хотя бы базовое логирование:

log_statement = 'all'
log_connections = on
log_disconnections = on

Это позволит вам видеть все выполненные запросы, подключения и отключения.

Вы также можете настроить аудит с помощью расширения pgAudit для более детального контроля:

CREATE EXTENSION pgaudit;

8. Использование устаревших методов аутентификации

Использование устаревших методов аутентификации, таких как password, не обеспечивает достаточной защиты.

Как избежать? Переключитесь на более безопасные методы вроде scram-sha-256:

ALTER SYSTEM SET password_encryption = 'scram-sha-256';

И обновите пароли пользователей:

ALTER USER student_role WITH PASSWORD 'new_secure_password';

Эти проблемы могут показаться мелкими, но каждая из них способна превратиться в серьезную брешь безопасности. Ваша задача — вести базу данных так, будто каждый пользователь, пытающийся к ней подключиться, подозрителен. Как говорится, "доверяй, но проверяй". Теперь у вас есть инструменты не только для настройки безопасности, но и для предотвращения самых распространённых ошибок. Ловите удачу за хвост, и пусть ваши данные будут в безопасности!

2
Задача
SQL SELF, 48 уровень, 4 лекция
Недоступна
Применение принципа минимальных привилегий
Применение принципа минимальных привилегий
1
Опрос
Введение в шифрование данных, 48 уровень, 4 лекция
Недоступен
Введение в шифрование данных
Введение в шифрование данных
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 57
5 марта 2026
😎