Red Hat コンテナーレジストリーの認証

更新 -

Red Hat の配布するコンテナーイメージが、従来の Red Hat コンテナーレジストリー (registry.access.redhat.com) から新たなレジストリー(registry.redhat.io) に移行しつつあります。この移行に伴い、コンテナーイメージをプルして使用するのに必要な認証に変更が生じます。このアーティクルでは、新たなレジストリーへの移行およびそれに関連する認証の問題について説明します。この移行中、お客様は以下の対応が可能です。

  • registry.access.redhat.com がサポートされなくなるまで、認証の不要なこのレジストリーの使用を続ける。
  • 新たな registry.redhat.io で認証がどのように機能するかを理解する。
  • 共有システムで使用するためのレジストリーサービスアカウントを作成する。

Red Hat のレジストリー

Red Hat では、3 つの異なるコンテナーレジストリーを通じてコンテナーイメージを配布しています。

レジストリー コンテンツ 非認証アクセスの
サポート
Red Hat ログインの
サポート
レジストリートークンの
サポート
registry.access.redhat.com Red Hat 製品 対応 非対応 非対応
registry.redhat.io Red Hat 製品 非対応 対応 対応
registry.connect.redhat.com サードパーティー製品 非対応 対応 対応

Red Hat では、今後 1 年間かけて registry.redhat.io および registry.connect.redhat.com を Red Hat および認定パートナーの主コンテナーレジストリーとして標準化し、最終的には registry.access.redhat.com を廃止する計画です。registry.access.redhat.com が廃止されるまで、お客様はこのレジストリーの使用を続けることができますが、registry.redhat.io を使用する準備を進めることを推奨します。

Red Hat ログインの取得

新しいレジストリーのアクセスモデルでは、Red Hat ログインが必要です。Red Hat 製品に対するエンタイトルメントをお持ちのお客様は、すでにアカウントをお持ちです。これは、Red Hat カスタマーポータル (access.redhat.com) にログインしてご自分の Red Hat サブスクリプションを管理するのに使用するアカウントと同じタイプのものです。

Red Hat アカウントをお持ちでなければ、以下のどちらかにサインアップして無料の Red Hat アカウントを取得することができます。

  • Red Hat Developer プログラム: 無料の開発者アカウントにサインアップすると、開発者ツールおよびプログラムにアクセスすることができます。
  • 30日間の試用版サブスクリプション: 30日間の試用版サブスクリプションにサインアップすると、一部の Red Hat ソフトウェア製品にアクセスすることができます。

諸条件に同意して Red Hat アカウントを取得したら、そのアカウントを使用して新しい Red Hat レジストリーにログインしてイメージを取得することができます。yum を使用してイメージをビルドまたは更新する際に RPM パッケージを追加または更新するためには、引き続き Red Hat からのエンタイトルメントが必要である点に注意してください。

認証の使用

認証されたレジストリーからコンテンツを取得するには、カスタマーポータル、Red Hat Developer、またはレジストリーサービスアカウントのいずれかの認証情報を使用してレジストリーにログインする必要があります。

registry.redhat.io レジストリーにログインするには、podman login または docker login コマンドのどちらかを使用することができます。 このアーティクルで例として使用した docker コマンドは、すべて podman コマンドに置き換えることができます。OpenShift またはその他の共有環境からは、個人のカスタマーポータルの認証情報の代わりにサービスアカウントを使用することを推奨します。

podman を使用して registry.redhat.io に認証するには、以下のコマンドを実行します。

# podman login -u myrhusername -p xxxxxxxxxxx https://registry.redhat.io

docker login コマンドを使用して registry.redhat.io に認証するには、以下のコマンドを実行します。

# docker login https://registry.redhat.io
Username: myrhusername
Password:  xxxxxxxxxxx

これで、以下のように新しいレジストリーからイメージ (例: rhel-atomic イメージ) をプルすることができます。

skopeo コマンドを使用する場合:

# skopeo copy registry.redhat.io/rhel7/rhel-atomic

docker コマンドを使用する場合:

# docker pull registry.redhat.io/rhel7/rhel-atomic
Username: myrhusername
Password:  xxxxxxxxxxx

