Container Compute Service (ACS) は、Container Registry (ACR) からパスワードレスでイメージをプルすることをサポートしており、効率性とセキュリティを向上させます。このトピックでは、ACS クラスターでパスワードレスで ACR イメージをプルする方法について説明します。
背景情報
Container Registry (ACR) は、ACR Personal Edition と ACR Enterprise Edition を含む複数のエディションで、クラウドネイティブアーティファクトのセキュアなホスティングと効率的な配布を提供します。詳細については、「Container Registry (ACR) の概要」をご参照ください。ACS は、すべての ACR エディションにおいて、パスワードレスで ACR イメージをプルするための統一された設定方法を提供します。
ACS クラスターにパスワードレスアクセスを設定すると、ACS はインスタンス作成時に ACR イメージの認証情報を自動的に挿入します。これにより、インスタンス作成プロセスが簡素化され、パスワード漏洩のリスクが軽減され、セキュリティが強化されます。
Docker イメージ、セルフホスト型リポジトリ、その他の ACR 以外のイメージは、パスワードレスでのプルをサポートしていません。
前提条件
ACS クラスターでパスワードレスでの ACR イメージプルを設定する前に、以下のタスクを完了してください。
-
ACS クラスターを作成します。詳細については、「ACS クラスターの作成」をご参照ください。
-
ACR インスタンスを作成し、イメージリポジトリとイメージを設定済みであること。
-
ACR Personal Edition インスタンスを設定する場合は、「Personal Edition インスタンスを使用したイメージのプッシュとプル」をご参照ください。
-
ACR Enterprise Edition インスタンスを設定する場合は、「Enterprise Edition インスタンスを使用したイメージのプッシュとプル」をご参照ください。
-
-
ACR Enterprise Edition インスタンスを使用する場合は、そのアクセス方法を設定する必要があります。
新規作成された ACR Enterprise Edition インスタンスは、デフォルトではアクセスできません。インターネットまたは Virtual Private Cloud (VPC) 経由でインスタンスにアクセスする前に、適切な ACL ポリシーを設定する必要があります。
-
パブリックネットワークアクセス:パブリックネットワークアクセスを有効にすると、パブリックドメイン名を使用して ACR Enterprise Edition インスタンスのイメージに直接アクセスできます (クロスドメインサポート)。詳細については、「パブリックネットワークアクセス制御の設定」をご参照ください。
-
VPC アクセス:VPC 経由で ACR Enterprise Edition インスタンスにアクセスするには、必要な認可を有効にする必要があります。詳細については、「VPC アクセス制御の設定」をご参照ください。
-
仕組み
パスワードレスコンポーネントは、コンソールの設定を読み取ることでプライベートイメージをプルします。パスワードレスコンポーネントを設定すると、クラスター内に Secret が自動的に作成され、設定で指定された ServiceAccount に関連付けられます。この ServiceAccount を使用するすべての Pod は、パスワードレスコンポーネントによって生成された Secret を自動的に使用してイメージをプルし、パスワードレスでのイメージプルが可能になります。
パスワードレスコンポーネントのインストールと設定
ACS コンソール にログインします。左側のナビゲーションペインで、クラスター をクリックします。
-
クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。
-
アドオン管理 ページで セキュリティ タブを選択し、aliyun-acr-credential-helper を見つけて インストール をクリックします。
-
パラメーター ダイアログボックスで、AcrInstanceInfo の横にある 追加 をクリックして、複数の ACR インスタンスエントリを追加します。 以下の例を使用して設定し、OK をクリックします。
-
**[AcrInstanceInfo]** を追加します。
説明デフォルトのシナリオは次のように設定されています。
-
ACR Personal Edition インスタンスを同期する場合は、デフォルトの **[AcrInstanceInfo]** 設定を使用します。
-
ACR Enterprise Edition インスタンスを同期する場合は、**[instanceID]** を入力し、その他のフィールドはデフォルト値のままにします。
パラメーターキー
設定項目の説明
値
instanceID
ACR インスタンス ID。
Container Registry でインスタンスを確認します。
-
エンタープライズ版: インスタンスで、インスタンス ID を見つけます。値は
cri-で始まる文字列です。 -
Personal Edition:このフィールドを空のままにして、Personal Edition のパスワードレスでのプルを有効にします。
デフォルト値:空 (現在のリージョンの Personal Edition インスタンスを設定)。
regionID
ACR インスタンスのリージョン ID。
ACR インスタンスが存在するリージョン ID です。たとえば、杭州のリージョン ID は
cn-hangzhouです。デフォルト値: ACS クラスターのリージョン。ACR インスタンスが同じリージョンにある場合は空のままにします。
domains
ACR インスタンスへのアクセスに使用されるドメイン名。
イメージをプルするためのドメイン名。複数のドメインはカンマ (,) で区切ります。
デフォルト値: [instanceID] で指定された ACR インスタンスに関連付けられたすべてのドメイン (パブリックドメイン registry.*、VPC ドメイン registry-vpc.*、内部ドメイン registry-internal.*)。
assumeRoleARN
(オプション) 「クロスアカウントでのイメージプルの設定」の手順 4 で取得した、イメージリポジトリ所有者の RAM ロールの ARN。クロスアカウントでプルしない場合は空のままにします。
例: acs:ram::123456789012****:test-rrsa-acr
デフォルト値:空。
expireDuration
(オプション) クロスアカウントで利用する場合の一時認証情報の有効期間。クロスアカウントでプルしない場合は空のままにします。
重要expireDuration の値は、クロスアカウントでのイメージ取得の設定のステップ 4 でイメージリポジトリ所有者のロールに設定した 最大セッション時間 以下である必要があります。
デフォルト値:
3600。rrsaRoleARN
(オプション) 「クロスアカウントでのイメージプルの設定」の手順 3 で取得した、ACS クラスター RAM ロールの ARN。クロスアカウントでプルしない場合は空のままにします。
例: acs:ram::987654321012****:demo-role-for-rrsa
デフォルト値:空。
rrsaOIDCProviderRoleARN
(オプション) 「クロスアカウントでのイメージプルの設定」の手順 2 で取得した、ACS クラスター RRSA OIDC **プロバイダー**の ARN。クロスアカウントでプルしない場合は空のままにします。
例: acs:ram::987654321012**:oidc-provider/ack-rrsa-abcd1234**
デフォルト値:空。
-
-
その他のパラメーターを設定します。
パラメーターキー
説明
設定値
[Enable RRSA]
RAM Roles for Service Accounts (RRSA) を有効にする場合に選択します (RRSA 関連の設定を完了する必要があります)。
デフォルトでは選択されていません。RRSA パラメーターを設定し、このオプションを選択すると、クロスアカウントでイメージをプルできます。
watchNamespace
パスワードレスでのイメージプルを有効にする名前空間。
デフォルト値は
defaultです。値を all に設定すると、すべての名前空間がパスワードなしのイメージプルをサポートすることを示します。複数の名前空間を設定するには、コンマ (,) で区切ります。説明アプリケーションの名前空間のみを指定することを推奨します。システムコンポーネントのイメージプルの失敗を防ぐため、all またはシステムコンポーネントの名前空間には設定しないでください。
serviceAccount
パスワードレスコンポーネントを適用するサービスアカウント。
デフォルト値:
default。説明複数の ServiceAccount を指定する場合は、カンマ (,) で区切ります。* を使用すると、指定された名前空間内のすべての ServiceAccount に適用されます。
expiringThreshold
ローカルにキャッシュされた認証情報の有効期限のしきい値。
デフォルト値:
15m。説明15m の使用を推奨します。これにより、認証情報の有効期限が切れる 15 分前に更新されます。
notifyEmail
パスワードレスコンポーネントによって生成された Secret 内の email ラベル。
デフォルト値:
xxx@aliyun.com。
-
クロスアカウントでのイメージプルの設定
RRSA を使用したクロスアカウントプル
RRSA は、ACS クラスターで Pod レベルの権限分離を可能にします。ACS クラスターで RRSA を有効にし、認可されたロール ARN をイメージリポジトリ所有者と共有することで、パスワードレスコンポーネントはクロスアカウントで ACR イメージをプルできます。
RRSA は現在、ACR Enterprise Edition インスタンス (Basic、Standard、Pro) からのイメージプルのみをサポートしています。
-
RRSA を有効にすると、コンポーネントによって生成された認証情報では、Personal Edition のプライベートイメージをプルしたり、このトピックで説明されている他の認証方法を使用したりすることはできません。
-
パスワードレスプラグインで RRSA を有効にするには、まず RRSA を有効にし、次にプラグインの RRSA 関連パラメーターを設定します。この順序を逆にした場合は、設定を反映させるために、パスワードレスプラグインの Pod を削除してください。
-
ACS クラスターで RRSA を有効にします。詳細については、「RRSA の有効化」をご参照ください。
-
ACS は、クラスター用の RRSA OIDC プロバイダーを自動的に作成します。クラスターコンソールで、**[Basic Information]** > **[Security and Audit]** > **[RRSA]** > **[OIDC]** に移動し、**[Provider URL]** と **[Provider ARN]** を確認します。
-
クラスター所有者は、OIDC プロバイダーを使用して RAM ロールを設定し、ロールの引き受け権限を付与します。
-
OIDC プロバイダーを使用して RAM ロールを作成するか、既存の RAM ロールを OIDC プロバイダーに関連付けて、パスワードレスコンポーネントがロールを使用して OpenAPI にアクセスできるようにします。
OIDC プロバイダーを使用した RAM ロールの作成
-
Alibaba Cloud アカウントで Resource Access Management (RAM) コンソールにログインします。
-
左側のナビゲーションペインで、 を選択します。Roles ページで、ロール作成 をクリックします。
-
ロール作成 ページで Switch to Policy Editor をクリックし、Principal を アイデンティティプロバイダー者 に設定します。次のようにロールを設定し、はい をクリックします。
-
以下の設定例を使用します。
設定項目
説明
[IdP タイプ]
**[OIDC]**。
[IdP の選択]
acs-rrsa-<cluster_id>。<cluster_id> をクラスター ID に置き換えます。
[条件]
-
**[oidc:iss]**: デフォルト値のままにします。
-
**[oidc:aud]**: デフォルト値のままにします。
-
[oidc:sub]: 条件演算子を [StringEquals] に設定します。**[system:serviceaccount:<namespace>:<serviceAccountName>]** の形式を使用します。
-
<namespace>:アプリケーションの名前空間。
-
<serviceAccountName>:サービスアカウントの名前。
パスワードレスプラグインでは、
system:serviceaccount:kube-system:aliyun-acr-credential-helperを使用する必要があります。 -
-
-
ロール作成 ダイアログボックスで、ロール名前 を demo-role-for-rrsa に設定し、はい をクリックします。
既存の RAM ロールを OIDC プロバイダーに関連付ける
-
Alibaba Cloud アカウントで Resource Access Management (RAM) コンソールにログインします。
-
左側のナビゲーションペインで、 を選択します。対象の RAM ロールの名前をクリックします。
-
トラスト規則 タブで、編集トラスト規則 をクリックします。 詳細については、「RAM ロールの信頼ポリシーを変更する」をご参照ください。
-
信頼ポリシーの
Statementリストに、以下のエントリ例を追加します。{ "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "oidc:aud": "sts.aliyuncs.com", "oidc:iss": "<oidc_issuer_url>", "oidc:sub": "system:serviceaccount:kube-system:aliyun-acr-credential-helper" } }, "Effect": "Allow", "Principal": { "Federated": [ "<oidc_provider_arn>" ] } }重要<oidc_issuer_url>と<oidc_provider_arn>を、ステップ 2 で取得した[プロバイダー URL] と [プロバイダー ARN] に置き換えます。
-
-
passwordless コンポーネントがロールを Assume できるように、
AliyunSTSAssumeRoleAccess権限ポリシーを RAM ロールにアタッチします。 詳細については、「RAM ロールの権限を管理する」をご参照ください。 -
Basic Information > [ARN] ページで、RAM ロールの [ARN] を確認します。
-
-
イメージリポジトリ所有者用の RAM ロールを設定し、クラスター所有者の RAM ロールを信頼し、イメージプル権限を付与します。
-
RAM ロールを作成します。詳細については、「Alibaba Cloud アカウントを信頼されたエンティティとする RAM ロールの作成」をご参照ください。
-
ACS クラスター RAM ロールを信頼して、リポジトリ所有者のロールを引き受けられるようにします。詳細については、「RAM ロールの信頼ポリシーの変更」をご参照ください。次のポリシードキュメントの例を使用します。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "<acs_role_arn>" ] } } ], "Version": "1" }重要<acs_role_arn>をステップ 3 で取得した ACS クラスター RAM ロールの ARN で置き換えます。 -
RAM ロールにイメージプル権限を付与します。
-
スクリプト編集モードでカスタムポリシーを作成します。 ポリシードキュメントのコンテンツは次のとおりです。 ポリシーのポリシー名は
AliyunACRBasicAccessにすることをお勧めします。 詳細については、「カスタムポリシーの作成」をご参照ください。{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] } -
RAM ロールに
AliyunACRBasicAccess権限を付与します。詳細については、「RAM ロールの権限を管理する」をご参照ください。
-
-
[任意] RAM ロールの 最大セッション時間 を設定します。有効な値の範囲は 3600 ~ 43200 秒です。最大セッション時間 を設定した場合は、ステップ 5 で AcrInstanceInfo を設定する際に expireDuration パラメーターも設定してください。
-
Basic Information > [ARN] ページで、RAM ロールの ARN を確認します。
-
-
パスワードレスコンポーネントの設定で、Enable RRSA を選択し、**[AcrInstanceInfo]** を設定します。
**[AcrInstanceInfo]** を次のように変更します。
パラメーターキー
説明
設定値
[Enable RRSA]
RRSA を有効にする場合に選択します (RRSA 関連の設定を完了する必要があります)。
選択済み
rrsaRoleARN
手順 3 で取得した ACS クラスター RAM ロールの **[ARN]**。
<acs_role_arn>rrsaOIDCProviderRoleARN
手順 2 で取得した ACS クラスター RRSA OIDC **プロバイダー ARN**。
oidc_provider_arnassumeRoleARN
手順 4 で取得したイメージリポジトリ所有者の RAM ロール **[ARN]**。
<acr_role_arn>expireDuration
パスワードレスコンポーネントによって生成される一時認証情報の有効期間。
重要expireDuration の値は、ステップ 4 でイメージリポジトリ所有者のロールに設定された 最大セッション時間 以下である必要があります。
デフォルト: 3600。有効範囲: [3600, 43200]。単位: 秒。