AWS Organizations の SCP と IAM Identity Center の許可セットで AWS Marketplace 製品のサブスクライブを制限してみた
はじめに
AWS Marketplace では、さまざまなソフトウェアを Amazon Machine Image(AMI)などの形式で利用できます。
便利な一方で、AWS IAM Identity Center の AdministratorAccess 許可セットを利用しているユーザーが、組織内の承認を受けずに AWS Marketplace 製品をサブスクライブできてしまうことがあります。
今回は、以下の要件を想定し、AWS Organizations の Service Control Policy(サービスコントロールポリシー、以降 SCP)と IAM Identity Center の許可セットを組み合わせて、AWS Marketplace 製品のサブスクライブ操作を制限してみました。
- 通常の
AdministratorAccess許可セットでは AWS Marketplace 製品をサブスクライブできないようにする - サブスクライブが必要な場合のみ、専用の許可セットを対象ユーザーへ一時的に割り当てる
- サブスクライブ後に専用の許可セットの割り当てを解除する
- サブスクライブ対象の製品自体は SCP で限定しない
今回の検証では、通常の AdministratorAccess 許可セットでは AWS Marketplace 製品のサブスクライブ操作が拒否され、専用の許可セットでは操作できることを確認しました。
前提
今回の検証環境は以下です。
- AWS Organizations を利用している
- Organizations ですべての機能を有効化している
- 検証対象は Organizations のメンバーアカウント
- IAM Identity Center を利用している
- IAM Identity Center のリージョンは
ap-northeast-1 - 通常利用する許可セットは
AdministratorAccess - サブスクライブ用の許可セット名は
MarketplaceSubscribeAccess - SCP は検証用の OU またはメンバーアカウントにアタッチする
- サブスクライブ対象の AWS Marketplace 製品は限定しない
この記事で使用する許可セット名やリージョンは例です。実際に利用する場合は、自身の環境に合わせて変更してください。
SCP は Organizations のメンバーアカウントに適用されますが、管理アカウントのユーザーやロールには適用されません。そのため、今回の方法では、管理アカウント上の AWS Marketplace 製品のサブスクライブ操作を制限できません。
また、SCP は権限を付与するポリシーではありません。組織内のメンバーアカウントで、IAM ユーザーや IAM ロールが利用できる権限の上限を定義します。
制御の全体像
通常時の流れは以下です。
ユーザー
↓
通常の AdministratorAccess 許可セットでログイン
↓
SCP で aws-marketplace:Subscribe を明示的に拒否
↓
AWS Marketplace 製品をサブスクライブできない
AWS Marketplace 製品のサブスクライブが必要になった場合は、対象ユーザーへ専用の許可セットを割り当てます。
ユーザーが AWS Marketplace 製品のサブスクライブを申請
↓
管理者が MarketplaceSubscribeAccess を割り当て
↓
ユーザーがサブスクライブ用の許可セットでログイン
↓
サブスクライブ用ロールは SCP の Deny 対象外
↓
ユーザーが AWS Marketplace 製品をサブスクライブ
↓
管理者が許可セットの割り当てを解除
今回の SCP では、サブスクライブ用の許可セットから作成される IAM ロールを、aws-marketplace:Subscribe の Deny 対象から除外します。
SCP は、サブスクライブ用の許可セットに aws-marketplace:Subscribe を許可するものではありません。
実際にサブスクライブ操作を行うには、SCP の Deny 対象から除外されていることに加えて、IAM Identity Center の許可セットに設定された IAM ポリシーでも aws-marketplace:Subscribe が許可されている必要があります。
aws-marketplace:Subscribe とは
aws-marketplace:Subscribe は、AWS Marketplace 製品のサブスクライブに関する操作を制御する IAM アクションです。
AWS のサービス認可リファレンスでは、以下の操作が含まれると説明されています。
- AWS Marketplace 製品のサブスクライブ
- サブスクリプションの検証が必要な製品に対するサブスクリプションリクエストの送信
- 既存サブスクリプションの自動更新の有効化
今回の SCP は aws-marketplace:Subscribe を制限するため、AMI 製品だけでなく、AWS Marketplace 製品全般のサブスクライブ操作が対象になります。
一方で、以下の操作は今回の SCP では直接制限していません。
- 既存サブスクリプションの参照
- 既にサブスクライブ済みの AMI からの EC2 インスタンス起動
aws-marketplace:Unsubscribeによるサブスクリプション解除- 既存サブスクリプションの自動更新の無効化
- AWS Marketplace 以外から取得した AMI の利用
aws-marketplace:Unsubscribe には、AWS Marketplace 製品のサブスクリプション解除に加えて、既存サブスクリプションの自動更新を無効化する操作も含まれます。
今回はサブスクライブ操作を承認制にすることが目的であるため、aws-marketplace:Unsubscribe は制限対象にしていません。
SCP を作成する
今回使用した SCP は以下です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyMarketplaceSubscribeExceptAllowedRole",
"Effect": "Deny",
"Action": "aws-marketplace:Subscribe",
"Resource": "*",
"Condition": {
"ArnNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_MarketplaceSubscribeAccess_*"
]
}
}
}
]
}
各要素を確認します。
Action
"Action": "aws-marketplace:Subscribe"
AWS Marketplace 製品のサブスクライブに関する操作を Deny の対象にします。
具体的には、製品のサブスクライブだけでなく、サブスクリプションリクエストの送信や、既存サブスクリプションの自動更新を有効化する操作も対象になります。
Resource
"Resource": "*"
AWS Marketplace では、IAM ポリシーの Resource 要素でリソース ARN を指定するリソースレベルのアクセス許可がサポートされていません。
そのため、Resource には * を指定します。
aws:PrincipalArn
"ArnNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_MarketplaceSubscribeAccess_*"
]
}
aws:PrincipalArn を使って、リクエストを実行した IAM プリンシパルの ARN を判定します。
ArnNotLike を使用しているため、指定した ARN パターンに一致しないプリンシパルが Deny の対象になります。
今回指定している ARN パターンに一致するサブスクライブ用ロールは、Deny の対象から除外されます。
IAM ロールの一時的な認証情報を使ってリクエストした場合、aws:PrincipalArn には、Assumed Role セッションの ARN ではなく IAM ロールの ARN が設定されます。
そのため、IAM Identity Center が作成した IAM ロールの ARN を条件として利用できます。
IAM Identity Center が作成する IAM ロール
IAM Identity Center の許可セットを AWS アカウントに割り当てると、対象アカウントに AWSReservedSSO_ から始まる IAM ロールが作成されます。
許可セット名が MarketplaceSubscribeAccess で、IAM Identity Center のリージョンが東京リージョンの場合、以下のような ARN になります。
arn:aws:iam::111111111111:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_MarketplaceSubscribeAccess_0123456789abcdef
IAM Identity Center が作成するロール名と ARN の形式は以下です。
ロール名:
AWSReservedSSO_<許可セット名>_<一意なサフィックス>
ARN:
arn:aws:iam::<AWSアカウントID>:role/aws-reserved/sso.amazonaws.com/<リージョン>/AWSReservedSSO_<許可セット名>_<一意なサフィックス>
末尾の一意なサフィックスは環境によって異なるため、SCP では末尾にワイルドカードを指定しています。
AWSReservedSSO_MarketplaceSubscribeAccess_*
これにより、一意なサフィックスの値に依存せず、MarketplaceSubscribeAccess から作成された IAM ロールを条件にできます。
AWS のドキュメントでも、IAM Identity Center のロール ARN を参照する場合は、一意なサフィックスを固定せず、末尾にワイルドカードを使用する例が紹介されています。
なお、IAM Identity Center を us-east-1 で有効化している場合、IAM ロール ARN のパスにリージョンは含まれません。
arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/AWSReservedSSO_MarketplaceSubscribeAccess_*
実際に作成された IAM ロールの ARN を確認し、自身の環境に合った ARN パターンを SCP に指定してください。
サブスクライブ用の許可セットを作成する
IAM Identity Center に、AWS Marketplace 製品のサブスクライブに利用する許可セットを作成します。
今回の設定は以下です。
| 項目 | 設定値 |
|---|---|
| 許可セット名 | MarketplaceSubscribeAccess |
| 許可セットの種類 | カスタム許可セット |
| AWS マネージドポリシー | AdministratorAccess |
許可セット名と、SCP に指定する IAM ロール ARN の許可セット名部分は一致させます。
許可セット名:
MarketplaceSubscribeAccess
SCP に指定する ARN:
arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_MarketplaceSubscribeAccess_*
許可セットの作成手順
IAM Identity Center コンソールを開き、[マルチアカウント許可] の [許可セット] を選択します。
[許可セットを作成] をクリックし、カスタム許可セットを選択します。
AWS マネージドポリシーとして AdministratorAccess を選択し、許可セット名に以下を入力します。
MarketplaceSubscribeAccess
設定内容を確認し、許可セットを作成します。
作成した時点では、許可セットは AWS アカウントにプロビジョニングされていません。対象のユーザーまたはグループと AWS アカウントに許可セットを割り当てることで、対象アカウントに IAM ロールが作成されます。
AdministratorAccess を設定する理由
AdministratorAccess は、すべての AWS サービスとリソースに対する操作を許可する AWS マネージドポリシーです。
ポリシーの内容は以下です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
そのため、aws-marketplace:Subscribe も許可対象に含まれます。
今回は、通常の管理作業と同じ権限を維持しながら、専用の許可セットを利用した場合だけ AWS Marketplace 製品をサブスクライブできるようにするため、MarketplaceSubscribeAccess にも AdministratorAccess を設定しました。
この構成では、2つの許可セットに設定される IAM ポリシーは同じです。
| 許可セット | IAM ポリシー | SCP の評価 |
|---|---|---|
AdministratorAccess |
AdministratorAccess |
aws-marketplace:Subscribe の Deny 対象 |
MarketplaceSubscribeAccess |
AdministratorAccess |
aws-marketplace:Subscribe の Deny 対象外 |
違いは、SCP の aws:PrincipalArn 条件で Deny 対象から除外されるかどうかです。
AdministratorAccess よりも権限を絞った許可セットにしたい場合は、AWS マネージドポリシーの AWSMarketplaceManageSubscriptions や、必要なアクションだけを許可するカスタムポリシーも候補になります。
ただし、AWSMarketplaceManageSubscriptions には aws-marketplace:Subscribe 以外の AWS Marketplace 関連権限も含まれます。利用する場合は、現在のポリシー内容と運用上必要な操作を確認してください。
許可セットのタグを SCP の条件にしなかった理由
IAM Identity Center では、許可セットにタグを設定できます。
しかし、許可セットに設定したタグは、IAM Identity Center が各 AWS アカウントに作成する IAM ロールには引き継がれません。
AWS のドキュメントにも、タグは許可セットに適用できますが、IAM Identity Center が AWS アカウントに作成する対応ロールには適用できないと記載されています。
そのため、許可セットに以下のようなタグを設定しても、そのタグを IAM ロールのプリンシパルタグとして SCP から直接参照することはできません。
MarketplacePurchase=allow
たとえば、以下の条件では、許可セットに設定したリソースタグを判定できません。
"StringNotEquals": {
"aws:PrincipalTag/MarketplacePurchase": "allow"
}
aws:PrincipalTag で評価されるのは、リクエストを実行したプリンシパルに設定されたタグやセッションタグです。
許可セットに設定したリソースタグが、IAM Identity Center によって作成される IAM ロールのタグやセッションタグとして自動的に渡されるわけではありません。
今回は「サブスクライブ用の許可セットでログインした場合だけ Deny 対象から除外する」という要件であるため、許可セットから作成される IAM ロールの ARN を条件にしました。
SCP をアタッチする
作成した SCP を、検証対象の OU またはメンバーアカウントにアタッチします。
SCP を OU にアタッチした場合、その OU の配下にあるメンバーアカウントにも影響します。
そのため、最初から本番環境の OU 全体へ適用するのではなく、検証用のメンバーアカウントにアタッチし、想定した制御になることを確認してから適用範囲を広げるのがよさそうです。
今回確認するパターンは以下です。
| ログインに使用する許可セット | 想定結果 |
|---|---|
AdministratorAccess |
サブスクライブできない |
MarketplaceSubscribeAccess |
サブスクライブできる |
動作確認
検証対象のメンバーアカウントに SCP をアタッチし、許可セットごとに AWS Marketplace 製品のサブスクライブ操作を確認します。
通常の AdministratorAccess で確認する
まず、通常の AdministratorAccess 許可セットで検証対象のメンバーアカウントへログインします。
AWS Marketplace で AMI 製品のサブスクライブ画面を開いたところ、サブスクライブボタンがグレーアウトし、操作できませんでした。
画面上には、以下のエラーが表示されました。
User: arn:aws:sts::111111111111:assumed-role/AWSReservedSSO_AdministratorAccess_<一意なサフィックス>/<session-name> is not authorized to perform: aws-marketplace:Subscribe on resource: * with an explicit deny in a service control policy: arn:aws:organizations::222222222222:policy/o-xxxxxxxxxx/service_control_policy/p-xxxxxxxx

