Czytaj diff, nie podsumowanie
Zanim zatwierdzisz edycję pliku, przeczytaj faktyczny diff, a nie jednolinijkowy opis agenta. Podsumowanie to, co agent zamierzał; diff to, co zapisze.
Prywatność danych w pracy wspomaganej przez AI opiera się na czterostopniowej klasyfikacji — publiczne, wewnętrzne, poufne, zastrzeżone — która mówi, co może trafić do dostawcy modelu, egzekwowanej przez ustawienie retencji każdego narzędzia, skanowanie sekretów przed wysyłką, dane syntetyczne zamiast kopii produkcji, poświadczenia MCP o najmniejszych uprawnieniach i izolację środowisk trzymającą agenty z dala od produkcji.
Deweloper z twojego zespołu wkleja wynik zapytania do bazy w narzędzie AI, żeby zdebugować problem z wydajnością. Wynik zawiera adresy e-mail klientów, adresy rozliczeniowe i fragmenty numerów kart, a logi dostawcy trzymają teraz dane osobowe z twojej produkcyjnej bazy. Trzy linijki dalej, w innej sesji, ktoś wkleił pełny DATABASE_URL — host, użytkownika i hasło — żeby zapytać, czemu produkcja się zapycha. Trzecia osoba właśnie kieruje społecznościowy serwer MCP na produkcję z poświadczeniami administratora.
Każdy z tych ruchów wydaje się w danej chwili niegroźny i każdy z nich to scenariusz, który zabija firmowe wdrożenie AI, zanim się zacznie. Asystenci AI są bezpieczni na firmowym kodzie pod warunkiem, że skonfigurujesz je świadomie: sklasyfikuj, co może wyjść, włącz właściwe ustawienie retencji, nigdy nie pozwól, by sekret dotarł do modelu, i daj każdemu serwerowi MCP najmniejsze uprawnienia, jakich potrzebuje.
GRANTNie wszystkie dane niosą to samo ryzyko przy wysyłce do narzędzi AI. Sklasyfikuj je raz, a każda późniejsza decyzja — które pliki ignorować, które prompty blokować, do której bazy agent może sięgać — wynika ze stopnia.
| Stopień | Opis | Polityka dla narzędzi AI | Przykłady |
|---|---|---|---|
| Publiczne | Kod open source, publiczna dokumentacja | Bez ograniczeń | Biblioteki OSS, publiczne API, dokumentacja |
| Wewnętrzne | Kod firmowy, dokumenty wewnętrzne | Dozwolone z trybem prywatności | Logika biznesowa, narzędzia wewnętrzne, dokumenty architektury |
| Poufne | Tajemnice handlowe, niewydane funkcje | Dozwolone przy ścisłych kontrolach | Algorytmy, funkcje konkurencyjne, logika cenowa |
| Zastrzeżone | Dane osobowe, poświadczenia, dane finansowe | Nigdy nie wysyłaj do narzędzi AI | Dane klientów, klucze API, dane płatnicze, dane zdrowotne |
Stopień „wewnętrzne” wykonuje w tej tabeli cichą pracę: jest dozwolony z trybem prywatności, co znaczy, że cały system stopni trzyma się tylko wtedy, gdy wiesz, co tryb prywatności twojego narzędzia faktycznie gwarantuje.
„Tryb prywatności” nie jest uniwersalny — każdy dostawca ma własną kontrolę i własną gwarancję. Dowiedz się, która dotyczy ciebie, zanim wkleisz choć jedną firmową linijkę.
Cursor ma jawny przełącznik Privacy Mode (Cursor Settings). Przy włączonym twój kod nie jest przechowywany przez Cursora ani używany do treningu — to gwarancja zerowej retencji danych (ZDR). Privacy Mode jest domyślnie włączony dla zespołów Enterprise, a administratorzy mogą wymusić go w całym zespole, tak by nikt nie mógł go wyłączyć. Indeksowanie wciąż liczy embeddingi, ale przy Privacy Mode czysty tekst kodu nie jest przechowywany po stronie serwera po zakończeniu żądania.
Przy użyciu komercyjnym — Team, Enterprise i API — Anthropic domyślnie nie trenuje modeli na twoim kodzie ani promptach. Konta Free, Pro i Max mogą być użyte do treningu tylko przy świadomej zgodzie i są planami konsumenckimi rządzonymi warunkami konsumenckimi, a nie właściwą warstwą do firmowego obchodzenia się z danymi. Domyślna retencja to 30 dni; zerowa retencja danych jest dostępna przy odpowiednio skonfigurowanych kluczach API, co znaczy, że transkrypty nie są przechowywane po stronie serwera. Jeśli pracujesz na planie prywatnym, sprawdź ustawienie użycia danych i przejdź na warunki komercyjne dla firmowego kodu.
Codex dziedziczy gwarancje ChatGPT Enterprise: brak treningu na danych firmowych i zerowa retencja danych dla CLI i IDE, z rezydencją i retencją zgodnymi z twoimi politykami ChatGPT Enterprise. Na prywatnych planach ChatGPT przejrzyj swoje kontrole danych (historia rozmów i ustawienia „improve the model”), zanim użyjesz Codeksa na prywatnym repozytorium.
Klasyfikacja, której nikt nie widzi, to klasyfikacja, której nikt nie stosuje. Każde narzędzie ma plik ładowany, zanim agent cokolwiek zrobi, i mechanizm, który egzekwuje twarde krawędzie, zamiast je sugerować.
Użyj .cursor/rules, by zapisać politykę obchodzenia się z danymi:
DATA HANDLING POLICY:Privacy Mode MUST be enabled at all times (Settings → Privacy).
NEVER include in prompts or context:- Contents of .env, .env.*, or any secrets files- Customer data, even for debugging (use anonymized samples)- Production database query results- API keys, tokens, certificates, or private keys- Internal URLs that contain authentication tokens
ALWAYS use instead:- .env.example with placeholder values- Faker.js-generated test data that matches production schemas- Redacted log entries: replace emails with user_XXX@example.com- Mock credentials: sk_test_XXXXXXXXXXXXReguły to wskazówki. Egzekwowaniem jest .cursorignore, który w ogóle trzyma pliki poza indeksem:
.env***/secrets/****/credentials/****/*.pem**/*.keyconfig/production.*database/seeds/production/**Claude Code respektuje .gitignore i pozwala wykluczyć wrażliwe pliki regułami deny Read(...) w .claude/settings.json. Reguły deny są ewaluowane jako pierwsze, a plik nigdy nie trafia do kontekstu:
{ "permissions": { "deny": [ "Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)", "Read(./credentials/**)", "Read(./**/*.pem)", "Read(./**/*.key)", "Read(./config/production.*)" ] }}Reguły deny pokrywają pliki. Dla wszystkiego, co deweloper wpisuje, dodaj hook UserPromptSubmit, który skanuje każdy prompt przed wysłaniem:
{ "hooks": { "UserPromptSubmit": [{ "matcher": "*", "hooks": [{ "type": "command", "command": "node scripts/privacy-check.js" }] }] }}Skrypt hooka czyta JSON zdarzenia ze stdin i szuka wzorców takich jak adresy e-mail, numery kart i formaty kluczy API, blokując prompt (kod wyjścia 2), zanim żądanie opuści maszynę dewelopera. Kolejna sekcja zawiera prompt, który pisze ten skrypt.
Zadania chmurowe Codeksa działają w piaskownicach. Zakoduj kontrole prywatności w AGENTS.md, pliku, który Codex czyta przed każdym zadaniem:
PRIVACY CONTROLS:- Do not read .env or any secrets files- When debugging with sample data, generate synthetic data using Faker- All database connection strings must use environment variable references- Never output actual credentials, tokens, or PII in generated code or comments- If production data is needed for context, describe the schema shape insteadPiaskownica sieciowa Codeksa domyślnie uniemożliwia połączenia z produkcyjną bazą ze środowisk zadań chmurowych, co czyni piaskownicę warstwą egzekwującą, a AGENTS.md warstwą wskazówek.
Reguła nie zmienia się względem zwykłej higieny bezpieczeństwa, ale powierzchnia jest szersza: klucze API, tokeny, hasła i łańcuchy połączenia do bazy nigdy nie mogą pojawić się w prompcie. Odwołuj się do process.env.DATABASE_URL, a nie do dosłownej wartości. Najpewniejszym egzekwowaniem jest automatyzacja, a nie silna wola — wepnij gitleaks w hook pre-commit, żeby wyciekłe poświadczenie zostało złapane, zanim w ogóle zostanie zacommitowane albo wklejone.
Dwa prompty pokrywają dwa momenty. Pierwszy to sprawdzenie diffu, które człowiek uruchamia przed commitem; drugi buduje skaner wywoływany przez twój hook UserPromptSubmit przy każdej interakcji, dlatego musi być szybki i oparty na wzorcach, a nie na wywołaniu modelu.
Gdy deweloperzy potrzebują danych produkcyjnych do debugowania, odpowiedzią nie jest zredagowany eksport, tylko dane syntetyczne pasujące do schematu i do przypadków brzegowych. Naucz agenta generować je z kształtu tabeli, a nie z jej zawartości.
Anonimizacja trzyma się tylko wtedy, gdy dane produkcyjne w ogóle nie leżą w środowisku, do którego agent może sięgnąć.
Środowiska deweloperskie nigdy nie zawierają danych produkcyjnych
Używaj generowania danych syntetycznych albo zanonimizowanych migawek produkcji. Nigdy nie kopiuj produkcyjnych baz do środowiska deweloperskiego.
Narzędzia AI łączą się tylko z dev i staging
Bazodanowe serwery MCP, jeśli ich używasz, łączą się wyłącznie z bazami deweloperskimi. Dostęp do produkcyjnej bazy wymaga osobnego narzędzia z pełną ścieżką audytową.
Pipeline’y CI/CD używają kont serwisowych
Przepływy CI wspomagane przez AI (bezgłowy Claude Code, automatyzacja Codeksa) używają kont serwisowych o minimalnych uprawnieniach, a nie poświadczeń dewelopera.
Regularne przeglądy dostępu
Comiesięczny przegląd tego, do jakich danych narzędzia AI mają dostęp. Usuwaj zbędny dostęp proaktywnie.
Model Context Protocol pozwala twojemu agentowi łączyć się z zewnętrznymi narzędziami — bazą danych, GitHubem, przeglądarką. Każdy serwer MCP to wykonywalne oprogramowanie z takimi uprawnieniami, jakie mu dasz, więc nadmiernie uprzywilejowany albo niezweryfikowany serwer jest realną powierzchnią ataku. Dwie zasady pokrywają większość ryzyka.
Po pierwsze, zweryfikuj serwer, zanim go zainstalujesz. Wybieraj oficjalne, przestrzenione pakiety (na przykład @modelcontextprotocol/server-github, @modelcontextprotocol/server-postgres) zamiast nieznanego forka społecznościowego. Niech agent streści, co serwer faktycznie robi, zanim go podłączysz:
Po drugie, podłącz go z poświadczeniami o najmniejszych uprawnieniach. Serwerowi MCP dla Postgresa nigdy nie dawaj roli aplikacyjnej ani administracyjnej. Utwórz rolę tylko do odczytu, zawężoną dokładnie do tego, czego agent potrzebuje:
CREATE ROLE ai_readonly LOGIN PASSWORD 'rotate-me';GRANT CONNECT ON DATABASE app TO ai_readonly;GRANT USAGE ON SCHEMA public TO ai_readonly;GRANT SELECT ON ALL TABLES IN SCHEMA public TO ai_readonly;-- new tables inherit read-only access automaticallyALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO ai_readonly;Następnie skieruj łańcuch połączenia serwera MCP na ai_readonly — konfiguracja jest identyczna w Cursorze, Claude Code i Codeksie, bo wszystkie trzy czytają ten sam blok mcpServers. Teraz zahalucynowane DROP TABLE odrzuca baza danych, a nie nadzieja. Zobacz Database MCP po pełną konfigurację i Bezpieczeństwo MCP po model zagrożeń.
Traktuj każdy blok napisany przez agenta jak pull request od zupełnie nowego współpracownika: może być funkcjonalnie poprawny i wciąż dostarczyć błąd wstrzyknięcia albo brakujące sprawdzenie autoryzacji. Nie przeglądaj diffu pobieżnie — zrób drugie przejście z modelem w kapeluszu bezpieczeństwa, a potem zweryfikuj ustalenia samodzielnie.
Czytaj diff, nie podsumowanie
Zanim zatwierdzisz edycję pliku, przeczytaj faktyczny diff, a nie jednolinijkowy opis agenta. Podsumowanie to, co agent zamierzał; diff to, co zapisze.
Bramkuj destrukcyjne komendy
Nigdy nie zatwierdzaj automatycznie komend terminala, które kasują, wdrażają albo modyfikują dane. Uruchamiaj agenty w trybie ograniczonym (zatwierdzanie per akcja w Cursorze, prompty uprawnień w Claude Code albo Codex z jawną piaskownicą i approval_policy=on-request). W Codeksie piaskownica egzekwuje granice dostępu, a polityka zatwierdzeń osobno steruje pytaniami o eskalację.
To dyscyplina człowieka w pętli, która oddziela pracę produkcyjną od demonstracji — pełny przepływ przeglądu opisuje Człowiek w pętli.
Jeśli twoja organizacja przetwarza dane mieszkańców UE, użycie narzędzi AI musi być zgodne z GDPR:
Kontrole prywatności działają tylko wtedy, gdy deweloperzy je rozumieją i stosują. Krótka, zapadająca w pamięć ściągawka bije dokument polityki, którego nikt nie otwiera.
Potem utrzymuj ją w zgodzie z rzeczywistością kwartalnym przeglądem, który weryfikuje cztery rzeczy: konfigurację narzędzi (tryby prywatności włączone, pliki ignore aktualne), wzorce użycia (prompty zawierające podejrzane wzorce, jak adresy e-mail czy formaty kluczy), zgodność dostawcy (aktualne DPA, niezmienione polityki retencji) i świeżość szkoleń (nowi deweloperzy wdrożeni w politykę w pierwszym tygodniu).
args MCP — ładuj je ze środowiska.UPDATE, bo rola dana serwerowi MCP mogła pisać. Naprawą jest powyższy GRANT tylko do odczytu; osobną rolę zapisu twórz świadomie i tylko wtedy, gdy faktycznie potrzebujesz modyfikacji..env albo klucz został osadzony, bo nie był ignorowany. Dodaj go do .cursorignore i .gitignore, a potem zrotuj każde zaindeksowane poświadczenie — osadzony sekret to sekret wyciekły.