メインコンテンツにスキップ

Axur Credentials Feed - ServiceNow

Credentials Feed(Push または Pull)を使用して、Axur プラットフォームが検出した漏えい認証情報ごとに ServiceNow のインシデントを作成する方法を説明します。

概要

Credentials Feed は、Axur プラットフォームが検出した漏えい認証情報(従業員や顧客の流出したログイン情報)を配信します。ServiceNow 上の小さなスクリプトが各認証情報をインシデントレコードに変換するため、チームはパスワードをリセットし、対応状況を追跡できます。

図 1:2 つの配信モード。どちらも同じ JSON と同じマッピングスクリプトを使用します。

  • Push(Webhook 2.0): ほぼリアルタイム

    • Axur プラットフォームが、ServiceNow に作成したエンドポイントへ認証情報を送信します。インスタンスがインバウンド通信を受け付ける必要があります。

  • Pull(ポーリング): 承認を得やすい

    • ServiceNow が X 分ごとにフィードを照会します。通信はアウトバウンドのみで、遅延はスケジュール間隔と同じです。

Tickets Feed ガイドをすでにご利用ですか?

本ガイドは同じ構成で、独自のスクリプト名(AxurCredentialFeedMapper、axur.credentials_feed.url)を使用します。両方の連携は同じインスタンス内で並行して稼働でき、同じ API Key プロパティを共有できます。

前提条件

  • ServiceNow インスタンスと admin ユーザー(Push の場合は web_service_admin でも可)。まずテストする場合は、developer.servicenow.com の無料 Personal Developer Instance(PDI)を使用してください。URL は https://dev123456.service-now.com のような形式です。

  • フィードを作成するための、Axur プラットフォームの manager 権限を持つユーザー。

  • Axur プラットフォームの API Key(Pull のみ)。手順  を参照してください。

クラシック UI と Next Experience の違い

ServiceNow のメニューは、クラシックインターフェース(UI16)と Next Experience(All メニュー)で表示が異なります。フィルターに sys_properties.list と入力するなどの一部のショートカットは、すべてのバージョンで動作するわけではありません。以下の各手順には、どちらのインターフェースでも使える直接 URL も記載しています。<instance> はご自身のインスタンス名(例:dev123456)に置き換えてください。

本ガイドで使用する直接 URL

項目

直接 URL

新しいシステムプロパティ

https://<instance>.service-now.com/sys_properties.do?sys_id=-1

システムプロパティ一覧

https://<instance>.service-now.com/sys_properties_list.do

新しい Script Include

https://<instance>.service-now.com/sys_script_include.do?sys_id=-1

新しい Scheduled Script Execution

https://<instance>.service-now.com/sysauto_script.do?sys_id=-1

新しい Scripted REST API

https://<instance>.service-now.com/sys_ws_definition.do?sys_id=-1

フィードで作成されたインシデント

https://<instance>.service-now.com/incident_list.do?sysparm_query=correlation_idISNOTEMPTY

システムログ

https://<instance>.service-now.com/syslog_list.do


Axur プラットフォームでフィードと API Key を取得する

最初にこの手順を行ってください。Pull では、ServiceNow で何かを作成する前にフィード URL と API Key の両方が必要です。

フィードを作成する

  1. one.axur.com/api-integrations → Feeds セクション → Add feed に移動します。Employee credentials または User credentials テンプレートを選ぶか、Skip templates をクリックします。

  2. Credentials タイプを選択します。

  3. 配信モードとして Pull または Push を選択します。Push の場合は、手順 6 で作成するエンドポイント URL を入力します。

  4. Event date には作成日(created)があらかじめ設定されています。各認証情報は、Axur プラットフォームが最初に検出したときに 1 回だけ届きます。

  5. Feed parameters で受信する認証情報を選択します。フィルターは & で組み合わせます:

  6. 推奨:以下の fields パラメーターも追加してください。これによりフィードはスクリプトが使用する項目のみを返し、パスワードが Axur プラットフォームの外に出ることはありません:

    fields=id,created,detectionDate,customer,assets,status,credential.types,user,user.type,access.url,source.name

    フィルターと組み合わせた例:credential.types=employee&fields=id,created,…

  7. タイトル(例:「ServiceNow – 漏えい認証情報」)を設定して保存します。

  8. 一覧に表示されるフィードのフィード URL をコピーします。https://api.axur.com/gateway/1.0/api/integration-feed/feeds/feed/<ID> のような形式です。

