Przepływy pracy bezpieczeństwa i zgodności w przedsiębiorstwie
Twój zespół bezpieczeństwa właśnie wstrzymał wdrożenie AI. Pytania są zasadne: gdzie trafia nasz kod źródłowy, czy programista może wkleić dane osobowe klienta do promptu i czy potrafisz udowodnić audytorowi SOC2, kto dokładnie co uruchomił? Ogólnikowe rady w stylu „pisz jasne prompty” nie odpowiadają na żadne z nich. Ten przewodnik pokazuje konkretne, egzekwowalne mechanizmy kontroli, które faktycznie oferuje każde z trzech narzędzi — ustawienia, które przełączasz, konfiguracje, które commitujesz, i skanery, które podpinasz do CI — abyś mógł przejść przegląd i z powrotem włączyć wdrożenie.
Co z tego wyniesiesz
Dział zatytułowany „Co z tego wyniesiesz”- Dokładne ustawienie prywatności i retencji danych do wyegzekwowania w Cursor, Claude Code i Codex, tak aby kod źródłowy nie był przechowywany ani używany do treningu.
- Zacommitowany, egzekwowany maszynowo plik polityki dla każdego narzędzia, który blokuje odczyt
.env, niebezpieczne komendy shell i niezatwierdzone serwery MCP — a nie stronę na wiki, którą wszyscy ignorują. - Hook
PreToolUsei konfigurację pre-commit, które skanują diffy pod kątem sekretów i danych osobowych, zanim cokolwiek opuści maszynę, z użyciem prawdziwego open source (gitleaks,detect-secrets,trivy). - Gotowe do wklejenia prompty generujące listę kontrolną przeglądu bramkowaną przez CODEOWNERS, skaner diffów pod kątem sekretów/danych osobowych oraz middleware audytowe SOC2 CC7.1 dla Express + Postgres.
- Mapowanie kontroli SOC2 / GDPR / HIPAA na powierzchnię audytu, którą udostępnia każde narzędzie (Cursor Admin API, compliance API w Claude for Enterprise, Codex Compliance API).
Krok 1: Wyegzekwuj ochronę danych na poziomie narzędzia
Dział zatytułowany „Krok 1: Wyegzekwuj ochronę danych na poziomie narzędzia”Te mechanizmy istotnie różnią się między narzędziami, więc skonfiguruj każdy z osobna. Cel jest identyczny: zapobiec przechowywaniu kodu źródłowego i sekretów oraz nie dopuścić, by wrażliwe pliki w ogóle trafiły do kontekstu.
Wyegzekwuj Privacy Mode na poziomie zespołu, aby pojedyncze osoby nie mogły go wyłączyć, a następnie trzymaj wrażliwe pliki poza indeksowaniem i kontekstem za pomocą .cursorignore.
- Panel zespołu -> Settings -> włącz Privacy Mode i przełącz Enforce (członkowie nie mogą go już wyłączyć). Privacy Mode jest domyślnie włączony dla Enterprise i daje Ci ZDR ze wszystkimi dostawcami modeli.
- Na urządzeniach firmowych wdróż politykę MDM Allowed Team IDs, aby użytkownicy nie mogli zalogować się na konto prywatne, które nie ma Privacy Mode.
- Zacommituj
.cursorignore, aby sekrety i infrastruktura nigdy nie były indeksowane ani wysyłane jako kontekst:
# .cursorignore — nigdy nie indeksuj ani nie wysyłaj do modeli.env.env.***/secrets/****/*.pem**/*.keyterraform.tfstate***/credentials.jsonDla obciążeń podlegających regulacjom poproś dział sprzedaży o włączenie CMEK (kluczy szyfrowania zarządzanych przez klienta), aby embeddingi i wszelkie dane Cloud Agent były szyfrowane Twoim kluczem. Jeśli Twoja polityka w ogóle zabrania przechowywania kodu, po prostu nie włączaj Cloud Agents — każda inna funkcja Cursora nadal działa.
Dostarcz plik managed settings, który IT wdraża systemowo. Użytkownicy i projekty nie mogą go nadpisać, więc jest to Twój twardy fundament.
managed-settings.json znajduje się w /Library/Application Support/ClaudeCode/ (macOS), /etc/claude-code/ (Linux/WSL) lub C:\Program Files\ClaudeCode\ (Windows):
{ "permissions": { "deny": [ "Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)", "Read(./**/*.pem)", "Bash(curl:*)", "WebFetch" ] }, "allowManagedPermissionRulesOnly": true, "disableBypassPermissionsMode": "disable", "deniedMcpServers": [{ "serverName": "filesystem" }]}disableBypassPermissionsMode: "disable" likwiduje furtkę --dangerously-skip-permissions. allowManagedPermissionRulesOnly ignoruje wszelkie reguły allow/ask/deny dodane lokalnie przez programistę. deniedMcpServers blokuje ryzykowne serwery w całej organizacji. Uwierzytelniaj się przez Claude for Enterprise, aby uzyskać SSO, RBAC i compliance API.
Zablokuj agenta za pomocą sandbox_mode i approval_policy oraz rozdziel dostęp lokalny i chmurowy w ChatGPT Enterprise.
W ~/.codex/config.toml (lub wypchnij to przez konfigurację zespołu):
# Domyślnie tylko do odczytu; agent musi zapytać przed zapisem lub uruchomieniem czegokolwiek ryzykownegosandbox_mode = "read-only"approval_policy = "on-request"
[sandbox_workspace_write]network_access = falseWartości sandbox to read-only, workspace-write i danger-full-access — nigdy danger-full-access na laptopie programisty pracującym na prawdziwym repozytorium. W Workspace Settings -> Settings and Permissions użyj RBAC, aby włączyć Codex Local (aplikacja/CLI/IDE, działa w sandboksie na urządzeniu) i Codex Cloud (hostowane kontenery) dla różnych grup. ChatGPT Enterprise daje ZDR dla CLI i IDE oraz AES-256 w spoczynku i TLS 1.2+ w transmisji.
Krok 2: Zastąp plik z regułami egzekwowaną polityką
Dział zatytułowany „Krok 2: Zastąp plik z regułami egzekwowaną polityką”Przestarzały jednoplikowy .cursorrules jest wycofywany. Użyj Project Rules w Cursor (.cursor/rules/*.mdc), CLAUDE.md w Claude Code wraz z zacommitowanymi ustawieniami projektu oraz AGENTS.md w Codex. Plik z regułami to wskazówki, których model zazwyczaj przestrzega; to listy deny z Kroku 1 faktycznie je egzekwują. Używaj obu.
Utwórz .cursor/rules/security.mdc. Frontmatter alwaysApply: true wstrzykuje regułę do każdej sesji:
---description: "Security & data-handling rules"alwaysApply: true---
- Never write API keys, passwords, tokens, or connection strings into code. Read them from `process.env`.- Never put customer PII (names, emails, SSNs, MRNs) in fixtures, logs, or prompts. Use `@faker-js/faker` for test data.- Mark AI-assisted code with a `// AI-assisted` comment so review and CODEOWNERS can track it.- Redact secrets before logging; encrypt sensitive data at rest and in transit.Umieść te same reguły w CLAUDE.md w katalogu głównym repozytorium (ładowany automatycznie jako pamięć) i zacommituj zespołowe reguły uprawnień w .claude/settings.json:
{ "permissions": { "deny": ["Read(./.env)", "Read(./secrets/**)"], "ask": ["Bash(git push:*)"] }}CLAUDE.md steruje modelem; zacommitowane reguły deny/ask egzekwują twarde granice dla wszystkich pracujących na repozytorium.
Codex czyta AGENTS.md z katalogu głównego repozytorium. Użyj tej samej treści co w regule Cursora powyżej — format to zwykły Markdown, a wskazówki są identyczne we wszystkich narzędziach. Połącz go z sandbox_mode z Kroku 1, aby reguły były poparte rzeczywistym sandboksem, a nie tylko intencją.
Krok 3: Skanuj diffy pod kątem sekretów i danych osobowych, zanim opuszczą maszynę
Dział zatytułowany „Krok 3: Skanuj diffy pod kątem sekretów i danych osobowych, zanim opuszczą maszynę”Używaj prawdziwych, utrzymywanych skanerów — a nie ręcznie sklejonej klasy z wyrażeniami regularnymi. gitleaks (binarka Go) i detect-secrets (pip install detect-secrets) wyłapują poświadczenia; trivy wyłapuje podatne zależności i błędną konfigurację. Podepnij je w dwóch miejscach: hook PreToolUse w Claude Code (blokuje commit, który agent ma za chwilę uruchomić) oraz CI (zabezpieczenie końcowe).
Hook to miejsce, w którym te trzy narzędzia się rozchodzą — Claude Code potrafi zablokować wywołanie narzędzia w locie; Cursor i Codex polegają na pre-commit + CI.
Cursor nie ma hooka blokującego commit, więc egzekwuj na warstwie git za pomocą konfiguracji pre-commit, którą dziedziczy każdy klon:
repos: - repo: https://github.com/gitleaks/gitleaks rev: v8.21.2 hooks: - id: gitleaks - repo: https://github.com/Yelp/detect-secrets rev: v1.5.0 hooks: - id: detect-secrets args: ['--baseline', '.secrets.baseline']Uruchom pre-commit install raz na klon (albo wyegzekwuj to przez bootstrap repozytorium). Teraz każdy commit — wspomagany przez AI czy nie — jest skanowany, zanim wyląduje.
Dodaj hook PreToolUse, który skanuje diff w staging, zanim agent będzie mógł uruchomić git commit. W .claude/settings.json:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [{ "type": "command", "command": ".claude/hooks/scan-secrets.sh" }] } ] }}.claude/hooks/scan-secrets.sh czyta wejście narzędzia ze stdin i odrzuca commit, jeśli gitleaks cokolwiek znajdzie:
#!/usr/bin/env bashcmd=$(jq -r '.tool_input.command // ""')case "$cmd" in *"git commit"*) if ! gitleaks git --staged --no-banner; then echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"gitleaks found a secret in the staged diff"}}' exit 0 fi ;;esacexit 0Agent dosłownie nie jest w stanie zacommitować sekretu — hook zwraca permissionDecision: "deny" i Claude Code przerywa wywołanie narzędzia.
Codex respektuje powyższe hooki pre-commit, gdy uruchamia git commit wewnątrz sandboksa, więc zainstaluj je w ten sam sposób. Dla dodatkowej bramki trzymaj Codex na approval_policy = "on-request", aby zatrzymywał się i czekał na zatwierdzenie przez człowieka przed każdym commitem lub pushem, dając Ci szansę rzucić okiem na diff.
Zabezpieczenie w CI jest identyczne niezależnie od tego, które narzędzie napisało kod:
name: Security Scanon: [pull_request]jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 with: { fetch-depth: 0 } - name: Secret scan uses: gitleaks/gitleaks-action@v2 - name: Dependency & misconfig scan uses: aquasecurity/trivy-action@v0.36.0 with: { scan-type: 'fs', severity: 'HIGH,CRITICAL', exit-code: '1' } - name: AI-attribution check run: | count=$(git diff --name-only origin/${{ github.base_ref }}... \ | xargs grep -l "AI-assisted\|AI-generated" 2>/dev/null | wc -l) if [ "$count" -eq 0 ]; then echo "::warning::No AI-assisted attribution found in changed files" fiKrok 4: Zmapuj kontrole zgodności na powierzchnię audytu każdego narzędzia
Dział zatytułowany „Krok 4: Zmapuj kontrole zgodności na powierzchnię audytu każdego narzędzia”Audytorzy nie akceptują „ufamy programistom”. Każde narzędzie udostępnia powierzchnię audytu i dostępu, na którą możesz skierować ocenę SOC2 / GDPR / HIPAA.
-
SOC2 (CC6 dostęp, CC7.1 wykrywanie). Pobieraj logi dostępu i użycia z powierzchni administracyjnej każdego narzędzia: Admin API Cursora i analityka zespołu, Claude Code przez Claude for Enterprise (SSO, RBAC, compliance API) oraz Compliance API Codeksa, które eksportuje treść promptu, odpowiedzi, użytkownika, znacznik czasu, model i zużycie tokenów wprost do Twojego potoku SIEM/eDiscovery. Dla własnych usług wygeneruj middleware do logowania audytu CC7.1 (prompt poniżej).
-
GDPR (minimalizacja danych, prawo do usunięcia). Trzymaj dane osobowe całkowicie poza promptami —
.cursorignore/permissions.deny/ sandbox z Kroku 1 zajmują się tym. W kwestii usuwania, Codex Compliance API oraz eksporty enterprise Cursor/Anthropic pozwalają zlokalizować i rozliczyć każdy rekord powiązany z użytkownikiem. Nigdy nie używaj danych produkcyjnych jako fixtur testowych; zamiast tego generuj dane syntetyczne. -
HIPAA (przetwarzanie PHI). Nigdy nie wysyłaj chronionych informacji zdrowotnych do modelu bez podpisanej umowy BAA obejmującej tę konkretną powierzchnię. Domyślnie używaj syntetycznych pacjentów i redaguj PHI, zanim trafi do promptu.
Generuj syntetyczne dane testowe za pomocą utrzymywanego @faker-js/faker (stary samodzielny pakiet faker jest wycofany, a jego API faker.datatype.* już nie istnieje):
import { faker } from '@faker-js/faker';
export function syntheticPatient() { return { id: faker.string.uuid(), name: faker.person.fullName(), dob: faker.date.past({ years: 80 }), mrn: `TEST-${faker.number.int({ min: 100000, max: 999999 })}`, conditions: ['Synthetic Condition A', 'Synthetic Condition B'], };}Gdy coś przestaje działać
Dział zatytułowany „Gdy coś przestaje działać”- Skaner sekretów blokuje każdy commit (fałszywe alarmy). Fixtury testowe o wysokiej entropii i przykładowe klucze wyzwalają
gitleaks/detect-secrets. Wygeneruj baseline (detect-secrets scan > .secrets.baseline) i zacommituj go albo dodaj precyzyjny.gitleaksignore— nigdy nie wyłączaj skanowania w całości. - Redakcja psuje poprawne prompty. Agresywna redakcja wyrażeniami regularnymi zamienia
user@example.comw przykładzie kodu na[REDACTED]i niszczy kontekst agenta. Redaguj na ścieżce diff/commit, a nie w promptcie, który programista aktualnie pisze; lepiej trzymać dane osobowe na zewnątrz (pliki ignore) niż wymazywać je po fakcie. - Programista omija politykę. Jeśli ktoś używa konta prywatnego lub
--dangerously-skip-permissions, Twoje zacommitowane reguły nic nie robią. Dlatego Krok 1 ma znaczenie: egzekwuj Privacy Mode + Allowed Team IDs (Cursor),disableBypassPermissionsMode+ managed settings (Claude Code) oraz RBAC (Codex) na poziomie organizacji, a nie repozytorium. - PHI przeciekają, bo „ZDR” wzięto za BAA. Zero Data Retention zapobiega treningowi i przechowywaniu; to nie jest Business Associate Agreement. Brak BAA, brak PHI — i kropka.
- Serwer MCP, który dodałeś do listy dozwolonych, ma dostęp do systemu plików. Zbyt szeroki serwer MCP może odczytać dokładnie te pliki, które chroni Twoja lista deny. Używaj
deniedMcpServers/allowedMcpServersw managed settings Claude Code i sprawdzaj zakres każdego serwera przed zatwierdzeniem.
Co dalej
Dział zatytułowany „Co dalej”- Najlepsze praktyki prywatności i bezpieczeństwa — codzienne nawyki stojące za tymi kontrolami.
- Automatyzacja zgodności — automatyzacja zbierania dowodów w CI.
- Operacje bezpieczeństwa — monitorowanie w czasie działania i reagowanie na incydenty.
- Zarządzanie kosztami — budżety, poziomy modeli i kontrola użycia w zespołach.