mcpField
C
control-objective-management

control-objective-management

github.com/happy-technologies-llcセキュリティ4141 回インストール2 日前に更新
リポジトリ

control-objective-management について

ServiceNow GRCでコンプライアンス管理目標を扱うスキルです。作成、規制へのマッピング、有効性評価、ギャップ是正を行い、SOX、GDPR、HIPAAなどのフレームワークを扱うコンプライアンス・監査チームを対象とします。

主な機能

  1. 01管理目標の作成と更新
  2. 02管理目標と規制引用のマッピング
  3. 03テストと証拠による統制評価
  4. 04統制カバレッジのギャップ特定
  5. 05有効性レポートと是正タスクの生成

活用シーン

  1. 01コンプライアンス統制フレームワークの構築・改訂
  2. 02統制有効性テストの実施
  3. 03変化する規制への統制のマッピング
  4. 04規制監査への準備

MCP 対応

ServiceNow MCPツールで管理目標、統制、規制引用、コンプライアンスタスクを照会・作成・更新し、ギャップ分析を行う方法を説明します。

インストール

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

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill control-objective-management

インストール後、Claude Code で/control-objective-managementを入力して読み込まれたか確認します。

詳細

統制目標の管理

概要

このスキルでは、ServiceNow GRC におけるコンプライアンス統制目標を包括的に管理できます。対象となる内容は次のとおりです。

  • 規制の背景情報を含む統制目標の作成と更新
  • テストと証拠のレビューによる統制の有効性評価
  • 統制目標と SOX、GDPR、HIPAA、その他の規制要件とのマッピング
  • 目標に適切な統制やテストが不足している箇所の特定
  • プロファイル、ポリシー、引用にまたがる統制範囲の分析
  • 監査とコンプライアンスレビュー用の統制有効性レポートの生成

使用するタイミング:

  • 規制コンプライアンスのために統制フレームワークを構築または更新するとき
  • 統制の有効性評価やテストサイクルの実施中
  • 新規または変更された規制要件に統制をマッピングするとき
  • ビジネスプロセス全体で統制範囲のギャップを特定するとき
  • SOX、GDPR、HIPAA、その他の規制監査に備えるとき
  • 年次の統制の合理化と最適化の実施中

前提条件

  • ロール: sn_compliance.manager、sn_grc.manager、または admin
  • プラグイン: com.sn_compliance、com.sn_grc
  • アクセス権: sn_compliance_control_objective、sn_compliance_control、sn_compliance_policy、sn_compliance_citation テーブルへの読み取り/書き込みアクセス
  • 知識: コンプライアンスフレームワーク(SOX、GDPR、HIPAA)と統制設計の原則に関する理解

主なコンプライアンステーブル

テーブル用途主なフィールド
sn_compliance_control_objective統制目標number, short_description, description, state, owner, policy, framework, effectiveness
sn_compliance_control目標を実装する統制number, short_description, state, control_objective, owner, effectiveness, test_result, test_date, profile
sn_compliance_policyコンプライアンスポリシーnumber, short_description, state, owner, policy_statement, effective_date
sn_compliance_citation規制上の引用number, short_description, reference, regulation, authority, citation_text
sn_compliance_taskコンプライアンスタスクnumber, short_description, state, assigned_to, due_date, control
sn_grc_profileGRC エンティティプロファイルnumber, short_description, profile_type, applies_to

手順

ステップ 1:既存の統制目標を取得する

現在の統制目標を照会して、ベースラインのフレームワークを把握します。

