> For the complete documentation index, see [llms.txt](https://help.aikido.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.aikido.dev/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/device-protection-in-containers.md).

# コンテナ内の Device Protection

Device Protection は Linux コンテナーイメージ内で実行できるため、CI ジョブ、ビルドコンテナー、コンテナー化された開発環境でのパッケージのインストールも、ワークステーション上と同じように検査されます。エージェントはイメージのビルド中にインストールし、コンテナー実行時にはエージェントのコンテナーエントリポイントに起動させます。

イメージを変更せずに開発者マシン上の実行中コンテナを保護するには、をオンにします **コンテナを保護** 代わりに。参照 [Docker コンテナのデバイス保護](/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-in-docker-containers.md).

まず [Linux 用 Device Protection をインストールする](/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux.md) まず、トークンと各方法で使うパッケージについて。 [Linux 展開リファレンス](/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/linux-rollout-reference.md) それらすべてにわたるトークン処理とデバイス識別をカバーします。

{% hint style="info" %}
コンテナーイメージのインストールには常に `--container`。これがないと、エージェントはデスクトップユーザーがセットアップを完了するのを待ち、プロキシは起動せず、あなたのコマンドが実行される前にコンテナーが終了します。参照: [何が `--container` 変更する](#what-container-changes).

`--container` は、エージェントが実行される *内部で* コンテナー内、またはジョブ後に破棄されるホスト型 CI ランナー上で使います。そうしたコンテナーをビルドして実行する Docker、Kubernetes、または Jenkins のホストはサーバーなので、そこで次を使ってインストールします。 `--headless` 代わりに。参照 [Linux 用 Device Protection をインストールする](/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux.md#choose-the-install-flavor).
{% endhint %}

## イメージに Device Protection を追加する

ビルドは root で実行する必要があり、エージェントのインストーラー自体は `curl` と `ca-certificates`を必要としますが、Debian slim イメージには含まれていません。

{% tabs %}
{% tab title="インストールスクリプト" %}
インストールスクリプトは、イメージのディストリビューションとアーキテクチャに合ったパッケージを選び、チェックサムを検証してインストールします。ビルド時にトークンが必要です。

{% code title="Dockerfile" overflow="wrap" %}

```dockerfile
FROM node:20-bookworm-slim

ARG AIKIDO_TOKEN

RUN apt-get update \\
 && apt-get install -y --no-install-recommends curl ca-certificates \\
 && curl -fsSL https://github.com/AikidoSec/safe-chain/raw/refs/heads/main/install-scripts/install-endpoint-linux.sh \\
      | sh -s -- --token "$AIKIDO_TOKEN" --container \\
 && rm -rf /var/lib/apt/lists/*

STOPSIGNAL SIGTERM
ENTRYPOINT ["aikido-endpoint-protection-container-entrypoint"]

# 独自のコマンドです。これは Aikido がブロックするパッケージをダウンロードするため、次を出力します
# 保護が機能している間は 403 が表示されます。
CMD ["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"]
```

{% endcode %}

次に、ビルドして実行します。

{% code overflow="wrap" %}

```bash
docker build -t my-app --build-arg AIKIDO_TOKEN=<your-token> .
docker run --rm --init my-app
```

{% endcode %}

`--build-arg AIKIDO_TOKEN=<your-token>` は必須です。ビルドはシェル環境を参照できず、トークンが空の場合はインストーラーがエラーで停止します。既に持っている変数を渡すには、Docker に変数名だけを指定します。 `--build-arg AIKIDO_TOKEN`.
{% endtab %}

{% tab title="パッケージファイル" %}
パッケージを自分でインストールすれば、バージョンを固定し、社内ミラーからインストールし、トークンを一切含まないイメージを構築できます。パッケージマネージャーの環境でコンテナモードの変数を設定し、次を設定します。 `AIKIDO_TOKEN` これは、トークンをイメージに組み込みたい場合にのみ設定してください。

{% code title="Dockerfile" overflow="wrap" %}

```dockerfile
FROM node:20-bookworm-slim

RUN apt-get update \\
 && apt-get install -y --no-install-recommends curl ca-certificates \\
 && curl -fLO https://github.com/AikidoSec/safechain-internals/releases/latest/download/EndpointProtection-amd64.deb \\
 && AIKIDO_CONTAINER=1 AIKIDO_CI_CD=1 apt-get install -y --no-install-recommends ./EndpointProtection-amd64.deb \\
 && rm -f EndpointProtection-amd64.deb \\
 && rm -rf /var/lib/apt/lists/*

STOPSIGNAL SIGTERM
ENTRYPOINT ["aikido-endpoint-protection-container-entrypoint"]

CMD ["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"]
```

{% endcode %}

次にイメージをビルドし、実行時にトークンを渡します。

{% code overflow="wrap" %}

```bash
docker build -t my-app .
docker run --rm --init -e AIKIDO_TOKEN=<your-token> my-app
```

{% endcode %}

両方の変数名を設定します。 `AIKIDO_CONTAINER` が現在の名前であり、 `AIKIDO_CI_CD` が、1.8.2 までのパッケージが読み取る旧名です。したがって、両方を設定しておけば、どのパッケージをインストールしても動作します。

ラップトップではなく、イメージに一致するパッケージを使ってください。 `EndpointProtection-arm64.deb` arm64 イメージには、 `el9` または `el10` Red Hat 系ベースイメージ向けの RPM です。 [Linux 用 Device Protection をインストールする](/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux.md#manual-install) ですべて一覧できます。
{% endtab %}
{% endtabs %}

## トークンの取得元

エージェントはトークンをインストール時または実行時に受け取りますが、違いはトークンがどこに残るかです。

| として渡す                                     | 最終的に入る場所                                     |
| ----------------------------------------- | -------------------------------------------- |
| `--build-arg AIKIDO_TOKEN=<your-token>`   | イメージとそのビルド履歴です。イメージを pull できる人なら誰でも読めます。     |
| `docker run -e AIKIDO_TOKEN=<your-token>` | 実行中のコンテナーだけです。エントリポイントが起動時にトークンをエージェントへ渡します。 |

レジストリに push するイメージでは実行時トークンを優先し、ビルドしたマシンから離れないイメージではビルド時トークンを使ってください。BuildKit はビルド時形式（`SecretsUsedInArgOrEnv`）について、まさにこの理由で警告します。

実行時に渡したトークンは、トークンなしでビルドされたイメージにのみ適用されます。いったんトークンが組み込まれると、エージェントはそれを使います。

## Node.js と uv を Aikido CA に向ける

エージェントはローカル CA で HTTPS を検査します。システムの信頼ストアを読むツールは自動的にそれを使いますが、Node.js と uv は独自のものを持っているため、エージェントはそれらを CA に向ける変数を次に書き込みます。 `/etc/profile.d/`。エントリポイントはそこからプロキシ設定しか読み込まないため、 `CMD` が実行されると `npm` は次で失敗します。 `SELF_SIGNED_CERT_IN_CHAIN` 残りを読み込むまで。

コマンドが実行される前に、エージェントが配置するすべてのファイルを読み込んでください。

{% code title="Dockerfile" overflow="wrap" %}

```dockerfile
CMD ["sh", "-c", "for f in /etc/profile.d/aikido-*.sh; do . \"$f\"; done; exec npm ci"]
```

{% endcode %}

エージェントは起動時にそれらのファイルを書き込むため、パスを次にコピーするのではなく、実行時に読み込んでください。 `ENV` ビルド時に。

## イメージのビルド中にインストールを検査する

エージェントはコンテナー実行中にのみ動くため、 `RUN npm ci` を Dockerfile に書くと、パッケージは検査されないままダウンロードされます。ビルドも対象にするには、次の中でエージェントを起動します。 `RUN` ステップ:

{% code title="Dockerfile" overflow="wrap" %}

```dockerfile
RUN aikido-endpoint-protection-start --wait-for-healthy \\
 && for f in /etc/profile.d/aikido-*.sh; do . "$f"; done \\
 && npm ci
```

{% endcode %}

エージェントは実行中にトークンを必要とするため、これはトークンを組み込んでビルドしたイメージでしか機能しません。

## GitHub Actions のジョブコンテナ

`jobs.<id>.container` はイメージの `ENTRYPOINT`を置き換えるため、エントリポイントは実行されません。代わりに、ジョブの最初のステップでエージェントを起動してください:

{% code title=".github/workflows/build.yml" overflow="wrap" %}

```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/your-org/my-app:latest
      env:
        AIKIDO_TOKEN: ${{ secrets.AIKIDO_TOKEN }}
    steps:
      - name: Device Protection を開始
        run: aikido-endpoint-protection-start --wait-for-healthy

      - name: 依存関係をインストール
        run: |
          for f in /etc/profile.d/aikido-*.sh; do . "$f"; done
          npm ci
```

{% endcode %}

各ステップはそれぞれ独自のシェルで実行されるため、 `/etc/profile.d/aikido-*.sh` パッケージをインストールするすべてのステップで。

## コンテナーモードの仕組み

イメージを動かすだけならこれは不要ですが、フラグとエントリポイントが何をしているかを説明します。

### 何が `--container` 変更する

`--container` （または `AIKIDO_CONTAINER=1` と `AIKIDO_CI_CD=1` コンテナーモードの変数（パッケージを自分でインストールする場合は変数を設定すること）が、エージェントをコンテナー内で動かす鍵です:

* **プロキシは CA をメモリに保持し** 、OS キーリングでは保持しません。コンテナーや CI ランナーには OS キーリングがないためです。
* **トラフィックは明示的なプロキシを経由し** 上で `127.0.0.1:7654` 、ワークステーションで使われる透過的な eBPF データパスではありません。つまり、コンテナーには `--privileged` も追加の capability も不要です。

`--ci-cd` はこのフラグの以前の名前でした。インストールスクリプトは今でもこれを受け付けるため、既存の Dockerfile は引き続き動作しますが、今後は次を使ってください。 `--container` 今書くものではこれを使ってください。

### エントリポイントの動作

`aikido-endpoint-protection-container-entrypoint` は、引き継いで終了するラッパーではなく、小さなスーパーバイザーです:

1. トークンを次から受け渡します `AIKIDO_TOKEN` 。コンテナーの環境に設定されている場合。
2. systemd を使わずにエージェントを起動し、正常であると報告されるまで最大 20 秒待ちます。そうならない場合、コンテナーはコマンドを保護なしで実行する代わりに、エラーで終了します。
3. プロキシ環境変数をエクスポートし、あなたの `CMD` を子プロセスとして実行します。
4. で `SIGTERM` 受信すると、まずエージェントを停止し、次にあなたのコマンドを停止して終了します `143`。また、 `SIGRTMIN+3`も処理します。これは systemd ベースのイメージが次の場合に送信する信号です。 `docker stop`.
5. 終了コードはあなたのコマンドのものになります。

その信号を受け取るために PID 1 のままになるので、孤立プロセスの回収は行いません。 `--init` （または `tini`）がそれをカバーしており、追加する価値があります。

もしあなたの `CMD` が systemd そのものなら、エントリポイントはそれを exec し、ユニットにエージェントの起動を任せます。

## 動作確認

次を付けてイメージを実行してください。 `CMD` 正常なコンテナーは次を出力します:

```
Aikido Endpoint Protection は正常です
403
```

次の `403` は、エージェントがマルウェアテスト用パッケージを拒否していることを示します。URL をブロックされていないパッケージに置き換えると、同じコマンドは次を出力します `200`。これは、ダウンロードを単に壊しているのではなく、プロキシが経路に入っていることを示します。

実行中のコンテナー内では、 `aikidoctl バージョン` はインストール済みバージョンとエージェントの状態を報告します。

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

| 問題                                                                                       | 修正                                                                                                                                                           |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `exec aikido-endpoint-protection-container-entrypoint failed: No such file or directory` | そのイメージには、コンテナー対応より前のエージェントが入っています。最新のパッケージをインストールしてください                                                                                                      |
| `エラー: デーモンは起動しましたが、正常状態になりませんでした`                                                        | コンテナーにトークンがないか、エージェントが次を付けずにインストールされています `--container`。 `-e AIKIDO_TOKEN=<your-token>`、そしてイメージがコンテナーモードでエージェントをインストールしたことを確認してください                           |
| `npm エラー SELF_SIGNED_CERT_IN_CHAIN`、または同じものが `uv`                                        | Aikido CA の変数がプロセスに届いていません。次を読み込んでください `/etc/profile.d/aikido-*.sh` パッケージをインストールするコマンドの前に                                                                    |
| パッケージは期待どおりブロックされていますが、コンテナーがデバイス一覧に一度も表示されません                                           | トークンが拒否されました。マルウェアブロックは拒否されたトークンでも動作し続けるため、トークン自体と、コンテナーが次へ到達できることを確認してください `*.aikido.dev` HTTPS 経由で                                                         |
| ダウンロードはまったく検査されていません                                                                     | あなたのコマンドがエントリポイントを迂回しています。たとえば、 `docker run` それを上書きするものや、それを置き換えるジョブコンテナーなどです。次を使ってエージェントを明示的に起動してください `aikido-endpoint-protection-start --wait-for-healthy` |
| `docker stop` は猶予期間を使い切ってからコンテナーを終了させます                                                  | エントリポイントとあなたのプロセスの間にある何かが `SIGTERM`を吸収しています。シェルラッパーなしでイメージを実行するか、次を追加してください `--init`                                                                         |

Red Hat 系ベースイメージに適したパッケージを選ぶなど、コンテナー固有ではないことについては、次の表を参照してください [Linux 用 Device Protection をインストールする](/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux.md#troubleshooting).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://help.aikido.dev/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/device-protection-in-containers.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
