control-objective-management について
ServiceNow GRCでコンプライアンス管理目標を扱うスキルです。作成、規制へのマッピング、有効性評価、ギャップ是正を行い、SOX、GDPR、HIPAAなどのフレームワークを扱うコンプライアンス・監査チームを対象とします。
主な機能
- 01管理目標の作成と更新
- 02管理目標と規制引用のマッピング
- 03テストと証拠による統制評価
- 04統制カバレッジのギャップ特定
- 05有効性レポートと是正タスクの生成
活用シーン
- 01コンプライアンス統制フレームワークの構築・改訂
- 02統制有効性テストの実施
- 03変化する規制への統制のマッピング
- 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_profile | GRC エンティティプロファイル | 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 302 | CEO/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-Table | GET /api/now/table/sn_compliance_control_objective |
| 目標の作成 | SN-Create-Record | POST /api/now/table/sn_compliance_control_objective |
| 目標の更新 | SN-Update-Record | PATCH /api/now/table/sn_compliance_control_objective |
| 管理策のクエリ | SN-Query-Table | GET /api/now/table/sn_compliance_control |
| 引用のクエリ | SN-Query-Table | GET /api/now/table/sn_compliance_citation |
| ギャップ分析 | SN-Execute-Background-Script | POST /api/now/table/sys_trigger |
| スキーマの検出 | SN-Discover-Table-Schema | GET /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%)
- 特定されたギャップ:
- 第 17 条(消去権)-- 自動削除の統制がありません
- 第 20 条(データポータビリティ)-- エクスポートの仕組みが未テストです
- 第 35 条(DPIA)-- プロセス統制がまだ実装されていません
- 推奨事項: 規制上の罰金リスクが最も高いため、第 17 条のギャップを優先します
関連スキル
grc/issue-action-plan- 統制の不備によって発生した問題を是正しますgrc/issue-summarization- 統制のギャップに関連する問題を要約しますgrc/risk-assessment-summarization- 統制によって軽減されるリスクを評価しますgrc/regulatory-alert-analysis- 統制要件に影響する規制の変更を追跡しますsecurity/audit-compliance- 統制テストの証拠に関する監査証跡