図 2:推奨されるフィード設定(イメージ図。実際の画面とは異なる場合があります)。

API Key を取得する(Pull のみ)

  1. Axur プラットフォームで My Preferences → API KEY タブを開きます。

  2. 新しいキーを作成し、すぐにコピーします。手順 で ServiceNow のプロパティを作成するまで、パスワードマネージャーに保管してください。

キーは作成したユーザーに紐づきます

キーは、そのユーザーが Axur プラットフォームで閲覧できる範囲にのみアクセスできます。ユーザーが無効化、ブロック、または削除されるとキーは失効し、ジョブが 401 Unauthorized で失敗し始めます。認証情報へのアクセス権があり、無効化されることのないユーザー(専用の連携用ユーザーなど)でキーを作成してください。キーを共有したり、スクリプトに直接記述したりしないでください。


フィールドマッピング

collectionData.detections[] の各項目が Incident テーブルのレコードになります。色は各情報の取得元を示します:

マッピング表

ServiceNow のフィールド

JSON 内の取得元

備考

state

固定値 1

作成時のみ設定されます。更新時にインシデントが再オープンされることはありません。

correlation_id

id

重複を防ぐために使用します。

correlation_display

id

short_description

Data Leakage - 種別 - customer - user @ access.url

上限は 160 文字です。超える場合はユーザー/URL 部分のみが短縮されます(... 付き)。

description

図 3b のテンプレート

リンク:https://one.axur.com/data-leakage/credentials?customerId={customer}&text={id}

認証情報タイプのラベル

credential.types

インシデント上のラベル

employee

Employee credential exposed

user

User credential exposed

両方

Employee and User credential exposed

パスワードが ServiceNow に書き込まれることはありません

フィードがパスワードを送信した場合でも、スクリプトはそれをインシデントにコピーしません。インシデントは多くの人が閲覧でき、長期間保存されるため、漏えいしたパスワードを保存すると新たな漏えいにつながります。検出の詳細は、説明欄のリンクから Axur プラットフォームで確認できます。

ドットを含むキーに注意

access.url や credential.types などのフィールドは名前にドットを含みます。JavaScript では d.access.url ではなく、角かっこを使って d['access.url'] と記述してください。


Script Include:マッパー

このスクリプトはフィールドを組み立て、インシデントを作成または更新します。作成は1 回だけで、Push と Pull の両方で使用されます。

  1. https://<instance>.service-now.com/sys_script_include.do?sys_id=-1 を開きます。メニューからは System Definition › Script Includes → New の順に進みます。

  2. Name:AxurCredentialFeedMapper(この名前と完全に一致させる必要があります)。

  3. 以下のコードを Script フィールドに貼り付けて保存します。

var AxurCredentialFeedMapper = {
TABLE: 'incident',
CREDENTIALS_URL: 'https://one.axur.com/data-leakage/credentials',
SHORT_DESCRIPTION_LIMIT: 160,
WORKSPACE: 'Data Leakage',

TYPE_LABELS: {
'employee': 'Employee',
'user': 'User'
},

buildFields: function (item) {
var id = item.id;
var customer = item.customer || '';
var user = item.user || '';
var accessUrl = item['access.url'] || '';
var typeLabel = this.typeLabel(item['credential.types'] || []);

var prefix = this.WORKSPACE + ' - ' + typeLabel + ' credential exposed - ' + customer + ' - ';
var target = accessUrl ? user + ' @ ' + accessUrl : user;
var shortDescription = prefix + this.fit(target, prefix.length);

var link = this.CREDENTIALS_URL + '?customerId=' + encodeURIComponent(customer)
+ '&text=' + encodeURIComponent(id);

var description = [
'Axur - one.axur.com',
'',
'New credential exposure detected (' + link + ')',
'',
'Detection ID: ' + id,
this.assetsLine(item.assets || []),
'Credential Type: ' + typeLabel,
'User: ' + user + (item['user.type'] ? ' (' + item['user.type'] + ')' : ''),
'Access URL: ' + accessUrl,
'Source: ' + (item['source.name'] || ''),
'Status: ' + (item.status || ''),
'Detection Date: ' + this.formatDate(item.detectionDate || item.created)
].join('\n');

return { id: id, shortDescription: shortDescription, description: description };
},

typeLabel: function (types) {
var labels = [];
for (var i = 0; i < types.length; i++) {
labels.push(this.TYPE_LABELS[types[i]] || types[i]);
}
return labels.length ? labels.join(' and ') : 'Unknown';
},

fit: function (text, usedLength) {
var available = this.SHORT_DESCRIPTION_LIMIT - usedLength;
if (text.length <= available) return text;
return text.substring(0, Math.max(available - 3, 0)) + '...';
},

assetsLine: function (assets) {
if (assets.length === 0) return 'Asset: -';
return assets.length === 1 ? 'Asset: ' + assets[0] : 'Assets: (' + assets.join(', ') + ')';
},

formatDate: function (iso) {
if (!iso) return '';
return iso.substring(8, 10) + '/' + iso.substring(5, 7) + '/' + iso.substring(0, 4);
},

upsert: function (item) {
var f = this.buildFields(item);
if (!f.id) return;

var gr = new GlideRecord(this.TABLE);
gr.addQuery('correlation_id', f.id);
gr.query();
var exists = gr.next();
if (!exists) {
gr.initialize();
gr.state = 1;
}
gr.correlation_id = f.id;
gr.correlation_display = f.id;
gr.short_description = f.shortDescription;
gr.description = f.description;
if (exists) { gr.update(); } else { gr.insert(); }
},

processPayload: function (payload) {
var detections = (payload && payload.collectionData && payload.collectionData.detections) || [];
for (var i = 0; i < detections.length; i++) {
this.upsert(detections[i]);
}
return detections.length;
}
};