MCP を使用する場合(Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control_objective
  query: active=true^ORDERBYnumber
  fields: sys_id,number,short_description,description,state,owner,policy,framework,effectiveness,sys_created_on,sys_updated_on
  limit: 100

REST API を使用する場合:

GET /api/now/table/sn_compliance_control_objective?sysparm_query=active=true^ORDERBYnumber&sysparm_fields=sys_id,number,short_description,description,state,owner,policy,framework,effectiveness&sysparm_limit=100
ステップ 2:新しい統制目標を作成する

MCP を使用する場合:

Tool: SN-Create-Record
Parameters:
  table_name: sn_compliance_control_objective
  fields:
    short_description: "Ensure access to personal data is restricted to authorized personnel"
    description: "Control objective to verify that access controls are in place to restrict personal data access per GDPR Article 25 and Article 32 requirements. Includes role-based access, least privilege enforcement, and periodic access reviews."
    owner: [owner_sys_id]
    policy: [policy_sys_id]
    state: draft
    framework: GDPR

REST API を使用する場合:

POST /api/now/table/sn_compliance_control_objective
Content-Type: application/json

{
  "short_description": "Ensure access to personal data is restricted to authorized personnel",
  "description": "Control objective to verify access controls per GDPR Article 25 and 32.",
  "owner": "[owner_sys_id]",
  "policy": "[policy_sys_id]",
  "state": "draft",
  "framework": "GDPR"
}
ステップ 3:統制目標を規制上の引用にマッピングする

マッピング用に既存の引用を照会する:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_citation
  query: active=true^regulationLIKEGDPR
  fields: sys_id,number,short_description,reference,regulation,authority,citation_text
  limit: 50

目標を SOX の引用にマッピングする:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_citation
  query: active=true^regulationLIKESOX^ORregulationLIKESarbanes
  fields: sys_id,number,short_description,reference,regulation,authority
  limit: 50

目標を HIPAA の引用にマッピングする:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_citation
  query: active=true^regulationLIKEHIPAA
  fields: sys_id,number,short_description,reference,regulation,authority
  limit: 50
ステップ 4:統制の有効性を評価する

特定の目標について、統制とそのテスト結果を照会する:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control
  query: control_objective=[objective_sys_id]^active=true
  fields: sys_id,number,short_description,state,effectiveness,test_result,test_date,owner,profile
  limit: 50

すべての目標を対象に有効性評価を生成する:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var assessment = {
      generated_date: new GlideDateTime().toString(),
      total_objectives: 0,
      effectiveness_summary: { effective: 0, partially_effective: 0, ineffective: 0, not_tested: 0 },
      by_framework: {},
      objectives_detail: []
    };

    var obj = new GlideRecord('sn_compliance_control_objective');
    obj.addQuery('active', true);
    obj.query();

    while (obj.next()) {
      assessment.total_objectives++;

      var framework = obj.framework.getDisplayValue() || 'General';
      if (!assessment.by_framework[framework]) {
        assessment.by_framework[framework] = { total: 0, effective: 0, gaps: 0 };
      }
      assessment.by_framework[framework].total++;

      // Query controls for this objective
      var ctrl = new GlideRecord('sn_compliance_control');
      ctrl.addQuery('control_objective', obj.sys_id.toString());
      ctrl.addQuery('active', true);
      ctrl.query();

      var totalControls = 0, passingControls = 0, failingControls = 0, untestedControls = 0;
      while (ctrl.next()) {
        totalControls++;
        var testResult = ctrl.test_result.getDisplayValue().toLowerCase();
        var state = ctrl.state.getDisplayValue().toLowerCase();

        if (testResult === 'pass' || state === 'compliant') passingControls++;
        else if (testResult === 'fail' || state === 'non-compliant') failingControls++;
        else untestedControls++;
      }

      // Determine effectiveness
      var effectiveness = 'Not Tested';
      if (totalControls === 0) {
        effectiveness = 'No Controls';
      } else if (failingControls === 0 && untestedControls === 0) {
        effectiveness = 'Effective';
        assessment.effectiveness_summary.effective++;
        assessment.by_framework[framework].effective++;
      } else if (failingControls === 0 && passingControls > 0) {
        effectiveness = 'Partially Effective';
        assessment.effectiveness_summary.partially_effective++;
      } else if (failingControls > 0) {
        effectiveness = 'Ineffective';
        assessment.effectiveness_summary.ineffective++;
        assessment.by_framework[framework].gaps++;
      } else {
        assessment.effectiveness_summary.not_tested++;
      }

      assessment.objectives_detail.push({
        number: obj.number.toString(),
        title: obj.short_description.toString(),
        framework: framework,
        total_controls: totalControls,
        passing: passingControls,
        failing: failingControls,
        untested: untestedControls,
        effectiveness: effectiveness
      });
    }

    gs.info('CONTROL EFFECTIVENESS ASSESSMENT:\n' + JSON.stringify(assessment, null, 2));
  description: "GRC: Assess control effectiveness across all objectives"
ステップ 5:統制のギャップを特定する

適切な統制範囲が確保されていない目標を検索する:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var gaps = [];

    var obj = new GlideRecord('sn_compliance_control_objective');
    obj.addQuery('active', true);
    obj.query();

    while (obj.next()) {
      var ctrl = new GlideAggregate('sn_compliance_control');
      ctrl.addQuery('control_objective', obj.sys_id.toString());
      ctrl.addQuery('active', true);
      ctrl.addAggregate('COUNT');
      ctrl.query();

      var controlCount = 0;
      if (ctrl.next()) controlCount = parseInt(ctrl.getAggregate('COUNT'));

      // Gap: No controls or all controls failing
      if (controlCount === 0) {
        gaps.push({
          type: 'NO_CONTROLS',
          objective_number: obj.number.toString(),
          objective_title: obj.short_description.toString(),
          framework: obj.framework.getDisplayValue() || 'General',
          owner: obj.owner.getDisplayValue(),
          severity: 'CRITICAL',
          recommendation: 'Design and implement controls to address this objective'
        });
      } else {
        // Check for all-failing scenario
        var failCtrl = new GlideAggregate('sn_compliance_control');
        failCtrl.addQuery('control_objective', obj.sys_id.toString());
        failCtrl.addQuery('active', true);
        failCtrl.addQuery('state', 'NOT IN', 'compliant,passed');
        failCtrl.addAggregate('COUNT');
        failCtrl.query();

        var failCount = 0;
        if (failCtrl.next()) failCount = parseInt(failCtrl.getAggregate('COUNT'));

        if (failCount === controlCount) {
          gaps.push({
            type: 'ALL_CONTROLS_FAILING',
            objective_number: obj.number.toString(),
            objective_title: obj.short_description.toString(),
            framework: obj.framework.getDisplayValue() || 'General',
            total_controls: controlCount,
            failing_controls: failCount,
            severity: 'HIGH',
            recommendation: 'All controls ineffective; redesign control approach or add compensating controls'
          });
        }

        // Check for stale testing (no test in last 180 days)
        var staleCtrl = new GlideRecord('sn_compliance_control');
        staleCtrl.addQuery('control_objective', obj.sys_id.toString());
        staleCtrl.addQuery('active', true);
        staleCtrl.addQuery('test_date', '<', gs.daysAgo(180));
        staleCtrl.query();
        var staleCount = staleCtrl.getRowCount();

        if (staleCount > 0) {
          gaps.push({
            type: 'STALE_TESTING',
            objective_number: obj.number.toString(),
            objective_title: obj.short_description.toString(),
            framework: obj.framework.getDisplayValue() || 'General',
            stale_controls: staleCount,
            severity: 'MEDIUM',
            recommendation: 'Schedule control re-testing; ' + staleCount + ' controls not tested in 180+ days'
          });
        }
      }
    }

    gaps.sort(function(a, b) {
      var sevOrder = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, LOW: 3 };
      return (sevOrder[a.severity] || 3) - (sevOrder[b.severity] || 3);
    });

    gs.info('CONTROL GAPS IDENTIFIED: ' + gaps.length + '\n' + JSON.stringify(gaps, null, 2));
  description: "GRC: Identify control gaps across all objectives"
