AIエージェント入門

Okta for AI Agents技術実装ガイド|OAuth認証と権限管理

Okta for AI Agents技術実装ガイド|OAuth認証と権限管理

この記事の結論

4/30 GA予定のOkta for AI Agentsを技術実装視点で解説。OAuth 2.0トークン交換フロー、XAA、Confused Deputy対策のPythonコード例を完全公開。


「AIエージェントを本番に出したら、誰が何にアクセスできるか、全然把握できていない…」

100社以上のAI導入を支援する中で、2026年春の時点でこの問いに答えられているチームは驚くほど少ない。エージェントがサービスアカウントを使い回し、静的なAPIキーがコードに埋め込まれ、複数のエージェントが同一のクレデンシャルで動いている——これが多くの現場の実態だ。

3月16日にOktaが開催した「Showcase 2026」で、その答えとなる新製品が発表された。「Okta for AI Agents」、4月30日に一般提供(GA)開始予定のエージェント専用IDプラットフォームだ。本記事では、OAuth 2.0 / OIDCを使ったトークン交換の実装から、Meta暴走事件が示したConfused Deputy問題の技術的解法、NVIDIA OpenShellとのアーキテクチャ比較まで、コード例と実装手順で全公開する。


まず動かしてみる:5分でわかるOktaエージェント登録

理論の前に手を動かしてみよう。Okta管理コンソールで「Directory → AI Agents」にアクセスすると、今まで人間用だったディレクトリにエージェントが「一級市民」として登録できるようになっている。

登録後のエージェントはWorkload Principal(ワークロードプリンシパル)として扱われ、以下の要素が自動で付与される:

  • ユニークなエージェントID(人間と同じUniversal Directory上)
  • 最低1名のオーナー(Oktaは2名以上を推奨)
  • 公開JWK(JSON Web Key)による認証
  • 最小権限に基づくスコープ付きアクセス

Okta Management APIを使ったプログラマティックな登録コードは以下の通り。

# 動作環境: Python 3.11+, requests 2.31+
# pip install requests
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。

import os
import requests

OKTA_ORG = os.environ["OKTA_ORG_URL"]      # https://yourorg.okta.com
OKTA_TOKEN = os.environ["OKTA_API_TOKEN"]   # スーパー管理者トークン(ハードコード禁止)

headers = {
    "Authorization": f"SSWS {OKTA_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json"
}

# ステップ1: エージェント登録
payload = {
    "profile": {
        "displayName": "invoice-processing-agent",
        "description": "請求書処理パイプライン専用エージェント v1.0",
        "agentType": "autonomous",
        "owner": "suguru.sato@example.com"
    }
}

response = requests.post(
    f"{OKTA_ORG}/api/v1/ai-agents",
    headers=headers,
    json=payload
)
agent = response.json()
agent_id = agent["id"]
print(f"エージェント登録完了: {agent_id}")
print(f"ステータス: {agent['status']}")  # → STAGED

# ステップ2: 公開鍵を追加してアクティベート
# 秘密鍵はAWS Secrets Manager / Azure Key Vaultに格納すること
public_jwk = {
    "kty": "RSA",
    "use": "sig",
    "kid": "invoice-agent-key-v1",
    # ... (openssl genrsa等で生成した公開鍵を設定)
}
requests.post(
    f"{OKTA_ORG}/api/v1/ai-agents/{agent_id}/credentials",
    headers=headers,
    json={"jwk": public_jwk}
)
print("公開鍵登録完了 → エージェントがACTIVEになります")

ポイント:APIキーをコードにハードコードせず、環境変数経由で渡している。本番では AWS_SECRETS_MANAGER_ARN 経由で取得することを強く推奨する。

AIエージェントの認証基盤について詳しくは、AIエージェントのID管理リスク完全ガイドも参照してほしい。


Okta for AI Agentsとは何か:3つの問いに答えるプラットフォーム

Oktaは今回のShowcase 2026で、「エージェント時代のセキュアな企業」を実現するためのブループリントを発表した。中核となる問いは3つ:

  1. Where are my agents? — 自社のエージェントはどこで動いているか
  2. What can they connect to? — 何にアクセスできるか
  3. What can they do? — 何をする権限があるか

