Teamsアプリ
Teams、Keeperボルト、エンドポイント特権マネージャーとの承認ワークフロー連携

概要
Keeper Teamsアプリは、常時付与された特権を抑え、Teams上で認証情報のワークフロー申請と承認をスムーズに行うのに役立ちます。Teamsエージェントおよびコマンダーサービスモードのコンテナはお客様側のインフラ上でホストされ、エンドツーエンド暗号化によりゼロ知識が維持されます。
本書では、Keeperシークレットマネージャーを用いる簡易セットアップによりKeeper Teamsアプリを導入する手順を説明します。シークレットマネージャーまたはKeeperPAMのライセンスがない場合は、Keeperのアカウントマネージャーにご連絡ください。
機能
レコードアクセスの申請
理由、カスタム権限、アクセス時間の上限を指定して、特定のKeeperレコードへのアクセスを申請します。標準のボルトレコードおよびKeeperPAMのリソースを含みます。
フォルダアクセスの申請
理由、カスタム権限、アクセス時間の上限を指定して、特定のKeeper共有フォルダへのアクセスを申請します。
ワンタイム共有の申請
ワンタイム共有、パスワードのリセット、その他の動的パスワード生成を、自己破棄型の共有リンクで申請します。編集可能なワンタイム共有にも対応し、双方向の共有が可能です。
エンドポイント特権マネージャーの承認
Keeperエンドポイント特権マネージャー (KEPM) のジャストインタイム昇格の承認を、専用Teamsチャネルでリアルタイムに行います。
SSOクラウドデバイスの承認
Keeperオートメーターがデプロイされていない場合、Teamsから直接SSOクラウドデバイスの承認を行います。
要件
システム要件
ゼロ知識とエンドツーエンド暗号化を維持するため、Keeper Teamsアプリおよびコマンダーサービスモードのコンテナは、Microsoft Teamsクラウドと連携するために、お客様ごとのインフラ上でホストします。初期構成ではローカルでKeeperコマンダーを用います。
Linux VM
クラウドまたはオンプレのVMで、TeamsおよびKeeperの各サービスへhttps/443の外向き接続が可能です。
Docker
サービスのセットアップにはDockerの利用を推奨します。
Keeperコマンダー
最新のKeeperコマンダーをインストールする必要があります。
Keeperシークレットマネージャー
シークレット構成データの取得に、KeeperシークレットマネージャーまたはKeeperPAMのライセンスのいずれかを使用します。
Microsoft Azureテナント
Azure ADでアプリを登録するための管理者アクセスが必要です。
Microsoft Teams
カスタムアプリをインストールできる権限を持つTeamsワークスペース。
重要: teams-app-setup コマンドを実行するには、Keeperシークレットマネージャー (KSM) を有効にする必要があります。KSMが利用できない場合は、アカウントマネージャーにご連絡ください。
セットアップ手順
以下の手順では、コマンダーおよびTeamsアプリ用のDockerイメージ (keeper/commander および keeper/teams-app) を使用します。本連携では、各サービスが用いる構成を保護するためにKeeperシークレットマネージャーも利用します。
Teamsアプリを構成するには、次の8つの手順に従います。
手順1. Azure ADアプリの登録
このセクションでは、Teamsボットを認証するために、Microsoft 365テナントにAzure ADアプリを作成します。
Azure Portal に、全体管理者またはアプリケーション管理者としてサインインします。
[Azure Active Directory] → [アプリの登録] に移動します。

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

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


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

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

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

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

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


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

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

アプリ作成後、次の資格情報を収集します。
CLIENT_ID
アプリの登録 → 概要 → アプリケーション (クライアント) ID
TENANT_ID
アプリの登録 → 概要 → ディレクトリ (テナント) ID
署名シークレット
アプリの登録 → 証明書とシークレット → クライアント シークレット (値)
生成されたクライアントID、テナントID、および 署名シークレットの値 は 手順4 用に保存しておきます。
手順2. Azureボットの登録の作成
Azure PortalでBot Servicesを検索し、[リソースの作成] をクリックします。

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

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

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

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

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

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

