Windowsセキュリティインターナル
PowerShellで理解するWindowsの認証、認可、監査の仕組み
- James Forshaw 著、北原 憲 訳
- 2025年03月 発行
- 616ページ
- ISBN978-4-8144-0106-2
- フォーマット Print PDF ePub
- 原書: Windows Security Internals
6,820円
書籍のご注文はオーム社サイトへ
内容
本書の著者であるJames Forshawは、Windows OSのセキュリティ技術を専門とする世界的に名の知れた最高峰の技術者であり、Windows OS自体の脆弱性や攻撃手法を数多く発見しています。本書では、PowerShell環境のセットアップ、Windowsカーネルインタフェースの理解、セキュリティ参照モニター内での処理などのベストプラクティスを含む基本的な内容から、アクセス検証やネットワーク認証といった複雑な処理の実装など、より高度なトピックまでを、関連性の高いケーススタディを通して説明します。さらに、PowerShellを使用したスクリプト例を随所に掲載し、Windowsシステムの動作をテストしたり、コンパイラやその他の開発ツールを使用せずにセキュリティを調査したりする方法を学ぶことができます。
関連書籍
目次
訳者まえがき
序文
謝辞
まえがき
第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の鍵生成
初期認証での公開鍵の使用
プロキシによる検証の回避