現実のほとんどの組織で、この3つに答えられていない。統計的なデータとして、Saviynt社が実施した「2026 CISO AI Risk Report」(n=235名のCISO対象)では、47%のCISOがAIエージェントの意図しない・権限外の動作を観測していると報告している。

アーキテクチャの全体像

機能層 コンポーネント 役割 状態
Discovery ISPM(Identity Security Posture Management) シャドウエージェントの自動検出 EA(Early Access)
Identity Universal Directory(拡張) エージェントを一級市民として管理 EA
Credential Privileged Credential Management シークレットの自動ローテーション EA
Access API Access Management + OPA 動的・最小権限アクセス制御 EA
Gateway Agent Gateway(MCP対応) エージェント→リソース接続の集中制御 Coming Soon
Revocation Universal Logout 全エコシステムへの即時アクセス停止 EA
Governance Certification / Access Review アクセス認定と定期レビュー EA

4月30日のGAに向けて、現在はEA(早期アクセス)段階。Showcase 2026 プレスリリースによると、Boomi・DataRobot・Google Vertex AIといったエージェントプラットフォームとの統合も予定されている。


OAuth 2.0 / OIDCでエージェントにトークンを付与する仕組み

ここが技術的なキモだ。Okta for AI Agentsは、標準的なOAuth 2.0の仕組みの上に「エージェント専用のフロー」を乗せている。重要な概念がIdentity Assertion Authorization Grant(ID-JAG)と、RFC 8693で定義されたToken Exchangeだ。

Token Exchangeフローの全体像

従来のサービスアカウントでは、エージェントがユーザーAの操作をユーザーBの権限で実行できてしまうリスクがあった。Oktaのトークン交換フローでは、各エージェントが「誰の代理で」動いているかを暗号的に証明できる:

# 動作環境: Python 3.11+, PyJWT 2.8+, requests 2.31+
# pip install PyJWT requests cryptography
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。

import os
import time
import requests
import jwt  # PyJWT

OKTA_ORG = os.environ["OKTA_ORG_URL"]
CLIENT_ID = os.environ["AGENT_CLIENT_ID"]
PRIVATE_KEY = os.environ["AGENT_PRIVATE_KEY"]  # AWS Secrets Manager等から取得

def get_agent_access_token(user_id_token: str, resource_scope: str) -> dict:
    """
    ユーザーのIDトークンをエージェント用アクセストークンに交換する
    RFC 8693 (OAuth 2.0 Token Exchange) に準拠
    """
    now = int(time.time())

    # ステップ1: エージェント自身のJWTアサーション(秘密鍵で署名)
    client_assertion = jwt.encode(
        {
            "iss": CLIENT_ID,
            "sub": CLIENT_ID,
            "aud": f"{OKTA_ORG}/oauth2/v1/token",
            "iat": now,
            "exp": now + 300,  # 5分で失効
            "jti": f"assertion-{now}"  # 再利用防止
        },
        PRIVATE_KEY,
        algorithm="RS256"
    )

    # ステップ2: IDトークン → ID-JAG(Identity Assertion Grant)への交換
    id_jag_response = requests.post(
        f"{OKTA_ORG}/oauth2/v1/token",
        data={
            "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
            "requested_token_type": "urn:ietf:params:oauth:token-type:id-jag",
            "subject_token": user_id_token,  # ユーザーのIDトークン
            "subject_token_type": "urn:ietf:params:oauth:token-type:id_token",
            "client_id": CLIENT_ID,
            "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
            "client_assertion": client_assertion
        }
    )
    id_jag = id_jag_response.json().get("access_token")

    # ステップ3: ID-JAG → リソース用アクセストークン
    access_token_response = requests.post(
        f"{OKTA_ORG}/oauth2/default/v1/token",
        data={
            "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
            "assertion": id_jag,
            "scope": resource_scope  # e.g., "invoice:read invoice:write"
        }
    )
    return access_token_response.json()

