日本語

Linux 展開リファレンス

Linux へのデプロイにあるどの方法も、行うことは同じです。ホストに合ったパッケージを取得し、環境にユーザーグループトークンを設定した状態でインストールし、その後ユーザーに新しいログインシェルを使ってもらいます。このページでは、これらの共通手順を一度にまとめて説明します。各ガイドでは、それぞれのツールでの実行方法を示し、その理由についてはこのページにリンクしています。

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

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

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

1 つのトークンは 1 つの Aikido ユーザーグループに対応します。デバイスがどのグループに参加するかを決めるのがトークンだからです。異なるグループのマシンにはそれぞれトークンが必要で、別々のインベントリグループ、Hiera レイヤー、データバッグアイテム、またはモジュールインスタンスで管理します。

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

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

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

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

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

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

user-data
#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

取得処理はお使いのクラウドに合わせて置き換えてください。マネージド 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 および Ubuntudpkg-query -W -f='${db:Status-Status}' aikido-endpoint-protection | grep -qx installed
RHEL、Rocky Linux、CentOSrpm -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 は常に最新リリースを指します。独自のスケジュールでフリートを更新したい場合は、パッケージを社内にミラーし、ツールの参照先をそのミラーにしてください。

アップグレードではデバイスの登録が維持され、トークンも不要なため、既存のパッケージの上に新しいパッケージをインストールします。エージェントが存在する場合にインストールをスキップする自動化を使っている場合は、そのチェックをバージョンを考慮したものにするか、アップグレード実行時のみ一時的に外してください。アップグレードを参照してください。

トラブルシューティング

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