オプション A:Scheduled Job による Pull

インスタンスが外部からの呼び出しを受け付けられない場合は、このオプションを選択してください。

URL と API Key を保存する

始める前に:フィード URL と API Key を手元に用意してください。

  1. 新規プロパティのフォームを直接開きます:https://<instance>.service-now.com/sys_properties.do?sys_id=-1。sys_properties_list.do を開いて New をクリックすることもできます。

  2. フィード URL のプロパティを作成します:

  3. axur.feed.api_key がまだ存在しない場合(Tickets Feed 連携と共有されます)は、フォームを再度開いて作成します:

セキュリティ

API Key をスクリプトに直接記述しないでください。セキュリティチームの方針に応じて、システムプロパティの代わりに Connection & Credential Aliases を使用することもできます。

スケジュールを作成する

  1. https://<instance>.service-now.com/sysauto_script.do?sys_id=-1 を開きます。メニューからは System Definition › Scheduled Jobs → New → Automatically run a script of your choosing の順に進みます。

  2. Name:Axur Credentials Feed → Incident。Run:Periodically。Repeat interval:00:05:00(5 分)。

  3. 以下のスクリプトを貼り付けて保存します。

図 4:5 分ごとに実行される Scheduled Job(イメージ図)。

var FEED_URL = gs.getProperty('axur.credentials_feed.url');
var API_KEY = gs.getProperty('axur.feed.api_key');
var MAX_PAGES = 20;

for (var page = 0; page < MAX_PAGES; page++) {
var request = new sn_ws.RESTMessageV2();
request.setEndpoint(FEED_URL);
request.setHttpMethod('GET');
request.setRequestHeader('Authorization', 'Bearer ' + API_KEY);
request.setRequestHeader('Accept', 'application/json');

var response = request.execute();
if (response.getStatusCode() != 200) {
gs.error('Axur credentials feed: HTTP ' + response.getStatusCode() + ' - ' + response.getBody());
break;
}

var processed = AxurCredentialFeedMapper.processPayload(JSON.parse(response.getBody()));
if (processed === 0 || FEED_URL.indexOf('dry-run=true') > -1) break;
}

フィードを呼び出すたびにポインターが進み、次のバッチが返されます。ループは空のバッチが返るまで続きますが、ジョブが停止しないよう、1 回の実行あたりの呼び出しは最大 20 回に制限されています。dry-run モードではポインターが進まないため、ジョブは 1 回の実行につき 1 回だけ呼び出します。


オプション B:Scripted REST API による Push

