# Teamsアプリ

<figure><img src="/files/MXEfee5pDZG1gcLIvnYq" alt=""><figcaption></figcaption></figure>

## 概要

**Keeper Teamsアプリ**は、常時付与された特権を抑え、Teams上で認証情報のワークフロー申請と承認をスムーズに行うのに役立ちます。Teamsエージェントおよびコマンダーサービスモードのコンテナはお客様側のインフラ上でホストされ、エンドツーエンド暗号化によりゼロ知識が維持されます。

本ページでは、Keeperシークレットマネージャーを用いる簡易セットアップによりKeeper Teamsアプリを導入する手順を説明します。シークレットマネージャーまたはKeeperPAMのライセンスがない場合は、Keeperのアカウントマネージャーにご連絡ください。

## 機能

<table><thead><tr><th width="309.94140625">機能</th><th>説明</th></tr></thead><tbody><tr><td><strong>レコードアクセスの申請</strong></td><td>理由、カスタム権限、アクセス時間の上限を指定して、特定のKeeperレコードへのアクセスを申請します。標準のボルトレコードおよびKeeperPAMのリソースを含みます。</td></tr><tr><td><strong>フォルダアクセスの申請</strong></td><td>理由、カスタム権限、アクセス時間の上限を指定して、特定のKeeper共有フォルダへのアクセスを申請します。</td></tr><tr><td><strong>ワンタイム共有の申請</strong></td><td>ワンタイム共有、パスワードのリセット、その他の動的パスワード生成を、自己破棄型の共有リンクで申請します。編集可能なワンタイム共有にも対応し、双方向の共有が可能です。</td></tr><tr><td><strong>エンドポイント特権マネージャーの承認</strong></td><td>Keeperエンドポイント特権マネージャー (KEPM) のジャストインタイム昇格の承認を、専用Teamsチャネルでリアルタイムに行います。</td></tr><tr><td><strong>SSOクラウドデバイスの承認</strong></td><td>Keeperオートメーターがデプロイされていない場合、Teamsから直接SSOクラウドデバイスの承認を行います。</td></tr><tr><td><strong>セルフサービスでのシークレット作成</strong></td><td>TeamsからKeeperボルトの共有フォルダにログインレコードを直接作成します。サブフォルダの選択や自動生成パスワードにも対応します。</td></tr></tbody></table>

***

## 要件

#### システム要件

ゼロ知識とエンドツーエンド暗号化を維持するため、Keeper Teamsアプリおよびコマンダーサービスモードのコンテナは、Microsoft Teamsクラウドと連携するために、お客様ごとのインフラ上でホストします。初期構成ではローカルでKeeperコマンダーを用います。

<table><thead><tr><th width="262.71484375">要件</th><th>詳細</th></tr></thead><tbody><tr><td>Linux VM</td><td>クラウドまたはオンプレのVMで、TeamsおよびKeeperの各サービスへhttps/443の外向き接続が可能です。</td></tr><tr><td>Docker</td><td>サービスのセットアップにはDockerの利用を推奨します。</td></tr><tr><td>Keeperコマンダー</td><td>最新のKeeperコマンダーをインストールする必要があります。</td></tr><tr><td>Keeperシークレットマネージャー</td><td>シークレット構成データの取得に、KeeperシークレットマネージャーまたはKeeperPAMのライセンスのいずれかを使用します。</td></tr><tr><td>Microsoft Azureテナント</td><td>Azure ADでアプリを登録するための管理者アクセスが必要です。</td></tr><tr><td>Microsoft Teams</td><td>カスタムアプリをインストールできる権限を持つTeamsワークスペース。</td></tr></tbody></table>

{% hint style="warning" %}
重要: `teams-app-setup` コマンドを実行するには、Keeperシークレットマネージャー (KSM) を有効にする必要があります。KSMが利用できない場合は、アカウントマネージャーにご連絡ください。
{% endhint %}

## セットアップ手順

