Active Directory ユーザー オブジェクトには、Active Directory の監査レポート作成と管理に役立つ、複数のログオン メタデータ属性があります。たとえば、一定期間まったく使用されていないユーザー アカウントを特定するため、または「stale」アカウントとして扱うために、よく使われます。
ただし、各ログオン メタデータ属性には理解しておくべき独自の挙動があります。そうしないと、レポートが最良の場合はわかりにくくなり、最悪の場合は不正確、または誤解を招く内容になり得ます。
最終ログオン AD 属性
Last-Logon 属性には、ドメイン コントローラーがユーザーを正常に認証した最後の時刻を表す Windows FileTime の形式が含まれています。ユーザーのログオン メタデータとしては最も古参の存在で、最初のバージョンの Active Directory から使われています。
以下の PowerShell コマンドを使うことで、ドメイン コントローラー上の最終ログオン時刻やその他のユーザー属性を取得できます:
Get-ADUser -Filter * -Properties lastLogon | Select samaccountname, @{Name="lastLogon";Expression={[datetime]::FromFileTime($_.'lastLogon')}}
Last-Logon 属性は、ドメイン コントローラーがログオン要求を正常に処理するたびに更新されます。つまり、古いユーザー アカウントを正確に特定するための完璧な方法であるように見えるかもしれません。 しかし、考慮すべき大きな注意点があります。
AD の Last-Logon はレプリケーションされる属性ではありません。各ドメイン コントローラー(DCs)は、特定のユーザーに対してその属性の自身のバージョンを保持します。この動作は意図的なものです——この属性をネットワーク内のドメイン コントローラー間で同期し続けるために必要となるレプリケーション トラフィックの増加は、特に導入当時(二十年前)では手に負えないほど大きくなっていたはずです。しかし、この動作こそが、この属性を使って古いユーザー アカウントをレポートするときに注意が必要な理由にもなっています。
Last-Logon はレプリケーションされないため(ドメインコントローラーはこの情報を交換しません)、属性値は照会しているドメインコントローラーの文脈でのみ解釈できます。つまり、その属性の値はユーザーが最後にログインした時刻であるとは限らず、確認しているドメインコントローラーを通じてユーザーが最後に正常に認証された時刻を表します。同様に、属性の値が 0 であることは、そのユーザーが一度もログインしていないことを必ずしも意味しません。値を返したドメインコントローラーが、そのユーザーからのログイン要求をこれまで一度も処理したことがない可能性があります。
要するに、Last-Logon 属性はログインに関連する監査に使えますが、正確なレポーティングを行うには、特定のユーザー アカウントについて「最も最近更新された値」を特定するために、ログイン要求を処理できるすべてのドメインコントローラーを問い合わせる必要があります。あるいは、この後の章で説明するように、サードパーティのレポーティング ソリューションを利用することもできます。
Last-Logon-Timestamp
Last-Logon-Timestamp には、ユーザーがドメインにログオンした 最近 時刻を表す Windows FileTime の形式が含まれています。このユーザー属性は Microsoft Windows Server 2003 で導入されました。より古い Last-Logon 属性とは異なり、Last-Logon-Timestamp 属性はレプリケートされる属性です。つまり、特定のユーザーに対する値はすべてのドメインコントローラーに同期されます。これは Last-Logon 属性に比べて大きな改善です。つまり、古い(使用されていない)ユーザー アカウントを見つける最善の方法は Last-Logon-Timestamp を使うことですよね?さて、この属性にはそれ自体に注意点があります。
Last-Logon-Timestamp 属性の落とし穴は、ドメインコントローラーがログオン要求を正常に処理したときに、必ずしも更新されるわけではないことです。代わりに、この属性には動的な更新頻度があり、その頻度は ms-DS-Logon-Time-Sync-Interval 属性の値によって制限されます。ms-DS-Logon-Time-Sync-Interval の既定値は NOT SET で、14 日として扱われます。この属性が変更されていることは一般的ではありませんが、気になる場合は、次の PowerShell スクリプトでその実際の値を簡単に確認できます:
$lastLogonReplicationInterval = (Get-ADDomain).LastLogonReplicationInterval
if( $lastLogonReplicationInterval )
{
Write-Host "ms-DS-Logon-Time-Sync-Interval is set to $($lastLogonReplicationInterval) days"
}
else {
Write-Host "ms-DS-Logon-Time-Sync-Interval is not set and will be treated as 14 days"
デフォルトの 14 日間の最大更新境界(maximum update boundary)が設定されたドメインでは、ドメイン コントローラーがログオン要求を正常に処理し、かつ当該属性の最終更新からの経過期間が 9 日から 14 日の間のどこかの値を超えている場合に限り、Last-Logon-Timestamp が更新されます。この経過期間のばらつきは、更新頻度を制御するロジックに含まれるランダムな割合(random percentage)の結果です。この動作は、ネットワーク内のドメイン コントローラー間でこの属性を同期状態に保つために必要なレプリケーション トラフィックを制限することと、ほぼ同時刻に Last-Logon-Timestamp を更新した多数のユーザーについてレプリケーションが必要になる可能性を抑えることとの間の妥協を反映しています。
Last-Logon-Timestamp 属性の更新頻度を制御するロジックの、簡略化した例は次のとおりです。
(Current Datetime – Last-Logon-Timestamp) ? (ms-DS-Logon-Time-Sync-Interval – (Random % * 5 days))
実際には、Last-Logon-Timestamp 属性により、ログオン関連の監査やレポート作成が簡単になります。重要な潜在的課題は、非アクティブ ユーザーのレポートに関わる点だけです。この属性を非アクティブ ユーザーの特定に使う場合、「staleness(古さ/陳腐化)」のしきい値は、レプリケーションが意味のある更新を確実に反映(伝播)できるようにするのに十分な期間だけ、ドメインの ms-DS-Logon-Time-Sync-Interval 値を超える必要があります。
LastLogonDate (PowerShell)
PowerShell に慣れている人なら LastLogonDate を見覚えがあるかもしれませんが、Active Directory の global catalog スキーマのどこにも見つけることはできません。これは LastLogonDate が実際にはローカルで計算される値であり、Last-Logon-Timestamp 属性のレプリケートされた値をユーザーフレンドリーな形式で表示するためです。LastLogonDate は Last-Logon-Timestamp 属性と同様に、利点も欠点もすべて備えています。とはいえ、Windows DateTime からの変換が不要なので、ほとんどのユーザー ログオン関連の監査レポート作成において最適な選択肢です。
Active Directory の最終成功インタラクティブ ログオン属性
属性 ms-DS-Last-Successful-Interactive-Logon-Time は Windows Server 2008 で導入されましたが、デフォルトで無効になっているため、多くの人はそれをよく知りません。有効にすると、ユーザーの最後の成功したインタラクティブ ログオンの日付と時刻が格納されます。これは有効化すると非常に役立ちそうに見えますが、それでも無効のままにしておくべき説得力のある理由がいくつかあります。少し後で説明します。
ラボ環境があり、属性 ms-DS-Last-Successful-Interactive-Logon-Time をいろいろ試してみたい場合は、次を有効にできます。コンピューターの構成 ? ポリシー ? 管理用テンプレート ? Windows コンポーネント ? Windows ログオン オプション ? ユーザー ログオン時に以前のログオンに関する情報を表示する GPO。次に グループ ポリシーの更新 を強制します。運用環境のドメインで、遊び半分でこの設定を有効にしないでください。痛い目を見ます。
ms-DS-Last-Successful-Interactive-Logon-Time 属性の最初の問題は、その値が インタラクティブ ログオンが認証された場合にのみ更新されることです(「Ctrl-Alt-Del」ログオンをイメージしてください)。つまり、ネットワーク共有へのログオンや LDAP 認証のような重要な認証アクティビティは、更新をトリガーしません。したがって、この属性を使ってログオン関連の監査レポートを作成すると、結果がいくらか不正確になる可能性があります。たとえば、非アクティブなユーザー アカウントを特定するレポートでは、一般的に非常に活発に使われているドメイン サービス アカウントが挙がってしまうことがあります。理由は、それらが非インタラクティブな形で活発に動いているためです。要するに、この属性は「古い(休眠気味の)」ユーザーのレポーティングを本当に簡単かつ信頼性高くしてくれますが、対象はインタラクティブ セッションに使用されるユーザー アカウントに限られます。
まとめ
監査レポートで Active Directory logを生成する必要がある場合、最善のアプローチは、おそらくドメイン コントローラーのイベント ログを集約して、それらを処理することです。イベント ログは非常にノイズが多い一方で、非常に信頼性が高く、Active Directory では参照できない履歴情報を提供します。
それが難しい場合は LastLogonDate を使用します。あるいは、さらに良い方法として、Active Directory PowerShell モジュールに組み込まれている Search-ADAccount cmdlet を使い、必要な情報を取得して CSV ファイルに出力します:
Search-ADAccount -AccountInactive -DateTime ((Get-Date).AddDays(-30)) -UsersOnly | Select Name,LastLogonDate,DistinguishedName| Export-CSV c:psinactive_users.csv
Search-ADAccount cmdlet は実際には裏側で LastLogonDate を活用します。その非アクティブ期間(inactivity period)のデフォルトは 15 日で、多くの環境で問題ありません。上記の例には、非アクティブ期間を 30 日の値で上書きするために必要な構文が含まれています。体系化されたアプローチを好む方のために、この情報を数値を変換したり CSV ファイルを分析したりすることなく取得できる便利な無料ツールとして Netwrix Inactive User Tracker があります。
Netwrix はどのように役立ちますか?
Active Directory で各ユーザーの last logon date を定期的に確認することで、ドメイン管理者は、攻撃者が侵害して悪用したいと思う“古い(stale)”アカウントを検知して削除しやすくなります。ただし、これは包括的なサイバーセキュリティ戦略のほんの一部にすぎません。
Netwrix Active Directory Security Solution は、すべての Active Directory ユーザー アカウントの最終ログオン時刻だけでなく、Active Directory におけるあらゆるアクティビティについての詳細情報を提供します。包括的に事前に用意されたレポートにより、ログオン監視 が合理化されます。特に「ユーザー アカウント – 最終ログオン時刻」レポートでは、有効/無効を問わずすべてのユーザー アカウントが一覧表示され、各アカウントの最終ログオン時刻が示されます。レポートのサブスクリプション機能を使用すると、IT 管理者は指定したスケジュールに従ってレポートをメールで自動的に受け取ることができ、ベスト プラクティスに基づく定期的なレビューを促進するとともに、システムの脆弱性をより効率的に排除できるようになります。
Netwrix Directory Manager
自動化されたグループ管理で AD をシンプルに、そして安全に
よくある質問
Lastlogon と lastLogonTimeStamp の違いは何ですか?
Last-Logon 属性とは異なり、Last-Logon-Timestamp 属性は複製(replicated)属性です。つまり、特定のユーザーに対する値はすべてのドメイン コントローラーに同期されます。
lastLogonTimeStamp はどのように計算されますか?
Last-Logon-Timestamp(または lastLogonTimeStamp)はユーザーのログオン時に DC によって登録されます。ただし、あるドメイン コントローラーがログオン要求を正常に処理した場合でも、この属性がすべての DC において常に更新されるとは限りません。
インタラクティブ認証とは何ですか?
インタラクティブ認証とは、ユーザーが端末にログインするためにユーザー ID とパスワードの入力を求められるプロセスです。インタラクティブなログインが最もよく発生するのは、Windows のログオン画面と Windows のロック画面です。
共有する
もっと詳しく
著者について
Joe Dibley
セキュリティリサーチャー
Netwrix のセキュリティリサーチャーであり、Netwrix Security Research Team のメンバーです。Joe は Active Directory、Windows、およびさまざまなエンタープライズソフトウェアのプラットフォームとテクノロジーの専門家であり、新たなセキュリティリスク、複雑な攻撃手法、そしてそれに関連する緩和策と検知について研究しています。