Повод: звонок, которого мы не ждали
Среда, конец апреля. Постоянный клиент пишет, коротко, тревожно: его сайт на WordPress несколько часов ведёт себя странно. Берёмся, тянем за первую ниточку и через три часа понимаем: не один сайт, а 30 из 37 установок WordPress на одном хостинг-аккаунте скомпрометированы. Семейство веб-шеллов, циркулирующее годами под именем "Sid Gifari", расползлось по всему аккаунту.
Сигнатура была однозначной и неприлично предсказуемой. Три дыры, всегда одни и те же: непропатченная тема с маркетплейса с известным RCE-issue 14-месячной давности. Никакого login-lockout, значит брутфорс через XML-RPC. Никакого мониторинга целостности файлов, поэтому веб-шелл лежал в plugin-root замаскированный как wp-cache.php, и неделями его никто не замечал.
Следующая неделя у нас была занята не столько самой работой по очистке. Она рутинная: локализовать веб-шеллы, захэшировать, восстановить оригиналы из source-tree WP-Core, форензически проверить содержимое БД, ротировать пароли, раскатать defense-pack на все 37 сабов, настроить cron под Wordfence и file-integrity, валидировать бэкапы.
Нас занимало другое: мы уже трижды записывали шаги именно для этого сценария. Один раз после похожего инцидента два года назад, один раз как внутренняя best-practice-документация, один раз как руководство для junior-коллеги. Знание было каждый раз. Но лежало на трёх разных Notion-страницах, в старой Confluence-вики и в Markdown-файле во внутреннем репозитории.
На следующей неделе пришло осознание: знания у нас есть, мы просто никогда не делали их потребляемыми. Ни для своей же команды под цейтнотом, ни для coding-агентов, с которыми мы и наши клиенты теперь работаем ежедневно.
Сегодня мы публикуем библиотеку, которая из этого выросла.
Что это за библиотека
claude-security-skills, это open-source-коллекция из 34 защитных security-плейбуков для LLM-coding-агентов. Работает с Claude Code, Cursor, GitHub Copilot, Codex CLI, Cline, Gemini CLI. Везде, где агент может читать структурированные промпты из workspace.
Каждый skill, это Markdown-файл с YAML-frontmatter (name, description). Coding-агент семантически сопоставляет описание с тем, о чём сейчас идёт разговор, и автоматически подтягивает подходящий плейбук в контекст. Команду набирать не нужно. Агент сам распознаёт "ага, это про hardening WordPress" и следует соответствующим шагам.
13 доменов, 34 skill, лицензия MIT, v1.0.0 выходит сегодня.
Мандаты, из которых выросла библиотека
Мы не хотели делать теоретическую библиотеку. Каждый skill в репозитории взят из конкретного клиентского мандата за последние двенадцать месяцев. Вот четыре мандата, которые составляют костяк.
Мандат 1: консолидация хостинг-аккаунта после инцидента с веб-шеллом
Тот самый инцидент из вступления. Что превратило очистку в библиотеку, так это понимание: безопасность WordPress на shared-хостинге решается не на уровне сайта, а на уровне аккаунта. Один скомпрометированный поддомен достаточен для lateral movement через cross-account file permissions или общих DB-пользователей.
Из этого мандата вышли три skill: wordpress-hardening (уровень сайта), shared-hosting-isolation (account-level defense pack с file-integrity-cron, mu-plugin audit-backdoor и автоматическим plugin-patch-status-report), и incident-response-wordpress (порядок форензики, что из логов сохранять, когда уведомлять хостера).
Coding-агент, у которого эти три skill в контексте, не может "просто поставить" WordPress-сайт. Он сначала проверяет, в каком hosting-setup находится, смотрит file permissions на уровне аккаунта, предлагает defense pack и реализует его.
Мандат 2: greenfield-hardening VPS под SaaS-бэкенд
Клиент поднял новый VPS на Hetzner Cloud, Debian 12, планирует NestJS-бэкенд с Postgres под Production. Классический greenfield, без legacy. Нас попросили один раз пройтись по setup с полными защитными стандартами, прежде чем туда попадёт хоть одно приложение.
В итоге мы выдали восемь последовательных шагов конфигурации: правила UFW, SSH key-only с fail2ban, автоматические security-обновления без автоматической перезагрузки, Postgres с listen address на localhost и лимитами connection-pool, стратегия бэкапов с off-site encryption через restic в B2, защита origin-IP в Cloudflare с Authenticated Origin Pulls (так что direct-IP bypass невозможен), secrets-management через systemd-environment-файлы с правами 600 и Vault read-only пользователем для приложения, плюс мониторинг с fail2ban-вебхуками в приватный Slack-канал.
Эти восемь шагов в той же последовательности уже трижды реализовывались в предыдущих VPS-hardening. Из этого мандата вышли skill vps-hardening-debian, cloudflare-origin-protection, postgres-listen-hardening, secrets-management-systemd, backup-strategy-restic и fail2ban-monitoring: шесть skill из одного мандата.
Мандат 3: security-аудит распределённой агентской платформы
Клиент эксплуатирует собственную LLM-агентскую платформу: серверный кластер, оркестрирующий задачи, плюс worker-клиенты, работающие в изолированных контейнерах, плюс NATS-message-bus между ними. Нас привлекли провести security-аудит перед более широкой бетой.
Findings, которые удивили нас больше всего:
- NATS работал без ACL. Любой worker мог подписаться на все subject, в том числе те, которые предназначались другим worker. Скомпрометированный worker мог бы прочитать всю task-queue.
- Tool-calls от агента к серверу не делали re-validation авторизации. Агент получал JWT при initial-connection и потом использовал его для каждого tool-call, без refresh, без сужения scope под каждый call.
- MCP-серверы полностью доверяли агенту. MCP-tools исходили из того, что агент ответственно валидирует input. Чего агент, разумеется, не делает, когда input приходит из источников, способных к prompt-injection.
Из этого аудита вышли skill nats-acl-patterns, mcp-server-hardening, prompt-injection-defense и agent-jwt-rotation. Плюс более длинный skill distributed-agent-architecture-review, документирующий методологию аудита.
Мандат 4: inheritance-аудит NestJS-кодбейза 12-месячной давности
Клиент перенял backend-сервис у предыдущего подрядчика: 12 месяцев кода, около 40 000 строк, без документации, прежний lead недоступен. Бриф: "дайте отчёт, что здесь внутри и где горит".
Мы прогнали воспроизводимый процесс аудита в такой последовательности: сначала gitleaks (три секунды, ловит забытые API-ключи в git-history; нашли семь, два ещё активны). Потом semgrep с auto-ruleset (две минуты, ловит 80 процентов паттернов OWASP Top 10; 23 finding, четыре критических). Потом CodeQL для анализа потоков данных (полчаса, ловит то, что не ловит semgrep; три дополнительных finding, все три действительно exploitable). Потом ручной architecture-review по auth- и data-flow-путям.
Итого: три часа wall-time, 18 actionable finding, отчёт на 14 страниц с severity, воспроизводимостью и предложением fix по каждому finding.
Из этого мандата вышел skill codebase-audit: последовательность, выбор инструментов, что в какой output-отчёт идёт, когда ручные review-шаги неизбежны.
Как это технически работает
Каждый skill, это Markdown-файл с двумя обязательными полями во frontmatter:
---
name: wordpress-hardening
description: Use this skill when working on WordPress sites,
addressing security vulnerabilities, hardening shared hosting
environments, or responding to webshell incidents.
---Тело содержит плейбук в виде прозы: диагностические шаги, конкретные команды, типичные ошибки, чек-лист верификации. Простой язык, никаких таблиц перекрёстных ссылок построчно. Агент лучше понимает семантический контекст, читая нормальные инструкции, чем разбирая mapping-матрицу.
Coding-агент при старте загружает skill из директории .claude/skills/ (или эквивалентного пути своей платформы) и сопоставляет description семантически с тем, о чём идёт разговор. Когда вы говорите "Я мигрирую Express-сервер на Cloudflare Workers", он автоматически подтягивает релевантные skill (origin-hardening, secrets-management, специфика Workers) в контекст. Команду набирать не нужно.
Для программного использования есть index.json. Кто строит свой tooling вокруг, например MCP-сервер, отдающий skill как resources, или CI-систему, бутящую агента перед каждым PR с подходящим subset, может через него читать полный каталог.
Установка, это git clone в project-root или в ~/.claude/skills/ для глобального использования. Никаких npm-зависимостей, никаких build-шагов, никакого runtime. Только Markdown-файлы.
Пять skill, которые стоит выделить
Из 34 здесь пять, которые нам бы чаще всего пригодились реактивно, и которые теперь живут проактивно в инструментарии вашего агента.
wordpress-hardening
Якорь всей библиотеки. Трёхуровневый подход: уровень аккаунта (изолировать все sub на одном хостинг-аккаунте, настроить defense-pack-cron), уровень сайта (Wordfence плюс 2FA плюс login-lockout плюс file-integrity-monitor), форензика (mu-plugin как read-only audit-backdoor, ежечасно логирующий хэши wp-config.php, .htaccess и всех plugin-root). Когда агент работает на WordPress-кодбейзе и предлагает мутации файлов, он сначала проверяет, в чистом ли состоянии сайт.
ai-agent-guardrails
Ответ на вопрос "что будет, если агент запустит bulk-операцию, которую не сможет откатить?". Паттерн: dry-run-first, плюс confirm-threshold (--apply с N-й write-операции, по умолчанию N=1 для деструктивных операций). Плюс логирование всех мутаций в append-only-файл, против которого агент перед каждым --apply должен проверить, не выполнял ли он уже эту же операцию. Предотвращает класс "агент случайно удалил 10 000 строк из БД, потому что неверно понял гарантию идемпотентности".
codebase-audit
Методология приёма незнакомых кодбейзов (см. Мандат 4 выше). Последовательность, выбор инструментов, формат вывода. Coding-агент с этим skill при первом контакте с проектом строит AUDIT-FINDINGS.md в repo-root, против которого работает с тех пор, вместо того чтобы каждую сессию начинать с нуля.
prompt-injection-defense
Паттерн, который мы называем "untrusted-since-confirm". Когда агент обрабатывает внешний input (Markdown из user-submission, содержимое email, output tool, который сам LLM-генерирует), этот input помечается untrusted с момента получения и остаётся таким, пока не пройдёт человеческий confirm. Конкретно: никаких tool-calls, никаких sub-agent-spawns, никаких API-writes на основе untrusted-content без явного approval. Предотвращает класс "PDF со скрытыми instructions выполняется агентом".
dach-compliance
Якорь под наш локальный рынок. Impressum, политика конфиденциальности, AGB по праву AT/DE/CH; cookie-consent по TTDSG/DSG; договоры обработки данных при использовании US-subprocessors. Когда агент строит новую страницу для DACH-клиента, он проверяет, существуют ли три обязательные страницы и корректно ли они линкованы, прежде чем сигнализировать production-ready.
Плюс ещё 29: hardening Postgres, паттерны архитектуры бэкенда, email-security с DMARC/DKIM/SPF, mobile-app-security, secrets-management, паттерны session/auth, защита origin-IP, и так далее. Полный список в репозитории.
Сознательные дизайн-решения
Три решения, которые мы приняли явно, потому что они не самоочевидны:
Только защита. Никакого red-team-материала, никаких exploit-PoC, никаких skill, обучающих агентов пробивать WAF. Мы обращаемся к командам, которые шиппят production-код, а не к pen-тестерам. Это решение исключает целый класс возможных skill, что делает библиотеку меньше. Это намеренно.
Опыт важнее полноты. Каждый skill в библиотеке взят из конкретного мандата, над которым мы работали. Никакого теоретического материала, никаких skill по темам, в которых у нас нет собственной практики. Лучше опубликуем 34 skill в полной глубине, чем 200 наполовину.
Multi-platform-формат. Skill, это чистый Markdown с YAML-frontmatter, без tool-специфичного кода. Мы тестируем в основном против Claude Code, но Cursor, Copilot, Codex CLI и Gemini CLI грузят их так же. Pull request под специфику платформ приветствуются. Compliance-mapping (OWASP, PCI-DSS, ISO 27001) сознательно не часть библиотеки: это работа аудитора, а не coding-агента. Что нужно агенту, это ясная инструкция на читаемом языке.
Что дальше
Следующая партия skill в работе, все из текущих или недавно завершённых мандатов:
- postgres-hardening (RLS-паттерны, лимиты connection-pool, pgaudit-setup), из multi-tenant-SaaS-мандата
- terraform-iac-security (provider-auth, шифрование state-file, drift-detection), из cloud-миграции для клиента в Q1
- threat-modeling-with-agent (на базе STRIDE, ведомый через агента), из двух architecture-review, в которых мы использовали агента как структурированного партнёра по интервью для threat-modeling
- kubernetes-cluster-hardening (PodSecurityStandards, NetworkPolicies, миграция на PSA), из cluster-аудита, который сейчас идёт
Параллельно мы изучаем MCP-server-wrapper, который отдаёт skill как центральный resource, чтобы вы не клонировали в каждый проект, а ваш агент тянул живьём из index.
Дальнейшие посты этой серии последуют. Сегодняшний companion-материал на dev.to разбирает десять антипаттернов, которые мы регулярно видим в AI-generated коде в Production: хорошее вводное чтение перед тем, как поставить библиотеку.
Подключайтесь или работайте с нами
Репозиторий: github.com/GoldenWing-360/claude-security-skills, лицензия MIT, pull request приветствуются. Курируемая prompt-library в wiki показывает, как активировать skill в живой сессии.
Companion-материал на dev.to: 10 Security Mistakes Claude Code and Copilot Make in Production.
Если вы хотите применить эти паттерны к вашему стеку, будь то WordPress-конгломерат после инцидента, greenfield-VPS-setup с защитой origin Cloudflare, аудит ваших LLM-интегрированных backend-сервисов или приём незнакомого кодбейза, напишите нам. Мы делаем это профессионально.




