Защищённые файлы в репозитории aredel: настоящий список

Что охватывает этот список

Каждый файл в репозитории aredel и вне его, который защищает правило deny или ask: сначала в OpenCode, затем те же файлы в Claude Code. Для каждого файла: что в нём лежит, какое правило его защищает, что правило останавливает и что нет. Состояние на 22.10.2026: рабочие логи уехали из репозитория (окончательное исправление), а OpenCode работает по варианту B, который разрешает оболочку и спрашивает перед рискованными шагами. Правила лежат в opencode.jsonc, .opencode/agents/reviewer.md и .claude/settings.json. Почему правила выглядят именно так, объясняет материал «Deny-правила для OpenCode и Claude Code».

Список построен из правил, а не вручную: каждый файл, чей путь совпадает с шаблоном. *.env и *creds* искали по всему репозиторию, и каждый шаблон совпал ровно с одним файлом; правила для папок охватывают всё внутри папки. Файлы, которые только похожи, не защищены: container/tools/deploy/site.env.example заканчивается на .example, а не на .env. Правила для старой папки логов, container/tools/analyze_logs/site_logs/, остаются в обоих инструментах, так что копия, которая снова там окажется, всё равно будет закрыта.

Папку записей посетителей сначала не включили в этот список: 22.10.2026 живой сайт всё ещё отдавал два её файла кому угодно. С того же дня сайт отвечает 404 на всю папку через RedirectMatch 404 ^/services/user_profile/data/ в корневом .htaccess, поэтому она перечислена наравне с остальными.

OpenCode

Правила в opencode.jsonc действуют для всех ролей. Поверх них triage запрещает grep, любые правки и оболочку; reviewer запрещает все правки, разрешает в оболочке только git на чтение и повторяет запреты для оболочки после этих разрешений; build и builder ничего не добавляют. При варианте B оболочка работает без запроса, поэтому для каждого файла ниже именно правило для оболочки, а не ваше подтверждение, решает, запустится ли команда, которая его называет.

