Przejdź do głównej zawartości

Automatyzacja operacji bezpieczeństwa

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

Dział zatytułowany „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

Dział zatytułowany „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.

  1. Uruchom deterministyczne skanery i przechwyć wynik czytelny dla maszyny. To są prawdziwe komendy, nie prompty — wklej je do terminala:

    Okno terminala
    # Static analysis (registry rules)
    semgrep --config=auto --json --output semgrep.json .
    # Dependency CVEs
    npm audit --json > audit.json
    # Secrets in working tree + history
    detect-secrets scan --all-files > secrets.json
    # Container image (if you ship one)
    trivy image --severity HIGH,CRITICAL --format json -o trivy.json myorg/api:latest

    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.

  2. 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.

  3. 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:

{
"mcpServers": {
"github": {
"url": "https://api.githubcopilot.com/mcp/",
"headers": { "Authorization": "Bearer ${GITHUB_PAT}" }
}
}
}

Teraz agent czyta semgrep.json, łata dwa prawdziwe odkrycia i wywołuje narzędzie create_pull_request z GitHub MCP — wszystko z jednego promptu.

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.

Prawdziwe, osiągalne odkrycie, a nie zmyślone:

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
- name: AI triage (advisory)
if: github.event_name == 'pull_request'
run: |
semgrep --config=auto --json --output semgrep.json . || true
claude -p "Summarize semgrep.json: rank exploitable findings, list \
likely false positives, suggest the smallest fix for each real one." \
--allowedTools "Read,Grep" --output-format json > triage.json
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

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:

  1. Wpiąć Trivy do CI jako blokującą bramkę (prompt powyżej).
  2. Włączyć ciągłe skanowanie rejestru dla już wdrożonych obrazów.
  3. 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ł.
  4. 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)
apiVersion: v1
kind: Namespace
metadata:
name: payments
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: latest
pod-security.kubernetes.io/warn: restricted
---
# 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:

{
"mcpServers": {
"azure": {
"command": "npx",
"args": ["-y", "@azure/mcp@latest", "server", "start"],
"env": {
"AZURE_SUBSCRIPTION_ID": "your-subscription-id",
"AZURE_TENANT_ID": "your-tenant-id"
}
}
}
}

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
uvx snyk-agent-scan@latest scan
# Inspect the exact tool descriptions your model is being fed
uvx snyk-agent-scan@latest inspect

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.

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.