mcpField
P
performing-soc2-type2-audit-preparation

performing-soc2-type2-audit-preparation

github.com/mukul975セキュリティ35.2k103 回インストール8 週間前に更新
リポジトリ

performing-soc2-type2-audit-preparation について

コンプライアンスチーム向けの SOC 2 Type II 監査準備スキルです。準備状況の評価、証拠収集、統制テスト、監視、監査人向け資料の整理を扱い、AICPA Trust Services Criteria に沿って作業を整理します。

主な機能

  1. 01Trust Services Criteria へのマッピング
  2. 02統制ギャップの評価
  3. 03証拠の自動収集
  4. 04統制有効性の検証
  5. 05継続的なコンプライアンス確認
  6. 06監査証拠パッケージの作成

活用シーン

  1. 01SOC 2 Type II 監査の準備
  2. 02監査期間前のギャップ評価
  3. 03監査期間中の統制運用を追跡
  4. 04監査基準ごとに証拠を整理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill performing-soc2-type2-audit-preparation

インストール後、Claude Code で/performing-soc2-type2-audit-preparationを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

詳細

SOC 2 Type II 監査の準備

使用するタイミング

  • CPA 事務所との SOC 2 Type II 監査業務に備える場合
  • AICPA Trust Services Criteria に照らしてギャップ評価を実施する場合
  • クラウドインフラストラクチャや ID プロバイダー全体の証拠収集を自動化する場合
  • 監査期間(3~12 か月)を通じて統制が有効に運用されていたことを検証する場合
  • 監査の合間も SOC 2 のコンプライアンス状況を維持するため、継続的なコンプライアンス監視を構築する場合
  • 準備状況評価で特定された統制上のギャップを是正する場合

前提条件

  • AICPA Trust Services Criteria(CC1~CC9)に関する知識があること
  • 読み取り専用権限でクラウドプロバイダーの API(AWS、Azure、または GCP)にアクセスできること
  • ID プロバイダー(Okta、Azure AD、Google Workspace)にアクセスできること
  • バージョン管理システム(GitHub、GitLab)にアクセスできること
  • チケット管理システム(Jira、Linear、ServiceNow)にアクセスできること
  • boto3、requests、pyyaml の依存関係を含む Python 3.8 以降があること
  • コンプライアンス証拠を収集するための適切な権限があること

手順

1. Trust Services Criteria を理解する

SOC 2 は、AICPA が定める 5 つの Trust Services カテゴリーに基づいています。Security(Common Criteria CC1~CC9)は必須です。その他のカテゴリーは、ビジネスとの関連性に基づいて選択します。

カテゴリー基準焦点
Security(必須)CC1~CC9統制環境、リスク、アクセス、運用、変更管理
AvailabilityA1システムの稼働時間と災害復旧
Processing IntegrityPI1正確かつ完全なデータ処理
ConfidentialityC1機密情報の保護
PrivacyP1~P8個人情報のライフサイクル
2. Common Criteria の内訳(CC1~CC9)

CC1 - 統制環境: 取締役会による監督、経営体制、誠実性と倫理的価値、人事ポリシー、説明責任。

CC2 - コミュニケーションと情報: セキュリティポリシー、システム境界、役割、責任に関する社内外のコミュニケーション。

CC3 - リスク評価: リスクの特定、不正リスク分析、変更の影響評価、リスク許容度の定義。

CC4 - モニタリング活動: 継続的な統制評価、不備の特定、是正状況の追跡、内部監査。

CC5 - 統制活動: ポリシーと手順の対応付け、テクノロジーによる統制、組織全体への統制の導入。

CC6 - 論理的および物理的アクセス制御: 認証、認可、アクセス権の付与と削除、物理的セキュリティ、暗号化。

CC7 - システム運用: 異常検知、インシデント対応、脆弱性管理、変更検知、イベント監視。

CC8 - 変更管理: 変更の認可、テスト、承認ワークフロー、緊急変更、ロールバック手順。

CC9 - リスク軽減: ベンダーリスク管理、事業継続、保険、残存リスクの受容。

3. ギャップ評価を実施する

監査期間が始まる前に、8~12 週間前を目安に準備状況評価を実施します。

# Define control matrix against CC criteria
gap_assessment = {
    "CC1": {
        "CC1.1": {
            "criteria": "COSO Principle 1: Demonstrates commitment to integrity",
            "control": "Code of conduct signed annually by all employees",
            "evidence": "Signed acknowledgments in HR system",
            "status": "implemented",
            "gap": None,
        },
        "CC1.2": {
            "criteria": "COSO Principle 2: Board exercises oversight",
            "control": "Quarterly board security reviews",
            "evidence": "Board meeting minutes with security agenda items",
            "status": "partial",
            "gap": "No documented security committee charter",
        },
    },
}
4. 証拠収集を自動化する

監査期間を通じて、連携システムから証拠を継続的に収集します。

import boto3

# CC6 Evidence: AWS IAM access controls
iam = boto3.client("iam")

# Collect MFA status for all IAM users
users = iam.list_users()["Users"]
mfa_evidence = []
for user in users:
    mfa_devices = iam.list_mfa_devices(UserName=user["UserName"])
    mfa_evidence.append({
        "user": user["UserName"],
        "mfa_enabled": len(mfa_devices["MFADevices"]) > 0,
        "created": user["CreateDate"].isoformat(),
    })