ステップ 6:評価結果で統制目標を更新する

MCP を使用する場合:

Tool: SN-Update-Record
Parameters:
  table_name: sn_compliance_control_objective
  sys_id: [objective_sys_id]
  fields:
    effectiveness: effective
    work_notes: |
      === CONTROL EFFECTIVENESS ASSESSMENT ===
      Assessment Date: 2026-03-19
      Total Controls: 5
      Passing: 4 (80%)
      Failing: 0
      Untested: 1
      Overall Effectiveness: Effective

      Regulatory Mapping: SOX Section 404, GDPR Article 32
      Next Review: 2026-06-19
    state: reviewed

REST API を使用する場合:

PATCH /api/now/table/sn_compliance_control_objective/[sys_id]
Content-Type: application/json

{
  "effectiveness": "effective",
  "work_notes": "Control effectiveness assessment completed. 4/5 controls passing.",
  "state": "reviewed"
}
ステップ 7:ギャップの是正に向けたコンプライアンスタスクを作成する

MCP を使用する場合:

Tool: SN-Create-Record
Parameters:
  table_name: sn_compliance_task
  fields:
    short_description: "Design controls for unaddressed control objective CO0001456"
    description: "Control objective CO0001456 has no implementing controls. Design and implement at least one preventive and one detective control. Map to GDPR Article 32 requirements for data processing security."
    assigned_to: [control_owner_sys_id]
    due_date: 2026-05-01
    priority: 2
    state: 1

