# Ansible Tower / AWX / Automation controller Security

{{#include ../banners/hacktricks-training.md}}

## 基本情報

**Ansible Tower** またはそのオープンソース版 [**AWX**](https://github.com/ansible/awx) は、**Ansibleのユーザーインターフェース、ダッシュボード、およびREST API**として知られています。**ロールベースのアクセス制御**、ジョブスケジューリング、グラフィカルなインベントリ管理を使用して、最新のUIからAnsibleインフラストラクチャを管理できます。TowerのREST APIとコマンドラインインターフェースにより、現在のツールやワークフローに簡単に統合できます。

**Automation Controllerは新しい**バージョンのAnsible Towerで、より多くの機能を備えています。

### 違い

[**こちら**](https://blog.devops.dev/ansible-tower-vs-awx-under-the-hood-65cfec78db00)によると、Ansible TowerとAWXの主な違いは受けるサポートであり、Ansible Towerにはロールベースのアクセス制御、カスタムAPIのサポート、ユーザー定義のワークフローなどの追加機能があります。

### テクノロジースタック

- **Webインターフェース**: これは、ユーザーがインベントリ、資格情報、テンプレート、およびジョブを管理できるグラフィカルインターフェースです。直感的に設計されており、オートメーションジョブの状態と結果を理解するのに役立つ視覚化を提供します。
- **REST API**: Webインターフェースでできるすべてのことは、REST APIを介しても行えます。これにより、AWX/Towerを他のシステムと統合したり、インターフェースで通常実行するアクションをスクリプト化したりできます。
- **データベース**: AWX/Towerは、構成、ジョブ結果、およびその他の必要な運用データを保存するためにデータベース（通常はPostgreSQL）を使用します。
- **RabbitMQ**: これは、AWX/Towerが異なるコンポーネント間、特にWebサービスとタスクランナー間で通信するために使用するメッセージングシステムです。
- **Redis**: Redisは、キャッシュおよびタスクキューのバックエンドとして機能します。

### 論理コンポーネント

- **インベントリ**: インベントリは、**ジョブ**（Ansibleプレイブック）を**実行**できる**ホスト（またはノード）のコレクション**です。AWX/Towerでは、インベントリを定義してグループ化でき、AWS、Azureなどの他のシステムから**ホストリストを取得する**動的インベントリもサポートしています。
- **プロジェクト**: プロジェクトは、**バージョン管理システム**（Gitなど）から取得した**Ansibleプレイブックのコレクション**です。必要に応じて最新のプレイブックを取得します。
- **テンプレート**: ジョブテンプレートは、**特定のプレイブックがどのように実行されるか**を定義し、ジョブのための**インベントリ**、**資格情報**、およびその他の**パラメータ**を指定します。
- **資格情報**: AWX/Towerは、SSHキー、パスワード、APIトークンなどの秘密を**管理および保存する**安全な方法を提供します。これらの資格情報は、プレイブックが実行されるときに必要なアクセスを持つようにジョブテンプレートに関連付けることができます。
- **タスクエンジン**: ここで魔法が起こります。タスクエンジンはAnsibleに基づいて構築されており、**プレイブックを実行する**責任があります。ジョブはタスクエンジンに送信され、指定されたインベントリに対して指定された資格情報を使用してAnsibleプレイブックが実行されます。
- **スケジューラとコールバック**: これらはAWX/Towerの高度な機能で、**ジョブを特定の時間にスケジュール**したり、外部イベントによってトリガーしたりできます。
- **通知**: AWX/Towerは、ジョブの成功または失敗に基づいて通知を送信できます。メール、Slackメッセージ、Webhookなど、さまざまな通知手段をサポートしています。
- **Ansibleプレイブック**: Ansibleプレイブックは、構成、デプロイメント、およびオーケストレーションツールです。自動化された再現可能な方法でシステムの望ましい状態を記述します。YAMLで記述され、プレイブックはAnsibleの宣言的自動化言語を使用して、実行する必要がある構成、タスク、およびステップを記述します。

### ジョブ実行フロー

1. **ユーザーインタラクション**: ユーザーは、**Webインターフェース**または**REST API**を介してAWX/Towerと対話できます。これにより、AWX/Towerが提供するすべての機能にフロントエンドアクセスが提供されます。
2. **ジョブの開始**:
   - ユーザーは、WebインターフェースまたはAPIを介して**ジョブテンプレート**に基づいてジョブを開始します。
   - ジョブテンプレートには、**インベントリ**、**プロジェクト**（プレイブックを含む）、および**資格情報**への参照が含まれています。
   - ジョブの開始時に、実行のためにジョブをキューに入れるリクエストがAWX/Towerのバックエンドに送信されます。
3. **ジョブのキューイング**:
   - **RabbitMQ**は、Webコンポーネントとタスクランナー間のメッセージングを処理します。ジョブが開始されると、RabbitMQを使用してタスクエンジンにメッセージが送信されます。
   - **Redis**は、実行待ちのキューに入れられたジョブを管理するタスクキューのバックエンドとして機能します。
4. **ジョブの実行**:
   - **タスクエンジン**は、キューに入れられたジョブを取得します。ジョブに関連付けられたプレイブック、インベントリ、および資格情報に関する必要な情報を**データベース**から取得します。
   - 関連する**プロジェクト**から取得したAnsibleプレイブックを使用して、タスクエンジンは指定された**インベントリ**ノードに対して提供された**資格情報**を使用してプレイブックを実行します。
   - プレイブックが実行されると、その実行出力（ログ、ファクトなど）がキャプチャされ、**データベース**に保存されます。
5. **ジョブ結果**:
   - プレイブックの実行が終了すると、結果（成功、失敗、ログ）が**データベース**に保存されます。
   - ユーザーは、Webインターフェースを介して結果を表示したり、REST APIを介してクエリを実行したりできます。
   - ジョブの結果に基づいて、**通知**が送信され、ユーザーや外部システムにジョブの状態を通知できます。通知はメール、Slackメッセージ、Webhookなどです。
6. **外部システムとの統合**:
   - **インベントリ**は外部システムから動的に取得でき、AWX/TowerはAWS、Azure、VMwareなどのソースからホストを取得できます。
   - **プロジェクト**（プレイブック）はバージョン管理システムから取得でき、ジョブ実行中に最新のプレイブックを使用することが保証されます。
   - **スケジューラとコールバック**は、他のシステムやツールと統合するために使用でき、AWX/Towerが外部トリガーに反応したり、事前に決められた時間にジョブを実行したりします。

### AWXラボの作成とテスト

[**ドキュメントに従って**](https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md)、docker-composeを使用してAWXを実行することが可能です:
```bash
git clone -b x.y.z https://github.com/ansible/awx.git # Get in x.y.z the latest release version

cd awx

# Build
make docker-compose-build

# Run
make docker-compose

# Or to create a more complex env
MAIN_NODE_TYPE=control EXECUTION_NODE_COUNT=2 COMPOSE_TAG=devel make docker-compose

# Clean and build the UI
docker exec tools_awx_1 make clean-ui ui-devel

# Once migrations are completed and the UI is built, you can begin using AWX. The UI can be reached in your browser at https://localhost:8043/#/home, and the API can be found at https://localhost:8043/api/v2.

# Create an admin user
docker exec -ti tools_awx_1 awx-manage createsuperuser

# Load demo data
docker exec tools_awx_1 awx-manage create_preload_data
```
## RBAC

### サポートされている役割

最も特権のある役割は**システム管理者**と呼ばれます。この役割を持つ者は**何でも変更**できます。

**ホワイトボックスセキュリティ**レビューでは、**システム監査者役割**が必要で、これにより**すべてのシステムデータを表示**できますが、変更はできません。別の選択肢として**組織監査者役割**を取得することもできますが、前者を取得する方が良いでしょう。

<details>

<summary>利用可能な役割の詳細な説明を表示するにはここを展開してください</summary>

1. **システム管理者**:
- これは、システム内の任意のリソースにアクセスし、変更する権限を持つスーパーユーザー役割です。
- すべての組織、チーム、プロジェクト、インベントリ、ジョブテンプレートなどを管理できます。
2. **システム監査者**:
- この役割を持つユーザーは、すべてのシステムデータを表示できますが、変更はできません。
- この役割は、コンプライアンスと監視のために設計されています。
3. **組織の役割**:
- **管理者**: 組織のリソースに対する完全な制御。
- **監査者**: 組織のリソースへの表示専用アクセス。
- **メンバー**: 特定の権限なしでの組織の基本メンバーシップ。
- **実行**: 組織内でジョブテンプレートを実行できます。
- **読み取り**: 組織のリソースを表示できます。
4. **プロジェクトの役割**:
- **管理者**: プロジェクトを管理および変更できます。
- **使用**: ジョブテンプレートでプロジェクトを使用できます。
- **更新**: SCM（ソース管理）を使用してプロジェクトを更新できます。
5. **インベントリの役割**:
- **管理者**: インベントリを管理および変更できます。
- **アドホック**: インベントリ上でアドホックコマンドを実行できます。
- **更新**: インベントリソースを更新できます。
- **使用**: ジョブテンプレートでインベントリを使用できます。
- **読み取り**: 表示専用アクセス。
6. **ジョブテンプレートの役割**:
- **管理者**: ジョブテンプレートを管理および変更できます。
- **実行**: ジョブを実行できます。
- **読み取り**: 表示専用アクセス。
7. **資格情報の役割**:
- **管理者**: 資格情報を管理および変更できます。
- **使用**: ジョブテンプレートやその他の関連リソースで資格情報を使用できます。
- **読み取り**: 表示専用アクセス。
8. **チームの役割**:
- **メンバー**: チームの一部ですが、特定の権限はありません。
- **管理者**: チームのメンバーと関連リソースを管理できます。
9. **ワークフローの役割**:
- **管理者**: ワークフローを管理および変更できます。
- **実行**: ワークフローを実行できます。
- **読み取り**: 表示専用アクセス。

</details>

## AnsibleHoundによる列挙と攻撃経路マッピング

`AnsibleHound`は、Goで書かれたオープンソースのBloodHound *OpenGraph*コレクターで、**読み取り専用**のAnsible Tower/AWX/Automation Controller APIトークンを完全な権限グラフに変換し、BloodHound（またはBloodHound Enterprise）内で分析できるようにします。

### これはなぜ便利ですか？
1. Tower/AWX REST APIは非常に豊富で、インスタンスが知っている**すべてのオブジェクトとRBAC関係**を公開しています。
2. 最も低い権限（**読み取り**）のトークンでも、すべてのアクセス可能なリソース（組織、インベントリ、ホスト、資格情報、プロジェクト、ジョブテンプレート、ユーザー、チーム…）を再帰的に列挙することが可能です。
3. 生データがBloodHoundスキーマに変換されると、Active Directory評価で非常に人気のある*攻撃経路*の視覚化機能を得ることができますが、今度はあなたのCI/CD環境に向けられています。

したがって、セキュリティチーム（および攻撃者！）は：
* **誰が何の管理者になれるか**を迅速に理解できます。
* **特権のないアカウントから到達可能な資格情報やホスト**を特定できます。
* 複数の「読み取り ➜ 使用 ➜ 実行 ➜ 管理者」エッジを連鎖させて、Towerインスタンスまたは基盤となるインフラストラクチャを完全に制御できます。

### 前提条件
* HTTPS経由でアクセス可能なAnsible Tower / AWX / Automation Controller。
* **読み取り**のみにスコープを持つユーザーAPIトークン（*ユーザー詳細 → トークン → トークンを作成 → スコープ = 読み取り*から作成）。
* コレクターをコンパイルするためのGo ≥ 1.20（または事前ビルドされたバイナリを使用）。 

### ビルドと実行
```bash
# Compile the collector
cd collector
go build . -o build/ansiblehound

# Execute against the target instance
./build/ansiblehound -u "https://tower.example.com/" -t "READ_ONLY_TOKEN"
```
内部的にAnsibleHoundは、少なくとも以下のエンドポイントに対して*ページネーション*された`GET`リクエストを実行し、すべてのJSONオブジェクトで返される`related`リンクを自動的に追跡します:
```
/api/v2/organizations/
/api/v2/inventories/
/api/v2/hosts/
/api/v2/job_templates/
/api/v2/projects/
/api/v2/credentials/
/api/v2/users/
/api/v2/teams/
```
すべての収集されたページは、ディスク上の単一のJSONファイルにマージされます（デフォルト: `ansiblehound-output.json`）。

### BloodHound 変換
生のTowerデータは、`AT`（Ansible Tower）でプレフィックスされたカスタムノードを使用して**BloodHound OpenGraph**に**変換**されます：
* `ATOrganization`, `ATInventory`, `ATHost`, `ATJobTemplate`, `ATProject`, `ATCredential`, `ATUser`, `ATTeam`

および関係/特権をモデル化するエッジ：
* `ATContains`, `ATUses`, `ATExecute`, `ATRead`, `ATAdmin`

結果はBloodHoundに直接インポートできます：
```bash
neo4j stop   # if BloodHound CE is running locally
bloodhound-import ansiblehound-output.json
```
オプションで、**カスタムアイコン**をアップロードして、新しいノードタイプを視覚的に区別することができます:
```bash
python3 scripts/import-icons.py "https://bloodhound.example.com" "BH_JWT_TOKEN"
```
### Defensive & Offensive Considerations
* *Read* トークンは通常無害と見なされますが、**完全なトポロジーとすべての認証情報メタデータ**を漏洩します。機密情報として扱ってください！
* **最小特権**を強制し、未使用のトークンを回転/取り消ししてください。
* APIの過剰な列挙（複数の連続した `GET` リクエスト、高いページネーション活動）を監視してください。
* 攻撃者の視点から見ると、これはCI/CDパイプライン内での完璧な*初期の足場 → 特権昇格*手法です。

## References
* [AnsibleHound – BloodHound Collector for Ansible Tower/AWX](https://github.com/TheSleekBoyCompany/AnsibleHound)
* [BloodHound OSS](https://github.com/BloodHoundAD/BloodHound)

{{#include ../banners/hacktricks-training.md}}
