# Azure PipelinesでのDevice Protection

Azure PipelinesのジョブはLinuxエージェント上で実行されるため、Device Protectionは他のLinuxマシンと同じ方法でインストールします。Azure Pipelines固有なのはインストール先です。常駐するセルフホストエージェントには一度だけインストールし、Microsoftホストエージェントでは各ジョブ内でインストールします。

トークンとインストール方式については、まず[Install Device Protection for Linux](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux)をお読みください。以下のジョブレベルのスニペットではコンテナ方式を使用しています。コンテナ方式については[Device Protection in Containers](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/device-protection-in-containers)で説明しています。

## Microsoftホストエージェント

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

{% code title="azure-pipelines.yml" overflow="wrap" %}
```yaml
pool:
  vmImage: ubuntu-latest

steps:
  - script: |
      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
    displayName: Start Device Protection
    env:
      AIKIDO_TOKEN: $(AIKIDO_TOKEN)

  - script: |
      for f in /etc/profile.d/aikido-*.sh; do . "$f"; done
      npm ci
    displayName: Install dependencies
```
{% endcode %}

* **シークレットは`env`の下でマッピングしてください。** Azure Pipelinesは、シークレット変数をステップに自動的に公開することはありません。
* **トークンは`sudo`の後に渡してください。** `sudo`はそれ以外の環境変数を破棄します。
* **パッケージをインストールするすべてのステップで`/etc/profile.d/aikido-*.sh`をsourceしてください。** 各ステップは新しいシェルで実行されるため、これらの設定がないとダウンロードがエージェントを経由しません。
* **ランナーはVMですが、`--container`を使用します。** ジョブからランナーを再起動することはできず、コンテナモードでは再起動が不要です。エージェントを明示的に起動するのもこのためです。[Choose the install flavor](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux#choose-the-install-flavor)を参照してください。

## セルフホストエージェント

エージェントホストに`--headless`を指定してエージェントをインストールし、再起動します。[Install Device Protection for Linux](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux#choose-the-install-flavor)を参照してください。

## 動作確認

{% code title="azure-pipelines.yml" overflow="wrap" %}
```yaml
  - script: |
      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
    displayName: Verify Device Protection
```
{% endcode %}

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

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

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