REST API を使用する場合:

POST /api/now/table/sn_compliance_task
Content-Type: application/json

{
  "short_description": "Design controls for unaddressed control objective CO0001456",
  "description": "No implementing controls exist. Design preventive and detective controls.",
  "assigned_to": "[owner_sys_id]",
  "due_date": "2026-05-01",
  "priority": "2",
  "state": "1"
}

規制フレームワークの背景情報

SOX(Sarbanes-Oxley Act)
セクション統制目標の重点領域主なフィールド
Section 302CEO/CFO による財務統制の認証開示統制、重大な弱点
Section 404財務報告に係る内部統制(ICFR)統制設計、運用上の有効性
Section 409重大な変更のリアルタイム開示モニタリング統制、イベント駆動型評価
GDPR(一般データ保護規則)
条項管理目標の焦点主な項目
第25条設計およびデフォルト設定によるデータ保護プライバシー管理、データ最小化
第30条処理活動の記録処理インベントリ管理
第32条処理のセキュリティ技術的および組織的措置
第35条データ保護影響評価DPIA プロセス管理
HIPAA(医療保険の携行性と責任に関する法律)
規則管理目標の焦点主な項目
164.312(a)アクセス制御一意のユーザー ID、緊急アクセス、自動ログオフ
164.312(c)完全性管理ePHI を認証するメカニズム
164.312(d)認証個人またはエンティティの認証
164.312(e)伝送セキュリティ暗号化、完全性管理

ツールの使用

操作MCP ツールREST エンドポイント
目標のクエリSN-Query-TableGET /api/now/table/sn_compliance_control_objective
目標の作成SN-Create-RecordPOST /api/now/table/sn_compliance_control_objective
目標の更新SN-Update-RecordPATCH /api/now/table/sn_compliance_control_objective
管理策のクエリSN-Query-TableGET /api/now/table/sn_compliance_control
引用のクエリSN-Query-TableGET /api/now/table/sn_compliance_citation
ギャップ分析SN-Execute-Background-ScriptPOST /api/now/table/sys_trigger
スキーマの検出SN-Discover-Table-SchemaGET /api/now/table/sys_dictionary

ベストプラクティス

  • フレームワークとの整合: 目標はフレームワーク名だけでなく、具体的な規制の条項やセクションに必ず対応付けます
  • 管理策の多層化: 多層防御のため、各目標には予防的管理策と発見的管理策の両方を設けます
  • テスト頻度: リスクに基づいたテスト頻度を設定します。重要な管理策は四半期ごと、標準的な管理策は年次で実施します
  • ギャップの優先順位付け: ギャップの件数だけでなく、規制上のリスクとビジネスへの影響に基づいて優先順位を付けます
  • オーナーシップモデル: 管理目標のオーナー(戦略面)と管理策のオーナー(運用面)の両方を割り当てます
  • 証跡の基準: テストを開始する前に、各管理策で許容される証跡の種類を定めます
  • フレームワーク横断のマッピング: 複数のフレームワークを満たす管理策を特定し、重複を減らします

