ユーザーアカウントアクティビティを調査する方法 Issue <!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } アクティビティのモニタリングについての最新情報は、Monitoring user activityを参照してください。 特定のユーザーの挙動を確認する必要がある場合は、以下の推奨手順に従ってトランザクションログとイベントログを確認してください。 特定の ServiceNow ユーザーのインスタンスで成功/失敗したログインの IP アドレスを見つける検索の期間を変更する ユーザー名で検索範囲を制限する成功/失敗したログイン試行 手順 ユーザーアクティビティを見つける手順 アドミンとしてインスタンスにログインします。トランザクションログを特定します。 トランザクションログは、インスタンス管理者が [syslog_transaction] テーブルのテーブルローテーションを調整していない限り、デフォルトで 49 日間保持されます。 [System Logs] > [Transactions] に移動して、https://<インスタンス名>.service-now.com/syslog_transaction_list.do を表示します。 調査目的を満たすようにフィルターを調整してログを絞り込みます。 必要な期間: [Created] フィルターユーザー名: [Created by] フィルター、[starts with] または [contains] のオプションを使用 ログの日付範囲を絞り込みます。 このリストビューから、フィルターを以下のように調整できます。 [Created on]:任意の日付または期間に調整[Created by]:影響を受けるユーザー名に調整 以下のようにして、ユーザーログインの IP アドレスを特定します。 テーブルの左上にある歯車をクリックして、[Personalize List columns] を開きます。ログインしているユーザーの IP アドレスを表示するには、[Personalize List columns] モジュールを使用して IP アドレス列をリストビューに追加します。 成功/失敗したログイン試行を特定する この手順はローカルアカウントのみが対象です。 アドミンとしてインスタンスにログインします。[System Logs] > [Events] に移動します。https://<インスタンス名>.service-now.com/sysevent_list.do?sysparm_query=sys_created_onONToday%40javascript:gs.daysAgoStart(0)%40javascript:gs.daysAgoEnd(0)%5EGOTOnameSTARTSWITHSNC.Auth.DBフィルターを次のように調整します。このリストビューから、フィルターを以下のように調整できます。 [Created on]:任意の日付または期間に調整[Created by]:影響を受けるユーザー名に調整 懸念されるアクティビティを評価するためのその他の推奨アクション 上記の手順が完了したら、次のアクションを実行して、特定されたログに記録されていない、または設定されている現在のログ保持期間外に発生した疑わしいアクティビティがないかどうかを確認することをお勧めします。 [sys_user_has_role] テーブルを確認し、該当するユーザーのエントリにフィルタリングすることで、ターゲットユーザーに割り当てられているロールを決定します。インスタンス内で予期しない変更が行われていないか、[sys_audit] テーブルを確認します。詳細については、このドキュメントページを参照してください。 https://www.servicenow.com/docs/csh?topicname=c_UnderstandingTheSysAuditTable.html&version=latest 認識されない新しく作成されたユーザー (特に特権ロールを持つユーザー) がないか、[sys_user] テーブルを確認します。サービスアカウントをレビューし、次の KB にリンクされているベストプラクティスに従って設定されていることを確認します:https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB1933421 プラットフォームオーナーチームによって認識されていない、新しくスケジュールされたジョブがあるかどうかを確認します。スケジュール済みジョブのレビュー方法の詳細については、このドキュメントページを参照してください。 https://www.servicenow.com/docs/csh?topicname=view-scheduled-jobs.html&version=latest [Customer Updates] テーブルに予期しないアクティビティがないか確認します。この表の操作方法の詳細については、リンク先のドキュメントを参照してください。 https://www.servicenow.com/docs/csh?topicname=r_CustomerUpdatesTable.html&version=latest Security Center Metrics ダッシュボード (/now/security-center/my_security_metrics)、特に以下のメトリクスを確認します。 Privileged Users: Local logins of privileged users not protected by MFA in Security CenterPrivileged Users: New usersPrivileged Users: Successful loginsUsers: Successful loginsUsers: Inactive users who are not locked outUsers: New usersPrivileged Identities: Admin users added Privileged Identities: Admin logins Authentication: Users using MFA BypassAuthentication High privileged non-MFA usersExport: Total Exports IP アドレスに基づくノードログの確認 特定の IP アドレスに関連するアクティビティをノードログで確認するには、まず以下の KB の手順に従って、インスタンスからすべてのノードログをダウンロードしてください。 https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0826291 ノードログのダウンロードが完了したら、別のフォルダーに保存し、任意のターミナルでそのフォルダーに移動します。 Linux/Mac ユーザー向け手順: 以下のコマンドを使用して、ServiceNow から報告された IP アドレスを txt ファイルに追加します。入力が完了したら、空白行で Ctrl + D を押してください。 cat > reported_ip_addresses.txt reported_ip_addresses.txt が作成されたら、以下のコマンドを実行します。フォルダー内のすべてのログファイルをループ処理し、それぞれの結果ファイルを作成します。 -- Command Begins -- for LOG in app*localhost_log*.txt; do PREFIX=$(echo "$LOG" | grep -oE '^app[0-9]+'); echo "[$PREFIX] Step 1/3: searching for IPs..."; grep -F -f reported_ip_addresses.txt "$LOG" > "${PREFIX}_activity_from_ips.txt"; echo "[$PREFIX] Step 2/3: extracting txids..."; grep -oE 'txid=[0-9a-f]+' "${PREFIX}_activity_from_ips.txt" | sed 's/txid=//' | sort -u > "${PREFIX}_associated_txids.txt"; echo "[$PREFIX] Step 3/3: pulling all lines for those txids (this is the slow one on big files)..."; grep -F -f <(sed 's/^/txid=/' "${PREFIX}_associated_txids.txt") "$LOG" > "${PREFIX}_activity_from_txids.txt"; echo "[$PREFIX] Done."; done -- Command Ends -- 実行中は以下のような進捗メッセージが表示されます。 [app######] Step 1/3: searching for IPs... [app######] Step 2/3: extracting txids... [app######] Step 3/3: pulling all lines for those txids (this is the slow one on big files)... [app######] Done. 次に、Windows PowerShell 手順の後にあるスクリプト出力セクションを参照してください。 Windows PowerShell ユーザー向け手順: 以下のコマンドを実行します。ウィンドウ/プロンプトで IP アドレスを入力できます。1 行に 1 つずつ IP アドレスを入力または貼り付けてください。入力が完了したら、空白行(空の行で Enter キーを押すだけ)で終了します。 $ips = @(); while ($true) { $line = Read-Host "Enter IP (blank line to finish)"; if ([string]::IsNullOrWhiteSpace($line)) { break }; $ips += $line.Trim() }; $ips | Set-Content -Path "reported_ip_addresses.txt"; Write-Host "Saved $($ips.Count) IP address(es)." これにより、IP アドレスが 1 行ずつ reported_ip_addresses.txt に保存されます。 以下のブロック全体を貼り付けて Enter キーを押してください。フォルダー内の一致するすべてのログファイルをループ処理し、進捗メッセージとともに各ノードの結果ファイルを作成します。 -- Command Begins -- $ipPatterns = Get-Content "reported_ip_addresses.txt" | Where-Object { $_.Trim() -ne "" } | ForEach-Object { [regex]::Escape($_.Trim()) } Get-ChildItem -File | Where-Object { $_.Name -match '^app\d+.*localhost_log' } | ForEach-Object { $log = $_.FullName $name = $_.Name $prefix = [regex]::Match($name, '^app\d+').Value if ([string]::IsNullOrEmpty($prefix)) { $prefix = "unknown" } Write-Host "[$prefix] Step 1/3: searching for IPs..." Select-String -Path $log -Pattern $ipPatterns | ForEach-Object { $_.Line } | Set-Content -Path "${prefix}_activity_from_ips.txt" Write-Host "[$prefix] Step 2/3: extracting txids..." Select-String -Path "${prefix}_activity_from_ips.txt" -Pattern 'txid=([0-9a-f]+)' -AllMatches | ForEach-Object { $_.Matches } | ForEach-Object { $_.Groups[1].Value } | Sort-Object -Unique | Set-Content -Path "${prefix}_associated_txids.txt" Write-Host "[$prefix] Step 3/3: pulling all lines for those txids..." $txids = Get-Content "${prefix}_associated_txids.txt" | Where-Object { $_.Trim() -ne "" } | ForEach-Object { "txid=" + [regex]::Escape($_.Trim()) } if ($txids.Count -gt 0) { Select-String -Path $log -Pattern $txids | ForEach-Object { $_.Line } | Set-Content -Path "${prefix}_activity_from_txids.txt" } else { Set-Content -Path "${prefix}_activity_from_txids.txt" -Value "" } Write-Host "[$prefix] Done."} -- Command Ends -- 実行中は以下のような進捗メッセージが表示されます。 [app#######] Step 1/3: searching for IPs... [app#######] Step 2/3: extracting txids... [app#######] Step 3/3: pulling all lines for those txids (this is the slow one on big files)... [app#######] Done. スクリプト出力 各ノードに対して、ノードの app###### 識別子をプレフィックスとした 3 つのファイルが作成されます。 app######_activity_from_ips.txt — 報告された IP アドレスのいずれかが記載されているすべてのログ行 app######_associated_txids.txt — それらの行から抽出した固有のトランザクション ID(txid) app######_activity_from_txids.txt — それらのトランザクションのすべてのログ行(各トランザクションのアクティビティ全体) これらのログを確認して、インスタンスのノードログに記録されたアクティビティを特定してください。ノードログの構造に関するご質問は、ServiceNow サポートにケースを作成してお問い合わせください。 Release<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } Resolution<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } }