
SOC 2 साक्ष्य जो GitLab CI में स्वयं एकत्र होता है: प्रत्येक मर्ज एक हस्ताक्षरित बंडल उत्पन्न करता है, एक OPA गेट अनुपलब्ध प्रमाण वाले रिलीज़ को ब्लॉक करता है, और ऑडिटरों को स्क्रीनशॉट के बजाय एक लिंक मिलता है।
SOC 2 साक्ष्य जो GitLab CI में स्वयं एकत्र होता है: प्रत्येक मर्ज एक हस्ताक्षरित बंडल उत्पन्न करता है, एक Open Policy Agent गेट अनुपस्थित प्रमाण वाले रिलीज़ को अवरुद्ध करता है, और एक ऑडिटर को स्क्रीनशॉट के बजाय एक पैकेट लिंक मिलता है।
लाइव ऑडिटर डैशबोर्ड · GitLab प्रोजेक्ट · डेमो साक्ष्य · रोडमैप
मैंने ShipProof इसलिए बनाया क्योंकि एंटरप्राइज़ बिक्री बार-बार infosec समीक्षा के दौरान रुक जाती है। जब कोई ऑडिटर SOC 2 Type II परिवर्तन-प्रबंधन साक्ष्य मांगता है, तो इंजीनियर अक्सर Jira, Slack और Drive में स्क्रीनशॉट ढूँढने में दो सप्ताह बिता देते हैं।
मैं चाहता था कि प्रमाण सीधे डिप्लॉयमेंट पाइपलाइन में रहे। ShipProof में प्रत्येक मर्ज कमिट स्वचालित रूप से एक विहित, हस्ताक्षरित साक्ष्य बंडल बनाता है जिसमें टेस्ट रन, Semgrep SAST स्कैन, Gitleaks सीक्रेट्स डिटेक्शन, Syft सॉफ़्टवेयर बिल ऑफ़ मटेरियल्स, और CODEOWNERS अनुमोदन शामिल होते हैं।
मेरा मुख्य डिज़ाइन नियम सख्त है: एक LLM प्रमाणों का सारांश बना सकता है या इश्यू विवरण का मसौदा तैयार कर सकता है, लेकिन यह कभी भी किसी रिलीज़ को अनुमोदित नहीं कर सकता। रिलीज़ गेट Rego में लिखा गया एक Open Policy Agent मूल्यांकन है। यदि कोई आर्टिफ़ैक्ट अनुपस्थित है या कोई अनुमोदन रबर स्टैम्प जैसा दिखता है, तो गेट फेल-क्लोज़्ड हो जाता है, रिलीज़ को रोक देता है, और समाधान पथ के साथ एक इश्यू फ़ाइल करता है। जब गेट अनुमति देता है, तो ऑडिटर को एक स्टैटिक साइट या एक प्रमाणित API का एकल लिंक मिलता है।
मैंने ShipProof को GitLab DevOps जीवनचक्र के विरुद्ध मैप किया। यह सभी नौ चरणों को मूल रूप से स्वचालित करता है:
| चरण | पाइपलाइन में मैंने क्या स्वचालित किया |
|---|---|
| plan | क्लोज़्ड-लूप अंतराल कार्य आइटम प्रबंधन। गेट अस्वीकृतियाँ पुनरावृत्ति गणना के साथ संरचित ट्रैकिंग इश्यू स्वतः खोलती हैं; बाद की पासिंग पाइपलाइनें फ़िक्स कमिट संदर्भों के साथ इश्यू को स्वतः हल और बंद करती हैं। |
| create | कोड समीक्षा और स्रोत प्रबंधन। CODEOWNERS नीति फ़ाइलों की सुरक्षा करता है; गेट पाँच मिनट से कम की रबर-स्टैम्प अनुमोदनों को अस्वीकार करता है; स्वचालित MR नोट्स समीक्षा का मार्गदर्शन करते हैं; Duo फ़्लो MR टिप्पणियों का वर्णन करते हैं। |
| verify | pytest, Semgrep SAST, और Gitleaks verify चरण में चलते हैं, आर्टिफ़ैक्ट हैश रिकॉर्ड करते हैं। |
| package | Syft package चरण में CycloneDX SBOMs उत्पन्न करता है और आर्टिफ़ैक्ट को बंडल में हैश करता है। |
| secure | नियतात्मक OPA गेट रिलीज़ से पहले हस्ताक्षर, श्रृंखला हैश, और रबर-स्टैम्प नियमों की जाँच करता है। |
| release | अनुपालन गेट जॉब प्रोडक्शन में डिप्लॉयमेंट को अवरुद्ध करता है; डिप्लॉय जॉब्स को allow निर्णय की आवश्यकता होती है। |
| configure | Cloud Run डिप्लॉयमेंट मैनिफ़ेस्ट सीक्रेट कमिट किए बिना पर्यावरण चर से रेंडर होते हैं। |
| monitor | डिप्लॉयमेंट के बाद की जाँचें सत्यापित करती हैं कि चल रहे कंटेनर इमेज डाइजेस्ट बंडल-अनुमोदित कमिट से मेल खाते हैं। |
| govern | एक अपरिवर्तनीय हैश-श्रृंखलाबद्ध लेजर ऑडिटर पैकेट, अंतराल इश्यू, और GitLab Pages डैशबोर्ड को फ़ीड करता है। |
मैंने ShipProof को Python 3.11 और Node.js 20 के साथ विकसित किया।
python -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt
मेरा टेस्ट सूट और टाइप चेक चलाएँ:
OPA_BIN=/tmp/opa pytest -q && ruff check src tests demo-app scripts && mypy --strict src scripts
किसी भी कमिट के लिए एक स्थानीय बंडल एकत्र करें:
PYTHONPATH=src python -m comply.collect --sha aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --out /tmp/bundle.json
कलेक्टर stdout पर एक एकल JSON पंक्ति आउटपुट करता है और पूर्ण बंडल को policy/inputs.json के साथ डिस्क पर लिखता है। यदि प्रमाण अनुपलब्ध हैं, तो बंडल एक deny स्थिति दर्ज करता है।
PYTHONPATH=src python -m comply.collect --sha <40-hex-sha> --out evidence/bundle.json \
--mr-iid 42 --pipeline-id 1001 --project group/project \
--pipeline-file pipeline.json --approvals-file approvals.json
CI में, scripts/gate_bridge.py pipeline.json तैयार करता है, जबकि scripts/fetch_approvals.py GitLab API से समीक्षा डेटा खींचता है। अनुपस्थित फ़ाइलें पास माने जाने के बजाय अनुपस्थित स्थिति के रूप में दर्ज की जाती हैं। प्रत्येक stderr लॉग में बंडल सहसंबंध ID शामिल होता है, और रहस्य *** के रूप में छिपाए जाते हैं।
PYTHONPATH=src python -m comply.gate --bundle evidence/bundle.json --ledger logs/ledger.jsonl
Exit code 0 एक allow verdict दर्शाता है। Exit code 1 एक denial दर्शाता है जिसमें विफल नियंत्रण का नाम देने वाली एक structured error होती है। Exit code 2 अमान्य arguments दर्शाता है। जब gate CI में ब्लॉक करता है, तो pipeline एक tracking issue खोलने के लिए python -m comply.gap को ट्रिगर करता है।
PYTHONPATH=src python -m comply.packet --ledger logs/ledger.jsonl --release all \
--out packet.json --csv packet.csv --pdf packet.pdf
CSV निर्यात में ग्यारह कॉलम होते हैं: bundle_id,commit_sha,mr_iid,pipeline_id,control,proof_type,status,artifact_sha,approver_ids,policy_sha,created_at। PDF उसी JSON स्रोत से print CSS के माध्यम से रेंडर होता है।
AUDITOR_TOKEN=local-only PYTHONPATH=src uvicorn comply.api:app --port 8000
बियरर प्रमाणीकरण का उपयोग करके बंडल क्वेरी करें:
curl -H "Authorization: Bearer local-only" "localhost:8000/api/v1/bundles?mr_iid=42"
The API बंडल क्वेरीज़, रिलीज़ पैकेट्स और बैकग्राउंड PDF एक्सपोर्ट के लिए एंडपॉइंट्स प्रदान करता है, जो बियरर टोकन और प्रति मिनट 60 अनुरोधों की दर सीमा द्वारा सुरक्षित हैं।
cd auditor && npm install && npm run build
इंटरफ़ेस React 19, TypeScript और Tailwind CSS से बनाया गया है। यह hash routing का उपयोग करते हुए एक स्थिर साइट के रूप में निर्यात होता है, जिससे यह सर्वर रीराइट्स के बिना सीधे GitLab Pages पर चल सकता है। जब कोई बैकएंड API मौजूद नहीं होता है, तो यह public/fallback/demo-packets.json से नमूना डेटा का उपयोग करता है।
flowchart LR
A["CI jobs (pytest, Semgrep, Gitleaks, Syft)"] --> B["gate_bridge.py (artifact summary)"]
B --> C["comply.collect (bundle.json + inputs.json)"]
C --> D["comply.sign (Cosign, HMAC fallback)"]
D --> E["ledger.jsonl (hash chain)"]
E --> F["comply.gate (OPA policy + signature + chain)"]
F -->|"deny"| G["comply.gap (gap issue + MR comment)"]
F -->|"allow"| H["deploy jobs (gated)"]
E --> I["comply.packet (JSON, CSV, PDF)"]
I --> J["GitLab Pages dashboard + read API"]