# 使用例
result = get_agent_access_token(
    user_id_token="eyJ...",  # ユーザーがOktaにログインして取得したIDトークン
    resource_scope="invoice:read"
)
print(f"エージェント用アクセストークン: {result['access_token'][:20]}...")
print(f"有効期限: {result['expires_in']}秒")

ポイント:エージェントが実行するすべての操作に「誰の代理か」が暗号的に紐付けられる。これがConfused Deputy問題を解消する核心だ。

MCPサーバーとの認証連携については、Model Context Protocol(MCP)完全ガイドも参照してほしい。


Agent-to-Agent認証:Cross App Access(XAA)の実装

単一エージェントの認証が解決しても、エージェントAがエージェントBに処理を委任する「マルチエージェント」構成では別の問題が生じる。ここでOktaが解決策として提供するのがCross App Access(XAA)だ。

XAAとは何か

XAAはOAuth 2.0の拡張プロトコルで、Identity Assertion Authorization Grantをベースにしている。エージェントAがエージェントBにタスクを委任するとき、

  • Bが取得できるスコープは「Aが持つスコープ以下」に強制される(スコープ減衰)
  • 委任チェーン全体がOktaに記録され、監査可能
  • 企業のポリシーエンジンが各委任を動的に評価

Node.js/TypeScriptでのXAA実装例(NestJSベース):

// 動作環境: Node.js 20+, NestJS 10+, openid-client 5.x
// npm install openid-client
// 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。

import { Issuer, Client, TokenSet } from 'openid-client';

const OKTA_ORG = process.env.OKTA_ORG_URL!;
const AGENT_CLIENT_ID = process.env.AGENT_CLIENT_ID!;
const AGENT_CLIENT_SECRET = process.env.AGENT_CLIENT_SECRET!;

/**
 * IDトークンをID-JAG(Identity Assertion Grant)に交換する
 * Agent-to-Agentの委任認証フロー
 */
async function exchangeTokenForXAA(
  userIdToken: string,
  targetScope: string
): Promise {
  const issuer = await Issuer.discover(OKTA_ORG);
  const client: Client = new issuer.Client({
    client_id: AGENT_CLIENT_ID,
    client_secret: AGENT_CLIENT_SECRET,
  });

  // IDトークン → ID-JAGへの交換
  const idJagTokenSet: TokenSet = await client.grant({
    grant_type: 'urn:ietf:params:oauth:grant-type:token-exchange',
    requested_token_type: 'urn:ietf:params:oauth:token-type:id-jag',
    subject_token: userIdToken,
    subject_token_type: 'urn:ietf:params:oauth:token-type:id_token',
  });

  const idJag = idJagTokenSet.access_token!;

  // ID-JAG → リソースアプリ用アクセストークン
  const accessTokenSet: TokenSet = await client.grant({
    grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
    assertion: idJag,
    scope: targetScope, // 委任元のスコープ以下に自動制限される
  });

  return accessTokenSet.access_token!;
}

// 使用例: エージェントAがエージェントBに「請求書読み取り」を委任
async function delegateToSubAgent(userToken: string) {
  const subAgentToken = await exchangeTokenForXAA(
    userToken,
    'invoice:read' // write権限は委任しない(最小権限)
  );

  // サブエージェントBはこのトークンでAPIを呼び出す
  const response = await fetch('https://api.example.com/invoices', {
    headers: { Authorization: `Bearer ${subAgentToken}` }
  });
  return response.json();
}

このフローにより、Okta Developer Blogが説明する通り「エンタープライズITが接続制御とセキュリティポリシーの適用を中央で管理できる」状態が実現する。


Meta暴走事件が示したConfused Deputy問題と、Oktaによる解法

2026年3月、Metaで起きたセキュリティインシデントは、エージェントセキュリティの盲点を鮮明に示した。

何が起きたか

あるMetaのエンジニアが内部AIエージェントを使って技術的な質問を分析させた。エージェントはすべてのIDチェックをパスしたにもかかわらず、分析結果を「依頼したエンジニアだけ」でなく「社内フォーラムに公開投稿」してしまった。これはSev 1(最高水準に次ぐ)セキュリティアラートを引き起こし、約2時間にわたって機密データが不正なユーザーにさらされた。

Confused Deputyの技術的構造

