Automatyzacja operacji bezpieczeństwa łączy deterministyczne skanery — Semgrep, npm audit, detect-secrets, Trivy — z agentem AI w Cursorze, Claude Code lub Codeksie, który czyta ich wynik, oddziela realne podatności od fałszywych alarmów, zamienia je w zrecenzowany pull request, bramkuje CI na naprawialnych HIGH i CRITICAL oraz szkicuje dowody SOC 2 i GDPR cytujące prawdziwe artefakty.
Twój skaner właśnie oznaczył 412 „krytycznych” odkryć w 50 obrazach kontenerów i 14 CVE w zależnościach. Jedenaście z tych CVE dotyczy pakietów wyłącznie deweloperskich, które nigdy nie trafiają na produkcję, dwa są nieosiągalne z jakiejkolwiek wywoływanej ścieżki kodu, a ten jeden, który ma znaczenie, leży pogrzebany na dole raportu. W tym czasie kanał on-call płonie, a audytor SOC 2 chce dowodów z przeglądu dostępów na piątek.
Obietnica „bezpieczeństwa z AI” rzadko oznacza nowy skaner. To asystent, który czyta wynik skanera tak, jak zrobiłby to starszy inżynier — koreluje odkrycie z twoim kodem, eliminuje to, co nieosiągalne, i zamienia resztę w zrecenzowany pull request zamiast w 200-liniowy zrzut JSON, którego nikt nie otwiera.
Co wyniesiesz z automatyzacji operacji bezpieczeństwa
Prompt do triage dla każdej klasy skanera: odkrycia SAST z Semgrepa, CVE z npm audit, obrazy kontenerów z Trivy’ego i żywy sekret znaleziony w historii
Mechanikę poszczególnych narzędzi do prowadzenia tej pętli w Cursorze (tryb agenta + MCP), Claude Code (bezgłowy -p w CI + hooki) i Codeksie (piaskownica CLI + automatyzacja w chmurze)
Workflow CI, który uruchamia skanery jako twardą bramkę, a triage AI jako krok doradczy, plus zadanie Trivy blokujące merge przy naprawialnych HIGH/CRITICAL
Zweryfikowane konfiguracje MCP dla danych bezpieczeństwa AWS i Azure, serwer GitHub MCP do otwierania PR-ów z naprawą oraz jeden skaner higieny MCP, który naprawdę warto uruchamiać
Utwardzanie Kubernetes z aktualnymi API (Pod Security Admission, nie usunięte PodSecurityPolicy)
Trzeźwą listę trybów awarii, żebyś nie dostarczał fałszywej pewności
Przepływ pracy: agent na szczycie prawdziwych narzędzi
Błąd, który popełnia większość opracowań o „AI SecOps”, to proszenie modelu, by był skanerem. Nie jest. Semgrep, CodeQL i Trivy są deterministyczne, szybkie i audytowalne — zostaw je. Zadaniem AI jest ta kosztowna część, którą obecnie wykonuje człowiek: czytanie wyników, eliminowanie fałszywych alarmów i proponowanie najmniejszej poprawnej poprawki.
Uruchom deterministyczne skanery i przechwyć wynik czytelny dla maszyny. To są prawdziwe komendy, nie prompty — wklej je do terminala:
semgrep instalujesz przez pip install semgrep lub brew install semgrep; detect-secrets przez pip install detect-secrets; trivy przez brew install trivy lub jego skrypt instalacyjny. Żadne z nich nie są pakietami npm — nie rób npm install.
Przekaż wynik do AI w celu triage. Tu leży właściwa wartość. Skaner mówi „potencjalne wstrzyknięcie SQL w db.ts:42”; asystent mówi, czy db.ts:42 jest osiągalne z niezaufanego wejścia, czy też jest zapytaniem parametryzowanym, które reguła błędnie oznaczyła.
Zamień prawdziwe wyniki w zrecenzowany PR — nigdy w automatycznie scalany. Pozwól AI naszkicować poprawkę i treść PR, ale zatwierdza ją człowiek (lub wymagana bramka CI). Automatyczne stosowanie poprawek AI w pliku wrażliwym na bezpieczeństwo to przepis na wprowadzenie regresji z zielonym ptaszkiem.
Komendy skanerów z kroku 1 są wszędzie identyczne. Mechanika kroków 2 i 3 różni się między narzędziami.
Uruchom skanery, tak by semgrep.json / audit.json / trivy.json istniały w przestrzeni roboczej, a potem wejdź w tryb agenta (Cmd/Ctrl+I). Tryb agenta czyta JSON bezpośrednio i edytuje oznaczone pliki źródłowe w miejscu, pokazując każdą zmianę jako checkpoint, który akceptujesz lub odrzucasz. Z podłączonym serwerem MCP @aws-security dodaj @aws-security do promptu, aby mógł sprawdzić, czy dana usługa jest faktycznie wystawiona do internetu.
Dodaj serwer GitHub MCP, aby agent mógł otworzyć PR z naprawą bez opuszczania edytora. W ustawieniach MCP Cursora (lub w .cursor/mcp.json) zarejestruj oficjalny zdalny serwer:
Teraz agent czyta semgrep.json, łata dwa prawdziwe odkrycia i wywołuje narzędzie create_pull_request z GitHub MCP — wszystko z jednego promptu.
Claude Code błyszczy w bezgłowej połowie tej pętli, tej w CI. Uruchom skanery, a potem przepuść prompt do triage przez -p (tryb print) z JSON-em na dysku. Claude Code potrafi sam uruchomić grep/rg, by potwierdzić osiągalność, co czyni jego priorytetyzację konkretną, a nie zgadywaną:
Okno terminala
semgrep--config=auto--json--outputsemgrep.json.
claude-p"Read semgrep.json. For each finding, classify exploitable vs \
false-positive and output JSON: {file, line, verdict, reason, patch}. \
Treat anything under test/ or scripts/ as non-shipping."\
Ten sam kształt działa dla odkryć w kontenerach, gdzie użytecznym wynikiem jest ranking priorytetów, a nie zestaw poprawek:
Okno terminala
claude-p"Read trivy.json (Trivy JSON). For each HIGH/CRITICAL: name the CVE and package, use Grep to check if the vulnerable path is reachable in our source, and assign P0/P1/P2 with a one-line justification. Output a markdown table sorted by priority."--output-formatjson>container-triage.json
Dodaj serwer GitHub MCP z udokumentowanym transportem HTTP, aby Claude Code mógł otwierać PR lokalnie lub w CI:
Hook PreToolUse to właściwe miejsce na wyegzekwowanie reguły „żadnego automatycznego scalania poprawek bezpieczeństwa” — zablokuj każde Bash(gh pr merge*) na gałęzi o nazwie security-* i wymagaj przeglądu przez człowieka.
Codex (GPT-5.6 Sol w App/CLI/IDE/Cloud) jest najmocniejszy w wariancie zaplanowanym i bezobsługowym, a domyślna piaskownica czyni z niego bezpieczne miejsce do przeglądania każdej komendy przed uruchomieniem:
Okno terminala
semgrep--config=auto--json--outputsemgrep.json.
codexexec"Read semgrep.json and rank findings by real exploitability; \
propose a minimal patch for each genuinely exploitable one."\
--ask-for-approvalon-request
Dla przebiegu interaktywnego z przeglądem każdej akcji uruchom codex -a untrusted (pyta przed każdą akcją) i wklej:
Read trivy.json. For each HIGH/CRITICAL finding, check whether the vulnerable
package is actually imported and reachable in this repo, classify it P0/P1/P2
by real exploitability, and propose the smallest dependency bump that resolves
the P0s. Show me the diff before applying anything.
Do cyklicznego skanu użyj Codex Cloud z integracją GitHub: skieruj zadanie Cloud na repozytorium według harmonogramu, pozwól mu uruchomić skanery i triage, a następnie otworzyć PR z naprawą przez podłączoną aplikację GitHub. Trzymaj --ask-for-approval on-request (nie never), aby destrukcyjna naprawa wciąż zatrzymywała się na człowieku.
To są przepisy. Zakładają, że masz już przechwycony JSON ze skanerów. Każdy celuje w inne wejście i ta różnica ma znaczenie: odkrycia Semgrepa wymagają osiągalności skażenia, CVE wymagają osiągalności miejsc wywołania, odkrycia w kontenerach wymagają ekspozycji, a wyciekły sekret wymaga rotacji przed czymkolwiek innym.
P0 — CVE-2026-42945 (nginx, przepełnienie sterty w ngx_http_rewrite_module, CVSS 9.2).
Dotyczy: obraz bazowy nginx:1.30.0 w 3 usługach. Osiągalne: tak — wszystkie trzy używają dyrektyw rewrite. Wystawione do internetu: tak (ingress brzegowy).
Naprawa: przebuduj na nginx:1.31.0 (lub 1.30.1), który zawiera łatkę. Załataj w ciągu 24 godzin.
To CVE jest prawdziwe (wprowadzone w 2008, ujawnione w 2026, naprawione w nginx 1.31.0 / 1.30.1) — w pracy nad bezpieczeństwem używaj weryfikowalnych odkryć; nigdy nie pozwól agentowi przedstawić wymyślonego numeru CVE jako faktu.
Uruchamiaj deterministyczne skanery na każdym PR, a potem triage AI jako krok doradczy. Twarda bramka pozostaje deterministyczna — pipeline kończy się błędem przy naprawdę nowych wynikach o wysokiej istotności z Semgrepa lub Trivy’ego, a nie na podstawie opinii AI. Zwróć uwagę na actions/checkout@v5 (Node 24; runnery v3 są wycofane z końcem czerwca 2026).
.github/workflows/security-scan.yml
name: Security Scan
on:
pull_request:
schedule:
- cron: '0 */6 * * *'
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Semgrep (hard gate on new high-severity)
uses: semgrep/semgrep-action@v1
with:
config: auto
- name: Dependency audit
run: npm audit --audit-level=high
- name: Secret scan
run: |
pipx install detect-secrets
detect-secrets scan --all-files | tee secrets.json
# Advisory: AI triage summary posted to the PR, not a blocker
W przypadku obrazów największą dźwignię daje skaner przed wdrożeniami, tak by naprawialna podatność krytyczna automatycznie blokowała merge. Trivy dostarcza utrzymywaną GitHub Action; zadaniem agenta jest wpiąć ją w twój pipeline i poprawnie ustawić bramkę.
Poprawna bramka wygląda mniej więcej tak — zwróć uwagę, że skanuje zbudowany obraz i wywala build, a nie tylko raportuje:
- name: Scan image with Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: myorg/api:${{ github.sha }}
severity: HIGH,CRITICAL
ignore-unfixed: true
exit-code: '1'# fail the build on a fixable HIGH/CRITICAL
format: sarif
output: trivy.sarif
Wzorzec się uogólnia: skanowanie w CI w czasie budowania, ciągłe skanowanie rejestru dla obrazów już wdrożonych oraz polityka dopuszczania na klastrze, żeby podatny obraz nie mógł zostać zaplanowany, nawet jeśli prześlizgnie się przez CI.
Rzeczywisty przepływ pracy bezpieczeństwa kontenerów
Wyzwanie: twój zespół wdraża ponad 50 obrazów tygodniowo. Ręczny przegląd jest wąskim gardłem; niezeskanowane obrazy są ryzykiem. Rozwiązaniem są warstwowe, automatyczne bramki — i polityka dopuszczania używająca aktualnych API Kubernetes.
Użyj agenta, by:
Wpiąć Trivy do CI jako blokującą bramkę (prompt powyżej).
Włączyć ciągłe skanowanie rejestru dla już wdrożonych obrazów.
Egzekwować Pod Security Standards na klastrze przez Pod Security Admission (wbudowanego następcę usuniętego PodSecurityPolicy) albo silnik polityk w rodzaju Kyverno / OPA Gatekeeper dla bogatszych reguł.
Audytować działające obciążenia względem CIS Kubernetes Benchmark.
PodSecurityPolicy (policy/v1beta1) zostało usunięte w Kubernetes 1.25 i nie istnieje na żadnym wspieranym klastrze — każdy przewodnik, który wciąż każe ci „wdrożyć pod security policies”, jest nieaktualny. Aktualnym wbudowanym mechanizmem jest Pod Security Admission poprzez etykiety przestrzeni nazw, egzekwujący trzy Pod Security Standards (privileged / baseline / restricted), w parze z NetworkPolicy do izolacji ruchu.
# namespace with Pod Security Standards enforced (replaces PodSecurityPolicy)
# default-deny egress/ingress, then allow only what's needed
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: payments-isolation
namespace: payments
spec:
podSelector:
matchLabels:
app: payments-api
policyTypes: [Ingress, Egress]
ingress:
- from:
- podSelector:
matchLabels: { app: api-gateway }
ports:
- { protocol: TCP, port: 8443 }
egress:
- to:
- podSelector:
matchLabels: { app: postgres }
ports:
- { protocol: TCP, port: 5432 }
Dwa prompty pokrywają dwie sytuacje, w których faktycznie się znajdziesz. Pierwszy dotyczy jednej przestrzeni nazw, której ruch już znasz — produkuje manifesty gotowe do zastosowania od razu. Drugi to plan dla całego klastra, wraz z decyzją o RBAC i silniku polityk, którą pierwszy pomija.
Kilka źródeł danych bezpieczeństwa warto podłączyć jako serwery MCP, by agent mógł odpytywać żywą postawę chmury zamiast pracować na nieaktualnym eksporcie. Serwer (command, args, env) jest wszędzie taki sam — różni się tylko plik konfiguracyjny i jego format: Cursor i Claude Code (.mcp.json) używają kształtu JSON mcpServers, podczas gdy Codex (~/.codex/config.toml) wyraża te same pola jako tabelę TOML [mcp_servers.<name>].
Postawa bezpieczeństwa AWS — pakiet aws-security-mcp (prawdziwy, w npm) udostępnia odkrycia Security Hub, GuardDuty i IAM:
{
"mcpServers": {
"aws-security": {
"command": "npx",
"args": ["-y", "aws-security-mcp"],
"env": {
"AWS_REGION": "us-east-1"
}
}
}
}
Ten sam serwer w ~/.codex/config.toml Codeksa — identyczne pola, składnia TOML:
[mcp_servers.aws-security]
command = "npx"
args = ["-y", "aws-security-mcp"]
[mcp_servers.aws-security.env]
AWS_REGION = "us-east-1"
Nie wpisuj AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY na sztywno w konfiguracji, którą możesz zacommitować. Pozwól serwerowi pobrać poświadczenia ze standardowego łańcucha AWS — przyjętej roli IAM, SSO lub ~/.aws/credentials — dokładnie tak, jak robi to AWS CLI.
Postawa bezpieczeństwa Azure — firmowy serwer Microsoftu @azure/mcp obejmuje Defender for Cloud i zapytania o zasoby:
Serwer GitHub MCP (github/github-mcp-server, zdalnie pod https://api.githubcopilot.com/mcp/) to trwałe połączenie dla połowy naprawczej: pozwala agentowi przeszukiwać kod w całej organizacji, czytać alerty Dependabota i skanowania sekretów oraz otwierać PR. Sięgaj po niego, gdy agent musi wielokrotnie działać na GitHubie. Nie istnieje pakiet @anthropic/* ani jednostringowe new MCPClient('github') — MCP to connect(transport), a potem callTool({ name, arguments }), a jeśli skryptujesz bezpośrednio na SDK, pakiet to @modelcontextprotocol/sdk, a klient mieszka pod @modelcontextprotocol/sdk/client/index.js.
Po stronie umiejętności umiejętność Semgrep (semgrep/skills, instalowana przez npx skills add semgrep/skills) to lżejsza opcja: uczy agenta pisać własne reguły Semgrep dla twojego kodu i uruchamiać skany, bez stawiania serwera.
Jeśli dodajesz serwery MCP do przepływu bezpieczeństwa, zaudytuj je. snyk-agent-scan (uruchamiany przez uvx) statycznie sprawdza zainstalowane serwery MCP pod kątem prompt injection, zatruwania narzędzi i ataków typu rug-pull — ryzyk łańcucha dostaw specyficznych dla MCP. To dawny mcp-scan od Invariant Labs, przemianowany po przejęciu Invariant Labs przez Snyk w czerwcu 2025; stary pakiet mcp-scan w PyPI jest teraz tylko przekierowaniem, które instaluje i przekazuje do snyk-agent-scan, więc używaj kanonicznej nazwy:
Okno terminala
# Scan all installed MCP server configs for malicious tool descriptions
uvxsnyk-agent-scan@latestscan
# Inspect the exact tool descriptions your model is being fed
uvxsnyk-agent-scan@latestinspect
To prawdziwa, aktualna komenda — i naprawdę dobry nawyk, gdy zaczynasz zależeć od zewnętrznych serwerów MCP w danych bezpieczeństwa.
Zgodność to w większości składanie dowodów, a to dokładnie ten rodzaj ustrukturyzowanej pracy zestawieniowej, w której agent jest dobry — pod warunkiem, że skierujesz go na prawdziwe artefakty (logi dostępu, IaC, eksporty konfiguracji), zamiast prosić o stwierdzenie zgodności z niczego.
Wrzuć do kontekstu eksport z przeglądu dostępów i IaC, podłącz @aws-security dla żywej konfiguracji i poproś o pakiet dowodów zmapowany na konkretne mechanizmy kontrolne.
Using `access-review.csv` (our quarterly IAM export) and the Terraform in
`infra/`, draft a SOC 2 evidence package for controls CC6.1 (logical access),
CC6.3 (network access), and CC8.1 (change management). For each control: cite
the specific file/line or log entry that demonstrates it, and flag any control
where the evidence is missing or weak. Do NOT claim a control is satisfied
without pointing to the artifact that proves it.
Claude Code potrafi przeczytać repozytorium, uruchomić git log po dowody zarządzania zmianami i złożyć pakiet w jednym przebiegu.
Map our personal-data flows for a GDPR Article 30 record. Search the codebase
and `infra/` for: where PII is collected, which datastores hold it (grep for
schema/migrations), where it crosses a service or third-party boundary (Stripe,
SendGrid, analytics), and where retention/deletion is implemented. Output a
table of data category -> store -> lawful basis (mark "UNKNOWN — needs legal
review" if not evident) -> retention. Be explicit about gaps; do not invent a
lawful basis.
Użyj Codeksa z piaskownicą tylko do odczytu do przebiegu dowodowego — ma czytać i raportować, a nie modyfikować infrastrukturę.
Okno terminala
codex--sandboxread-only"Assemble SOC 2 CC6.1 access-control evidence from access-review.csv and infra/"
Potem poproś o raport luk, bo to ta część, na której audytor faktycznie działa:
Read `access-review.csv` and `infra/`. For SOC 2 CC6.1/CC6.3/CC8.1, produce a
gap report: control, current evidence (with file/log citation), and the single
most important gap to close. Rank gaps by audit risk. Flag any control with no
supporting artifact as a blocker.
Dyscyplina, która czyni to wiarygodnym: każda teza „spełnione” musi cytować prawdziwy artefakt. Pakiet dowodów zmyślony przez agenta polegnie w chwili, gdy audytor poprosi o źródłowy log — więc jawnie promptuj o cytaty i oznaczanie luk, jak wyżej.