レジストリーにログインすると、ご自分の認証情報は $HOME/.docker/config.json ファイルに保管されます。次回そのレジストリーからプルする際には、それらの認証情報が自動的に使用されます。このファイルの例を以下に示します。

   {
           "auths": {
                   "https://registry.redhat.io": {
                           "auth": "c2xmams6c2RmbGtq"
                   }
           }
   }

別の方法でこれらの認証情報を保存するには、「docker login」のページで config.json の説明を参照してください。

OpenShift ノードの場合には、追加のステップがあります。ログインした後に、~/.docker/config.json/var/lib/origin/.docker/config.json にコピーし、ノードを再起動する必要があります。

# cp ~/.docker/config.json /var/lib/origin/.docker/config.json; systemctl restart atomic-openshift-node

共有環境用のレジストリーサービスアカウント

registry.redhat.io からのコンテナーイメージを共有環境 (OpenShift など) で使用する場合には、管理者は個人のカスタマーポータルの認証情報の代わりにレジストリーサービスアカウント (認証トークンとも呼ばれる) を使用することを推奨します。

サービスアカウントはカスタマーポータルを利用する組織に提供されるメカニズムで、registry.redhat.io に認証してそこからコンテンツを取得するためだけに使用されます。共有システムでカスタマーポータルの認証情報を使用する必要がないので、サービスアカウントの使用を推奨します。レジストリーサービスアカウントは、カスタマーポータルのアカウントに適用されるセキュリティー管理機能に柔軟に対応します (パスワードの強制リセットなど)。

レジストリーサービスアカウントの 管理アプリケーション から、サービスアカウントの管理が可能です。また、Red Hat Container Catalog のメインページにある Service Accounts のリンクからアクセスすることもできます。 作成するサービスアカウントの数やシステムでの使用方法を自由に決めることができます。ガイドラインとしては、共有システム (OpenShift Container Platform クラスターなど) ごとに 1 つのサービスアカウントを使用してください。

レジストリーサービスアカウントの管理

サービスアカウント管理のアプリケーションで、トークン管理のために認証を簡単に分割することができます。サービスアカウントを作成、変更、または削除できるかどうかは、カスタマーポータルのログインに 組織管理者 ロールが割り当てられているかどうかにより決まります。

カスタマーポータルの組織管理者は、以下の操作を行うことができます。

  • 組織で作成したすべてのレジストリーサービスアカウントを表示する
  • レジストリーサービスアカウントを作成する
  • 任意のレジストリーサービスアカウントを変更または削除する

カスタマーポータルのユーザー (組織管理者以外) は、以下の操作を行うことができます。

  • 組織のレジストリーサービスアカウントをすべて表示する
  • レジストリーサービスアカウントを作成する
  • 自分の作成したレジストリーサービスアカウントのみを変更または削除する

カスタマーポータルのユーザーは、同じ組織内のどのユーザーが作成したサービスアカウントでも表示することができます。サービスアカウントおよびそれに関連付けられた認証情報を、組織内の他のユーザーから秘匿する機能はありません。

レジストリーサービスアカウントの作成

レジストリーサービスアカウントの管理アプリケーション にアクセスし、必要に応じてログインします。

  1. 「Registry Service Accounts」のページから New Service Account をクリックします。
  2. サービスアカウントの名前を入力します。変更できないランダムな文字列が先頭に追加されます。
    • 説明を入力します。
    • CREATE をクリックします。
  3. 「Registry Service Accounts」のページに戻ります。
  4. 作成したサービスアカウントをクリックします。
    • 先頭に追加された文字列を含めたユーザー名を書き留めます (例: XXXXXXX|username)。これが registry.redhat.io にログインするのに使用するユーザー名です。
    • パスワードを書き留めます。これが registry.redhat.io へのログインに使用するパスワードです。

「Token Information」のページには複数のタブがあり、さまざまなシナリオでの認証トークンの使用方法に関するガイダンスが提供されます。たとえば、Docker Login タブでは、Docker CLI でのトークンの使用方法について説明しています。

認証トークンの変更