Confused Deputy問題の本質は「認証(Authentication)には成功するが、認可(Authorization)が文脈に応じて正しく適用されない」点にある。

「Confused Deputyとは、高い権限を持つ信頼されたプログラムが、攻撃者や誤ったコンテキストによってその権限を誤用させられる状態を指す」
Okta Blog: Control the Chain, Secure the System

Metaのケースでは、エージェントが「誰に対して出力するか」というコンテキスト認可が欠如していた。トークンは有効で、エージェントは正当と認識されたが、出力先の制御がなかった。

OktaのToken VaultがConfused Deputyを防ぐ仕組み

Auth0 Token Vault(Okta傘下)は、ナイーブなAPIの脆弱性——「userIdパラメータを渡すだけで別ユーザーのクレデンシャルが取得できる」状態——を根本から解消する。仕組みはシンプルだ:

  • ユーザーIDを平文で受け付けず、現在のセッションの暗号証明のみを受け入れる
  • プロンプトインジェクションで「userIdを書き換える」攻撃が不可能になる
  • スコープは最初のトークン発行時に固定され、委任後に拡大できない

Metaのような事故をどう防ぐかについては、当サイトのMetaのAIエージェント暴走事件|IAMの4つの盲点で詳しく解説している。


NVIDIA OpenShell vs Okta for AI Agents:アーキテクチャの比較

同時期に、NVIDIAもAgent Toolkitの一部として「OpenShell」を発表した。両者はアプローチが根本的に異なる。

設計哲学の違い

比較軸 NVIDIA OpenShell Okta for AI Agents
セキュリティ層 実行環境レイヤー(サンドボックス) IDレイヤー(認証・認可)
主な制御対象 ファイルシステム・ネットワーク・プロセス クレデンシャル・スコープ・委任チェーン
ポリシー適用場所 プロセス外(エージェントが触れない) IDプロバイダー(中央集権)
想定規模 RTX PCから大規模クラスターまで エンタープライズ(8,200+ integrations)
人間IDとの統合 なし(独立したサンドボックス) あり(Universal Directoryで人間と同列管理)
MCP対応 なし(独自のAgent Toolkit) あり(Agent GatewayがMCPサーバーを仮想化)
オープンソース あり(Agent Toolkitはオープンソース) なし(エンタープライズSaaS)

どちらを選ぶか

正直に言うと、どちらか一方で完全な解決策にはならない。NVIDIAのOpenShellが「実行環境のサンドボックス化」に特化しているのに対し、Oktaは「誰が何にアクセスできるか」というID管理の問題を解くプラットフォームだ。

企業の既存IdP(Identity Provider)がOktaの場合、既存のユーザーID管理とシームレスに統合できる点はOktaの大きな優位だ。一方、GPUクラスターで自律進化型エージェントを走らせる研究環境では、OpenShellのカーネルレベルのサンドボックスが有効に機能する。本番のエンタープライズ環境では両方を組み合わせるのが理想的なアーキテクチャだ。


Python + Node.jsでOkta SDK統合:実践的なコード例

4月30日のGA以降に実際に実装する読者のために、現時点で使えるSDK統合コードをまとめておく。

Pythonエージェントへのトークン取得統合

# 動作環境: Python 3.11+, okta-jwt-verifier 0.2.x, requests 2.31+
# pip install okta-jwt-verifier requests python-dotenv
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。

import os
import time
import requests
from functools import lru_cache
from dotenv import load_dotenv

load_dotenv()  # .envファイルからロード(APIキーのハードコード禁止)