# CC7 Evidence: AWS CloudTrail logging status
cloudtrail = boto3.client("cloudtrail")
trails = cloudtrail.describe_trails()["trailList"]
logging_evidence = []
for trail in trails:
    status = cloudtrail.get_trail_status(Name=trail["TrailARN"])
    logging_evidence.append({
        "trail": trail["Name"],
        "is_logging": status["IsLogging"],
        "multi_region": trail.get("IsMultiRegionTrail", False),
        "log_validation": trail.get("LogFileValidationEnabled", False),
    })
5. 統制の有効性を検証する

Type II 監査では、監査期間全体を通じて統制が有効に運用されていたことを証明します。

import requests

# CC8 Evidence: Change management - verify all production changes
# had tickets, approvals, and testing before deployment
headers = {"Authorization": f"token {github_token}"}
prs = requests.get(
    "https://api.github.com/repos/org/repo/pulls",
    params={"state": "closed", "base": "main", "per_page": 100},
    headers=headers,
).json()

change_evidence = []
for pr in prs:
    if not pr.get("merged_at"):
        continue
    reviews = requests.get(pr["url"] + "/reviews", headers=headers).json()
    approved = any(r["state"] == "APPROVED" for r in reviews)
    change_evidence.append({
        "pr_number": pr["number"],
        "title": pr["title"],
        "merged_at": pr["merged_at"],
        "approved": approved,
    })

# Flag PRs merged without approval (control exception)
exceptions = [c for c in change_evidence if not c["approved"]]
6. 継続的なコンプライアンス監視

統制の逸脱を検出するため、毎日実行する自動チェックを設定します。

# Daily compliance check - run via cron or Lambda
checks = [
    {"control": "CC6.1", "check": "All IAM users have MFA enabled"},
    {"control": "CC6.6", "check": "No public S3 buckets"},
    {"control": "CC7.1", "check": "CloudTrail logging enabled"},
    {"control": "CC7.2", "check": "GuardDuty findings under threshold"},
    {"control": "CC8.1", "check": "All PRs have required reviews"},
]

for check in checks:
    result = run_compliance_check(check["control"])
    if not result["passing"]:
        send_alert(
            channel="#compliance",
            message=f"Control drift: {check['control']} - {check['check']}",
            details=result["findings"],
        )
7. 監査人向けの証拠パッケージを準備する

基準ごとに、収集した証拠を構造化されたパッケージに整理します。

evidence_package = {
    "audit_period": {"start": "2025-04-01", "end": "2026-03-31"},
    "criteria_packages": {
        "CC1_Control_Environment": {
            "CC1.1": ["signed_acknowledgments.csv"],
            "CC1.2": ["board_minutes_q1.pdf", "board_minutes_q2.pdf"],
        },
        "CC6_Logical_Physical_Access": {
            "CC6.1": ["okta_mfa_policy.json", "iam_users_mfa_status.csv"],
            "CC6.2": ["access_review_q1.csv", "access_review_q2.csv"],
            "CC6.3": ["offboarding_tickets.csv", "terminated_user_audit.csv"],
        },
        "CC7_System_Operations": {
            "CC7.1": ["cloudtrail_config.json", "siem_dashboard.png"],
            "CC7.2": ["guardduty_findings_summary.csv"],
            "CC7.3": ["vulnerability_scan_reports/"],
        },
        "CC8_Change_Management": {
            "CC8.1": ["merged_prs_with_approvals.csv"],
        },
    },
}

例

CC6.2 のアクセスレビューを自動化する
import boto3
from datetime import datetime, timedelta

iam = boto3.client("iam")

# Find users with no activity in 90 days
inactive_threshold = datetime.utcnow() - timedelta(days=90)
report = iam.get_credential_report()["Content"].decode()

inactive_users = []
for line in report.strip().split("\n")[1:]:
    fields = line.split(",")
    username = fields[0]
    last_used = fields[4]
    if last_used not in ("N/A", "no_information"):
        last_date = datetime.strptime(last_used, "%Y-%m-%dT%H:%M:%S+00:00")
        if last_date < inactive_threshold:
            inactive_users.append({"user": username, "last_active": last_used})
CC7.2 の脆弱性管理に関する証拠
import requests

headers = {"Authorization": f"Bearer {scanner_token}"}
scans = requests.get(
    "https://scanner.example.com/api/v1/scans",
    params={"status": "completed", "since": "2025-04-01"},
    headers=headers,
).json()

vuln_evidence = {"scan_count": len(scans), "critical_findings": 0, "high_findings": 0}
for scan in scans:
    findings = requests.get(
        f"https://scanner.example.com/api/v1/scans/{scan['id']}/findings",
        headers=headers,
    ).json()
    vuln_evidence["critical_findings"] += len([f for f in findings if f["severity"] == "critical"])
    vuln_evidence["high_findings"] += len([f for f in findings if f["severity"] == "high"])
CC7.3 のインシデント対応に関する証拠
incidents = requests.get(
    "https://pagerduty.com/api/v1/incidents",
    params={"since": "2025-04-01", "until": "2026-03-31"},
    headers={"Authorization": f"Token token={pd_token}"},
).json()

ir_evidence = {
    "total_incidents": len(incidents["incidents"]),
    "incidents": [
        {
            "id": inc["id"],
            "title": inc["title"],
            "severity": inc["urgency"],
            "created": inc["created_at"],
            "resolved": inc.get("last_status_change_at"),
        }
        for inc in incidents["incidents"]
    ],
}

コメント