エラーには、aws-marketplace:Subscribe が SCP の明示的な Deny によって拒否されたことが示されています。
通常の AdministratorAccess 許可セットでは、IAM ポリシーによって aws-marketplace:Subscribe が許可されています。
しかし、今回の SCP では、MarketplaceSubscribeAccess から作成された IAM ロールの ARN パターンに一致しないプリンシパルに対して、aws-marketplace:Subscribe を明示的に拒否しています。
IAM の権限評価では明示的な Deny が優先されるため、AdministratorAccess が設定されていてもサブスクライブできません。
MarketplaceSubscribeAccess で確認する
次に、IAM Identity Center で対象ユーザーと検証対象のメンバーアカウントに MarketplaceSubscribeAccess を割り当てます。
対象ユーザーは、AWS アクセスポータルから MarketplaceSubscribeAccess を選択し、同じ AWS アカウントへログインします。
先ほどと同じ AWS Marketplace 製品のサブスクライブ画面を開いたところ、サブスクライブボタンが有効になり、操作できることを確認しました。
MarketplaceSubscribeAccess から作成された IAM ロールは、以下の ARN パターンに一致します。
arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_MarketplaceSubscribeAccess_*
SCP では ArnNotLike を使用しているため、この ARN パターンに一致する IAM ロールは、aws-marketplace:Subscribe の Deny 対象から除外されます。
また、許可セットには AdministratorAccess が設定されているため、IAM ポリシーでは aws-marketplace:Subscribe が許可されています。
その結果、サブスクライブ用の許可セットでは、AWS Marketplace 製品のサブスクライブ操作を実行できました。
今回の検証では、以下の制御を確認できました。
- 通常の
AdministratorAccessではサブスクライブできない MarketplaceSubscribeAccessではサブスクライブできる
運用フロー
今回想定している運用フローは以下です。
ユーザーが AWS Marketplace 製品のサブスクライブを申請
↓
管理者が申請内容を確認
↓
管理者が対象ユーザーと対象アカウントに MarketplaceSubscribeAccess を割り当て
↓
ユーザーが MarketplaceSubscribeAccess でログイン
↓
ユーザーが AWS Marketplace 製品をサブスクライブ
↓
ユーザーがサブスクライブ完了を管理者へ連絡
↓
管理者が MarketplaceSubscribeAccess の割り当てを解除
IAM Identity Center の許可セットは、ユーザーまたはグループと AWS アカウントの組み合わせに対して割り当てます。
そのため、ある AWS アカウントに MarketplaceSubscribeAccess を割り当てても、組織内のすべてのアカウントで利用できるようになるわけではありません。
サブスクライブ操作が必要なユーザーと AWS アカウントの組み合わせに対して、許可セットを割り当てます。
また、ユーザーが通常の AdministratorAccess とサブスクライブ用の MarketplaceSubscribeAccess の両方を割り当てられている場合、AWS アクセスポータルには両方の許可セットが表示されます。
サブスクライブ時には、ユーザーが MarketplaceSubscribeAccess を選択してログインする必要があります。
今回の制御範囲
今回の SCP で制限できるのは、aws-marketplace:Subscribe を必要とする操作です。
主な対象は AWS Marketplace 製品のサブスクライブですが、サブスクリプションの検証が必要な製品に対するリクエストの送信や、既存サブスクリプションの自動更新を有効化する操作も含まれます。
一方で、SCP を適用する前からサブスクライブ済みの製品について、利用そのものを停止する制御ではありません。
たとえば、既にサブスクライブ済みの AMI から EC2 インスタンスを起動する操作は、今回の SCP では直接制限していません。
AWS Marketplace 製品を新しくサブスクライブする
→ 今回の SCP で制限する
サブスクライブ済みの AMI から EC2 インスタンスを起動する
→ 今回の SCP では直接制限しない
サブスクライブ済みの AMI からの EC2 インスタンス起動まで制限したい場合は、ec2:RunInstances に対する IAM ポリシーや SCP など、別の制御を検討する必要があります。
また、今回の SCP では aws-marketplace:Unsubscribe を対象にしていないため、サブスクリプションの解除や、自動更新を無効化する操作は制限していません。
サブスクライブとサブスクリプション解除のどちらを承認制にするかは、要件に応じて決める必要があります。
まとめ
AWS Organizations の SCP と IAM Identity Center の許可セットを組み合わせ、AWS Marketplace 製品のサブスクライブ操作を特定の許可セット経由に制限できました。
ポイントは、サブスクライブ用の許可セットから作成される IAM ロール ARN を、aws-marketplace:Subscribe の Deny 対象から除外することです。
また、IAM Identity Center の許可セットに設定したタグは、対応する IAM ロールへ引き継がれないため、今回は aws:PrincipalArn を条件にしました。
今回の方法は、サブスクライブ対象の製品を事前に限定するのではなく、AWS Marketplace 製品をサブスクライブできるユーザーを一時的に限定したい場合に利用できそうです。








