はじめに
「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ファイルを作成します。ここでは、パスワード保存の無効化とオートフィルの無効化を設定してみます。
{
"AutofillAddressEnabled": false,
"AutofillCreditCardEnabled": false,
"PasswordManagerEnabled": false
}
次に、Recommendedポリシー(推奨)の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エージェントを活用する道が開けたのではないでしょうか。
参考リンク
- Amazon Bedrock AgentCore adds support for Chrome policies and custom root CA(What's New)
- Using browser enterprise policies(公式ドキュメント)
- Configure Root Certificate Authority for AgentCore Browser(公式ドキュメント)
- Troubleshoot AgentCore Browser(トラブルシューティング)
- Chrome Enterprise Policy List(Chromiumポリシー一覧)
- Amazon Bedrock AgentCore