Что Askbase выполняет в вашей базе и как сделать так, чтобы он не смог выполнить ничего другого
Эта страница написана для того, кто решает, пускать ли программу к боевой базе. Это не страница про продажу. Коротко: создайте роль, которая умеет только читать, отдайте её Askbase, и считайте всё, что делает приложение, вторым рубежом, а не первым.
Что приложение выполняет
Каждое сгенерированное выражение разбирается до исполнения и выполняется только если прошло белый список. Всё, чего в списке нет, отклоняется, показывается пользователю с причиной и в базу не отправляется.
- Ровно одно выражение. Точка с запятой со вторым выражением отклоняется.
- Только
SELECT, допускается ведущийWITH. - Никаких
INSERT,UPDATE,DELETE,DROP,CREATE,ALTER,TRUNCATE,GRANT. - Никакого управления транзакциями,
PRAGMAи служебных команд. - Никаких рекурсивных
WITH. - Таблицы и столбцы с указанием таблицы сверяются со слепком схемы, снятым при подключении.
- Если в выражении нет
LIMIT, приложение его добавляет.
Сверх этого на каждый запрос стоит таймаут и ограничение на число возвращаемых строк.
Почему правил приложения недостаточно
Потому что один рубеж это один рубеж. Pedro с соавторами показали на ICSE 2025, что на неизменённом каркасе агента внедрённая через текст инструкция получает полный доступ на чтение и запись, а попытки защититься правкой формулировок оказались крайне хрупкими.
Отдельно: роль только для чтения не спасает от отказа в обслуживании. В отчёте об уязвимости Langchain-Chatchat тяжёлый рекурсивный WITH исчерпывал ресурсы при включённом режиме только для чтения. Поэтому рекурсивные выражения здесь запрещены разбором, а не правами.
Права в базе и разбор запроса в приложении решают разные задачи. Нужны оба. Если поставщик говорит, что модели велено не делать ничего плохого, это не средство защиты.
PostgreSQL
Подставьте свои имена вместо analytics, askbase_ro и пароля.
CREATE ROLE askbase_ro LOGIN PASSWORD 'задайте_свой_пароль';
GRANT CONNECT ON DATABASE analytics TO askbase_ro;
REVOKE CREATE ON SCHEMA public FROM askbase_ro;
GRANT USAGE ON SCHEMA public TO askbase_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO askbase_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO askbase_ro;
Ограничьте ресурсы на уровне роли, чтобы тяжёлый запрос не задел остальных.
ALTER ROLE askbase_ro SET statement_timeout = '30s';
ALTER ROLE askbase_ro SET idle_in_transaction_session_timeout = '60s';
ALTER ROLE askbase_ro SET default_transaction_read_only = on;
Если часть столбцов читать нельзя вовсе, не выдавайте права на таблицу. Сделайте представление с разрешёнными столбцами и дайте права на него.
CREATE VIEW clients_safe AS
SELECT id, region_id, dt_reg FROM clients; -- без имён и телефонов
GRANT SELECT ON clients_safe TO askbase_ro;
REVOKE SELECT ON clients FROM askbase_ro;
Это заодно улучшает ответы. В слепок схемы попадёт только разрешённое, и модель не станет строить запросы к столбцам, которые читать нельзя.
MySQL
CREATE USER 'askbase_ro'@'localhost' IDENTIFIED BY 'задайте_свой_пароль';
GRANT SELECT ON analytics.* TO 'askbase_ro'@'localhost';
FLUSH PRIVILEGES;
ALTER USER 'askbase_ro'@'localhost'
WITH MAX_QUERIES_PER_HOUR 2000 MAX_USER_CONNECTIONS 4;
Таймаута на уровне роли в MySQL нет, поэтому время ограничивает приложение. Как и в PostgreSQL, отдельные столбцы скрывайте представлениями, а не выдачей прав на исходные таблицы.
SQLite
Пользователей в SQLite нет, права задаются файлом. Работайте с копией, а не с боевым файлом, и снимайте копию так, чтобы не поймать базу в середине записи.
sqlite3 /путь/к/analytics.sqlite ".backup '/путь/к/analytics-ro.sqlite'"
chmod 444 /путь/к/analytics-ro.sqlite
Четыре проверки перед тем, как пускать
- Подключитесь созданной ролью. Экран подключения показывает найденные права. Предупреждение о праве на запись означает, что роль получилась не та.
- Выключите Wi-Fi и задайте вопрос. Ответ должен прийти.
- Откройте журнал запросов и убедитесь, что там выражения и число строк, а не данные.
- Попробуйте от этой роли создать таблицу. Должна быть ошибка прав.
Чего мы не можем сделать за вас
Роль только для чтения не ограничивает, какие именно данные человек видит. Если кому-то нельзя видеть зарплаты, запрет должен быть в правах или в представлении, а не в приложении. Askbase честно покажет всё, до чего роль дотягивается.