1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AgentCoreブラウザにChromeポリシーとカスタムルートCA対応が来た!エージェントのブラウザ操作をエンタープライズ仕様にしてみた

1
Posted at

はじめに

「AIエージェントにブラウザ操作させたいけど、セキュリティポリシー的にNG出されちゃったよ……」

AgentCore Browserを使えばAIエージェントがWebブラウザを操作できるようになりますが、エンタープライズ環境では
「勝手にどこにでもアクセスされては困る」
「社内システムはプライベートCAで証明書を管理している」
といった壁にぶつかることが少なくありません。

2026年3月25日、Amazon Bedrock AgentCore BrowserがChrome Enterpriseポリシーとカスタムルート証明書(CA)に対応というアップデートが発表されました。

この記事では、これら2つの新機能を解説し、実際にポリシーファイルを作成してブラウザセッションに適用するところまでやってみます。

忙しい人のための要点まとめ

  • Chrome Enterpriseポリシー対応: 100以上のChromiumポリシーをJSON形式でS3に配置し、ブラウザセッションに自動適用できるようになった
  • カスタムルートCA対応: AWS Secrets Managerに格納したPEM証明書をブラウザセッションの信頼ストアに追加できる
  • ポリシーにはManaged(強制)Recommended(推奨) の2つのレベルがあり、用途に応じて使い分けが可能
  • 証明書はツールレベル(全セッション共通)セッションレベル(個別) の両方で設定可能

今回のアップデートの全体像

Chromeポリシー対応とは

AgentCore BrowserでChromium Enterprise Policyを使ってブラウザの挙動を制御できるようになり、ポリシーファイル(JSON)をS3バケットに配置するだけで、ブラウザセッションに自動的に適用されます。

2つのポリシーレベル

レベル 適用タイミング 上書き可否 配置場所(コンテナ内)
Managed(強制) CreateBrowser API時 不可(管理者強制) /etc/chromium/policies/managed/
Recommended(推奨) StartBrowserSession API時 可(ユーザーレベル) /etc/chromium/policies/recommended/

Managedポリシーはカスタムブラウザ作成時に設定され、そのブラウザで起動するすべてのセッションに強制適用されます。一方、Recommendedポリシーはセッション開始時に指定し、セッションごとに異なる設定を適用できます。

ユースケース例

カスタムルートCA対応とは

多くの企業では社内システムのSSL証明書をプライベートCA(認証局)で発行しています。これまでAgentCore Browserのセッションでは、そうした社内サービスに「証明書エラー」でアクセスできないケースがありました。

今回のアップデートで、AWS Secrets Managerに格納したPEM形式のルートCA証明書をブラウザセッションの信頼ストアに追加できるようになり、以下が可能になりました。

  • 社内発行のSSL証明書を使ったサービス(Jira、Artifactory、社内ポータル等)へのアクセス
  • TLSインターセプションを行う企業プロキシ経由の通信

証明書が適用されるまでの流れ

証明書の設定レベル

証明書はツールレベルとセッションレベルの2箇所で設定でき、両方が指定された場合はマージされます(ツールレベルが先に適用)。

設定レベル API 適用範囲 最大数
ツールレベル CreateBrowser 全セッション共通 10個
セッションレベル StartBrowserSession 個別セッション 10個

やってみた

実際にChromeポリシーとカスタムルートCAをそれぞれ設定してみます。

パート1: Chromeポリシーを設定する

手順1: ポリシーファイルを作成する

まず、Managedポリシー(強制)のJSONファイルを作成します。ここでは、パスワード保存の無効化とオートフィルの無効化を設定してみます。

managed-policies.json
{
  "AutofillAddressEnabled": false,
  "AutofillCreditCardEnabled": false,
  "PasswordManagerEnabled": false
}

次に、Recommendedポリシー(推奨)のJSONファイルも作成してみます。ここでは、セーフブラウジングの強化とサードパーティクッキーのブロックを設定してみます。

recommended-policies.json
{
  "SafeBrowsingProtectionLevel": 2,
  "BlockThirdPartyCookies": true
}

SafeBrowsingProtectionLevel の値は 1(標準保護)または 2(強化保護)を指定します。

利用可能なポリシーの一覧は Chrome Enterprise Policy List で確認できます。100以上のポリシーが設定可能ですが、特にエージェント運用で役立ちそうなものをいくつかピックアップします。

ポリシーキー 説明 エージェント運用での用途
URLBlocklist 指定URLへのアクセスをブロック 不要なサイトへのアクセス防止
URLAllowlist ブロックリストの例外を許可 業務に必要なサイトのみ許可
PasswordManagerEnabled パスワード保存の無効化 機密情報の保存防止
DownloadRestrictions ダウンロードの制限 ファイル持ち出し防止
BookmarkBarEnabled ブックマークバーの表示制御 UI簡素化

