# ゴールデンイメージへの Device Protection のデプロイ

Packer やその他のイメージパイプラインで独自の Linux イメージを構築している場合は、ビルド中に Device Protection をインストールしてください。そうすることで、そのイメージから作成されるすべてのマシンが初回起動時から保護され、実行時にインストール手順を行う必要がなくなります。

まず [Install Device Protection for Linux](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) で説明しています。

## ビルド中にインストールする

{% code title="workstation.pkr.hcl" overflow="wrap" %}
```hcl
variable "aikido_token" {
  type      = string
  sensitive = true
}

build {
  sources = ["source.amazon-ebs.workstation"]

  provisioner "shell" {
    environment_vars = [
      "AIKIDO_TOKEN=${var.aikido_token}",
    ]
    inline = [
      "curl -fsSLo /tmp/aikido.deb https://github.com/AikidoSec/safechain-internals/releases/latest/download/EndpointProtection-amd64.deb",
      "sudo AIKIDO_TOKEN=\"$AIKIDO_TOKEN\" apt-get install -y /tmp/aikido.deb",
      "rm -f /tmp/aikido.deb",
      "systemctl is-enabled aikido-endpoint-protection",
      "sudo truncate -s 0 /etc/machine-id",
    ]
  }
}
```
{% endcode %}

初回起動まで先送りする必要のある処理はありません。パッケージはビルド中にデバイスを登録します。このビルドで知っておくべき点が 3 つあります。

* トークンは `.pkrvars.hcl` ファイルではなく、シークレットストアから渡してください。例: `PKR_VAR_aikido_token=$(...) packer build .`。変数を `sensitive` としてマークすると、Packer の出力に表示されなくなります。[ログと state にトークンを残さない](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/linux-rollout-reference#keep-the-token-out-of-logs-and-state)を参照してください。
* `systemctl is-enabled` は、サービスが有効化されなかった場合にビルドを失敗させます。これはまさに必要なチェックです。壊れたイメージを後から見つけるほうがはるかにコストがかかります。
* `truncate -s 0 /etc/machine-id` は最後に実行するため、各マシンの初回起動時に systemd が新しい ID を書き込みます。これは省略できません。マシン ID を共有するマシンは、デバイスリスト上で 1 つのエントリを共有してしまいます。[デバイスの識別方法](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/linux-rollout-reference#how-devices-are-identified)を参照してください。

{% hint style="info" %}
Packer がビルドに使用するインスタンスはインストール中に自身を登録し、ビルドが完了すると消えます。そのエントリが非アクティブなデバイスとしてデバイスリストに残らないよう削除してください。[デバイスの削除](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/connecting-and-managing-devices#removing-a-device)を参照してください。
{% endhint %}

## 1 つのイメージに 1 つのユーザーグループ

トークンによってデバイスが参加する Aikido の[ユーザーグループ](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/user-groups-for-aikido-endpoint)が決まるため、ベイクされたイメージは 1 つのユーザーグループに属します。1 つのイメージで複数のグループに対応する必要がある場合は、トークンをイメージに含めず、パッケージファイルのみを配置してください。

{% code title="workstation.pkr.hcl" overflow="wrap" %}
```hcl
provisioner "shell" {
  inline = [
    "sudo mkdir -p /var/cache/aikido",
    "sudo curl -fsSLo /var/cache/aikido/EndpointProtection-amd64.deb https://github.com/AikidoSec/safechain-internals/releases/latest/download/EndpointProtection-amd64.deb",
  ]
}
```
{% endcode %}

その後、初回起動時に、そのマシンが属するグループのトークンを使用して、配置済みのファイルからインストールします。

{% code title="user-data" %}
```yaml
#cloud-config
runcmd:
  - AIKIDO_TOKEN=<your-token> apt-get install -y /var/cache/aikido/EndpointProtection-amd64.deb
```
{% endcode %}

これにより、初回起動時に GitHub へのネットワークアクセスが不要になります。その document の残りの部分については [cloud-init](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/deploy-device-protection-with-cloud-init) を参照してください。

## ロールアウトの確認

完成したイメージから 1 台のマシンを起動し、次を確認します。

{% code overflow="wrap" %}
```bash
cat /etc/machine-id
systemctl is-active aikido-endpoint-protection
aikidoctl version
```
{% endcode %}

同じイメージから 2 台目のマシンを起動し、2 つのマシン ID が異なること、および両方が **Active** ステータスで[デバイスリスト](https://app.aikido.dev/endpoint-protection/devices)に表示されることを確認してください。

イメージにはビルド時点の最新バージョンが固定されます。そのため、通常のイメージ更新サイクルで再ビルドし、古いイメージから既に稼働しているマシンは[新しいパッケージを上書きインストール](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/linux-rollout-reference#versions-and-upgrades)してアップグレードしてください。

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


| 問題                                                                                  | 対処法                                                                                                                                                                                                                                             |
| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| パッケージはインストールされるが、デバイスがダッシュボードに表示されない                       | インストールコマンドに `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) を参照してください |
