本書の著者であるJames Forshawは、Windows OSのセキュリティ技術を専門とする世界的に名の知れた最高峰の技術者であり、Windows OS自体の脆弱性や攻撃手法を数多く発見しています。本書では、PowerShell環境のセットアップ、Windowsカーネルインタフェースの理解、セキュリティ参照モニター内での処理などのベストプラクティスを含む基本的な内容から、アクセス検証やネットワーク認証といった複雑な処理の実装など、より高度なトピックまでを、関連性の高いケーススタディを通して説明します。さらに、PowerShellを使用したスクリプト例を随所に掲載し、Windowsシステムの動作をテストしたり、コンパイラやその他の開発ツールを使用せずにセキュリティを調査したりする方法を学ぶことができます。
Windowsセキュリティインターナル
―PowerShellで理解するWindowsの認証、認可、監査の仕組み
James Forshaw 著、北原 憲 訳
![[cover photo]](https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0106-2.jpeg)
- TOPICS
- Security
- 発行年月日
- 2025年03月
- PRINT LENGTH
- 616
- ISBN
- 978-4-8144-0106-2
- 原書
- Windows Security Internals
- FORMAT
- Print PDF EPUB
正誤表
ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。
第1刷正誤表
2025年3月更新
■P.52 2段落目5行目
【誤】その最小単位が4.096バイトだからです。
【正】その最小単位が4,096バイトだからです。
■P.52 2段落目5行目
【誤】その最小単位が4.096バイトだからです。
【正】その最小単位が4,096バイトだからです。
目次
訳者まえがき 序文 謝辞 まえがき 第I部 Windows OSの概要 1章 検証用PowerShell環境の構築 1.1 PowerShellのバージョン選定 1.2 PowerShellの設定 1.3 PowerShellの概要 1.3.1 型、変数、表現 1.3.2 コマンドの実行 1.3.3 コマンドやヘルプの出力 1.3.4 関数の定義 1.3.5 オブジェクトの表示と操作 1.3.6 オブジェクトの抽出、整列、グループ化 1.3.7 データのエクスポート 1.4 まとめ 2章 Windowsカーネル 2.1 Windowsカーネルエグゼクティブ 2.2 セキュリティ参照モニター 2.3 オブジェクトマネージャー 2.3.1 オブジェクトの型 2.3.2 オブジェクトマネージャー名前空間 2.3.3 システムコール 2.3.4 NTSTATUSコード 2.3.5 オブジェクトハンドル 2.3.6 情報の要求と設定をするシステムコール 2.4 I/Oマネージャー 2.5 プロセスマネージャーとスレッドマネージャー 2.6 メモリマネージャー 2.6.1 NtVirtualMemoryコマンド 2.6.2 Sectionオブジェクト 2.7 コード整合性 2.8 Advanced Local Procedure Call 2.9 構成マネージャー 2.10 実践例 2.10.1 名前を用いた開かれたハンドルの発見 2.10.2 共有オブジェクトの発見 2.10.3 配置されたセクションの変更 2.10.4 書き込み実行可能なメモリの発見 2.11 まとめ 3章 ユーザーモードアプリケーション 3.1 Win32とユーザーモードWindows API 3.1.1 新規ライブラリの読み込み 3.1.2 インポートAPIの列挙 3.1.3 DLLの探索 3.2 Win32 GUI 3.2.1 GUIのカーネルリソース 3.2.2 ウィンドウメッセージ 3.2.3 コンソールセッション 3.3 Win32 APIとシステムコールの比較 3.4 Win32レジストリパス 3.4.1 レジストリキーへのアクセス 3.4.2 レジストリの内容の確認 3.5 DOSデバイスパス 3.5.1 パスの種類 3.5.2 パスの最大長 3.6 プロセスの生成 3.6.1 コマンドラインの解釈 3.6.2 Shell API 3.7 システムプロセス 3.7.1 セッションマネージャー 3.7.2 Windows Logonプロセス 3.7.3 ローカルセキュリティ機関サブシステム 3.7.4 サービス制御マネージャー 3.8 実践例 3.8.1 特定のAPIをインポートしている実行ファイルの探索 3.8.2 隠されたレジストリキーとレジストリ値の発見 3.9 まとめ 第II部 セキュリティ参照モニター 4章 セキュリティアクセストークン 4.1 プライマリトークン 4.2 偽装トークン 4.2.1 Security Quality of Service 4.2.2 明示的なトークンの偽装 4.3 トークンの変換 4.4 疑似トークンハンドル 4.5 トークングループ 4.5.1 Enabled、EnabledByDefault、Mandatory 4.5.2 LogonId 4.5.3 Owner 4.5.4 UseForDenyOnly 4.5.5 Integrity、IntegrityEnabled 4.5.6 Resource 4.5.7 デバイスグループ 4.6 特権 4.7 サンドボックストークン 4.7.1 制限付きトークン 4.7.2 書き込み制限付きトークン 4.7.3 AppContainerとLowboxトークン 4.8 管理者を決定する要素 4.9 ユーザーアカウント制御 4.9.1 Linkedトークンと昇格の種類 4.9.2 UIアクセス 4.9.3 仮想化 4.10 セキュリティ属性 4.11 トークンの作成 4.12 トークンの割り当て 4.12.1 プライマリトークンの割り当て 4.12.2 偽装トークンの割り当て 4.13 実践例 4.13.1 UIアクセスプロセスの探索 4.13.2 偽装のためのトークンハンドルの探索 4.13.3 管理者権限の除去 4.14 まとめ 5章 セキュリティ記述子 5.1 セキュリティ記述子の構造 5.2 SIDの構造 5.3 絶対セキュリティ記述子と相対セキュリティ記述子 5.4 アクセス制御リストのヘッダーとエントリ 5.4.1 ヘッダー 5.4.2 ACEリスト 5.5 セキュリティ記述子の構築と操作 5.5.1 新しいセキュリティ記述子の作成 5.5.2 ACEの順序 5.5.3 セキュリティ記述子の書式化 5.5.4 相対セキュリティ記述子の変換 5.6 セキュリティ記述子定義言語 5.7 実践例 5.7.1 バイナリSIDの手動での解読 5.7.2 SIDの列挙 5.8 まとめ 6章 セキュリティ記述子の読み取りと割り当て 6.1 セキュリティ記述子の読み取り 6.2 セキュリティ記述子の割り当て 6.2.1 リソース作成時のセキュリティ記述子の割り当て 6.2.2 既存のリソースへのセキュリティ記述子の割り当て 6.3 Win32セキュリティAPI 6.4 サーバーセキュリティ記述子と複合ACE 6.5 継承動作の要約 6.6 実践例 6.6.1 オブジェクトマネージャーのリソース所有者の探索 6.6.2 リソース所有権の変更 6.7 まとめ 7章 アクセス検証処理 7.1 アクセス検証の実行 7.1.1 カーネルモードでのアクセス検証 7.1.2 ユーザーモードのアクセス検証 7.1.3 Get-NtGrantedAccessコマンド 7.2 PowerShellでのアクセス検証処理 7.2.1 アクセス検証関数の定義 7.2.2 強制アクセス検証の実施 7.2.3 トークンアクセス検証の実施 7.2.4 随意アクセス検証の実施 7.3 サンドボックス処理 7.3.1 制限付きトークン 7.3.2 Lowboxトークン 7.4 企業環境でのアクセス検証 7.4.1 オブジェクト型のアクセス検証 7.4.2 集約型アクセスポリシー 7.5 実践例 7.5.1 Get-PSGrantedAccess関数の使用 7.5.2 リソースに対して許可されるアクセス権限の計算 7.6 まとめ 8章 その他のアクセス検証の実例 8.1 トラバーサル検証 8.1.1 SeChangeNotifyPrivilege 8.1.2 限定的な検証 8.2 ハンドル複製でのアクセス検証 8.3 サンドボックストークンの検証 8.4 アクセス検証の自動化 8.5 実践例 8.5.1 オブジェクトに対するアクセス検証の簡略化 8.5.2 書き込み可能なSectionオブジェクトの探索 8.6 まとめ 9章 セキュリティ監査 9.1 セキュリティイベントログ 9.1.1 システム監査ポリシーの設定 9.1.2 ユーザー個別の監査ポリシーの設定 9.2 監査ポリシーのセキュリティ 9.2.1 リソースSACLの設定 9.2.2 グローバルなSACLの構成 9.3 実践例 9.3.1 監査アクセスセキュリティの検証 9.3.2 監査ACEが設定されたリソースの探索 9.4 まとめ 第III部 ローカルセキュリティ機関と認証 10章 Windowsでの認証 10.1 ドメイン認証 10.1.1 ローカル認証 10.1.2 企業ネットワークドメイン 10.1.3 ドメインフォレスト 10.2 ローカルドメイン構成 10.2.1 ユーザーデータベース 10.2.2 LSAポリシーデータベース 10.3 リモートLSAサービス 10.3.1 SAMリモートサービス 10.3.2 ドメインポリシーリモートサービス 10.4 SAMデータベースとSECURITYデータベース 10.4.1 レジストリを介したSAMデータベースへのアクセス 10.4.2 SECURITYデータベースの調査 10.5 実践例 10.5.1 RIDサイクリング 10.5.2 ユーザーパスワードの強制変更 10.5.3 すべてのローカルユーザーハッシュ値の抽出 10.6 まとめ 11章 Active Directory 11.1 Active Directoryの歴史の概要 11.2 PowerShellによるActive Directoryドメインの調査 11.2.1 リモートサーバー管理ツール 11.2.2 フォレストとドメインの基本情報 11.2.3 ユーザー情報の列挙 11.2.4 グループ情報の列挙 11.2.5 コンピューター情報の列挙 11.3 オブジェクトと識別名 11.3.1 ディレクトリオブジェクトの列挙 11.3.2 他ドメインのオブジェクトへのアクセス 11.4 スキーマ 11.4.1 スキーマの調査 11.4.2 セキュリティ属性へのアクセス 11.5 セキュリティ記述子 11.5.1 ディレクトリオブジェクトに対するセキュリティ記述子の照会 11.5.2 新規ディレクトリオブジェクトへのセキュリティ記述子の割り当て 11.5.3 既存オブジェクトへのセキュリティ記述子の割り当て 11.5.4 セキュリティ記述子の継承されたセキュリティ設定の調査 11.6 アクセス検証 11.6.1 オブジェクトの作成 11.6.2 オブジェクトの削除 11.6.3 オブジェクトの列挙 11.6.4 属性値の読み取りと書き込み 11.6.5 複数の属性値の検証 11.6.6 プロパティセットの確認 11.6.7 制御アクセス権限の調査 11.6.8 検証された書き込みアクセス権限の解析 11.6.9 SELF SIDへのアクセス 11.6.10 追加セキュリティ検証の実施 11.7 クレームと集約型アクセスポリシー 11.8 グループポリシー 11.9 実践例 11.9.1 認可コンテキストの構築 11.9.2 オブジェクト情報の収集 11.9.3 アクセス検証の実施 11.10 まとめ 12章 対話型認証 12.1 ユーザーのデスクトップの作成 12.2 LsaLogonUser API 12.2.1 ローカル認証 12.2.2 ドメイン認証 12.2.3 ログオンセッションとコンソールセッション 12.2.4 トークンの作成 12.3 PowerShellからのLsaLogonUser APIの呼び出し 12.4 トークンを用いた新規プロセスの作成 12.5 Serviceログオン 12.6 実践例 12.6.1 特権とログオンアカウント権限のテスト 12.6.2 異なるコンソールセッションでのプロセス作成 12.6.3 仮想アカウントでの認証 12.7 まとめ 13章 ネットワーク認証 13.1 NTLMネットワーク認証 13.1.1 PowerShellによるNTLM認証 13.1.2 暗号学的な導出処理 13.1.3 パススルー認証 13.1.4 ローカルループバック認証 13.1.5 その他のクライアント資格情報 13.2 NTLMリレー攻撃 13.2.1 攻撃手法の概要 13.2.2 アクティブサーバーチャレンジ 13.2.3 署名とシール 13.2.4 対象名 13.2.5 チャネルバインディング 13.3 実践例 13.3.1 概要 13.3.2 基本モジュールの実装 13.3.3 サーバーの実装 13.3.4 クライアントの実装 13.3.5 NTLM認証のテスト 13.4 まとめ 14章 Kerberos 14.1 Kerberosでの対話型認証 14.1.1 最初のユーザー認証 14.1.2 ネットワークサービス認証 14.2 PowerShellでのKerberos認証の実行 14.3 AP-REQメッセージの復号 14.4 AP-REPメッセージの復号 14.5 ドメイン間認証 14.6 Kerberosの委任 14.6.1 制約のない委任 14.6.2 制約付き委任 14.7 ユーザー間Kerberos認証 14.8 実践例 14.8.1 Kerberosチケットキャッシュの照会 14.8.2 簡易的なKerberoast 14.9 まとめ 15章 Negotiate認証とその他のセキュリティパッケージ 15.1 セキュリティバッファー 15.1.1 認証コンテキストでのバッファーの使用 15.1.2 署名とシールでのバッファーの使用 15.2 Negotiateプロトコル 15.3 一般的ではないセキュリティパッケージ 15.3.1 Secure Channel 15.3.2 CredSSP 15.4 Remote Credential Guardと制限付き管理モード 15.5 資格情報マネージャー 15.6 追加リクエスト属性フラグ 15.6.1 匿名セッション 15.6.2 Identityトークン 15.7 Lowboxトークンによるネットワーク認証 15.7.1 エンタープライズ認証機能による認証 15.7.2 既知のWebプロキシへの認証 15.7.3 明示的な資格情報による認証 15.8 認証監査イベントログ 15.9 実践例 15.9.1 認証が失敗した原因の特定 15.9.2 Secure Channelを用いたサーバーTLS証明書の抽出 15.10 まとめ 15.11 総括 付録A 検証用Windowsドメインネットワーク環境の構築 A.1 ドメインネットワーク A.2 Windows Hyper-Vのインストールと設定 A.3 仮想マシンの作成 A.3.1 PRIMARYDCサーバー A.3.2 GRAPHITEワークステーション A.3.3 SALESDCサーバー 付録B SDDL SIDエイリアスの対応関係 索引 コラム目次 Software Development Kitでの命名 永続オブジェクト APIセット DLLの拡張子 シャッター攻撃 リモートデスクトップサービスの起源 ローカル一意識別子 匿名ユーザー Internet Explorerの保護モード 整合性レベルHighは管理者を意味しない 無名オブジェクトのハンドルの複製 自動継承の危険性 スレッドプロセスコンテキスト ALARM ACEの謎 セキュア文字列 子クラスの悪用 リモートアクセス検証プロトコル SECURE ATTENTION SEQUENCE ドメイン資格情報のキャッシュ ネットワーク資格情報 パスワードの解析 ネットワーク認証とローカル管理者 ゴールデンチケット シルバーチケットとKerberoast AESの鍵生成 初期認証での公開鍵の使用 プロキシによる検証の回避