チャネルIDとチームID は 手順5 用に保存しておきます。
手順4. コマンダーサービスモードのセットアップ
サービスがKeeperテナント内で認証しコマンドを実行できるようにするには、承認済みの Keeperコマンダー構成ファイル を作成する必要があります。この構成はホストPCまたはワークステーションで生成できます。
マシンにローカルで Keeperコマンダーをインストール します。
必要に応じて本連携専用のKeeperサービス アカウントを新規作成し、関連レコードとフォルダへのアクセス、およびレコードとフォルダの共有ができるようにします。
Keeperサービスアカウントでコマンダーにログインします。
([email protected])
2FAを含む認証を完了します。認証が完了したら 手順5 に進みます。
手順5. Teamsアプリのセットアップコマンドの実行
teams-app-setup コマンドは docker-compose.yml を生成し、Teamsアプリおよびコマンダーサービスモードの各サービスを運用するために使用します。
コマンダーシェルで次を入力します。
コマンドライン オプション
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
カスタム名の例:
コマンドは次のプロンプトに沿って進む。
フェーズ1: Dockerサービスモードのセットアップ
KSMを自動構成し、Docker経由でサービスモードをセットアップするために必要な構成ファイルをアップロードします。
サービス構成
コマンダーサービスのポートを設定します。
Port
コマンダーサービスモードのポート番号 (1024–65535)。
8900
フェーズ2: Teamsアプリ連携のセットアップ
手順1および2 で取得したTeamsの資格情報を入力します。
Teams Client ID (required)
Azureアプリ登録のアプリケーション (クライアント) ID
2efdee8-6a0a-0...
Client Secret (required)
Azureアプリ登録のシークレット値
f16241e1-b52a-24...
Tenant ID (required)
Azure ADのディレクトリ (テナント) ID
a1b2c3d4e5f6...
Approvals Team ID (required)
手順3のチームID (必須)
9336604b-038e-4...
Teams bot port
Teamsボットが受信リクエストを待ち受けるポート
例: 3978
Enable PEDM? (optional)
エンドポイント特権マネージャーの承認を有効にする (y/n)。
y
PEDM Polling Interval (optional)
PEDMリクエストを確認する間隔 (秒)。既定: 120。
120
Enable Device Approvals?(optional)
SSOクラウドデバイス承認を有効にする (y/n)。
y
Device Approval Polling Interval (optional)
デバイス承認を確認する間隔 (秒)。既定: 120。
120
エンドポイント特権マネージャーの承認およびSSOクラウドの承認を処理するには、Teamsアプリのサービス ユーザーに、管理者権限として [エンドポイント特権の管理] および [Keeper管理コンソールの管理] が付与されている必要があります。
コマンドが正常に完了すると、次が自動的に実行されます。
デバイスの永続認証を構成します。
「Commander Service Mode – Teams App」 という名前の共有フォルダを作成します。
共有フォルダにアクセスできるKSMアプリケーションを作成します。
クライアントデバイスを作成し、Base64エンコードされた構成値を生成します。
Docker構成レコードを作成し、
.keeperディレクトリのconfig.jsonをアップロードします。Teamsアプリの資格情報を含むTeamsアプリ構成レコードを作成します。

正常終了すると、コマンダーサービスモードとTeamsアプリの両サービスを含む
docker-compose.ymlが生成され、デプロイ可能な状態になります。
セットアップ完了後、デバイストークンの競合を防ぐため、コマンダーセッションを終了し、ローカルの .keeper/config.json を削除します。
手順6. Docker環境へのデプロイ
このセクションでは、コマンダーサービスを実行するLinux仮想マシンまたはホスト上にDocker Compose環境を用意します。
Linux VMを起動するかLinuxホストを用意し、SSHで接続します。
dockerおよびdocker-composeをインストールします (手順は こちら をご参照ください)。生成した
docker-compose.ymlを手順5の成果物として対象のLinuxサーバーに転送します。
ホスト上でサービスを起動します。
サービス起動の順序
サービスは次の順で起動します。
コマンダーサービスが先に起動し、APIキーを生成してサービスURLとともにボルトのレコードに保存します。
ヘルスチェックでコマンダーサービスが稼働していることを検証します。
ヘルスチェック通過後にTeamsアプリが起動し、ボルトのレコードからAPIキーとサービスURLを自動取得します。

起動の確認
ログを監視し、すべてが起動したことを確認します。
コンテナの状態を確認します。
コマンダーサービスのログを表示します。
セキュリティのため、DockerログではAPIキーはマスクされます。両サービスは共有のボルトレコード経由で安全に通信します。
Teamsアプリのログを表示します。
成功していれば、次のようなメッセージが表示されます。
手順7. メッセージングエンドポイントの構成
ボットをデプロイして稼働させたら、Microsoft Teamsがボットと通信できるようメッセージングエンドポイントを構成します。
Linux VMにngrokをインストールし、認証します。
認証トークンはngrokダッシュボードから取得します。ダッシュボードの [Domains] で静的ドメインを予約します。
ngrokを起動します。
Azureでメッセージングエンドポイントを設定します。
Azure Portalに移動し、[Azureボット] リソースを開きます。
[設定] → [構成] に移動します。
[メッセージング エンドポイント] に
https://<YOUR_STATIC_DOMAIN>/api/messagesを設定します。[適用] をクリックします。
動作確認