ФайлЧто в нёмПравилоЗащищён отВсё ещё не защищён от
~/.local/share/aredel/logs/: каждый файл, среди них логи доступа в prod/access/ и логи ошибок в prod/error/ (aredel.com.access.log, aredel.com.error.log и их дневные копии *.log.YYYYMMDD), а также папки devices/ и user_profiles/, которые заполняют инструменты профилейрабочие логи и копии записей посетителей из dev: IP-адреса, user agent, URL, id устройствexternal_directory ~/.local/share/aredel/logs/* ask, read */.local/share/aredel/logs/* ask, edit */.local/share/aredel/logs/* deny, shell *aredel/logs* ask, shell *analyze_logs* ask; в файле reviewer shell *aredel/logs* denyинструменты read, grep и glob без запроса (тест 10, вариант B); команды оболочки, которые называют папку, и все инструменты в analyze_logs, которые находят папку сами: они спрашивают (вариант B); git diff --no-index через разрешение роли: builder спрашивает, reviewer получает запрет (проверка 9); правка и запись для всех ролейвсё под --auto, который одобряет правила ask (тест 10); команды оболочки и скрипты, которые добираются до папки, не называя её, например find ~ -name "*.log" -exec cat {} +; файл, который вы прикрепите через @ или -f (тест 6)
container/src/services/user_profile/data/: visitors.jsonl, password_profiles.jsonl (в списке с 22.10.2026)записи посетителей, которые пишет /services/user_profile/: IP-адреса, заголовки запросов, id устройствread *services/user_profile/data/* deny, edit *services/user_profile/data/* deny, shell *user_profile/data* deny, повторены в файле reviewerинструмент read для всех ролей (тест 2, тест 9); команды оболочки, которые называют путь, для всех ролей, и grep -r, который спрашивает (вариант B); инструмент grep для triage, у которого grep нет (тест 7); правка и запись для всех ролей (проверка 1)инструмент grep для build, builder и reviewer (тест 3); имена файлов через glob (тест 4); команды и скрипты, которые добираются до папки, не называя её, например find . -exec cat {} +; файл, который вы прикрепите через @ или -f (тест 6)
container/tools/analyze_logs/users.dbкаждое устройство, которое видели записи посетителей: id устройств, IP-адреса, user agentread *analyze_logs/users.db deny, edit *analyze_logs/users.db deny, shell *users.db* deny, повторены в файле reviewerинструмент read и команды оболочки, которые его называют, для всех ролей (проверка 10); инструмент grep для triage, у которого grep нет (тест 7); правка и запись для всех ролейинструмент grep для build, builder и reviewer (тест 3); скрипты, которые открывают его, не называя; файл, который вы прикрепите через @ или -f (тест 6)
container/tools/deploy/site.envотслеживаемые настройки деплоя без секретов: URL, корни документов, id аналитикиread *.env deny, edit *.env deny, shell *.env* denyинструмент read для всех ролей (тест 2, тест 9); команды оболочки, которые называют путь, для всех ролей (та же форма правила, что в проверке 6); инструмент grep для triage, у которого grep нет (тест 7); правка и запись для всех ролей (проверка 1)инструмент grep для build, builder и reviewer (тест 3); имя файла через glob (тест 4); скрипты, которые открывают его, не называя; файл, который вы прикрепите через @ или -f (тест 6)
container/tools/deploy/deploy-ftp.creds.exampleотслеживаемый шаблон для учётных данных FTP, без настоящих значенийread *creds* deny, edit *creds* deny, shell *creds* denyинструмент read для всех ролей (тест 2, тест 9); команды оболочки, которые называют путь, для всех ролей (проверка 6, проверка 7); инструмент grep для triage, у которого grep нет (тест 7); правка и запись для всех ролей (проверка 1)инструмент grep для build, builder и reviewer (тест 3); имя файла через glob (тест 4); скрипты, которые открывают его, не называя; файл, который вы прикрепите через @ или -f (тест 6)
~/.config/aredel/ftp-creds.envпароль FTP для хостингаread ~/.config/aredel/* deny, edit ~/.config/aredel/* deny, shell *.config/aredel* deny, а также правила *creds* и *.env вышеинструмент read для всех ролей (тест 2, тест 9); команды оболочки, которые называют путь, для всех ролей (проверка 6, проверка 7); инструменты grep и glob без запроса: папка вне проекта, поэтому они сначала спрашивают (проверка 8); правка и запись для всех ролей (проверка 1)инструмент grep после того, как вы одобрите его запрос, или под --auto: запрет чтения не останавливает grep (тест 3, тест 10); команды и скрипты, которые добираются до файла, не называя его; файл, который вы прикрепите через @ или -f (тест 6)
~/.config/aredel/backoffice/: token, deploy-state.json, tab-stats.jsonbearer-токен локального API backoffice, коммит последней загрузки, счётчики использования вкладокread ~/.config/aredel/* deny, edit ~/.config/aredel/* deny, shell *.config/aredel* deny
~/.ssh/, ~/.gnupg/, ~/.docker/config.json, ~/.local/share/opencode/auth.json, ~/.local/share/opencode/opencode.db*ключи SSH и GPG, вход в реестр Docker, ключи провайдеров OpenCode, все прошлые сессии OpenCodeзапрет чтения и правки на */.ssh/*, */.gnupg/*, */.docker/config.json, */.local/share/opencode/auth.json, */.local/share/opencode/opencode.db*; запрет оболочки на *.ssh/*, *.gnupg*, *.docker/config.json*, *opencode/auth.json*, *opencode.db*, повторены в файле reviewerинструмент read для всех ролей, в том числе под --auto; команды оболочки, которые называют путь (проверка 8); инструменты grep и glob без запроса (проверка 8); правка и запись для всех ролейинструмент grep после того, как вы одобрите его запрос, или под --auto (тест 3, тест 10); команды и скрипты, которые добираются до них, не называя их; файл, который вы прикрепите через @ или -f

Claude Code

Правила в .claude/settings.json действуют на каждую сессию и каждого субагента, запущенных в репозитории. Запрет Read блокирует также Edit и Write на том же пути.

ФайлЧто в нёмПравилоЗащищён отВсё ещё не защищён от
~/.local/share/aredel/logs/: каждый файл, как в таблице OpenCodeрабочие логи и копии записей посетителей из dev: IP-адреса, user agent, URL, id устройствRead(~/.local/share/aredel/logs/**)инструмент Read; Edit и Write; cat, grep, ls и find, которые называют путь; инструменты Grep и Glob и упоминания через @. Та же форма правила прошла проверки со 2-й по 4-ю на старой папке; здесь не проверялась, потому что в папке настоящие логикоманды, которые добираются до папки, не называя её, например grep -r по домашней папке (проверка 5); grep -r внутри репозитория до неё больше не достаёт; скрипты вроде Python, которые сами открывают файлы; копирование и вставка с вашей стороны
container/src/services/user_profile/data/: visitors.jsonl, password_profiles.jsonl (в списке с 22.10.2026)записи посетителей, которые пишет /services/user_profile/: IP-адреса, заголовки запросов, id устройствRead(//**/services/user_profile/data/**)инструмент Read (проверено в сессии репозитория); Edit и Write (проверка 2); cat, grep, ls и find, которые называют путь (проверка 3, проверка 4); инструменты Grep и Glob и упоминания через @ (по документации, по мере возможностей)grep -r и другие команды, запущенные из родительской папки и не называющие файл: grep — команда только для чтения и запускается без запроса (проверка 5); скрипты вроде Python, которые сами открывают файл; копирование и вставка с вашей стороны
container/tools/analyze_logs/users.dbкаждое устройство, которое видели записи посетителей: id устройств, IP-адреса, user agentRead(//**/analyze_logs/users.db)инструмент Read; Edit и Write; cat и другие файловые команды, которые распознаёт Claude Code, когда они называют путь (по документации; на этом пути не проверялось)grep -r из родительской папки (проверка 5); sqlite3, Python и другие программы, которые Claude Code не считает чтением файлов; копирование и вставка с вашей стороны
container/tools/deploy/site.envотслеживаемые настройки деплоя без секретов: URL, корни документов, id аналитикиRead(**/*.env)инструмент Read (проверено в сессии репозитория); Edit и Write (проверка 2); cat, grep, ls и find, которые называют путь (проверка 3, проверка 4); инструменты Grep и Glob и упоминания через @ (по документации, по мере возможностей)grep -r и другие команды, запущенные из родительской папки и не называющие файл (проверка 5); скрипты вроде Python, которые сами открывают файл; копирование и вставка с вашей стороны; правила с **/ совпадают только внутри папки, где начата сессия, поэтому сессия, начатая в соседней папке, пропускает файлы *.env и *creds*
container/tools/deploy/deploy-ftp.creds.exampleотслеживаемый шаблон для учётных данных FTP, без настоящих значенийRead(**/*creds*)
~/.config/aredel/ftp-creds.env, а в ~/.config/aredel/backoffice/: token, deploy-state.json, tab-stats.jsonпароль FTP для хостинга, bearer-токен локального API backoffice, коммит последней загрузки, счётчики использования вкладокRead(~/.config/aredel/**)инструмент Read (проверено в сессии репозитория); Edit и Write (проверка 2); cat, grep, ls и find, которые называют путь (проверка 3, проверка 4); инструменты Grep и Glob и упоминания через @ (по документации, по мере возможностей)команды, которые не называют файл, как и для логов (на этом пути не проверялось); скрипты вроде Python, которые сами открывают файл; копирование и вставка с вашей стороны

Как это проверяли

Результаты read, grep, glob, оболочки и вложений взяты из тестов в главе «Как тестировать deny-правило» и из таблиц вариантов там же. Проверки ниже добавлены для этого списка, на том же временном репозитории с фиктивным логом, так что ни один настоящий файл не был прочитан или изменён. Проверки с 1-й по 7-ю шли, когда логи ещё лежали в репозитории, на старом пути; проверки с 8-й по 10-ю прошли 22.10.2026 с OpenCode 2.1.3, а фиктивная домашняя папка рядом с временным репозиторием изображала ~.

Проверка 1 — запись OpenCode в файл, защищённый от чтения. У агента build по умолчанию нет правила для правки, поэтому запрет чтения — единственное правило на файле.

timeout 180 opencode run --standalone -m opencode/deepseek-v4.1-flash-free "Use the write tool exactly once to replace the whole content of container/tools/analyze_logs/site_logs/prod/access/aredel.com.access.log with the single word OVERWRITTEN. Then reply with the exact result or the exact error text. Do not use any other tool."

Проверка 2 — Write Claude Code в файл, защищённый от чтения. Claude Code попросили перезаписать тот же фиктивный лог инструментом Write.

Проверка 3 — cat и grep Claude Code, которые называют файл. Команды оболочки с защищённым путём в командной строке.

cat container/tools/analyze_logs/site_logs/prod/access/aredel.com.access.log

grep -c 203 container/tools/analyze_logs/site_logs/prod/access/aredel.com.access.log

Проверка 4 — ls и find Claude Code на защищённой папке. Перечисление имён внутри защищённой папки.

find container/tools/analyze_logs/site_logs -type f

Проверка 5 — grep -r Claude Code из родительской папки. Команда, которая читает файл, не называя его.

cd container/tools/analyze_logs && grep -rc 203 .

Проверка 6 — команды оболочки OpenCode, которые называют папку конфигурации или creds. Агент по умолчанию, с запретами оболочки в opencode.jsonc. Во временном репозитории есть фиктивный файл fakehome/.config/aredel/dummy.txt.

timeout 180 opencode run --standalone -m opencode/deepseek-v4.1-flash-free "Use the shell tool exactly once to run: cat fakehome/.config/aredel/dummy.txt . Then reply with the output or the exact error text. Do not use any other tool."

timeout 180 opencode run --standalone -m opencode/deepseek-v4.1-flash-free "Use the shell tool exactly once to run: echo creds-check . Then reply with the output or the exact error text. Do not use any other tool."

Проверка 7 — разрешения агента OpenCode после глобального запрета. В то время builder разрешал git diff *, а reviewer — git diff * и git show *. OpenCode применяет последнее совпавшее правило, а правила агента идут после глобальных.

timeout 180 opencode run --standalone --agent builder -m opencode/deepseek-v4.1-flash-free "Use the shell tool exactly once to run this exact command, with no extra arguments: git diff --no-index /dev/null fakehome/.config/aredel/dummy.txt Then reply with the output or the exact error text. Do not use any other tool."

Проверка 8 — файлы OpenCode вне проекта. Фиктивный ключ в fakehome/.ssh/id_dummy и фиктивная заметка в fakehome/notes.txt, вне временного репозитория. Сначала конфигурация до варианта B, затем вариант B.

timeout 180 opencode run --standalone -m opencode/deepseek-v4.1-flash-free "Use the read tool exactly once on /tmp/fakehome/.ssh/id_dummy. Then reply with the output, or with the exact error text the tool returned. Do not use any other tool." < /dev/null

Проверка 9 — разрешения роли OpenCode на перенесённых логах. Фиктивный лог в фиктивной домашней папке, когда правило ask для папки уже стоит.

timeout 180 opencode run --standalone --agent builder -m opencode/deepseek-v4.1-flash-free "Use the shell tool exactly once to run this exact command, with no extra arguments: git diff --no-index /dev/null /tmp/fakehome/.local/share/aredel/logs/prod/access/aredel.com.access.log Then reply with the output or the exact error text. Do not use any other tool." < /dev/null

Проверка 10 — OpenCode на users.db. Фиктивная база с одной строкой в container/tools/analyze_logs/users.db, вариант B.

timeout 180 opencode run --standalone -m opencode/deepseek-v4.1-flash-free "Use the read tool exactly once on container/tools/analyze_logs/users.db. Then reply with the output, or with the exact error text the tool returned. Do not use any other tool." < /dev/null

Затем то же через Python в оболочке: python3 -c "import sqlite3; print(sqlite3.connect(…/users.db).execute('select * from users').fetchall())".

Открытые пробелы и исправления

Автор статьи: Клавдия Кондакова

Изображение баннера