13.3.9. 要求ヘッダー
identityProviders スタンザで RequestHeaderIdentityProvider を設定して、X-Remote-User などの要求ヘッダー値からユーザーを識別します。これは通常、プロキシー認証と組み合わせて使用され、要求ヘッダー値を設定します。これは OpenShift Enterprise 2 のリモートユーザープラグイン によって管理者が Kerberos、LDAP、その他の数多くの形式のエンタープライズ認証を指定する方法と似ています。
さらに、コミュニティーでサポートされる SAML 認証 などの詳細な設定に要求ヘッダーアイデンティティープロバイダーを使用できます。SAML 認証は Red Hat ではサポートされていないことに注意してください。
ユーザーがこのアイデンティティープロバイダーを使用して認証を行うには、認証プロキシー経由で https://<master>/oauth/authorize (およびサブパス) にアクセスする必要があります。これを実行するには、OAuth トークンに対する非認証の要求を https://<master>/oauth/authorize にプロキシー処理するプロキシーエンドポイントにリダイレクトするよう OAuth サーバーを設定します。
ブラウザーベースのログインフローが想定されるクライアントからの非認証要求をリダイレクトするには、以下を実行します。
-
loginパラメーターをtrueに設定します。 -
provider.loginURLパラメーターをインタラクティブなクライアントを認証する認証プロキシー URL に設定してから、要求をhttps://<master>/oauth/authorizeにプロキシーします。
WWW-Authenticate チャレンジが想定されるクライアントからの非認証要求をリダイレクトするには、以下を実行します。
-
challengeパラメーターをtrueに設定します。 -
provider.challengeURLパラメーターをWWW-Authenticateチャレンジが予想されるクライアントを認証する認証プロキシー URL に設定し、要求をhttps://<master>/oauth/authorizeにプロキシーします。
provider.challengeURL および provider.loginURL パラメーターには、URL のクエリー部分に以下のトークンを含めることができます。
${url}は現在の URL と置き換えられ、エスケープされてクエリーパラメーターで保護されます。例:
https://www.example.com/sso-login?then=${url}${query}は最新のクエリー文字列と置き換えられ、エスケープされません。例:
https://www.example.com/auth-proxy/oauth/authorize?${query}
非認証要求が OAuth サーバーに到達することを想定する場合は、要求ヘッダーのユーザー名がチェックされる前に受信要求の有効なクライアント証明書をチェックするように、clientCA パラメーターをこのアイデンティティープロバイダーに対して設定する必要があります。これを設定しない場合、OAuth サーバーへの直接的な要求は、要求ヘッダーを設定するだけでこのプロバイダーのアイデンティティーになりすます可能性があります。
RequestHeaderIdentityProvider を使用したマスター設定
- 1
- このプロバイダー名は要求ヘッダーのユーザー名に接頭辞として付加され、アイデンティティー名が作成されます。
- 2
RequestHeaderIdentityProviderは、設定されたchallengeURLにリダイレクトすることで、WWW-Authenticateチャレンジを要求するクライアントに応答します。設定された URL はWWW-Authenticateチャレンジを使用して応答します。- 3
RequestHeaderIdentityProviderは、設定されたloginURLにリダイレクトすることで、ログインフローを要求するクライアントにのみ応答できます。設定される URL はログインフローを使用して応答します。- 4
- このプロバイダーのアイデンティティーとユーザーオブジェクト間のマッピングの確立方法を制御します (上記 を参照してください)。
- 5
- オプション: 非認証の
/oauth/authorize要求のリダイレクト先となる URL です。これにより、WWW-Authenticateチャレンジが予想されるクライアントの認証が行われ、それらの要求がhttps://<master>/oauth/authorizeにプロキシーされます。${url}は現在の URL と置き換えられ、エスケープされてクエリーパラメーターで保護されます。${query}は最新のクエリー文字列と置き換えられます。 - 6
- オプション: 非認証の
/oauth/authorize要求のリダイレクト先となる URL です。これは、ブラウザーベースのクライアントを認証してから、その要求をhttps://<master>/oauth/authorizeにプロキシー化します。https://<master>/oauth/authorizeにプロキシーする URL は/authorize(末尾にスラッシュはない) で終了し、OAuth 承認フローが適切に機能するようにサブパスもプロキシーする必要があります。${url}は現在の URL と置き換えられ、エスケープされてクエリーパラメーターで保護されます。${query}は最新のクエリー文字列と置き換えられます。 - 7
- オプション: PEM でエンコードされた証明書バンドルです。これが設定されている場合、要求ヘッダーのユーザー名をチェックする前に、有効なクライアント証明書が提示され、指定ファイルで認証局に対して検証される必要があります。
- 8
- オプション: 共通名 (
cn) の一覧。これが設定されている場合は、要求ヘッダーのユーザー名をチェックする前に指定される一覧の Common Name (cn) を持つ有効なクライアント証明書が提示される必要があります。空の場合、すべての Common Name が許可されます。これはclientCAとの組み合わせる場合にのみ使用できます。 - 9
- ユーザーアイデンティティーを順番にチェックする際に使用するヘッダー名。値を含む最初のヘッダーはアイデンティティーとして使用されます。これは必須であり、大文字小文字を区別します。
- 10
- メールアドレスを順番にチェックする際に使用するヘッダー名。値を含む最初のヘッダーはメールアドレスとして使用されます。これは任意であり、大文字小文字を区別します。
- 11
- 表示名を順番にチェックする際に使用するヘッダー名。値を含む最初のヘッダーは表示名として使用されます。これは任意であり、大文字小文字を区別します。
- 12
- 推奨ユーザー名を順番にチェックする際に使用するヘッダー名 (
headersに指定されるヘッダーで決定される変更不可のアイデンティティーと異なる場合)。値を含む最初のヘッダーは、プロビジョニング時に推奨ユーザー名として使用されます。これは任意であり、大文字小文字を区別します。
Microsoft Windows での SSPI 接続サポート
Microsoft Windows での SSPI 接続サポートの使用はテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
バージョン 3.11 以降
oc は、Microsoft Windows での SSO フローを許可するために Security Support Provider Interface (SSPI) をサポートします。要求ヘッダーのアイデンティティープロバイダーを GSSAPI 対応プロキシーと共に使用して Active Directory サーバーを OpenShift Container Platform に接続する場合、ユーザーは、ドメイン参加済みの Microsoft Windows コンピューターから oc コマンドラインインターフェイスを使用して OpenShift Container Platform に対して自動的に認証されます。
要求ヘッダーを使用した Apache 認証
この例は、マスターと同じホストに認証プロキシーを設定しています。同じホストにプロキシーとマスターがあると便利ですが、ご使用中の環境に適さない場合があります。たとえば、すでにマスターで ルーターを実行 している場合、ポート 443 が利用できなくなります。
この参照設定は Apache の mod_auth_gssapi を使用していますが、これは決して必須ではなく、以下の要件を満たしていれば他のプロキシーを簡単に使用することができます。
-
クライアント要求の
X-Remote-Userヘッダーをブロックして、スプーフィングを防ぎます。 -
RequestHeaderIdentityProvider設定でクライアント証明書の認証を適用します。 -
チャレンジフローを使用してすべての認証要求についての
X-Csrf-Tokenヘッダーを設定する必要があります。 -
/oauth/authorizeエンドポイントとそのサブパスのみがプロキシーされる必要があります。 バックエンドサーバーがクライアントを正しい場所へ送信できるようリダイレクトは書き換えないでください。 https://<master>/oauth/authorizeへプロキシーする URL は/authorizeで終了 (末尾のスラッシュなし) する必要があります。以下に例を示します。-
https://proxy.example.com/login-proxy/authorize?…https://<master>/oauth/authorize?…
-
https://<master>/oauth/authorizeにプロキシーされる URL のサブパスは、https://<master>/oauth/authorizeのサブパスにプロキシーする必要があります。以下に例を示します。-
https://proxy.example.com/login-proxy/authorize/approve?…https://<master>/oauth/authorize/approve?…
-
前提条件のインストール
mod_auth_gssapi モジュールを Optional チャンネル から取得します。以下のパッケージをインストールします。
yum install -y httpd mod_ssl mod_session apr-util-openssl mod_auth_gssapi
# yum install -y httpd mod_ssl mod_session apr-util-openssl mod_auth_gssapiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 信頼されたヘッダーを送信する要求を検証するために CA を生成します。この CA は
マスターのアイデンティティープロバイダーの設定の clientCA のファイル名として使用されます。oc adm ca create-signer-cert \ --cert='/etc/origin/master/proxyca.crt' \ --key='/etc/origin/master/proxyca.key' \ --name='openshift-proxy-signer@1432232228' \ --serial='/etc/origin/master/proxyca.serial.txt'
# oc adm ca create-signer-cert \ --cert='/etc/origin/master/proxyca.crt' \ --key='/etc/origin/master/proxyca.key' \ --name='openshift-proxy-signer@1432232228' \ --serial='/etc/origin/master/proxyca.serial.txt'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記oc adm ca create-signer-certコマンドは、5 年間有効な証明書を生成します。この期間は--expire-daysオプションを使って変更することができますが、セキュリティー上の理由から、値をこれより大きくすることは推奨されません。Ansible ホストインベントリーファイル (デフォルトで /etc/ansible/hosts) に最初に一覧表示されているマスターから
oc admコマンドを実行します。このプロキシー用のクライアント証明書を生成します。x509 証明書ツーリングを使用して実行することができます。
oc admCLI を使用すると便利です。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- ユーザー名は任意に指定できますが、ログにそのまま表示されるのでわかりやすい名前をつけると便利です。
- 2
- マスターと異なるホスト名で認証プロキシーを実行する場合、上記のようにデフォルトのマスター証明書を使用するのではなく、ホスト名と一致する証明書を生成することが重要です。/etc/origin/master/master-config.yaml ファイルの
masterPublicURLの値は、SSLCertificateFileに対して指定される証明書のX509v3 Subject Alternative Nameに含まれる必要があります。新規の証明書を作成する必要がある場合は、oc adm ca create-server-certコマンドを使用できます。
注記oc adm create-api-client-configコマンドは、2 年間有効な証明書を生成します。この期間は--expire-daysオプションを使って変更することができますが、セキュリティー上の理由から、値をこれより大きくすることは推奨されません。Ansible ホストインベントリーファイル (デフォルトで /etc/ansible/hosts) に最初に一覧表示されているマスターからoc admコマンドを実行します。
Apache の設定
このプロキシーはマスターと同じホストにある必要はありません。これはクライアント証明書を使用してマスターに接続し、X-Remote-User ヘッダーを信頼するように設定されます。
-
Apache 設定の証明書を作成します。
SSLProxyMachineCertificateFileパラメーターの値として指定する証明書は、プロキシーをサーバーに対して認証するために使用されるプロキシーのクライアント証明書です。これは、拡張されたキーのタイプとしてTLS Web Client Authenticationを使用する必要があります。 Apache 設定を作成します。以下のテンプレートを使用して必要な設定および値を指定します。
重要テンプレートを十分に確認し、その内容を環境に合うようにカスタマイズします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
マスターの設定
/etc/origin/master/master-config.yaml ファイルの identityProviders スタンザも更新する必要があります。
サービスの再起動
最後に、以下のサービスを再起動します。
systemctl restart httpd master-restart api master-restart controllers
# systemctl restart httpd
# master-restart api
# master-restart controllers
設定の確認
プロキシーをバイパスしてテストします。正しいクライアント証明書とヘッダーを指定すれば、トークンを要求できます。
curl -L -k -H "X-Remote-User: joe" \ --cert /etc/pki/tls/certs/authproxy.pem \ https://[MASTER]:8443/oauth/token/request
# curl -L -k -H "X-Remote-User: joe" \ --cert /etc/pki/tls/certs/authproxy.pem \ https://[MASTER]:8443/oauth/token/requestCopy to Clipboard Copied! Toggle word wrap Toggle overflow クライアント証明書を指定しない場合、要求は拒否されます。
curl -L -k -H "X-Remote-User: joe" \ https://[MASTER]:8443/oauth/token/request
# curl -L -k -H "X-Remote-User: joe" \ https://[MASTER]:8443/oauth/token/requestCopy to Clipboard Copied! Toggle word wrap Toggle overflow これは、設定された
challengeURL(追加のクエリーパラメーターを含む) へのリダイレクトを示します。curl -k -v -H 'X-Csrf-Token: 1' \ '<masterPublicURL>/oauth/authorize?client_id=openshift-challenging-client&response_type=token'
# curl -k -v -H 'X-Csrf-Token: 1' \ '<masterPublicURL>/oauth/authorize?client_id=openshift-challenging-client&response_type=token'Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、
WWW-Authenticate基本チャレンジ、ネゴシエートチャレンジ、またはそれらの両方のチャレンジを含む 401 応答が表示されるはずです。curl -k -v -H 'X-Csrf-Token: 1' \ '<redirected challengeURL from step 3 +query>'# curl -k -v -H 'X-Csrf-Token: 1' \ '<redirected challengeURL from step 3 +query>'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Kerberos チケットを使用または使用せずに、
ocコマンドラインへのログインをテストします。kinitを使用して Kerberos チケットを生成した場合は、これを破棄します。kdestroy -c cache_name
# kdestroy -c cache_name1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Kerberos キャッシュの名前を指定します。
Kerberos 認証情報を使用して
ocコマンドラインにログインします。oc login
# oc loginCopy to Clipboard Copied! Toggle word wrap Toggle overflow プロンプトで、Kerberos ユーザー名およびパスワードを入力します。
ocコマンドラインからログアウトします。oc logout
# oc logoutCopy to Clipboard Copied! Toggle word wrap Toggle overflow Kerberos 認証情報を使用してチケットを取得します。
kinit
# kinitCopy to Clipboard Copied! Toggle word wrap Toggle overflow プロンプトで、Kerberos ユーザー名およびパスワードを入力します。
ocコマンドラインにログインできることを確認します。oc login
# oc loginCopy to Clipboard Copied! Toggle word wrap Toggle overflow 設定が正しい場合は、別の認証情報を入力せずにログインできます。