認証情報をほぼリアルタイムで受信したい場合は、このオプションを選択してください。インスタンスが Axur プラットフォームからのインバウンド通信を受け付ける必要があります。

  1. https://<instance>.service-now.com/sys_ws_definition.do?sys_id=-1 を開きます。メニューからは System Web Services › Scripted Web Services › Scripted REST APIs → New の順に進みます。

  2. Name:Axur Credentials Feed、API ID:axur_credentials_feed。保存します。

  3. Resources タブ → New:Name credentials、HTTP method POST、Relative path /credentials。

  4. 以下のスクリプトをリソースに貼り付けて保存します。

  5. Resource path(例:https://<instance>.service-now.com/api/<scope>/axur_credentials_feed/credentials)をコピーし、Axur プラットフォームで Push フィードのエンドポイントとして入力します。

(function process(request, response) {
var processed = AxurCredentialFeedMapper.processPayload(request.body.data);
response.setStatus(200);
response.setBody({ processed: processed });
})(request, response);

エンドポイントの認証

このリソースはデフォルトで ServiceNow の認証を必要とします(Requires authentication)。これは無効にしないでください。代わりに、Axur プラットフォームが毎回の呼び出しで認証するよう設定します:

  1. ServiceNow で、インシデントの作成と更新に必要なロールのみを持つ専用の連携用ユーザー(例:axur.integration)を作成します。

  2. Axur プラットフォームで Push フィードを設定する際に、そのユーザーの認証情報を含むカスタムヘッダーを追加します:Authorization: Basic <ユーザー:パスワード の base64>。Axur プラットフォームは、すべてのリクエストでカスタムヘッダーを送信します。

任意:署名の検証

すべての Push リクエストには X-Push-Signature ヘッダーも含まれます。これは、Push フィードのシークレットキーで計算したリクエスト本文(未加工)の HMAC-SHA256 を 16 進数でエンコードしたものです。呼び出しが Axur プラットフォームからのものであることの証明をセキュリティチームが求める場合は、リソース内で検証してください。

接続テストPush フィードを保存またはテストすると、Axur プラットフォームは空の本文({})を送信します。スクリプトは processed: 0 とともに 200 を返し、何も作成しません。


テストと検証

  1. 一時的に dry-run を有効にします:axur.credentials_feed.url プロパティを開き(sys_properties_list.do で名前を検索)、Value の末尾に ?dry-run=true を追加します(例:https://api.axur.com/gateway/1.0/api/integration-feed/feeds/feed/<ID>?dry-run=true)。保存します。これにより、フィードは毎回同じ認証情報を返し、ポインターも進まないため、テスト中にデータが失われることはありません。

  2. ジョブを手動で実行します:Scheduled Job を開き → Execute Now。

  3. incident_list.do?sysparm_query=correlation_idISNOTEMPTY でインシデントを確認します。インシデントにパスワードが含まれていないことを確認してください。

  4. もう一度実行します。upsert により、インシデント数は増えないはずです。

  5. syslog_list.do または System Logs › Errors でエラーを確認します(Axur credentials feed: で始まるメッセージ)。

  6. 問題がなければ、axur.credentials_feed.url を再度編集し、値から ?dry-run=true を削除して、ポインターが進むようにします。

ヒント

本番環境で有効にする前に、サブプロダクションまたは開発インスタンスで検証してください。フィルターのないフィードでは、初回実行時に大量の認証情報が取り込まれる場合があります。大量のデータが予想される場合は、フィルター(例:credential.types=employee)を設定して始めてください。


セキュリティ上の注意とチェックリスト

項目

推奨事項

パスワード

ServiceNow には保存されません。fields パラメーター(手順 2.1)を使用して、送信自体も行われないようにしてください。

インシデントの閲覧者

漏えい認証情報は個人データです。一般キューではなく、制限されたグループ(例:Assignment group ルールを使用)にインシデントを割り当ててください。

API Key

password2 として保存し、admin のみが読み取れるようにします。キーは専用の連携用ユーザーで作成します。

本番稼働前チェックリスト

  • 適切なフィルターと fields パラメーターを設定した Credentials Feed を Axur プラットフォームで作成済み

  • Script Include AxurCredentialFeedMapper を作成済み

  • Pull:プロパティ axur.credentials_feed.url と axur.feed.api_key を作成済み

  • Pull:Scheduled Job が有効 · Push:フィードにエンドポイントを登録済み

  • axur.credentials_feed.url に ?dry-run=true を付けてテスト済み(重複なし、インシデントにパスワードなし)

  • axur.credentials_feed.url から ?dry-run=true を削除済み

こちらの回答で解決しましたか?