日本語

GitHub Actions での Device Protection

GitHub ActionsのジョブはLinuxランナー上で実行されるため、Device Protectionは他のLinuxマシンと同じ方法でインストールします。GitHub Actions固有なのはインストール先です。存続し続けるセルフホストランナーに一度だけインストールするか、ジョブ終了後に破棄されるホステッドランナーではジョブごとにインストールします。

トークンとインストールフレーバーについては、まずInstall Device Protection for Linuxをお読みください。以下のジョブレベルのスニペットではコンテナフレーバーを使用します。これについてはDevice Protection in Containersで説明しています。

GitHubホステッドランナー

Device ProtectionのトークンをAIKIDO_TOKENという名前のシークレットとして追加し、パッケージをインストールするステップより前にエージェントを起動します。

.github/workflows/build.yml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Start Device Protection
        env:
          AIKIDO_TOKEN: ${{ secrets.AIKIDO_TOKEN }}
        run: |
          curl -fsSL https://github.com/AikidoSec/safe-chain/raw/refs/heads/main/install-scripts/install-endpoint-linux.sh \
            | sudo AIKIDO_TOKEN="$AIKIDO_TOKEN" sh -s -- --container
          sudo aikido-endpoint-protection-start --wait-for-healthy

      - uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          for f in /etc/profile.d/aikido-*.sh; do . "$f"; done
          npm ci
  • トークンはsudoの後に渡してください。 sudoはそれ以外の環境変数を破棄します。
  • パッケージをインストールするすべてのステップで/etc/profile.d/aikido-*.shを読み込んでください。 各ステップは新しいシェルで実行されるため、これらの設定がないとダウンロードはエージェントを経由しません。
  • ランナーはVMですが、--containerを使用します。 ジョブからランナーを再起動することはできず、コンテナモードでは再起動が不要です。エージェントを明示的に起動するのもそのためです。Choose the install flavorを参照してください。

読み込みの行を省略するには、すべてのステップをログインシェルで実行します。ログインシェルは/etc/profile.d/を自動的に読み込みます。

.github/workflows/build.yml
defaults:
  run:
    shell: bash --login -eo pipefail {0}

ジョブコンテナ

container:を指定したジョブはrootとして実行されるため、sudoなしで同じステップを使用します。イメージにはcurlが必要です。イメージにエージェントがすでにインストールされている場合は、インストールを省略して起動のみを行います。Job containers in GitHub Actionsを参照してください。

セルフホストランナー

ランナーホストに--headlessを指定してエージェントをインストールし、再起動します。Install Device Protection for Linuxを参照してください。

動作確認

.github/workflows/build.yml
      - name: Verify Device Protection
        run: |
          for f in /etc/profile.d/aikido-*.sh; do . "$f"; done
          curl -sS -o /dev/null -w "%{http_code}\n" --max-time 15 https://registry.npmjs.org/safe-chain-test/-/safe-chain-test-0.0.1-security.tgz

403は、エージェントがマルウェアテストパッケージをブロックしたことを意味します。200は、ダウンロードがエージェントを経由しなかったことを意味します。

トラブルシューティング

問題対処法
Token is requiredシークレットがインストールに渡っていません。envでマッピングし、sudoの後に渡してください。フォークからのプルリクエストにはシークレットが渡されません
Root privileges requiredインストールコマンドと起動コマンドの先頭にsudoを付けてください
テストパッケージが200を返す、またはSELF_SIGNED_CERT_IN_CHAINステップで/etc/profile.d/aikido-*.shが読み込まれていません