短命のクラウドロールを仲介する
ロールのリースを保持し、プレーンを通じてそれを引き受けて短命の認証情報を得て、使用し、リースを解放します。
iam.assumecoordination.lease
ロールのリースを保持し、プレーンを通じてそれを引き受けて短命の認証情報を得て、使用し、リースを解放します。
iam.assumecoordination.leaseエージェントは、常設のクラウドキーを持つべきではありません。ブローカーは、ロールを保護されたクラスと照らして確認し、エージェントが保持する正確なロールARNの有効なリースを必須とし、その後STSにセッションを要求します。発行は、アクター、ロール、有効期限とともに台帳に記録され、キーは記録されません。
回答にはシークレットアクセスキーとセッショントークンが一度だけ含まれ、台帳には保持されません。リースを解放しても、すでに発行された認証情報は取り消されず、expirationMsまで有効です。STSは900秒未満のセッションを拒否します。
arn:aws:iam::で始まるロールARNコードはキーをINTRAMEDIAL_KEYから読み取ります。キーはシェルやシークレットストアに保管し、コミットするファイルには入れないでください。サインインした人が必要な呼び出しにはキーを使えず、コンソールが実行します。
それを使うエージェントとして、正確なロールARNのリースを取得します。認証情報の有効期間は、リースの残り時間が上限になります。
assumedはtrueで、リースと有効期限が続きます。
{
"assumed": true,
"roleArn": "arn:aws:iam::123456789012:role/deploy",
"sessionName": "release-agent",
"leaseId": "lease_4b7e",
"leaseScoped": true,
"expirationMs": 1793523600000,
: ,
: ,
:
}expirationMsに終了するロールセッションが発行されました。iam.assumeiam-assumecoordination.leasecoordination-leasecurl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/lease \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "arn:aws:iam::123456789012:role/deploy",
"actorDid": "did:web:acme.example:agent:release"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/lease", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "arn:aws:iam::123456789012:role/deploy",
actorDid: "did:web:acme.example:agent:release",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/lease",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "arn:aws:iam::123456789012:role/deploy",
"actorDid": "did:web:acme.example:agent:release",
},
timeout=30,
)
print(res.status_code, res.json())ロール、エージェント、セッション名、Web IDトークンを送ります。回答にはシークレットが一度だけ含まれるため、ログに見えない場所に保存してください。
curl -sS -X POST https://api.intramedial.com/api/v1/acp/iam/assume \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"roleArn": "arn:aws:iam::123456789012:role/deploy",
"actorDid": "did:web:acme.example:agent:release",
"sessionName": "release-agent",
"webIdentityToken": "eyJ…"
}'
# Save the answer to assume.json: it holds the secret once, so keep it out of logs.const res = await fetch("https://api.intramedial.com/api/v1/acp/iam/assume", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
roleArn: "arn:aws:iam::123456789012:role/deploy",
actorDid: "did:web:acme.example:agent:release",
sessionName: "release-agent",
webIdentityToken: "eyJ…",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/iam/assume",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"roleArn": "arn:aws:iam::123456789012:role/deploy",
"actorDid": "did:web:acme.example:agent:release",
"sessionName": "release-agent",
"webIdentityToken": "eyJ…",
},
timeout=30,
)
print(res.status_code, res.json())キーが必要な1つの作業のためにキーをエクスポートします。キーは、STSがセッションについて報告する有効期限であるexpirationMsまで有効です。
export AWS_ACCESS_KEY_ID=$(jq -r .accessKeyId assume.json)
export AWS_SECRET_ACCESS_KEY=$(jq -r .secretAccessKey assume.json)
export AWS_SESSION_TOKEN=$(jq -r .sessionToken assume.json)
# jq -r .expirationMs assume.json when STS says the credential ends作業が終わったらリースを解放します。これにより、次の認証情報が発行されなくなります。すでに発行されたものは取り消されず、expirationMsまで有効です。リクエストの急増を監視するには、watchdog.checkがiam.assumeイベントを読み取ります。
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/release \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "arn:aws:iam::123456789012:role/deploy",
"actorDid": "did:web:acme.example:agent:release"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/release", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "arn:aws:iam::123456789012:role/deploy",
actorDid: "did:web:acme.example:agent:release",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/release",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "arn:aws:iam::123456789012:role/deploy",
"actorDid": "did:web:acme.example:agent:release",
},
timeout=30,
)
print(res.status_code, res.json())転載元の資料: /docs/iam-assume
expirationMsまで有効です。台帳は追記専用で、Merkleルートのもとでシールされます。エントリの時刻はIntramedial自身のクロックによるもので、署名付きバンドルは公開鍵を使ってオフラインで確認できます。
coordination.leaseでリソースの排他リースを取得し、誰が保持しているかを確認し、終わったら手放します。
coordination.leaseリースと認証情報のイベントにおける急増、スパイク、沈黙を台帳から読み取り、独自のスケジューラーからチェックを実行します。
watchdog.check接続されたSaaSソースに対してエージェントが操作してよいかをプレーンに尋ね、何かが送信される前に判定を読み取ります。
saas.admitレシピ集にレシピを追加したときだけ、短いメールを1通。ほかのメールは送らず、どのメールからも配信停止できます。
アカウントは不要です。attestルートで7日間に35回まで呼び出せ、レシートはテストレシートとして明示されます。続けたくなったら、そのときに登録してください。