以下の手順では、コマンダーおよびTeamsアプリ用のDockerイメージ ([keeper/commander](https://hub.docker.com/r/keeper/commander)および[keeper/teams-app](https://hub.docker.com/r/keeper/teams-app))を使用します。本連携では、各サービスが用いる構成を保護するためにKeeperシークレットマネージャーも利用します。

Teamsアプリを構成するには、次の8つの手順に従います。

1. [Azure ADアプリの登録](#step-1.-register-azure-a-d-application)
2. [Azureボットの登録の作成](#step-2.-create-azure-bot-registration)
3. [承認用チャネルの作成](#step-2.-create-approvals-channel)
4. [コマンダーサービスモードのセットアップ](#step-4.-commander-service-mode-setup)
5. [Teamsアプリのセットアップコマンドの実行](#step-5.-run-teams-app-setup-command)
6. [Docker環境へのデプロイ](#step-6.-deploy-to-docker-environment)
7. [メッセージングエンドポイントの構成](#step-7.-configure-messaging-endpoint)
8. [Teamsアプリパッケージのアップロード](#step-8.-upload-teams-app-package)

***

### 手順1. Azure ADアプリの登録 <a href="#step-1.-register-azure-a-d-application" id="step-1.-register-azure-a-d-application"></a>

このセクションでは、Teamsボットを認証するために、Microsoft 365テナントにAzure ADアプリを作成します。

* [Azure Portal](https://portal.azure.com)に、全体管理者またはアプリケーション管理者としてサインインします。
* **\[Azure Active Directory]** → **\[アプリの登録]** に移動します。

<figure><img src="/files/NS3bRR4jsPXIHmY4T3Yt" alt=""><figcaption></figcaption></figure>

* **\[新規登録]** → **\[すべてのアプリケーション]** をクリックします。

<figure><img src="/files/OwlXzdUInJCmKrgVNLAw" alt=""><figcaption></figcaption></figure>

* アプリを構成します。\
  \- **\[名前]**: `keeper-security-teams`\
  \- **\[サポートされているアカウントの種類]**: 「この組織ディレクトリのみに含まれるアカウント」のみ\
  \- **\[リダイレクト URI]**: 現時点では空のままにします。

<figure><img src="/files/ABN3SJ0dkDLicqE8pwSO" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4om6YIgsPPfvzNTDBPue" alt=""><figcaption></figcaption></figure>

* **\[登録]** をクリックします。
* 作成後、**\[概要]** ページから次の値を控えます。
  * **\[アプリケーション (クライアント) ID]** — `AZURE_CLIENT_ID` として保存します。
  * **\[ディレクトリ (テナント) ID]** — `AZURE_TENANT_ID` として保存します。

<figure><img src="/files/WzDYuipKQHJM1vKkCvwQ" alt=""><figcaption></figcaption></figure>

* **\[APIのアクセス許可]** を構成します。
  * 管理 → **\[APIのアクセス許可]** → **\[アクセス許可の追加]** に移動します。

<figure><img src="/files/kufZZ5vp9yxer7LFVIem" alt=""><figcaption></figcaption></figure>

* **\[Microsoft Graph]** → **\[アプリケーションのアクセス許可]** を選択します。

<figure><img src="/files/4wBf1Qa79ohLHGaitwmJ" alt=""><figcaption></figcaption></figure>

* 次のアクセス許可を追加します。
  * `ChannelMessage.Read.All`
  * `User.Read.All`

<figure><img src="/files/uerQhuS1MzVxVWj3Lfo6" alt=""><figcaption></figcaption></figure>

* **\[MSFTに管理者の同意を与える]** をクリックします。

<figure><img src="/files/plPJ5jepCaqw6qDP65JP" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/AOfD7rmxJWYPiMDUaS76" alt=""><figcaption></figcaption></figure>

* **\[クライアント シークレット]** を作成します。
* **\[証明書とシークレット]** → **\[クライアント シークレット]** に移動します。

<figure><img src="/files/kFn1oztYDX1NJqhXXj2X" alt=""><figcaption></figcaption></figure>

* **\[新しいクライアント シークレット]** をクリックします。
* 説明: `Keeper Teams App`
* 有効期限: 適切な期間を選択します (24か月を推奨)。
* **\[追加]** をクリックします。
* **\[値はすぐにコピーし、]** `AZURE_CLIENT_SECRET` として保存します。

<figure><img src="/files/6bJocFVaIFcHTFCFQbQS" alt=""><figcaption></figcaption></figure>

アプリ作成後、次の資格情報を収集します。

<table><thead><tr><th width="219.890625">資格情報</th><th>場所</th></tr></thead><tbody><tr><td>CLIENT_ID</td><td>アプリの登録 → 概要 → アプリケーション (クライアント) ID</td></tr><tr><td>TENANT_ID</td><td>アプリの登録 → 概要 → ディレクトリ (テナント) ID</td></tr><tr><td>署名シークレット</td><td>アプリの登録 → 証明書とシークレット → クライアント シークレット (値)</td></tr></tbody></table>

{% hint style="info" %}
生成されたクライアントID、テナントID、および **署名シークレットの値** は **手順4** 用に保存しておきます。
{% endhint %}

***

### 手順2. Azureボットの登録の作成 <a href="#step-2.-create-azure-bot-registration" id="step-2.-create-azure-bot-registration"></a>

* Azure PortalでBot Servicesを検索し、**\[リソースの作成]** をクリックします。

<figure><img src="/files/1RMvH3nJ0io7vYgjZfOt" alt=""><figcaption></figcaption></figure>

* Bot Servicesを検索し、**\[作成]** をクリックします。

<figure><img src="/files/NYbqbVAXT4chNX5UOzQ9" alt=""><figcaption></figcaption></figure>

* ボットを構成します。
  * **\[ボット ハンドル]**: `keeper-security-bot` (一意である必要があります)
  * **\[サブスクリプション]**: 使用するサブスクリプションを選択します。
  * **\[リソース グループ]**: 新規作成するか既存を使用します。
  * **\[価格レベル]**: テストはFree (F0)、本番はStandard (S1)。
  * **\[アプリの種類]**: シングルテナント。
  * **\[作成の種類]**: 既存のアプリ登録を使用します。
  * **\[アプリID]**: 手順1のアプリケーション (クライアント) IDとテナントIDを入力します。

<figure><img src="/files/k2ElzhkembzeU9nuZSoa" alt=""><figcaption></figcaption></figure>

* **\[確認および作成]** → **\[作成]** をクリックします。

<figure><img src="/files/i3t9wFoaBU5PlJMHFBxf" alt=""><figcaption></figcaption></figure>

* **\[MicrosoftアプリID]** (手順1のアプリケーションIDと同じ) を控え、`BOT_ID` として保存します。

<figure><img src="/files/p9cFLb6io6zIbE7DzGng" alt=""><figcaption></figcaption></figure>

***

### 手順3. 承認用チャネルの作成 <a href="#step-2.-create-approvals-channel" id="step-2.-create-approvals-channel"></a>

* Microsoft Teamsで新しいプライベート チャネルを作成します (例: `#keeper-vault-approvers`)。
  * チームを右クリック → **\[チャネルの追加]**
  * **\[チャネル名]**: `keeper-vault-approvers`
  * **\[プライバシー]**: プライベート — 特定のチーム メンバーのみがアクセス可能
  * **\[作成]** をクリックします。
* **チームID** と **チャネルID** を取得します。
  * ウェブブラウザでTeamsを開きます。
  * 承認用チャネルに移動します。
  * チャネル名をクリックすると、次のようなポップアップが開きます。

<figure><img src="/files/bOQbXdXxLZzonyILqx6J" alt=""><figcaption></figcaption></figure>

* リンクをコピーし、新しいタブで開く。
* URLは次のような形式になる。`https://teams.microsoft.com/l/channel/19%3A...@thread.tacv2/...?groupId=<TEAM_ID>&tenantId=...`
* `groupId` を **チームID** として取り出す。
* **チャネルID**: `/channel/` とチャネル名のあいだの値をURLデコードします。\
  `%3A` を `:` に、`%40` を `@` に置き換える。\
  \
  例 (デコード前): `19%3AXSD5456476qe-a915_bN8WU7qScl7687678nj1Ya0e0RM1%40thread.tacv2`\
  例 (デコード後): `19:XSD5456476qe-a915_bN8WU7qScl7687678nj1Ya0e0RM1@thread.tacv2`

<figure><img src="/files/aZyelXP8AEndVX1iisj6" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**チャネルIDとチームID** は **手順5** 用に保存しておきます。
{% endhint %}

### 手順4. コマンダーサービスモードのセットアップ <a href="#step-4.-commander-service-mode-setup" id="step-4.-commander-service-mode-setup"></a>

サービスがKeeperテナント内で認証しコマンドを実行できるようにするには、承認済みの **Keeperコマンダー構成ファイル** を作成する必要があります。この構成はホストPCまたはワークステーションで生成できます。

* マシンにローカルで[Keeperコマンダーをインストール](/keeperpam/jp/commander-cli/commander-installation-setup.md)します。
* 必要に応じて本連携専用のKeeperサービス アカウントを新規作成し、関連レコードとフォルダへのアクセス、およびレコードとフォルダの共有ができるようにします。
* Keeperサービスアカウントでコマンダーにログインします。`(serviceuser@company.com)`

```
keeper shell
My Vault> login serviceuser@company.com
```

* 2FAを含む認証を完了します。認証が完了したら **手順5** に進みます。

***

### 手順5. Teamsアプリのセットアップコマンドの実行 <a href="#step-5.-run-teams-app-setup-command" id="step-5.-run-teams-app-setup-command"></a>

`teams-app-setup` コマンドは `docker-compose.yml` を生成し、Teamsアプリおよびコマンダーサービスモードの各サービスを運用するために使用します。

コマンダーシェルで次を入力します。

```
teams-app-setup
```

**コマンドライン オプション**

`teams-app-setup` コマンドは、カスタマイズ用に次の任意フラグに対応します。

| パラメータ                           | 説明                      | 既定値                                     |
| ------------------------------- | ----------------------- | --------------------------------------- |
| --folder-name (optional)        | 共有フォルダの名前               | Commander Service Mode - Teams App      |
| --app-name (optional)           | シークレットマネージャー アプリの名前     | Commander Service Mode - KSM App        |
| --config-record-name (optional) | コマンダー構成レコードの名前          | Commander Service Mode Docker Config    |
| --teams-record-name (optional)  | Teams構成レコードの名前          | Commander Service Mode Teams App Config |
| --config-path (optional)        | config.jsonファイルのパス      | \~/.keeper/config.json                  |
| --timeout (optional)            | デバイスのタイムアウト設定           | 30d                                     |
| --skip-device-setup (optional)  | 既に構成済みの場合はデバイス登録をスキップする | false                                   |

カスタム名の例:

```
teams-app-setup --folder-name "My Teams Integration" --timeout 7d
```

コマンドは次のプロンプトに沿って進む。

#### **フェーズ1: Dockerサービスモードのセットアップ**

KSMを自動構成し、Docker経由でサービスモードをセットアップするために必要な構成ファイルをアップロードします。

```bash
Phase 1: Running Docker Service Mode Setup
═══════════════════════════════════════════════════════════
    Docker Setup
═══════════════════════════════════════════════════════════

[1/7] Checking device settings...
  ✓  Device already registered
  ✓  Persistent login already enabled
  ✓  Setting logout timeout to 30d...

[2/7] Creating shared folder 'Commander Service Mode - Teams App'...
  ✓  Shared folder created successfully

[3/7] Creating record 'Commander Service Mode Docker Config'...
  ✓  Record created successfully

[4/7] Uploading config.json attachment...
  ✓  Config file uploaded successfully

[5/7] Creating Secrets Manager app 'Commander Service Mode - KSM App'...
  ✓  App created successfully

[6/7] Sharing folder with app...
  ✓  Folder shared with app

[7/7] Creating client device and generating config...
  ✓  Client device created successfully

✓ Docker Setup Complete!
```

**サービス構成**

コマンダーサービスのポートを設定します。

<table><thead><tr><th width="155.578125">プロンプト</th><th>説明</th><th>例</th></tr></thead><tbody><tr><td>Port</td><td>コマンダーサービスモードのポート番号 (1024–65535)。</td><td>8900</td></tr></tbody></table>

#### **フェーズ2: Teamsアプリ連携のセットアップ**

**手順1および2**で取得したTeamsの資格情報を入力します。

<table><thead><tr><th width="222.23046875">プロンプト</th><th width="310.171875">説明</th><th>例</th></tr></thead><tbody><tr><td>Teams Client ID (required)</td><td>Azureアプリ登録のアプリケーション (クライアント) ID</td><td>2efdee8-6a0a-0...</td></tr><tr><td>Client Secret (required)</td><td>Azureアプリ登録のシークレット値</td><td>f16241e1-b52a-24...</td></tr><tr><td>Tenant ID (required)</td><td>Azure ADのディレクトリ (テナント) ID</td><td>a1b2c3d4e5f6...</td></tr><tr><td>Teams Approvals Channel ID (required)</td><td>手順3のチャネルID (必須)</td><td>19:OfBgL.....x41@thread.tdf..</td></tr><tr><td>Approvals Team ID (required)</td><td>手順3のチームID (必須)</td><td>9336604b-038e-4...</td></tr><tr><td>Teams bot port</td><td>Teamsボットが受信リクエストを待ち受けるポート</td><td>例: 3978</td></tr><tr><td>Enable PEDM? (optional)</td><td>エンドポイント特権マネージャーの承認を有効にする (y/n)。</td><td>y</td></tr><tr><td>PEDM Polling Interval (optional)</td><td>PEDMリクエストを確認する間隔 (秒)。既定: 120。</td><td>120</td></tr><tr><td>Enable Device Approvals?(optional)</td><td>SSOクラウドデバイス承認を有効にする (y/n)。</td><td>y</td></tr><tr><td>Device Approval Polling Interval (optional)</td><td>デバイス承認を確認する間隔 (秒)。既定: 120。</td><td>120</td></tr></tbody></table>

{% hint style="info" %}
エンドポイント特権マネージャーの承認およびSSOクラウドの承認を処理するには、Teamsアプリのサービス ユーザーに、管理者権限として **\[エンドポイント特権の管理]** および **\[Keeper管理コンソールの管理]** が付与されている必要があります。
{% endhint %}

コマンドが正常に完了すると、次が自動的に実行されます。

* デバイスの永続認証を構成します。
* **「Commander Service Mode – Teams App」** という名前の共有フォルダを作成します。
* 共有フォルダにアクセスできるKSMアプリケーションを作成します。
* クライアントデバイスを作成し、Base64エンコードされた構成値を生成します。
* Docker構成レコードを作成し、`.keeper` ディレクトリの `config.json` をアップロードします。
* Teamsアプリの資格情報を含むTeamsアプリ構成レコードを作成します。

```bash
✓ Teams App Integration Setup Complete!

Resources Created:
  Phase 1 - Commander Service:
    • Shared Folder: Commander Service Mode - Teams App
    • KSM App: Commander Service Mode - KSM App (with edit permissions)
    • Config Record: XXXXXX
    • KSM Base64 Config: ✓ Generated
  Phase 2 - Teams App:
    • Teams Config Record: XXXXXX
    • Approvals Channel: XXXXXX
    • PEDM Integration: false
    • Device Approval: false
```

<figure><img src="/files/QlmPY03SIlmcIwJzmst4" alt=""><figcaption></figcaption></figure>

* 正常終了すると、コマンダーサービスモードとTeamsアプリの両サービスを含む `docker-compose.yml` が生成され、デプロイ可能な状態になります。

{% code overflow="wrap" %}

```yaml
services:
  commander-teams:
    container_name: keeper-service-teams
    ports:
    - 127.0.0.1:8900:8900
    image: keeper/commander:latest
    command: service-create -p 8900 -c 'search,share-record,share-folder,record-add,one-time-share,epm,pedm,device-approve,get,server' -f json -q y -ur lm8vnKnG5yYyjPmtL91IQQ --ksm-config
    healthcheck:
      test:
      - CMD-SHELL
      - python -c "import sys, urllib.request; sys.exit(0 if urllib.request.urlopen('http://localhost:8900/health', timeout=2).status == 200 else 1)"
      interval: 60s
      timeout: 3s
      start_period: 10s
      retries: 30
    restart: unless-stopped
  teams-app:
    container_name: keeper-teams-app
    image: keeper/teams-app:latest
    ports:
    - 3978:3978
    environment:
      KSM_CONFIG: KSM_CONFIG_BASE64_CODE
      COMMANDER_RECORD: RECORD_UID_OR_TITLE
      TEAMS_RECORD: TEAMS_RECORD_UID_OR_TITLE
    depends_on:
      commander-teams:
        condition: service_healthy
    restart: unless-stopped

```

{% endcode %}

セットアップ完了後、デバイストークンの競合を防ぐため、コマンダーセッションを終了し、ローカルの `.keeper/config.json` を削除します。

```
My Vault> quit
$ rm ~/.keeper/config.json
```

***

### 手順6. Docker環境へのデプロイ <a href="#step-6.-deploy-to-docker-environment" id="step-6.-deploy-to-docker-environment"></a>

このセクションでは、コマンダーサービスを実行するLinux仮想マシンまたはホスト上にDocker Compose環境を用意します。

* Linux VMを起動するかLinuxホストを用意し、SSHで接続します。
* `docker` および `docker-compose` をインストールします (手順については[こちら](/keeperpam/jp/privileged-access-manager/references/installing-docker-on-linux.md)をご参照ください)。
* 生成した `docker-compose.yml` を手順5の成果物として対象のLinuxサーバーに転送します。

ホスト上でサービスを起動します。

```
docker compose up -d
```

**サービス起動の順序**

サービスは次の順で起動します。

1. コマンダーサービスが先に起動し、APIキーを生成してサービスURLとともにボルトのレコードに保存します。
2. ヘルスチェックでコマンダーサービスが稼働していることを検証します。
3. ヘルスチェック通過後にTeamsアプリが起動し、ボルトのレコードからAPIキーとサービスURLを自動取得します。

<figure><img src="/files/7WLJcIDgcVCfIYELOciC" alt=""><figcaption></figcaption></figure>

**起動の確認**

ログを監視し、すべてが起動したことを確認します。

* コンテナの状態を確認します。

```bash
$ docker ps
NAME              STATUS                    PORTS
keeper-service    Up (healthy)              127.0.0.1:<port> -> <port>/tcp
keeper-teams-app  Up  
```

* コマンダーサービスのログを表示します。

```bash
$ docker logs keeper-service
[2026-01-21 10:00:00] Starting Commander Service Mode...
Generated API key: ****nQ= (stored in vault record: <CONFIG_VAULT_RECORD>)
Commander Service starting on <SERVICE_URL>/api/v2
Keeper Commander Service initialization complete
```

{% hint style="info" %}
セキュリティのため、DockerログではAPIキーはマスクされます。両サービスは共有のボルトレコード経由で安全に通信します。
{% endhint %}

* Teamsアプリのログを表示します。

```
docker logs keeper-teams-app
```

成功していれば、次のようなメッセージが表示されます。

```cobol
[INFO] [KeeperClient] KeeperClient initialized {"baseUrl":"http://commander-teams:4001/api/v2"}
[INFO] [ChannelService] Loaded 4 conversation references from file
[INFO] [ChannelService] Loaded 10 activity IDs from file
[INFO] [ChannelService] Loaded 17 approval status entries from file
[INFO] [ChannelService] Channel service initialized
[INFO] [Server] Health check endpoint available at http://localhost:3979/api/health
[INFO] @teams/app/http listening on port 3978 :rocket:
[INFO] [KeeperBot] ============================================================
[INFO] [KeeperBot] Starting Keeper Commander Teams Bot
[INFO] [KeeperBot] ============================================================
[INFO] [KeeperBot] Keeper Service Mode is accessible
[INFO] [KeeperBot] ============================================================
[INFO] [Server] Bot started, app listening on port 3978
[INFO] [Server] Configuration loaded from KSM: keeper, teams, pedm, deviceApproval
[INFO] [PedmPoller] Disabled in config
[INFO] [KeeperBot] EPM poller started
[INFO] [DevicePoller] Disabled in config
[INFO] [KeeperBot] Device approval poller started
```

***

### 手順7. メッセージングエンドポイントの構成 <a href="#step-7.-configure-messaging-endpoint" id="step-7.-configure-messaging-endpoint"></a>

ボットをデプロイして稼働させたら、Microsoft Teamsがボットと通信できるようメッセージングエンドポイントを構成します。

1. Linux VMにngrokをインストールし、認証します。

```bash
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
  | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
  && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
  | sudo tee /etc/apt/sources.list.d/ngrok.list
sudo apt update && sudo apt install -y ngrok
ngrok config add-authtoken <YOUR_NGROK_AUTH_TOKEN>
```

{% hint style="info" %}
認証トークンは[ngrokダッシュボード](https://dashboard.ngrok.com/get-started/your-authtoken)から取得します。ダッシュボードの **\[Domains]** で静的ドメインを予約します。
{% endhint %}

2. ngrokを起動します。

```bash
ngrok http YOUR_BOT_PORT --domain=<YOUR_STATIC_DOMAIN>
```

3. Azureでメッセージングエンドポイントを設定します。
   1. [Azure Portal](https://portal.azure.com)に移動し、**\[Azureボット]** リソースを開きます。
   2. **\[設定]** → **\[構成]** に移動します。
   3. **\[メッセージング エンドポイント]** に `https://<YOUR_STATIC_DOMAIN>/api/messages` を設定します。
   4. **\[適用]** をクリックします。
4. **動作確認**

<figure><img src="/files/IJMqE5ajQ3jSUEWA0jfi" alt=""><figcaption></figcaption></figure>

```bash
curl https://<YOUR_STATIC_DOMAIN>/api/health
```

### 手順8. Teamsアプリパッケージのアップロード <a href="#step-8.-upload-teams-app-package" id="step-8.-upload-teams-app-package"></a>

このセクションでは、Dockerサービスが稼働したら、TeamsアプリパッケージをMicrosoft Teams環境にアップロードします。

* [リリースページ](https://github.com/Keeper-Security/teams-integration)からアプリパッケージのテンプレートをダウンロードします。
* ZIPを展開すると、次が含まれます。

  ```
  teams-integration/appPackage/
  ├── manifest.json
  ├── color.png
  └── outline.png
  ```
* `manifest.json` を編集し、プレースホルダーを置き換える。

  * `${{TEAMS_APP_ID}}` を **AzureクライアントID** (手順1) に置き換える。

  例:

<figure><img src="/files/3cGzWc9uTMrs2Rn7zacr" alt=""><figcaption></figcaption></figure>

* `${{BOT_ID}}` を **ボットID** (AzureクライアントIDと同じ) に置き換える。

例:

<figure><img src="/files/1VzZMB5CkQibSgXiqMy1" alt=""><figcaption></figcaption></figure>

* ファイルをZIPに再パッケージします。

```bash
cd /path/to/your/appPackage-folder
zip -j keeper-teams-app.zip manifest.json color.png outline.png
```

* Teams管理センターにアップロードします。
  * [Microsoft Teams管理センター](https://teams.cloud.microsoft)にサインインします。
  * **\[Teamsアプリ]** → **\[アプリの管理]** に移動します。
  * **\[アプリをアップロードする]** をクリックし、組織のアプリカタログへのアプリのアップロードを選択します。
  * `keeper-teams-app.zip` を選択します。
  * **\[アップロード]** をクリックします。

<figure><img src="/files/AeinH9yHxl6DHaoM9nvW" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
**トラブルシューティング**: アップロードが **\[「問題が発生しました」]** で失敗する場合は、ターミナルからTeamsチャネルを直接有効にしてから、ZIPを再度アップロードできます。

```bash
# ターミナルで次のコマンドを実行する
az login
az rest --method put \
  --url "https://management.azure.com/subscriptions/$(az account show --query id -o tsv)/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.BotService/botServices/<BOT_NAME>/channels/MsTeamsChannel?api-version=2022-09-15" \
  --body '{"location":"global","properties":{"channelName":"MsTeamsChannel","properties":{"isEnabled":true}}}'
```

`<RESOURCE_GROUP>` をAzureのリソース グループ名に、`<BOT_NAME>` をAzureボット リソース名に置き換える。
{% endhint %}

* ZIPをアップロードしたら、チームにアプリをインストールします。

  * Microsoft Teamsでチームに移動します。
  * チーム名の横の **\[...]** → **\[チームの管理]** をクリックします。
  * **\[アプリ]** タブを開きます。

  <figure><img src="/files/pGhsmjiKCv6vmbyAtNyf" alt=""><figcaption></figcaption></figure>

  * **\[その他のアプリ]** (右下) をクリックします。

  <figure><img src="/files/2YVQNRf6l8pulbkbzmof" alt=""><figcaption></figcaption></figure>

  * **Keeper Security** を検索し、**\[承認者のチームまたはチャネル]** で開く。

  チーム単位でアプリをインストールしたら、承認用チャネルでボットを初期化し、そこへ承認リクエストをルーティングできるようにします。

  * 自動的にチャネルへリダイレクトされるか、**keeper-vault-approvers** プライベートチャネルに移動します。
  * 次のコマンドでボット名にメンションします。`@keeper Security /channel-status`

<figure><img src="/files/YBofrgKAGQ0DvEUjyuOl" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/6swSCraSWq9GfRGVboZu" alt=""><figcaption></figcaption></figure>

以上で、エンドユーザーはリクエストの起票を開始できます。

***

### 申請ユーザー向けコマンドリファレンス

{% hint style="warning" %}
重要: Slackでは任意のチャネルやDMから申請できますが、Keeper SecurityのTeamsボットは、ボットとの **1対1の個人チャット** でのみリクエスト系コマンドを受け付けます。チーム チャネル、グループ チャット、他ユーザーとのDMに送ったコマンドは処理されません。

ボットとの会話を始める手順:

1. Teamsの検索バーで **Keeper Security** を検索します。
2. 結果からボットを選択します。
3. 個人チャットでコマンドを送信します (例: `keeper-request-record "record" "justification"`)。
   {% endhint %}

#### keeper-request-record

特定のKeeperレコードへのアクセスを申請します。

構文:

```
keeper-request-record "record-uid-or-description" <justification>

Example:-
keeper-request-record kR3cF9Xm2Lp8NqT1uV6w Emergency server access
keeper-request-record "prod db EU region" Need to run migration
```

#### keeper-request-folder

共有フォルダへのアクセスを申請します。

構文:

```
keeper-request-folder "folder-uid-or-description" <justification>

Example:-
keeper-request-folder kF8zQ2Nm5Wx9PtR3sY7a Need staging access
keeper-request-folder "Staging Team Folder" Need staging access
```

#### keeper-one-time-share

レコードのワンタイム共有リンクを申請します。

構文:

```
keeper-one-time-share "record-uid-or-description" <justification>

Example:-
keeper-one-time-share kR3cF9Xm2Lp8NqT1uV6w Need to share with contractor John
keeper-one-time-share "AWS Production Password" Sharing with vendor
```

***

## スクリーンショット

以下のスクリーンショットは、Keeper Teamsアプリの主な機能を示す。

#### 申請のためのTeamsアプリ ボットとのやり取り (申請ユーザー視点)

<figure><img src="/files/txCjArthaIsrsuQnUSS5" alt=""><figcaption></figcaption></figure>

***

#### レコードへのアクセス申請 (UIDなし)

<figure><img src="/files/evc3C4rvDqhTD2DqxLRG" alt=""><figcaption></figcaption></figure>

***

#### レコードへのアクセス申請 (UID指定あり) (管理者視点)

<figure><img src="/files/nA0q2rr3U09043IDc6pP" alt=""><figcaption></figcaption></figure>

***

#### レコードアクセス申請 (管理者視点)

<figure><img src="/files/j2rqphMVUie8WFplKo6d" alt=""><figcaption></figcaption></figure>

***

#### フォルダへのアクセス申請 — 承認後 (管理者視点)

<figure><img src="/files/9ujNKRPe1fbN2Y0lBaJs" alt=""><figcaption></figcaption></figure>

***

#### フォルダアクセス申請 (UIDあり) (管理者視点)

<figure><img src="/files/yl7Yr0s3fdbx0m01CIKJ" alt=""><figcaption></figcaption></figure>

***

#### ワンタイム共有申請 (管理者視点)

<figure><img src="/files/idZijTdL49AmoxP4FRGq" alt=""><figcaption></figcaption></figure>

***

#### ワンタイム共有 — 新規レコード作成 (管理者視点)

<figure><img src="/files/kENqk6WT0sVVFhBT7CoK" alt=""><figcaption></figcaption></figure>

***

#### ワンタイム共有 — 承認後 (申請ユーザー視点)

<figure><img src="/files/8uWGb4D99Q7Iok8Dx07h" alt=""><figcaption></figcaption></figure>

***

#### エンドポイント特権マネージャー — 昇格の承認

<figure><img src="/files/OkkuR0oOaTWrzSnfUlVN" alt=""><figcaption></figcaption></figure>

***

#### SSOクラウドデバイス承認 (管理者視点)

<figure><img src="/files/DfgVDkalhDJAGtG9J3qy" alt=""><figcaption></figcaption></figure>

***

## アップデート

#### コマンダーサービスモードおよびTeamsアプリ コンテナの更新

コマンダーまたはTeamsアプリを最新版に更新するには、サービスを停止し、コンテナを更新してから新しいコンテナを起動します。

```bash
docker compose down
docker compose pull
docker compose up -d
```

***

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

#### 起動時のエラー

<table><thead><tr><th>エラー</th><th width="230.42578125">原因</th><th>対処</th></tr></thead><tbody><tr><td>コマンダーサービスモードがマスター パスワードを求める</td><td>ボルトのレコードに複数のconfig.jsonが添付されている</td><td>手順4〜5に従い、新しいフォルダ名で <code>teams-app-setup</code> を再実行し、新しいJSON構成ファイルを作成します。</td></tr><tr><td>[WARN] Warning: Cannot reach Keeper Service Mode</td><td>サービスモードが未起動、またはURLが誤っている</td><td>ボルトのレコードの <code>service URL</code> が想定どおりか確認します。</td></tr><tr><td>BotFrameworkAdapter initialization failed</td><td>ボットの資格情報が無効</td><td><code>MICROSOFT_APP_ID</code> と <code>MICROSOFT_APP_PASSWORD</code> を確認します。</td></tr><tr><td>Azure AD authentication error</td><td>テナントまたはクライアントの資格情報が無効</td><td><code>AZURE_TENANT_ID</code>、<code>AZURE_CLIENT_ID</code>、<code>AZURE_CLIENT_SECRET</code> を確認します。</td></tr></tbody></table>

***

#### Teams APIのエラー

| エラー                        | 原因                          | 対処                                           |
| -------------------------- | --------------------------- | -------------------------------------------- |
| Conversation not found     | チームまたはチャネルIDが無効             | `TEAMS_TEAM_ID` と `TEAMS_CHANNEL_ID` を確認します。 |
| Authorization denied (401) | ボットの構成不備またはトークン期限切れ         | クライアント シークレットを再生成し、構成を更新します。                 |
| Forbidden (403)            | APIのアクセス許可不足                | Graph APIのアクセス許可に管理者同意が付与されているか確認します。        |
| Channel not found          | ボットがチャネルに未追加                | 承認用チャネルにボットを追加します。                           |
| Activity not found         | メッセージが削除された、またはアクティビティIDが無効 | 古いカード更新時に発生することがあります。無視してかまいません。             |

***

#### サービスモードのエラー

| エラー                                | 原因                    | 対処                                                |
| ---------------------------------- | --------------------- | ------------------------------------------------- |
| Failed to submit command: HTTP 403 | APIキーが無効または欠落         | 構成用ボルト レコードのapi\_keyがサービスモードと一致するか確認します。          |
| Failed to submit command: HTTP 404 | APIエンドポイントのバージョンが誤り   | V2エンドポイント `/api/v2/` を使用します (`/api/v1/` ではありません)。 |
| Failed to submit command: HTTP 405 | HTTPメソッドが誤り           | サービスモードがキュー有効で稼働しているか確認します。                       |
| Command timed out or failed        | サービスモードの過負荷またはコマンド未登録 | サービスモードにコマンドを登録します。タイムアウトを延長します。                  |
| No request\_id received from API   | サービスモードがキュー/非同期モードでない | キュー有効 (V2) でサービスモードを再起動します。                       |

***

#### アクセス付与のエラー

| エラー                                          | 原因                  | 対処                                                                     |
| -------------------------------------------- | ------------------- | ---------------------------------------------------------------------- |
| Record Not Found                             | UIDが無効、またはレコードが削除済み | レコードUIDがKeeperボルトに存在するか確認します。                                          |
| Folder Not Found                             | フォルダUIDが無効          | フォルダUIDがKeeperボルトに存在するか確認します。                                          |
| Invalid UID Type (record vs folder)          | 種類に合わないコマンドを使用      | フォルダは `/keeper-request-folder`、レコードは `/keeper-request-record` を使う。     |
| This user already has time-limited access... | 既存の共有と競合            | 既存のアクセスを取り消してから、新しい権限を付与します。                                           |
| Share permissions require permanent access   | 共有系権限に期限を付けようとしている  | 共有権限 (**\[Can Share]**、**\[Edit & Share]**、**\[Change Owner]**) は常に永続。 |
| User share...failed                          | フォルダ上の権限の競合         | 既存アクセスと両立しない場合がある。取り消してから再付与します。                                       |

***

#### 検索およびモーダルのエラー

| エラー                                      | 原因                       | 対処                                                    |
| ---------------------------------------- | ------------------------ | ----------------------------------------------------- |
| No records found matching...             | 検索が細かすぎる、または該当なし         | 検索語を広げます。ボルトにレコードが存在するか確認します。                         |
| Search command timed out                 | サービスモードが遅い、またはボルトが非常に大きい | \_poll\_for\_result() の max\_wait を増やすか、検索をより具体的にします。 |
| Error processing search modal submission | モーダル データが破損または期限切れ       | モーダルを閉じて再試行します。ログで個別のエラーを確認します。                       |
| Modal shows "Searching..." forever       | ポーリング結果が返らない             | サービスモードのログを確認します。searchコマンドが登録されているか確認します。            |

***

#### ワンタイム共有のエラー

| エラー                                                     | 原因               | 対処                                                    |
| ------------------------------------------------------- | ---------------- | ----------------------------------------------------- |
| one-time share links can not be created for PAM records | コマンダーが未対応        | PAM以外のレコードで申請します。                                     |
| Share link created but URL not found in response        | サービスモードの応答形式が想定外 | サービスモードのバージョンを確認します。one-time-shareコマンドが登録されているか確認します。 |
| Failed to create one-time share                         | レコードが共有可能でない可能性  | ユーザーにレコードの共有権限があるか確認します。                              |

***

#### レコード作成のエラー

| エラー                                           | 原因                         | 対処                                                                      |
| --------------------------------------------- | -------------------------- | ----------------------------------------------------------------------- |
| Failed to create record                       | 必須フィールド不足またはコマンド エラー       | タイトル、ログイン、パスワードが入力されているか確認します。                                          |
| Record created but UID could not be retrieved | 作成後の検索に失敗                  | レコードは存在するが検索がタイムアウトした可能性があります。手動で検索します。                                 |
| Unable to load shared folder list             | share-reportコマンドの失敗、または未登録 | service-createコマンドに `share-report` が登録されているか確認します。**Retry**ボタンをクリックします。 |
| No subfolders found under this folder         | 選択した共有フォルダにサブフォルダがない       | 通知メッセージです。レコードは選択した共有フォルダに作成されます。                                       |
| Shared folder selection is required           | フォルダを選ばずにシークレットの作成を実行した    | 送信する前に、ドロップダウンから共有フォルダを選択します。                                           |

***

#### KEPMのエラー

| エラー                                 | 原因                       | 対処                                                       |
| ----------------------------------- | ------------------------ | -------------------------------------------------------- |
| No data returned                    | KEPMが有効でない               | Keeperエンタープライズ設定でKEPMを有効にします。サービスユーザーに必要な管理者権限があるか確認します。 |
| KEPM sync failed                    | サービスモードからKEPMサーバーに到達できない | ネットワーク接続とKEPMの構成を確認します。                                  |
| Failed to approve/deny KEPM request | リクエストの期限切れの可能性           | リクエストが未処理か確認します。自動期限切れしている場合がある。                         |

### 参考

* [コマンダーCLI概要](/keeperpam/jp/commander-cli/overview.md)
* [コマンダーサービスモード](/keeperpam/jp/commander-cli/service-mode-rest-api.md)
* [エンドポイント特権マネージャー](/keeperpam/jp/endpoint-privilege-manager/overview.md)
* [クラウドSSOコネクト](https://docs.keeper.io/sso-connect-cloud/)


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.keeper.io/keeperpam/jp/secrets-manager/integrations/teams-app.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