手順2: S3にアップロードする

S3バケットにポリシーファイルをアップロードします。

aws s3 cp managed-policies.json s3://my-agentcore-policies/policies/managed-policies.json

aws s3 cp recommended-policies.json s3://my-agentcore-policies/policies/recommended-policies.json

手順3: IAMポリシーを設定する

AgentCoreで組み込む場合はS3からポリシーファイルを読み取れるように、IAMポリシーを付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnterprisePolicyS3Access",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::my-agentcore-policies/policies/*"
      ]
    }
  ]
}

手順4: カスタムブラウザを作成する

Managedポリシーを適用したカスタムブラウザを作成します。

import boto3

client = boto3.client('bedrock-agentcore-control', region_name='ap-northeast-1')

response = client.create_browser(
    name="secure_browser",
    networkConfiguration={
        'networkMode': 'PUBLIC'
    },
    enterprisePolicies=[
        {
            "type": "MANAGED",
            "location": {
                "s3": {
                    "bucket": "my-agentcore-policies",
                    "prefix": "policies/managed-policies.json"
                }
            }
        }
    ]
)

browser_id = response['browserId']
print(f"Browser ID: {browser_id}")

手順5: セッションを起動してポリシーを確認する

作成したカスタムブラウザでセッションを起動し、Recommendedポリシーも追加してみます。

import boto3

REGION = "ap-northeast-1"
client = boto3.client('bedrock-agentcore', region_name=REGION)

response = client.start_browser_session(
    browserIdentifier="<手順4で取得した browserId>",
    name="my_session_with_policies",
    sessionTimeoutSeconds=1800,
    enterprisePolicies=[
        {
            "type": "RECOMMENDED",
            "location": {
                "s3": {
                    "bucket": "my-agentcore-policies",
                    "prefix": "policies/recommended-policies.json"
                }
            }
        }
    ]
)

print(f"Session ID: {response['sessionId']}")

このセッションでは、Managedポリシー(パスワード保存・オートフィル無効化)が強制適用され、さらにRecommendedポリシーが追加適用されます。

ポリシーが正しく適用されているかは、CDP(Chrome DevTools Protocol)経由で chrome://policy/ を開いて確認できます。以下のスクリプト(上記の start_browser_session コードの続き)を実行すると、Managed/Recommended それぞれのポリシー一覧が表示されます。

import asyncio
import json
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest

# start_browser_session の response から ws_url を取得
ws_url = response["streams"]["automationStream"]["streamEndpoint"]

# SigV4 署名ヘッダーを生成
session = boto3.session.Session()
credentials = session.get_credentials().get_frozen_credentials()
http_url = ws_url.replace("wss://", "https://")
aws_request = AWSRequest(method="GET", url=http_url)
SigV4Auth(credentials, "bedrock-agentcore", REGION).add_auth(aws_request)
signed_headers = dict(aws_request.headers)

async def verify():
    from playwright.async_api import async_playwright

    async with async_playwright() as p:
        browser = await p.chromium.connect_over_cdp(ws_url, headers=signed_headers)
        context = browser.contexts[0]
        page = context.pages[0] if context.pages else await context.new_page()

        await page.goto("chrome://policy/")
        await page.wait_for_timeout(2000)

        # "More actions" → "Copy as JSON" でポリシーデータを取得
        await page.locator("#more-actions-button").click()
        await page.wait_for_timeout(300)
        await page.locator("#copy-policies").click()
        await page.wait_for_timeout(500)
        policy_json = await page.evaluate("navigator.clipboard.readText()")
        policies = json.loads(policy_json) if policy_json else {}

        chrome_policies = policies.get("policyValues", {}).get("chrome", {}).get("policies", {})
        managed     = {k: v for k, v in chrome_policies.items() if v.get("level") == "mandatory"}
        recommended = {k: v for k, v in chrome_policies.items() if v.get("level") == "recommended"}

        print("[Managed ポリシー(強制)]")
        if managed:
            for name, info in managed.items():
                print(f"  {name} = {info['value']}")
        else:
            print("  (なし)")

        print("\n[Recommended ポリシー(推奨)]")
        if recommended:
            for name, info in recommended.items():
                print(f"  {name} = {info['value']}")
        else:
            print("  (なし)")

        await browser.close()

asyncio.run(verify())

実行結果の例:

[Managed ポリシー(強制)]
  AutofillAddressEnabled = False
  AutofillCreditCardEnabled = False
  ExtensionSettings = {'*': {'installation_mode': 'allowed'}, ...}
  PasswordManagerEnabled = False

[Recommended ポリシー(推奨)]
  BlockThirdPartyCookies = True
  SafeBrowsingProtectionLevel = 2

パート2: カスタムルートCAを設定する

手順1: テスト用ルートCA証明書を作成する

