日本語

ゴールデンイメージで Device Protection を展開する

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

まず Install Device Protection for Linux を読み、すべての方法で使用するトークン、パッケージ、インストールオプションについて確認してください。トークンの取り扱い、再起動、繰り返し実行、デバイスの識別といったその他の内容は Linux Rollout Reference で説明しています。

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

workstation.pkr.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",
    ]
  }
}

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

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

Packer がビルドに使用するインスタンスはインストール中に自身を登録し、ビルドが完了すると消えます。そのエントリが非アクティブなデバイスとしてデバイスリストに残らないよう削除してください。デバイスの削除を参照してください。

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

トークンによってデバイスが参加する Aikido のユーザーグループが決まるため、ベイクされたイメージは 1 つのユーザーグループに属します。1 つのイメージで複数のグループに対応する必要がある場合は、トークンをイメージに含めず、パッケージファイルのみを配置してください。

workstation.pkr.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",
  ]
}

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

user-data
#cloud-config
runcmd:
  - AIKIDO_TOKEN=<your-token> apt-get install -y /var/cache/aikido/EndpointProtection-amd64.deb

これにより、初回起動時に GitHub へのネットワークアクセスが不要になります。その document の残りの部分については cloud-init を参照してください。

ロールアウトの確認

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

cat /etc/machine-id
systemctl is-active aikido-endpoint-protection
aikidoctl version

同じイメージから 2 台目のマシンを起動し、2 つのマシン ID が異なること、および両方が 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 を参照してください