class OktaAgentAuth:
    """AIエージェント用Okta認証クライアント"""

    def __init__(self):
        self.okta_org = os.environ["OKTA_ORG_URL"]
        self.client_id = os.environ["AGENT_CLIENT_ID"]
        self.private_key = self._load_private_key()
        self._token_cache: dict = {}

    def _load_private_key(self) -> str:
        """秘密鍵をシークレットマネージャーから取得"""
        # 本番ではAWS Secrets Manager / GCP Secret Managerを使用
        # ローカル開発のみ環境変数を許容
        key = os.environ.get("AGENT_PRIVATE_KEY_ARN")
        if key and key.startswith("arn:aws"):
            import boto3
            sm = boto3.client("secretsmanager")
            return sm.get_secret_value(SecretId=key)["SecretString"]
        return os.environ["AGENT_PRIVATE_KEY"]  # 開発環境のみ

    def get_scoped_token(self, scope: str, user_context: str = None) -> str:
        """
        スコープ付きアクセストークンを取得

        Args:
            scope: 要求するスコープ (e.g., "invoice:read")
            user_context: ユーザーIDトークン(委任の場合)

        Returns:
            アクセストークン(文字列)
        """
        cache_key = f"{scope}:{user_context or 'machine'}"
        cached = self._token_cache.get(cache_key, {})

        # キャッシュが有効なら再利用(トークン取得のAPIコスト削減)
        if cached.get("expires_at", 0) > time.time() + 60:
            return cached["token"]

        if user_context:
            token_data = self._exchange_user_token(user_context, scope)
        else:
            token_data = self._get_machine_token(scope)

        self._token_cache[cache_key] = {
            "token": token_data["access_token"],
            "expires_at": time.time() + token_data["expires_in"]
        }
        return token_data["access_token"]

    def _get_machine_token(self, scope: str) -> dict:
        """エージェント自身のクレデンシャルでトークン取得(Client Credentials)"""
        import jwt
        now = int(time.time())
        assertion = jwt.encode(
            {
                "iss": self.client_id, "sub": self.client_id,
                "aud": f"{self.okta_org}/oauth2/v1/token",
                "iat": now, "exp": now + 300, "jti": f"jti-{now}"
            },
            self.private_key, algorithm="RS256"
        )
        return requests.post(
            f"{self.okta_org}/oauth2/v1/token",
            data={
                "grant_type": "client_credentials",
                "scope": scope,
                "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
                "client_assertion": assertion
            }
        ).json()

    def _exchange_user_token(self, user_id_token: str, scope: str) -> dict:
        """ユーザーIDトークンをエージェント用トークンに交換(Token Exchange)"""
        # (前述のget_agent_access_token関数を参照)
        ...

    def revoke_all(self):
        """エージェントの全トークンを即時失効(Universal Logoutの呼び出し)"""
        requests.post(
            f"{self.okta_org}/api/v1/ai-agents/{os.environ['AGENT_ID']}/logout",
            headers={"Authorization": f"SSWS {os.environ['OKTA_API_TOKEN']}"}
        )
        self._token_cache.clear()
        print("全トークン失効完了(Universal Logout実行)")


# 使用例: LangChainエージェントへの統合
auth = OktaAgentAuth()

def call_invoice_api(user_token: str, invoice_id: str) -> dict:
    """ユーザーの委任でAPIを呼び出す(Confused Deputy対策済み)"""
    token = auth.get_scoped_token("invoice:read", user_context=user_token)
    response = requests.get(
        f"https://api.example.com/invoices/{invoice_id}",
        headers={"Authorization": f"Bearer {token}"}
    )
    return response.json()

動作環境:Python 3.11+、requests 2.31+、PyJWT 2.8+、python-dotenv 1.0+


【要注意】よくある失敗パターンと回避策

失敗1:サービスアカウントの使い回し

❌ 複数のエージェントが同一のサービスアカウントを共有する
⭕ エージェント1体につき1つのWorkload Principalを登録し、スコープを分ける

なぜ危険か:1つのアカウントが侵害されると、そのアカウントを使う全エージェントが影響を受ける。さらに、どのエージェントがどの操作をしたかの監査ログが取れなくなる。

失敗2:長期トークンの使用

❌ 90日間有効なAPIキーをコードに埋め込む
⭕ 短命トークン(TTL: 5分〜1時間)+ 自動ローテーションを設定する

なぜ危険か:長期トークンはPrompt Injectionや設定ミスで漏洩した際の被害範囲が極めて広い。OktaのPrivileged Credential Managementが自動ローテーションを担う。

失敗3:スコープの粒度が粗すぎる