手順8. Teamsアプリパッケージのアップロード
このセクションでは、Dockerサービスが稼働したら、TeamsアプリパッケージをMicrosoft Teams環境にアップロードします。
リリースページ からアプリパッケージのテンプレートをダウンロードします。
ZIPを展開すると、次が含まれます。
manifest.jsonを編集し、プレースホルダーを置き換える。${{TEAMS_APP_ID}}を AzureクライアントID (手順1) に置き換える。
例:

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

ファイルをZIPに再パッケージします。
Teams管理センターにアップロードします。
Microsoft Teams管理センター にサインインします。
[Teamsアプリ] → [アプリの管理] に移動します。
[アプリをアップロードする] をクリックし、組織のアプリカタログへのアプリのアップロードを選択します。
keeper-teams-app.zipを選択します。[アップロード] をクリックします。

トラブルシューティング: アップロードが [「問題が発生しました」] で失敗する場合は、ターミナルからTeamsチャネルを直接有効にしてから、ZIPを再度アップロードできます。
<RESOURCE_GROUP> をAzureのリソース グループ名に、<BOT_NAME> をAzureボット リソース名に置き換える。
ZIPをアップロードしたら、チームにアプリをインストールします。
Microsoft Teamsでチームに移動します。
チーム名の横の [...] → [チームの管理] をクリックします。
[アプリ] タブを開きます。

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

Keeper Security を検索し、[承認者のチームまたはチャネル] で開く。
チーム単位でアプリをインストールしたら、承認用チャネルでボットを初期化し、そこへ承認リクエストをルーティングできるようにします。
自動的にチャネルへリダイレクトされるか、keeper-vault-approvers プライベートチャネルに移動します。
次のコマンドでボット名にメンションします。
@keeper Security /channel-status


以上で、エンドユーザーはリクエストの起票を開始できます。
申請ユーザー向けコマンドリファレンス
重要: Slackでは任意のチャネルやDMから申請できますが、Keeper SecurityのTeamsボットは、ボットとの 1対1の個人チャット でのみリクエスト系コマンドを受け付けます。チーム チャネル、グループ チャット、他ユーザーとのDMに送ったコマンドは処理されません。
ボットとの会話を始める手順:
Teamsの検索バーで Keeper Security を検索します。
結果からボットを選択します。
個人チャットでコマンドを送信します (例:
keeper-request-record "record" "justification")。
keeper-request-record
特定のKeeperレコードへのアクセスを申請します。
構文:
keeper-request-folder
共有フォルダへのアクセスを申請します。
構文:
keeper-one-time-share
レコードのワンタイム共有リンクを申請します。
構文:
スクリーンショット
以下のスクリーンショットは、Keeper Teamsアプリの主な機能を示す。
申請のためのTeamsアプリ ボットとのやり取り (申請ユーザー視点)

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

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

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

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

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

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

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

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

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

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

アップデート
コマンダーサービスモードおよびTeamsアプリ コンテナの更新
コマンダーまたはTeamsアプリを最新版に更新するには、サービスを停止し、コンテナを更新してから新しいコンテナを起動します。
トラブルシューティング
起動時のエラー
コマンダーサービスモードがマスター パスワードを求める
ボルトのレコードに複数のconfig.jsonが添付されている
手順4〜5に従い、新しいフォルダ名で teams-app-setup を再実行し、新しいJSON構成ファイルを作成します。
[WARN] Warning: Cannot reach Keeper Service Mode
サービスモードが未起動、またはURLが誤っている
ボルトのレコードの service URL が想定どおりか確認します。
BotFrameworkAdapter initialization failed
ボットの資格情報が無効
MICROSOFT_APP_ID と MICROSOFT_APP_PASSWORD を確認します。
Azure AD authentication error
テナントまたはクライアントの資格情報が無効
AZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET を確認します。
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
作成後の検索に失敗
レコードは存在するが検索がタイムアウトした可能性があります。手動で検索します。
KEPMのエラー
No data returned
KEPMが有効でない
Keeperエンタープライズ設定でKEPMを有効にします。サービスユーザーに必要な管理者権限があるか確認します。
KEPM sync failed
サービスモードからKEPMサーバーに到達できない
ネットワーク接続とKEPMの構成を確認します。
Failed to approve/deny KEPM request
リクエストの期限切れの可能性
リクエストが未処理か確認します。自動期限切れしている場合がある。
参考
エンドポイント特権マネージャー
最終更新
役に立ちましたか?

