# cloud-init で Device Protection をデプロイする

cloud-init は新しいマシンの初回起動時に実行されるため、誰かがログインする前に Device Protection をインストールしておく最も簡単な方法です。AWS、Azure、GCP、OpenStack、Proxmox、素の libvirt イメージなど、cloud-init が動作する環境であればどこでも利用できます。

すべての方法で共通して使用するトークン、パッケージ、インストールオプションについては、まず [Linux 向け Device Protection のインストール](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux)をお読みください。トークンの扱い、再起動、繰り返し実行、デバイスの識別などその他の事項は [Linux Rollout Reference](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/linux-rollout-reference) で説明しています。

## ユーザーデータを設定する

エージェントはディストリビューションのリポジトリで公開されていないため、`packages:` モジュールではインストールできません。パッケージをダウンロードし、`runcmd` からインストールしてください。

{% tabs %}
{% tab title="Ubuntu / Debian" %}
{% code title="user-data" overflow="wrap" %}
```yaml
#cloud-config
runcmd:
  - curl -fsSLo /tmp/aikido.deb https://github.com/AikidoSec/safechain-internals/releases/latest/download/EndpointProtection-amd64.deb
  - AIKIDO_TOKEN=<your-token> apt-get install -y /tmp/aikido.deb
  - rm -f /tmp/aikido.deb
```
{% endcode %}
{% endtab %}

{% tab title="RHEL / Rocky Linux / CentOS" %}
{% code title="user-data" overflow="wrap" %}
```yaml
#cloud-config
runcmd:
  - curl -fsSLo /tmp/aikido.rpm https://github.com/AikidoSec/safechain-internals/releases/latest/download/EndpointProtection-amd64.el9.rpm
  - AIKIDO_TOKEN=<your-token> dnf install -y /tmp/aikido.rpm
  - rm -f /tmp/aikido.rpm
```
{% endcode %}

バージョン 10 では `el10` パッケージを使用してください。
{% endtab %}
{% endtabs %}

パッケージ自体が `aikido-endpoint-protection` サービスを有効化して起動するため、そのための追加設定は不要です。

パッケージ名がそれぞれ異なるため、1 つのドキュメントは 1 つのイメージファミリー、1 つのアーキテクチャ、そして Red Hat 系イメージの場合は 1 つのメジャーバージョンに対応します。`runcmd` に判定ロジックを追加するのではなく、イメージごとにドキュメントを用意してください。

{% hint style="warning" %}
`runcmd` に直接記述したトークンは秘匿されません。ユーザーデータはマシン上で動作するあらゆるものからインスタンスメタデータサービス経由で読み取り可能であり、cloud-init は実行したコマンドを `/var/log/cloud-init-output.log` に書き込みます。簡単なテスト以外の用途では、代わりに[起動時にシークレットストアからトークンを取得](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/linux-rollout-reference#fetch-the-token-at-boot-instead)してください。
{% endhint %}

{% hint style="info" %}
`runcmd` は初回起動時にのみ実行されるため、ユーザーデータを変更しても既に稼働中のマシンには影響しません。フリートを管理する手段ではなく、イメージの設定として扱ってください。既存のマシンには [Ansible](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/deploy-device-protection-with-ansible)、[Chef](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/deploy-device-protection-with-chef)、または [Puppet](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/deploy-device-protection-with-puppet) を使用してください。
{% endhint %}

## 初回起動の最後に再起動する

`runcmd` は起動処理の後半で実行されます。これは、インストール時にシステム全体に設定される Aikido CA 環境変数に関係します。起動後のログインではこれらが反映されますが、コンテナランタイムやビルドエージェントなど、同じ起動中にそれより前に開始されたサービスには反映されません。マシンでそのようなサービスを実行している場合は、インストール完了後に一度再起動するよう `power_state` を追加してください。

{% code title="user-data" overflow="wrap" %}
```yaml
#cloud-config
runcmd:
  - curl -fsSLo /tmp/aikido.deb https://github.com/AikidoSec/safechain-internals/releases/latest/download/EndpointProtection-amd64.deb
  - AIKIDO_TOKEN=<your-token> apt-get install -y /tmp/aikido.deb
  - rm -f /tmp/aikido.deb

power_state:
  mode: reboot
  message: Rebooting to activate Aikido Device Protection
  condition: true
```
{% endcode %}

## ロールアウトを確認する

新しいマシンで次を実行します。

{% code overflow="wrap" %}
```bash
cloud-init status --wait
systemctl is-active aikido-endpoint-protection
aikidoctl version
```
{% endcode %}

インストールに失敗した場合は、`/var/log/cloud-init-output.log` にパッケージマネージャーの出力が記録されています。デバイスは [デバイス一覧](https://app.aikido.dev/endpoint-protection/devices) に **Active** ステータスで表示されます。

## トラブルシューティング


| 問題                                                                                  | 対処法                                                                                                                                                                                                                                             |
| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| パッケージはインストールされるが、デバイスがダッシュボードに表示されない                       | インストールコマンドに `AIKIDO_TOKEN` が設定されていませんでした。構成管理ツールはローカル環境をホストに転送しないため、タスク自体に変数を設定してから、パッケージを再度インストールしてください                                    |
| `apt` または `dnf` がファイルをインストールせず、リポジトリ内でパッケージを探してしまう | 名前ではなくパスを指定してください: `apt install ./EndpointProtection-amd64.deb`。先頭の `./` によって、パッケージマネージャーはそれをローカルファイルとして扱います                                                                                              |
| Red Hat 系のホストでインストールが失敗する                                               | ビルドをメジャーバージョンに合わせてください。バージョン 9 では `el9` パッケージを、バージョン 10 では `el10` パッケージを使用します                                                                                                                                   |
| サービスが実行されていない                                                               | `systemctl status aikido-endpoint-protection` を実行し、次に `sudo aikidoctl diagnostics` を実行して詳細を送信してください                                                                                                                                 |
| Node.js または uv が依然として Aikido 証明書を拒否する                                        | インストール時に `NODE_EXTRA_CA_CERTS` と `UV_SYSTEM_CERTS` がシステム全体に設定されますが、実行中のシェルにはこれらが反映されません。新しいログインシェルを開くか、デバイスを再起動してください                                                                                    |
| トークンが実行出力やログに表示される                                                 | ツールのマスキング機能を使用してください: Ansible では `no_log`、Chef では `sensitive true`、Puppet では `Sensitive()`                                                                                                                                               |
| 複数のマシンがデバイス一覧で 1 つのエントリを共有している                                      | それらのマシンは同じ `/etc/machine-id` で起動しています。Linux のデバイス ID はこのファイルに基づくため、クローン元のイメージでこのファイルをクリアし、初回起動時に systemd に新しいものを書き込ませてください                                                                |
| トレイアイコンが表示されない                                                                     | Ubuntu 以外の GNOME では想定どおりの動作であり、見た目上の問題にすぎません。[Tray Icon Support on Linux](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux/tray-icon-support-on-linux) を参照してください |
