Back to skills
SKILL.md
Soc2 Compliance
ASecurityExpert in SOC 2 compliance implementation and audit preparation. Use when performing security analysis, auditing, or hardening with soc2 compliance.
- 8 stars
- 0 votes
- 0 copies
- 1 view
- Added September 8, 2026
Works with
Security analysis
100/100npx -y skills add anubhavg-icpl/vibe --skill soc2-compliance --agent claude-codeAre you the author of Soc2 Compliance?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-soc2-compliance)---
name: soc2-compliance
description: Expert in SOC 2 compliance implementation and audit preparation. Use when performing security analysis, auditing, or hardening with soc2 compliance.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: security
tags: [soc2, compliance, security, audit, trust-services-criteria]
---
# SOC 2 Compliance Expert Mode
You are an expert in SOC 2 compliance, covering Trust Services Criteria implementation, evidence collection, and audit preparation.
## Core Expertise
### Trust Services Criteria
- **Security**: Protection against unauthorized access
- **Availability**: System availability commitments
- **Processing Integrity**: Accurate, complete processing
- **Confidentiality**: Protection of confidential information
- **Privacy**: Personal information handling
### SOC 2 Types
- **Type I**: Point-in-time design assessment
- **Type II**: Operating effectiveness over time (3-12 months)
## Implementation Framework
```python
# SOC 2 Control Framework Implementation
from dataclasses import dataclass, field
from typing import List, Optional, Dict
from enum import Enum
from datetime import datetime, timedelta
import json
class TrustServiceCategory(Enum):
SECURITY = "Security"
AVAILABILITY = "Availability"
PROCESSING_INTEGRITY = "Processing Integrity"
CONFIDENTIALITY = "Confidentiality"
PRIVACY = "Privacy"
class ControlStatus(Enum):
NOT_STARTED = "Not Started"
IN_PROGRESS = "In Progress"
IMPLEMENTED = "Implemented"
TESTED = "Tested"
EVIDENCE_COLLECTED = "Evidence Collected"
@dataclass
class Control:
"""SOC 2 Control definition."""
control_id: str
category: TrustServiceCategory
criteria: str
description: str
owner: str
status: ControlStatus = ControlStatus.NOT_STARTED
implementation_notes: str = ""
evidence_requirements: List[str] = field(default_factory=list)
evidence_collected: List[str] = field(default_factory=list)
last_tested: Optional[datetime] = None
next_review: Optional[datetime] = None
class SOC2ComplianceFramework:
"""SOC 2 compliance management framework."""
def __init__(self):
self.controls: Dict[str, Control] = {}
self._initialize_controls()
def _initialize_controls(self):
"""Initialize common SOC 2 controls."""
security_controls = [
Control(
control_id="CC1.1",
category=TrustServiceCategory.SECURITY,
criteria="The entity demonstrates a commitment to integrity and ethical values",
description="Code of conduct, ethics training, background checks",
owner="HR",
evidence_requirements=[
"Code of conduct document",
"Ethics training completion records",
"Background check policy and sample reports",
]
),
Control(
control_id="CC2.1",
category=TrustServiceCategory.SECURITY,
criteria="Information security policies are established",
description="Security policies covering access, data protection, incident response",
owner="Security Team",
evidence_requirements=[
"Information security policy document",
"Policy acknowledgment records",
"Annual policy review evidence",
]
),
Control(
control_id="CC6.1",
category=TrustServiceCategory.SECURITY,
criteria="Logical access security software and infrastructure",
description="Authentication, authorization, access controls",
owner="Engineering",
evidence_requirements=[
"SSO/MFA configuration screenshots",
"Access control matrix",
"User provisioning/deprovisioning procedures",
"Quarterly access reviews",
]
),
Control(
control_id="CC6.2",
category=TrustServiceCategory.SECURITY,
criteria="New internal and external users are registered and authorized",
description="User onboarding and access provisioning",
owner="IT",
evidence_requirements=[
"User provisioning workflow documentation",
"Sample onboarding tickets",
"Access request approval evidence",
]
),
Control(
control_id="CC6.3",
category=TrustServiceCategory.SECURITY,
criteria="Users are removed when access is no longer required",
description="Offboarding and access revocation",
owner="IT/HR",
evidence_requirements=[
"Offboarding checklist",
"Sample termination access revocation evidence",
"Automated deprovisioning configuration",
]
),
Control(
control_id="CC7.1",
category=TrustServiceCategory.SECURITY,
criteria="Security events are detected and responded to",
description="Security monitoring, alerting, incident response",
owner="Security Team",
evidence_requirements=[
"SIEM configuration",
"Alert rules documentation",
"Incident response plan",
"Sample incident tickets",
]
),
Control(
control_id="CC7.2",
category=TrustServiceCategory.SECURITY,
criteria="Incidents are identified and responded to",
description="Incident detection and response procedures",
owner="Security Team",
evidence_requirements=[
"Incident response procedures",
"Incident log/tickets",
"Post-incident reviews",
]
),
Control(
control_id="CC8.1",
category=TrustServiceCategory.SECURITY,
criteria="Change management processes are in place",
description="Change control for infrastructure and applications",
owner="Engineering",
evidence_requirements=[
"Change management policy",
"Sample change tickets with approvals",
"CI/CD pipeline configuration",
"Code review requirements",
]
),
]
availability_controls = [
Control(
control_id="A1.1",
category=TrustServiceCategory.AVAILABILITY,
criteria="Current processing capacity and usage are monitored",
description="Infrastructure monitoring and capacity management",
owner="SRE",
evidence_requirements=[
"Monitoring dashboards",
"Alerting configuration",
"Capacity planning documentation",
]
),
Control(
control_id="A1.2",
category=TrustServiceCategory.AVAILABILITY,
criteria="Business continuity and disaster recovery plans exist",
description="BC/DR planning and testing",
owner="Operations",
evidence_requirements=[
"Business continuity plan",
"Disaster recovery plan",
"DR test results",
"Backup verification logs",
]
),
]
confidentiality_controls = [
Control(
control_id="C1.1",
category=TrustServiceCategory.CONFIDENTIALITY,
criteria="Confidential information is identified and protected",
description="Data classification and protection",
owner="Security Team",
evidence_requirements=[
"Data classification policy",
"Encryption configuration",
"Access control lists for sensitive data",
]
),
]
for control in security_controls + availability_controls + confidentiality_controls:
self.controls[control.control_id] = control
def update_control_status(
self,
control_id: str,
status: ControlStatus,
notes: Optional[str] = None
):
"""Update control implementation status."""
if control_id not in self.controls:
raise ValueError(f"Control {control_id} not found")
control = self.controls[control_id]
control.status = status
if notes:
control.implementation_notes = notes
if status == ControlStatus.TESTED:
control.last_tested = datetime.now()
control.next_review = datetime.now() + timedelta(days=90)
def add_evidence(self, control_id: str, evidence: str):
"""Add evidence to a control."""
if control_id not in self.controls:
raise ValueError(f"Control {control_id} not found")
self.controls[control_id].evidence_collected.append(evidence)
def get_compliance_status(self) -> Dict:
"""Get overall compliance status."""
by_category = {}
for control in self.controls.values():
cat = control.category.value
if cat not in by_category:
by_category[cat] = {"total": 0, "implemented": 0, "tested": 0}
by_category[cat]["total"] += 1
if control.status in [ControlStatus.IMPLEMENTED, ControlStatus.TESTED, ControlStatus.EVIDENCE_COLLECTED]:
by_category[cat]["implemented"] += 1
if control.status in [ControlStatus.TESTED, ControlStatus.EVIDENCE_COLLECTED]:
by_category[cat]["tested"] += 1
overall_total = sum(c["total"] for c in by_category.values())
overall_implemented = sum(c["implemented"] for c in by_category.values())
return {
"overall_percentage": round(overall_implemented / overall_total * 100, 1) if overall_total > 0 else 0,
"by_category": by_category,
"controls_needing_attention": [
c.control_id for c in self.controls.values()
if c.status in [ControlStatus.NOT_STARTED, ControlStatus.IN_PROGRESS]
],
}
def generate_audit_package(self) -> Dict:
"""Generate audit evidence package."""
return {
"generated_at": datetime.now().isoformat(),
"controls": [
{
"control_id": c.control_id,
"category": c.category.value,
"criteria": c.criteria,
"description": c.description,
"status": c.status.value,
"owner": c.owner,
"evidence_requirements": c.evidence_requirements,
"evidence_collected": c.evidence_collected,
"last_tested": c.last_tested.isoformat() if c.last_tested else None,
"implementation_notes": c.implementation_notes,
}
for c in sorted(self.controls.values(), key=lambda x: x.control_id)
],
"summary": self.get_compliance_status(),
}
```
```yaml
# Infrastructure as Code for SOC 2 Controls
# AWS Security Controls via Terraform
# Encryption at rest
resource "aws_kms_key" "main" {
description = "Main encryption key for SOC 2 compliance"
deletion_window_in_days = 30
enable_key_rotation = true
tags = {
SOC2Control = "C1.1"
Purpose = "Data encryption at rest"
}
}
# CloudTrail for audit logging (CC7.1)
resource "aws_cloudtrail" "main" {
name = "main-audit-trail"
s3_bucket_name = aws_s3_bucket.cloudtrail.id
include_global_service_events = true
is_multi_region_trail = true
enable_log_file_validation = true
kms_key_id = aws_kms_key.cloudtrail.arn
event_selector {
read_write_type = "All"
include_management_events = true
data_resource {
type = "AWS::S3::Object"
values = ["arn:aws:s3:::"]
}
}
tags = {
SOC2Control = "CC7.1"
Purpose = "Audit logging"
}
}
# Config Rules for continuous compliance (CC2.1)
resource "aws_config_config_rule" "encrypted_volumes" {
name = "encrypted-volumes"
source {
owner = "AWS"
source_identifier = "ENCRYPTED_VOLUMES"
}
tags = {
SOC2Control = "C1.1"
}
}
resource "aws_config_config_rule" "mfa_enabled" {
name = "iam-user-mfa-enabled"
source {
owner = "AWS"
source_identifier = "IAM_USER_MFA_ENABLED"
}
tags = {
SOC2Control = "CC6.1"
}
}
# GuardDuty for threat detection (CC7.1)
resource "aws_guardduty_detector" "main" {
enable = true
datasources {
s3_logs {
enable = true
}
kubernetes {
audit_logs {
enable = true
}
}
}
tags = {
SOC2Control = "CC7.1"
}
}
# Security Hub for centralized findings
resource "aws_securityhub_account" "main" {}
resource "aws_securityhub_standards_subscription" "cis" {
standards_arn = "arn:aws:securityhub:::ruleset/cis-aws-foundations-benchmark/v/1.2.0"
}
```
```python
# Automated Evidence Collection
import boto3
from datetime import datetime, timedelta
import json
from typing import List, Dict
class EvidenceCollector:
"""Automated SOC 2 evidence collection."""
def __init__(self, region: str = "us-east-1"):
self.session = boto3.Session(region_name=region)
self.evidence = []
def collect_access_reviews(self) -> Dict:
"""Collect IAM access review evidence (CC6.1, CC6.3)."""
iam = self.session.client("iam")
# Get all users
users = iam.list_users()["Users"]
evidence = {
"control": "CC6.1",
"collected_at": datetime.now().isoformat(),
"users": [],
}
for user in users:
user_data = {
"username": user["UserName"],
"created": user["CreateDate"].isoformat(),
"last_used": None,
"mfa_enabled": False,
"access_keys": [],
}
# Check MFA
try:
mfa_devices = iam.list_mfa_devices(UserName=user["UserName"])
user_data["mfa_enabled"] = len(mfa_devices["MFADevices"]) > 0
except:
pass
# Check access keys
access_keys = iam.list_access_keys(UserName=user["UserName"])
for key in access_keys["AccessKeyMetadata"]:
last_used = iam.get_access_key_last_used(AccessKeyId=key["AccessKeyId"])
user_data["access_keys"].append({
"key_id": key["AccessKeyId"][-4:], # Last 4 chars only
"status": key["Status"],
"last_used": last_used.get("AccessKeyLastUsed", {}).get("LastUsedDate", "Never"),
})
evidence["users"].append(user_data)
self.evidence.append(evidence)
return evidence
def collect_encryption_status(self) -> Dict:
"""Collect encryption evidence (C1.1)."""
evidence = {
"control": "C1.1",
"collected_at": datetime.now().isoformat(),
"s3_buckets": [],
"rds_instances": [],
"ebs_volumes": [],
}
# S3 bucket encryption
s3 = self.session.client("s3")
buckets = s3.list_buckets()["Buckets"]
for bucket in buckets:
try:
encryption = s3.get_bucket_encryption(Bucket=bucket["Name"])
evidence["s3_buckets"].append({
"bucket": bucket["Name"],
"encrypted": True,
"algorithm": encryption["ServerSideEncryptionConfiguration"]["Rules"][0]["ApplyServerSideEncryptionByDefault"]["SSEAlgorithm"],
})
except s3.exceptions.ClientError:
evidence["s3_buckets"].append({
"bucket": bucket["Name"],
"encrypted": False,
})
# RDS encryption
rds = self.session.client("rds")
instances = rds.describe_db_instances()["DBInstances"]
for instance in instances:
evidence["rds_instances"].append({
"identifier": instance["DBInstanceIdentifier"],
"encrypted": instance["StorageEncrypted"],
"kms_key": instance.get("KmsKeyId"),
})
self.evidence.append(evidence)
return evidence
def collect_audit_logs(self, days: int = 30) -> Dict:
"""Collect CloudTrail audit log evidence (CC7.1)."""
cloudtrail = self.session.client("cloudtrail")
trails = cloudtrail.describe_trails()["trailList"]
evidence = {
"control": "CC7.1",
"collected_at": datetime.now().isoformat(),
"trails": [],
}
for trail in trails:
status = cloudtrail.get_trail_status(Name=trail["Name"])
evidence["trails"].append({
"name": trail["Name"],
"is_logging": status["IsLogging"],
"multi_region": trail["IsMultiRegionTrail"],
"log_validation": trail["LogFileValidationEnabled"],
"last_delivery": status.get("LatestDeliveryTime", "Unknown"),
})
self.evidence.append(evidence)
return evidence
def generate_report(self, output_path: str):
"""Generate evidence collection report."""
report = {
"generated_at": datetime.now().isoformat(),
"evidence_items": self.evidence,
"summary": {
"total_items": len(self.evidence),
"controls_covered": list(set(e["control"] for e in self.evidence)),
},
}
with open(output_path, "w") as f:
json.dump(report, f, indent=2, default=str)
return report
```
## Best Practices
### Implementation
- Start with security controls (most comprehensive)
- Map existing controls to SOC 2 criteria
- Automate evidence collection where possible
- Document all processes and exceptions
### Audit Preparation
- Conduct internal audits quarterly
- Maintain continuous evidence collection
- Address gaps before audit period
- Prepare control owners for interviews
### Continuous Compliance
- Implement automated monitoring
- Regular access reviews (quarterly)
- Annual policy reviews
- Continuous control testing
### Documentation
- Keep policies current and approved
- Maintain evidence in organized repository
- Document exceptions and compensating controls
- Track remediation of findings
You implement and maintain SOC 2 compliance programs with comprehensive controls and evidence collection.
Attribution
Comments
Loading comments…