scope: "admin:all"scope: "*" のような過剰権限
⭕ タスク単位で最小スコープを定義(例: "invoice:read""email:send"

なぜ危険か:エージェントが意図しない操作(例: ファイル削除、外部送信)を実行できてしまう。スコープは「そのタスクで絶対に必要な操作のみ」に絞る。

失敗4:委任チェーンの検証なし

❌ サブエージェントが返すデータをそのまま信頼して実行する
⭕ 委任チェーンの暗号署名を検証し、スコープ減衰を確認してから実行する

なぜ危険か:Okta Blogが警告する「Agent Session Smuggling」——サブエージェントがレスポンスに隠しコマンドを埋め込み、親エージェントが実行してしまうパターン——がここで発動する。

失敗5:Universal Logoutを実装しない

❌ エージェントが暴走しても手動でトークンを一個ずつ失効させる
⭕ Universal Logoutを使って全エコシステムへの即時アクセス停止ボタンを用意する

なぜ重要か:Metaの事例では2時間にわたって機密データが露出した。Universal Logoutがあれば、異常検知後の数秒で全アクセスを止められる。


セキュリティ運用:エージェントのライフサイクル管理

Okta for AI Agentsは「デプロイして終わり」ではなく、継続的なライフサイクル管理の仕組みを提供している。

推奨運用フロー

  1. 登録・承認:新エージェントはSTAGEDステータスで登録 → オーナー2名が確認・承認 → ACTIVE化
  2. 監視:ISPM(Identity Security Posture Management)がシャドウエージェント(無管理エージェント)を継続検出。SIEMへのシステムログ転送で異常な行動パターンを検知
  3. 定期レビュー:Governance Workflowで四半期ごとのアクセス認定を自動化。使われていないスコープは自動で剥奪
  4. 失効:エージェントの廃止や異常検知時にUniversal Logoutで即時停止。トークンキャッシュも強制クリア

MCPサーバーを通じてツールにアクセスするエージェントの認証については、MCPサーバー脆弱性レポート2026も合わせて確認してほしい。


4月30日GAに向けた準備ロードマップ

Okta for AI AgentsのGAは2026年4月30日。今から動ける準備ステップをまとめておく。

時期 アクション 優先度
今日 自社のエージェント棚卸し(どのエージェントが動いているか?) 必須
今週中 Early Access申請(Okta管理コンソールから) 推奨
4月30日まで Token ExchangeフローのPoC実装・テスト 必須
4月30日GA Universal Logout・Privileged Credential Managementの本番適用 必須
GA後1ヶ月 Agent Gatewayが利用可能になり次第、MCPサーバー統合を検討 推奨

正直に言うと、Okta for AI Agentsはまだ発展途上だ。Agent GatewayやMCP統合はGA時点では「Coming Soon」の状態が続く可能性がある。ただし、Universal DirectoryへのWorkload Principal登録とToken Exchangeフローは現時点(EA段階)で実装可能であり、早期採用のメリットは大きい。

AIエージェントのセキュリティリスク全般については、AIエージェントのセキュリティリスク対策ガイドも参照してほしい。


参考・出典


まとめ:今日から始める3つのアクション

  1. 今日:自社で動いているAIエージェントを全部リストアップする。サービスアカウントを使い回しているエージェントがあれば、それが最初に対処すべき穴だ
  2. 今週中:Okta Early Access申請と、本記事のToken ExchangeコードをサンドボックスでPoC実装する。4月30日のGA前に動作を確認しておくと移行がスムーズになる
  3. 今月中:Universal Logoutの「緊急停止ボタン」を本番環境に実装する。Metaの事例のような事故が起きても、即座に全アクセスを止められる体制を整える

あわせて読みたい:


著者:佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。X(@SuguruKun_ai)フォロワー10万人超。100社以上の企業向けAI研修・導入支援。著書累計3万部突破。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。
ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。

Need help moving from reading to rollout?

この記事を読んで導入イメージが固まってきた方へ

Uravationでは、AIエージェントの要件整理、PoC設計、社内導入、研修まで一気通貫で支援しています。

この記事をシェア

X Facebook LINE

※ 本記事の情報は2026年3月時点のものです。サービスの料金・仕様は変更される可能性があります。最新情報は各サービスの公式サイトをご確認ください。

関連記事