サービスアカウントの作成と同様に、管理アプリケーションの機能の一部として、アカウントを変更または削除することができます。「Registry Service Accounts」 のページに表示される各認証トークンの右側にあるポップアップメニューを使用して、これらの機能を呼び出すことができます。それぞれの機能の説明を以下に示します。

  • Regenerate Token: 認定されたユーザーは、サービスアカウントに関連付けられたパスワードをリセットすることができます。サービスアカウントのユーザー名は変更されません。
  • Update Description: 認定されたユーザーは、サービスアカウントの説明を更新することができます。
  • Delete Account: 認定されたユーザーは、サービスアカウントを削除することができます。

警告: サービスアカウントのパスワードを再生成したりサービスアカウントを削除したりすると、registry.redhat.io への認証およびコンテンツの取得にトークンを使用しているシステムに影響を及ぼす可能性があります。

registry.redhat.io をデフォルトにする設定

デフォルトの Red Hat システムでは、Docker サービスは registry.access.redhat.com でコンテナーイメージを探すように設定されています。新しいレジストリーを使用するように変更するには、/etc/containers/registries.conf ファイルを編集します。

スーパーユーザーとして以下のコマンドを実行します。

# vi /etc/containers/registries.conf

registries.search の値を次のように変更します。

[registries.search]
# registries = ['registry.access.redhat.com']
registries = ['registry.redhat.io']

Docker サービスを再起動し (systemctl restart docker)、新しいレジストリーを有効にします。その後、短いイメージ名を使用してイメージを探し、新しいレジストリーからプルすることができます。

# docker pull rhel-atomic
Using default tag: latest
Trying to pull repository registry.redhat.io/rhel-atomic ... 
latest: Pulling from registry.redhat.io/rhel-atomic

他のセキュアなレジストリーからのイメージを参照する pod の許可

.dockercfg ファイル (あるいは、より新しい Docker クライアントの場合は $HOME/.docker/config.json) は、ご自分の情報を保管する Docker 認証情報ファイルです (以前にセキュアな/セキュアではないレジストリーにログインしている場合)。

OpenShift Container Platform の内部レジストリーからではないセキュアなコンテナーイメージをプルするには、ご自分の Docker 認証情報ファイルからプルシークレットを作成し、それをサービスアカウントに追加する必要があります。

セキュアなレジストリーに対する .dockercfg がすでにある場合には、以下のコマンドを実行してそのファイルからシークレットを作成することができます。

$ oc create secret generic <pull_secret_name> \
    --from-file=.dockercfg=<path/to/.dockercfg> \
    --type=kubernetes.io/dockercfg

また、$HOME/.docker/config.json ファイルがある場合には、以下のコマンドを実行します。

$ oc create secret generic <pull_secret_name> \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson

セキュアなレジストリーに対する Docker 認証情報ファイルがまだない場合には、以下のコマンドを実行してシークレットを作成することができます。

$ oc create secret docker-registry <pull_secret_name> \
    --docker-server=<registry_server> \
    --docker-username=<user_name> \
    --docker-password=<password> \
    --docker-email=<email>

pod がシークレットを使用してイメージをプルするには、サービスアカウントにシークレットを追加する必要があります。この例のサービスアカウントの名前は、pod が使用するサービスアカウントの名前と一致している必要があります。default がデフォルトのサービスアカウントです。

$ oc secrets link default <pull_secret_name> --for=pull

ビルドイメージのプッシュおよびプル用にシークレットを使用するには、シークレットが pod 内部にマウント可能でなければなりません。そのためには、以下のコマンドを実行します。

$ oc secrets link builder <pull_secret_name>

ビルドについては、ビルド設定内からのプルシークレットとしてシークレットを参照する必要もあります。

Red Hat レジストリーの詳細

以下は、registry.redhat.io の使用開始にあたって役立つリソースになります。

  • トラブルシューティング: セキュリティーが強化された環境にいる場合には、内部の設定を変更して registry.redhat.io をプロキシーのホワイトリストに登録する必要があります。「Troubleshooting Authentication Issues with registry.redhat.io」のアーティクルに記載の手順に従って、registry.redhat.io との接続性を確認することができます。
  • 追加のサポート情報の取得方法: さらにサポートが必要な場合には、Red Hat カスタマーポータルからお使いの製品に対するサポートチケットを発行してください。