# Linux ロールアウトリファレンス

[Linux へのデプロイ](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux)にあるどの方法も、行うことは同じです。ホストに合ったパッケージを取得し、環境にユーザーグループトークンを設定した状態でインストールし、その後ユーザーに新しいログインシェルを使ってもらいます。このページでは、これらの共通手順を一度にまとめて説明します。各ガイドでは、それぞれのツールでの実行方法を示し、その理由についてはこのページにリンクしています。

## トークンがパッケージに渡る仕組み

`.deb` および `.rpm` パッケージは、インストール中に `AIKIDO_TOKEN` を読み取り、そのトークンに対してデバイスを登録します。この変数は `apt`、`dnf`、または `dpkg` を実行するプロセスの環境に存在する必要があります。そのため、どのガイドでも他の場所ではなくインストールステップそのものに変数を設定しています。

事前に自分のシェルで `AIKIDO_TOKEN` を設定しても効果はありません。Ansible、Chef、Puppet は、実行元マシンの環境を転送しません。また、Docker ビルドからも参照できません。

1 つのトークンは 1 つの Aikido [ユーザーグループ](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/user-groups-for-aikido-endpoint)に対応します。デバイスがどのグループに参加するかを決めるのがトークンだからです。異なるグループのマシンにはそれぞれトークンが必要で、別々のインベントリグループ、Hiera レイヤー、データバッグアイテム、またはモジュールインスタンスで管理します。

## トークンをログや状態に残さない

トークンが必要なのは初回インストール時だけですが、ほとんどのツールは実行内容を記録します。どのガイドでも各ツールの秘匿化機能を使用しているため、確認すべきなのは値がまだ残ってしまう場所です。

| ツール       | トークンが漏洩する可能性のある場所                                                                    |
| ---------- | --------------------------------------------------------------------------------------------------- |
| Ansible    | 平文のグループ変数。Ansible Vault で管理してください                                                   |
| Chef       | 平文のデータバッグ。暗号化データバッグまたは Chef Vault を使用してください                                     |
| Puppet     | ディスク上のインストールスクリプト、および `/opt/puppetlabs/puppet/cache` にキャッシュされたカタログ           |
| Terraform  | `user_data` にレンダリングされるものはすべて状態に残ります。`TF_LOG=DEBUG` の出力も秘匿化されません       |
| Packer     | `.pkrvars.hcl` ファイル。代わりにシークレットストアからトークンを渡してください                           |
| cloud-init | インスタンスメタデータサービス、および `/var/log/cloud-init-output.log`                               |
| Docker     | トークンを `--build-arg` で渡した場合、イメージとそのビルド履歴                      |

{% hint style="warning" %}
秘匿化を行うと、インストール失敗時に必要なエラーも隠れてしまいます。フリート全体ではなく、テスト用の 1 台のホストでのみ無効にしてください。
{% endhint %}

### 代わりに起動時にトークンを取得する

クラウドインスタンスでユーザーデータや状態の問題を解決する最もクリーンな方法は、そもそもトークンをそこに置かないことです。シークレットストアを読み取れる ID をマシンに付与し、インストール時にトークンを取得させます。

{% 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=$(aws ssm get-parameter \
      --name /aikido/device-protection-token \
      --with-decryption \
      --query Parameter.Value \
      --output text)
    export AIKIDO_TOKEN
    apt-get install -y /tmp/aikido.deb
  - rm -f /tmp/aikido.deb
```
{% endcode %}

取得処理はお使いのクラウドに合わせて置き換えてください。マネージド ID を使う場合は `az keyvault secret show`、サービスアカウントを使う場合は `gcloud secrets versions access` です。

## 保護が有効になるタイミング

インストールにより、システム全体の環境変数（`NODE_EXTRA_CA_CERTS` と `UV_SYSTEM_CERTS`）を通じて Node.js と uv が Aikido CA を参照するようになります。すでに実行中のシェルやサービスはこれらの変数を認識しないため、保護が完全になるのは新しいログインシェルを開くか再起動した後です。

利用者が作業中のマシンを自動化の実行から再起動しないでください。それらのユーザーにはログアウトして再ログインしてもらうか、メンテナンス時間帯に再起動してください。無人のマシンについては、インストールの最後に再起動します。その方法は各ガイドでツールごとに示しています。

## 繰り返し実行の負荷を抑える

Ansible、Chef、Puppet はプレイやコンバージのたびに再実行されるため、ダウンロードとインストールはエージェントの有無をチェックして保護してください。保護された実行は、すでにエージェントがあるマシンでは何もせず、トークンにも一切触れません。

| プラットフォーム                  | チェック                                                                                    |
| ------------------------- | ------------------------------------------------------------------------------------------ |
| Debian および Ubuntu         | `dpkg-query -W -f='${db:Status-Status}' aikido-endpoint-protection \| grep -qx installed` |
| RHEL、Rocky Linux、CentOS | `rpm -q aikido-endpoint-protection`                                                      |
| いずれも                    | `aikidoctl --simple`                                                                 |

Debian 系では `dpkg -s` ではなく `dpkg-query` を使用してください。`dpkg -s` は削除されたもののパージされていないパッケージに対しても成功するため、誰かが `apt remove aikido-endpoint-protection` を実行したマシンがツールからはインストール済みに見え、元の状態に戻されることがありません。

## デバイスの識別方法

Linux でのデバイス ID は `/etc/machine-id` に基づきます。同じファイルで起動したマシンはデバイスリスト上で 1 つのエントリを共有するため、1 台を除くすべてのマシンが見えなくなります。イメージビルドや VM テンプレートの最後のステップでこのファイルを空にしておけば、各マシンの初回起動時に systemd が新しい ID を書き込みます。

コンテナイメージは例外です。1 つのイメージから作られたすべてのコンテナは同じデバイスとして報告されますが、CI では通常それが望ましい動作です。

## バージョンとアップグレード

`releases/latest/download` の URL は常に最新リリースを指します。独自のスケジュールでフリートを更新したい場合は、パッケージを社内にミラーし、ツールの参照先をそのミラーにしてください。

アップグレードではデバイスの登録が維持され、トークンも不要なため、既存のパッケージの上に新しいパッケージをインストールします。エージェントが存在する場合にインストールをスキップする自動化を使っている場合は、そのチェックをバージョンを考慮したものにするか、アップグレード実行時のみ一時的に外してください。[アップグレード](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux#upgrading)を参照してください。

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


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