Для администратора базы данных

Что Askbase выполняет в вашей базе и как сделать так, чтобы он не смог выполнить ничего другого

Эта страница написана для того, кто решает, пускать ли программу к боевой базе. Это не страница про продажу. Коротко: создайте роль, которая умеет только читать, отдайте её Askbase, и считайте всё, что делает приложение, вторым рубежом, а не первым.

1выражение на запрос, и это SELECT. Второе выражение после точки с запятой отклоняется.
0сетевых соединений. Модель лежит файлом на диске, приложение работает с выключенным Wi-Fi.
0строк ваших данных в журнале. В журнале текст запроса, время и число строк.

Что приложение выполняет

Каждое сгенерированное выражение разбирается до исполнения и выполняется только если прошло белый список. Всё, чего в списке нет, отклоняется, показывается пользователю с причиной и в базу не отправляется.

  • Ровно одно выражение. Точка с запятой со вторым выражением отклоняется.
  • Только 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

Четыре проверки перед тем, как пускать

  1. Подключитесь созданной ролью. Экран подключения показывает найденные права. Предупреждение о праве на запись означает, что роль получилась не та.
  2. Выключите Wi-Fi и задайте вопрос. Ответ должен прийти.
  3. Откройте журнал запросов и убедитесь, что там выражения и число строк, а не данные.
  4. Попробуйте от этой роли создать таблицу. Должна быть ошибка прав.

Чего мы не можем сделать за вас

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