トラブルシューティング

管理目標テーブルが見つからない

症状: sn_compliance_control_objective へのクエリでテーブルが見つからないというエラーが返されます 原因: Compliance プラグインが有効になっていないか、別のテーブル名が使用されている可能性があります 解決策:

Tool: SN-Discover-Table-Schema
Parameters:
  table_name: sn_compliance_control_objective

見つからない場合は、sn_compliance_objective や sn_grc_control_objective などの代替テーブルを確認します。com.sn_compliance プラグインが有効であることを確認します。

フレームワークのフィールドが利用できない

症状: 管理目標レコードに framework フィールドがありません 原因: フレームワークの追跡に、別のフレームワークテーブルへの参照フィールドやカスタムフィールドが使われている可能性があります 解決策: regulation、compliance_framework などのフィールド、または sn_compliance_citation への参照がないか、スキーマを確認します。代替のグループ化方法として、カテゴリまたはポリシーへの参照を使用します。

管理策と目標のリンクがない

症状: 管理策は存在しますが、管理目標にリンクされていません 原因: sn_compliance_control の control_objective 参照フィールドに値が入力されていない可能性があります 解決策: 管理策が sn_grc_item 経由、または多対多の関連テーブル経由でリンクされているか確認します。存在する場合は sn_grc_m2m_control_objective_control をクエリします。

例

例 1:SOX 404 統制目標の評価

シナリオ: 年次 SOX 監査の準備として、ICFR の統制目標を評価する必要があります

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control_objective
  query: 123TEXTQUERY321=SOX Section 404 internal control financial reporting
  limit: 30

評価結果:

  • SOX 統制目標の合計: 24
  • 有効: 18(75%)
  • 部分的に有効: 4(17%)-- 未テストの統制は Q1 のレビュー待ちです
  • 無効: 1(4%)-- 職務分掌の統制に不備があります
  • 統制なし: 1(4%)-- IT 全般統制向けの新しい目標が追加されました
  • 主なギャップ: CO0002341 - 「財務システムに関する IT 変更管理統制」には実装済みの統制がありません
  • 必要な対応: 監査の実地調査前に、ギャップの是正に向けたコンプライアンスタスクを 2 件作成します
例 2:GDPR 統制カバレッジ分析

シナリオ: DPO が GDPR コンプライアンスに対する統制のカバレッジを確認する必要があります

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control_objective
  query: active=true^frameworkLIKEGDPR^ORdescriptionLIKEGDPR
  fields: sys_id,number,short_description,state,effectiveness,owner
  limit: 50

カバレッジレポート:

  • 定義済みの GDPR 目標: 15
  • 有効な統制あり: 12(カバレッジ 80%)
  • 完全に有効: 9(60%)
  • 特定されたギャップ:
    1. 第 17 条(消去権)-- 自動削除の統制がありません
    2. 第 20 条(データポータビリティ)-- エクスポートの仕組みが未テストです
    3. 第 35 条(DPIA)-- プロセス統制がまだ実装されていません
  • 推奨事項: 規制上の罰金リスクが最も高いため、第 17 条のギャップを優先します

関連スキル

  • grc/issue-action-plan - 統制の不備によって発生した問題を是正します
  • grc/issue-summarization - 統制のギャップに関連する問題を要約します
  • grc/risk-assessment-summarization - 統制によって軽減されるリスクを評価します
  • grc/regulatory-alert-analysis - 統制要件に影響する規制の変更を追跡します
  • security/audit-compliance - 統制テストの証拠に関する監査証跡

参考資料

コメント