実際の企業環境では社内CA発行の証明書を使いますが、ここではOpenSSLで自己署名ルートCA証明書を作成してテストします。

# 秘密鍵を生成
openssl genrsa -out my-root-ca.key 2048

# 自己署名ルートCA証明書を作成(10年有効)
openssl req -x509 -new -nodes \
  -key my-root-ca.key \
  -sha256 \
  -days 3650 \
  -out my-root-ca.pem \
  -subj "/C=JP/ST=Tokyo/O=MyCorpCA/CN=My Corporate Root CA"

# 内容確認
openssl x509 -in my-root-ca.pem -noout -subject -issuer -dates

手順2: CA証明書をSecrets Managerに格納する

PEM形式のルートCA証明書をSecrets Managerに保存します。

aws secretsmanager create-secret \
  --name "my-corporate-root-ca" \
  --secret-string file://my-root-ca.pem \
  --region ap-northeast-1

ARNが返ってくるので控えておきます。

{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:my-corporate-root-ca-xxxxxx",
    "Name": "my-corporate-root-ca"
}

手順3: IAMポリシーを設定する

Secrets Managerからの読み取り権限は以下のようなIAMポリシーで付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SecretsManagerCertificateAccess",
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue"
      ],
      "Resource": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:my-corporate-root-ca-*"
    }
  ]
}

手順4: カスタムCA付きでブラウザセッションを起動し、信頼ストアを確認する

カスタムルートCAをセッションレベルで指定してブラウザセッションを起動し、OS の信頼ストアへの追加を確認します。

import boto3
import asyncio
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest

REGION = "ap-northeast-1"
SECRET_ARN = "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:my-corporate-root-ca-xxxxxx"

client = boto3.client("bedrock-agentcore", region_name=REGION)

response = client.start_browser_session(
    browserIdentifier="aws.browser.v1",
    name="session_with_custom_ca",
    sessionTimeoutSeconds=300,
    certificates=[
        {
            "location": {
                "secretsManager": {
                    "secretArn": SECRET_ARN
                }
            }
        }
    ]
)

session_id = response["sessionId"]
ws_url = response["streams"]["automationStream"]["streamEndpoint"]
print(f"Session ID: {session_id}")

# SigV4 署名ヘッダーを生成
session = boto3.session.Session()
credentials = session.get_credentials().get_frozen_credentials()
http_url = ws_url.replace("wss://", "https://")
aws_request = AWSRequest(method="GET", url=http_url)
SigV4Auth(credentials, "bedrock-agentcore", REGION).add_auth(aws_request)
signed_headers = dict(aws_request.headers)

async def verify():
    from playwright.async_api import async_playwright

    async with async_playwright() as p:
        browser = await p.chromium.connect_over_cdp(ws_url, headers=signed_headers)
        context = browser.contexts[0]
        page = context.pages[0] if context.pages else await context.new_page()

        # /etc/ssl/certs/ を file:// スキームで開いて証明書の追加を確認
        await page.goto("file:///etc/ssl/certs/")
        await page.wait_for_timeout(1000)
        certs_index = await page.evaluate("document.body.innerText")

        if "MyCorpCA" in certs_index or "My_Corporate" in certs_index:
            print("証明書が OS 信頼ストア(/etc/ssl/certs/)に追加されています!")
        else:
            print("証明書は見つかりませんでした。")

        await browser.close()

asyncio.run(verify())

実行結果の例:

Session ID: 01XXXXXXXXXXXXXXXXXXXXXX
証明書が OS 信頼ストア(/etc/ssl/certs/)に追加されています!

これで、社内のプライベートCAで署名された証明書を使用するサービスにもHTTPSでアクセスできるようになります。

気をつけるポイント・注意点

Chromeポリシーの注意点

  • ポリシーファイルは最大5MBまで
  • 1回のAPI呼び出しで最大10ファイルまで指定可能

カスタムルートCAの注意点

  • Secrets Managerには文字列値(SecretString) として格納する必要あり(バイナリ形式は不可)
  • 証明書の検索キーとして CN や O の名前(MyCorpCA など)が /etc/ssl/certs/ のファイル名に使われるため、日本語や記号を含まない ASCII 名称を推奨

まとめ

AgentCore Browserがエンタープライズレベルのセキュリティ要件に対応できるようになりました。

機能 できること 主な用途
Chromeポリシー ブラウザの挙動を組織のルールに沿って制御 URL制限、ダウンロード禁止、キオスクモード
カスタムルートCA 社内CA証明書を信頼ストアに追加 社内サービスへのアクセス、プロキシ対応

特に、これまで「セキュリティポリシー的にエージェントにブラウザ操作はさせられない」と判断されていた企業でも、ポリシーでアクセス先を制限し、カスタムCAで社内サービスとの接続を確保することで、安全にAIエージェントを活用する道が開けたのではないでしょうか。

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?