13.3.9. 요청 헤더


identityProviders 스탠자에 RequestHeaderIdentityProvider 를 설정하여 X-Remote-User 와 같은 요청 헤더 값에서 사용자를 식별합니다. 일반적으로 요청 헤더 값을 설정하는 인증 프록시와 함께 사용됩니다. 이는 관리자가 OpenShift Enterprise 2의 원격 사용자 플러그인이 Kerberos, LDAP 및 기타 여러 형태의 엔터프라이즈 인증 기능을 제공하는 방법과 유사합니다.

참고

커뮤니티 지원 SAML 인증과 같은 고급 구성에도 요청 헤더 ID 공급자를 사용할 수 있습니다. Red Hat에서는 SAML 인증을 지원하지 않습니다.

사용자가 이 ID 공급자를 사용하여 인증하려면 인증 프록시를 통해 https://<master>/oauth/authorize (및 하위 경로)에 액세스해야 합니다. 이를 수행하려면 https://<master>/oauth/authorize 로 프록시하는 프록시 끝점으로 OAuth 토큰의 인증되지 않은 요청을 리디렉션하도록 OAuth 서버를 구성합니다.

브라우저 기반 로그인 flows가 필요한 클라이언트의 인증되지 않은 요청을 리디렉션하려면 다음을 수행합니다.

  1. login 매개 변수를 true로 설정합니다.
  2. provider.loginURL 매개변수를 대화형 클라이언트를 인증하는 인증 프록시 URL로 설정한 다음 요청을 https://<master>/oauth/authorize로 프록시합니다.

WWW 인증 챌린지가 예상되는 클라이언트의 인증되지 않은 요청을 리디렉션하려면 다음을 수행합니다.

  1. challenge 매개 변수를 true로 설정합니다.
  2. provider.challengeURL 매개변수를 WWW 인증 챌린지 가 예상되는 클라이언트를 인증하는 인증 프록시 URL로 설정한 다음 요청을 https://<master>/oauth/authorize로 프록시합니다.

provider.challengeURLprovider.loginURL 매개변수는 URL 조회 부분에 다음 토큰을 포함할 수 있습니다.

  • ${url}은 현재 URL로 교체되며 쿼리 매개변수에서 안전하도록 이스케이프됩니다.

    예: https://www.example.com/sso-login?then=${url}

  • ${query}는 이스케이프 처리되지 않은 현재 쿼리 문자열로 교체됩니다.

    예: https://www.example.com/auth-proxy/oauth/authorize?${query}

주의

OAuth 서버에 도달할 인증되지 않은 요청이 예상되는 경우 이 ID 프로바이더에 대해 clientCA 매개 변수를 설정해야 하므로 요청 헤더를 사용자 이름에 대해 들어오는 요청이 유효한 클라이언트 인증서에 대해 확인되도록 해야 합니다. 그러지 않으면 요청 헤더를 설정하는 것만으로 OAuth 서버에 대한 모든 직접 요청이 이 공급자의 ID를 가장할 수 있습니다.

RequestHeaderIdentityProvider를 사용한 마스터 구성

oauthConfig:
  ...
  identityProviders:
  - name: my_request_header_provider 1
    challenge: true 2
    login: true 3
    mappingMethod: claim 4
    provider:
      apiVersion: v1
      kind: RequestHeaderIdentityProvider
      challengeURL: "https://www.example.com/challenging-proxy/oauth/authorize?${query}" 5
      loginURL: "https://www.example.com/login-proxy/oauth/authorize?${query}" 6
      clientCA: /path/to/client-ca.file 7
      clientCommonNames: 8
      - my-auth-proxy
      headers: 9
      - X-Remote-User
      - SSO-User
      emailHeaders: 10
      - X-Remote-User-Email
      nameHeaders: 11
      - X-Remote-User-Display-Name
      preferredUsernameHeaders: 12
      - X-Remote-User-Login

1
이 공급자 이름은 요청 헤더에서 사용자 이름 앞에 접두어로 지정되어 ID 이름을 형성합니다.
2
RequestHeaderIdentityProvider 는 구성된 챌린지 URL로 리디렉션하여 WWW-Authenticate 챌린지를 요청하는 클라이언트에만 응답할 수 있습니다. 구성된 URL은 WWW-Authenticate 챌린지 에 응답해야 합니다.
3
RequestHeaderIdentityProvider 는 구성된 로그인 URL로 리디렉션하여 로그인 흐름을 요청하는 클라이언트에만 응답할 수 있습니다. 구성된 URL은 로그인 흐름을 사용하여 응답해야 합니다.
4
위에서 설명한 대로 이 프로바이더의 ID와 사용자 오브젝트 간의 매핑 설정 방법을 제어합니다.
5
선택 사항: 인증되지 않은 /oauth/authorize 요청을 리디렉션할 URL로, WWW-Authenticate 챌린지를 예상하는 클라이언트를 인증한 다음 https://<master>/oauth/authorize로 프록시합니다.${url} 은(는) 현재 URL로 교체되고 쿼리 매개 변수에서 안전하도록 이스케이프됩니다. ${query} 는 현재 쿼리 문자열로 교체됩니다.
6
선택 사항: 인증되지 않은 /oauth/authorize 요청을 로 리디렉션하는 URL로, 브라우저 기반 클라이언트를 인증한 다음 해당 요청을 https://<master>/oauth/authorize로 프록시합니다. OAuth 승인 흐름이 제대로 작동하려면 https://<master>/oauth/authorize 로 프록시되는 URL은 /authorize (후행 슬래시 없음)로 끝나야 하며 프록시 하위 경로도 작동합니다. ${url} 은 현재 URL로 교체되고 쿼리 매개변수에서 안전하도록 이스케이프됩니다. ${query} 는 현재 쿼리 문자열로 교체됩니다.
7
선택 사항: PEM 인코딩 인증서 번들. 설정한 경우 요청 헤더에서 사용자 이름을 확인하기 전에 지정된 파일의 인증 기관에 대해 유효한 클라이언트 인증서를 제공하고 검증해야 합니다.
8
선택 사항: 공통 이름(cn) 목록. 설정된 경우 요청 헤더에서 사용자 이름을 확인하기 전에 지정된 목록에 공통 이름(cn)이 있는 유효한 클라이언트 인증서를 제공해야 합니다. 비어 있는 경우 모든 공통 이름이 허용됩니다. clientCA 와 함께만 사용할 수 있습니다.
9
사용자 ID에 대해 순서대로 확인할 헤더 이름입니다. 값을 포함하는 첫 번째 헤더가 ID로 사용됩니다. 필수 항목이며 대소문자를 구분하지 않습니다.
10
이메일 주소를 순서대로 확인할 헤더 이름입니다. 값을 포함하는 첫 번째 헤더가 이메일 주소로 사용됩니다. 선택 항목이며 대소문자를 구분하지 않습니다.
11
표시 이름을 순서대로 확인할 헤더 이름입니다. 값을 포함하는 첫 번째 헤더가 표시 이름으로 사용됩니다. 선택 항목이며 대소문자를 구분하지 않습니다.
12
headers에 지정된 헤더에서 결정된 불변 ID와 다른 경우, 기본 사용자 이름을 순서대로 확인하는 헤더 이름입니다. 값이 포 된 첫 번째 헤더는 프로비저닝시 기본 사용자 이름으로 사용됩니다. 선택 항목이며 대소문자를 구분하지 않습니다.
Microsoft Windows에서 SSPI 연결 지원
중요

Microsoft Windows에서 SSPI 연결 지원을 사용하는 것은 기술 프리뷰 기능입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원하지 않으며, 기능상 완전하지 않을 수 있어 프로덕션에 사용하지 않는 것이 좋습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능 지원 범위에 대한 자세한 내용은 https://access.redhat.com/support/offerings/techpreview/를 참조하십시오.

버전 3.11부터

oc는 Microsft Windows에서 SSO 흐름을 허용하기 위해 보안 지원 공급자 인터페이스(SSPI)를 지원합니다. 요청 헤더 ID 공급자를 GSSAPI 지원 프록시와 함께 사용하여 Active Directory 서버를 OpenShift Container Platform에 연결하는 경우, 사용자가 도메인에 가입된 Microsoft Windows 컴퓨터에서 oc 명령줄 인터페이스를 사용하여 OpenShift Container Platform을 자동으로 인증할 수 있습니다.

요청 헤더를 사용한 Apache 인증

이 예제에서는 마스터와 동일한 호스트에서 인증 프록시를 구성합니다. 프록시와 마스터를 동일한 호스트에 보유하는 것은 편의성일 뿐이며 사용자 환경에 적합하지 않을 수 있습니다. 예를 들어 마스터에서 이미 라우터를 실행 중인 경우 포트 443을 사용할 수 없습니다.

또한 이 참조 구성은 Apache의 mod_auth_gssapi 를 사용하지만 필수는 없으며 다음 요구 사항을 충족하는 경우 다른 프록시를 쉽게 사용할 수 있습니다.

  1. 스푸핑을 방지하기 위해 클라이언트 요청에서 X-Remote-User 헤더를 차단합니다.
  2. RequestHeaderIdentityProvider 구성에서 클라이언트 인증서 인증을 시행합니다.
  3. 챌린지 flow를 사용하여 모든 인증 요청에 X-Csrf-Token 헤더를 설정해야 합니다.
  4. /oauth/authorize 엔드포인트와 해당 하위 경로만 프록시해야 하며 백엔드 서버가 클라이언트를 올바른 위치로 보낼 수 있도록 리디렉션을 다시 작성해서는 안 됩니다.
  5. https://<master>/oauth/authorize로 프록시되는 URL은 /authorize (후행 슬래시 없음)로 끝나야 합니다. 예를 들면 다음과 같습니다.

    • https://proxy.example.com/login-proxy/authorize?…​ HTTPS://<master>/oauth/authorize?…​
  6. https://<master>/oauth/authorize 로 프록시되는 URL의 하위 경로는 https://<master>/oauth/authorize 하위 경로로 프록시되어야 합니다. 예를 들면 다음과 같습니다.

    • https://proxy.example.com/login-proxy/authorize/approve?…​ HTTPS://<master>/oauth/authorize/approve?…​
사전 요구 사항 설치
  1. 선택적 채널에서 mod_auth_gssapi 모듈을 가져옵니다. 다음 패키지를 설치합니다.

    # yum install -y httpd mod_ssl mod_session apr-util-openssl mod_auth_gssapi
  2. 신뢰할 수 있는 헤더를 제출하는 요청을 검증하는 CA를 생성합니다. 이 CA는 마스터의 ID 공급자 구성에서 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 명령은 5년 동안 유효한 인증서를 생성합니다. 이는 --expire-days 옵션으로 변경할 수 있지만 보안상의 이유로 이 값보다 커지지 않는 것이 좋습니다.

    기본적으로 /etc/ansible/hosts 에서 Ansible 호스트 인벤토리 파일에 나열된 첫 번째 마스터에서만 oc adm 명령을 실행합니다.

  3. 프록시의 클라이언트 인증서를 생성합니다. 이 작업은 x509 인증서 툴링을 사용하여 수행할 수 있습니다. 편의를 위해 oc adm CLI를 사용할 수 있습니다.

    # oc adm create-api-client-config \
      --certificate-authority='/etc/origin/master/proxyca.crt' \
      --client-dir='/etc/origin/master/proxy' \
      --signer-cert='/etc/origin/master/proxyca.crt' \
      --signer-key='/etc/origin/master/proxyca.key' \
      --signer-serial='/etc/origin/master/proxyca.serial.txt' \
      --user='system:proxy' 1
    
    # pushd /etc/origin/master
    # cp master.server.crt /etc/pki/tls/certs/localhost.crt 2
    # cp master.server.key /etc/pki/tls/private/localhost.key
    # cp ca.crt /etc/pki/CA/certs/ca.crt
    # cat proxy/system\:proxy.crt \
      proxy/system\:proxy.key > \
      /etc/pki/tls/certs/authproxy.pem
    # popd
    1
    사용자 이름은 무엇이든 될 수 있지만 로그에 표시될 때 설명이 포함된 이름을 지정하는 것이 유용합니다.
    2
    마스터와 다른 호스트 이름에서 인증 프록시를 실행하는 경우 위에 표시된 대로 기본 마스터 인증서를 사용하는 대신 호스트 이름과 일치하는 인증서를 생성하는 것이 중요합니다. /etc/origin/master/master-config.yaml 파일의 masterPublicURL 값은 SSLCertificateFile 에 지정된 인증서 의 X509v3 주체 대체 이름에 포함되어야 합니다. 새 인증서를 만들어야 하는 경우 oc adm ca create-server-cert 명령을 사용할 수 있습니다.
    참고

    oc adm create-api-client-config 명령은 2년 동안 유효한 인증서를 생성합니다. 이는 --expire-days 옵션으로 변경할 수 있지만 보안상의 이유로 이 값보다 커지지 않는 것이 좋습니다. 기본적으로 /etc/ansible/hosts 에서 Ansible 호스트 인벤토리 파일에 나열된 첫 번째 마스터에서만 oc adm 명령을 실행합니다.

Apache 구성

이 프록시는 마스터와 동일한 호스트에 상주할 필요가 없습니다. 클라이언트 인증서를 사용하여 X-Remote-User 헤더를 신뢰하도록 구성된 마스터에 연결합니다.

  1. Apache 구성에 대한 인증서를 생성합니다. SSLProxyMachineCertificateFile 매개변수 값으로 지정하는 인증서는 서버에 프록시를 인증하는 데 사용되는 프록시의 클라이언트 인증서입니다. 확장 키 유형으로 TLS 웹 클라이언트 인증을 사용해야 합니다.
  2. Apache 구성을 생성합니다. 다음 템플릿을 사용하여 필요한 설정 및 값을 제공하십시오.

    중요

    템플릿을 신중하게 검토하고 환경에 맞게 내용을 사용자 정의하십시오.

    LoadModule request_module modules/mod_request.so
    LoadModule auth_gssapi_module modules/mod_auth_gssapi.so
    # Some Apache configurations might require these modules.
    # LoadModule auth_form_module modules/mod_auth_form.so
    # LoadModule session_module modules/mod_session.so
    
    # Nothing needs to be served over HTTP.  This virtual host simply redirects to
    # HTTPS.
    <VirtualHost *:80>
      DocumentRoot /var/www/html
      RewriteEngine              On
      RewriteRule     ^(.*)$     https://%{HTTP_HOST}$1 [R,L]
    </VirtualHost>
    
    <VirtualHost *:443>
      # This needs to match the certificates you generated.  See the CN and X509v3
      # Subject Alternative Name in the output of:
      # openssl x509 -text -in /etc/pki/tls/certs/localhost.crt
      ServerName www.example.com
    
      DocumentRoot /var/www/html
      SSLEngine on
      SSLCertificateFile /etc/pki/tls/certs/localhost.crt
      SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
      SSLCACertificateFile /etc/pki/CA/certs/ca.crt
    
      SSLProxyEngine on
      SSLProxyCACertificateFile /etc/pki/CA/certs/ca.crt
      # It's critical to enforce client certificates on the Master.  Otherwise
      # requests could spoof the X-Remote-User header by accessing the Master's
      # /oauth/authorize endpoint directly.
      SSLProxyMachineCertificateFile /etc/pki/tls/certs/authproxy.pem
    
      # Send all requests to the console
      RewriteEngine              On
      RewriteRule     ^/console(.*)$     https://%{HTTP_HOST}:8443/console$1 [R,L]
    
      # In order to using the challenging-proxy an X-Csrf-Token must be present.
      RewriteCond %{REQUEST_URI} ^/challenging-proxy
      RewriteCond %{HTTP:X-Csrf-Token} ^$ [NC]
      RewriteRule ^.* - [F,L]
    
      <Location /challenging-proxy/oauth/authorize>
          # Insert your backend server name/ip here.
          ProxyPass https://[MASTER]:8443/oauth/authorize
          AuthName "SSO Login"
          # For Kerberos
          AuthType GSSAPI
          Require valid-user
          RequestHeader set X-Remote-User %{REMOTE_USER}s
    
          GssapiCredStore keytab:/etc/httpd/protected/auth-proxy.keytab
          # Enable the following if you want to allow users to fallback
          # to password based authntication when they do not have a client
          # configured to perform kerberos authentication
          GssapiBasicAuth On
    
          # For ldap:
          # AuthBasicProvider ldap
          # AuthLDAPURL "ldap://ldap.example.com:389/ou=People,dc=my-domain,dc=com?uid?sub?(objectClass=*)"
    
          # It's possible to remove the mod_auth_gssapi usage and replace it with
          # something like mod_auth_mellon, which only supports the login flow.
        </Location>
    
        <Location /login-proxy/oauth/authorize>
        # Insert your backend server name/ip here.
        ProxyPass https://[MASTER]:8443/oauth/authorize
    
          AuthName "SSO Login"
          AuthType GSSAPI
          Require valid-user
          RequestHeader set X-Remote-User %{REMOTE_USER}s env=REMOTE_USER
    
          GssapiCredStore keytab:/etc/httpd/protected/auth-proxy.keytab
          # Enable the following if you want to allow users to fallback
          # to password based authntication when they do not have a client
          # configured to perform kerberos authentication
          GssapiBasicAuth On
    
          ErrorDocument 401 /login.html
        </Location>
    
    </VirtualHost>
    
    RequestHeader unset X-Remote-User
마스터 구성

/etc/origin/master/master-config.yaml 파일의 identityProviders 스탠자도 업데이트해야 합니다.

  identityProviders:
  - name: requestheader
    challenge: true
    login: true
    provider:
      apiVersion: v1
      kind: RequestHeaderIdentityProvider
      challengeURL: "https://[MASTER]/challenging-proxy/oauth/authorize?${query}"
      loginURL: "https://[MASTER]/login-proxy/oauth/authorize?${query}"
      clientCA: /etc/origin/master/proxyca.crt
      headers:
      - X-Remote-User
서비스 재시작

마지막으로 다음 서비스를 다시 시작하십시오.

# systemctl restart httpd
# master-restart api
# master-restart controllers
구성 확인
  1. 프록시를 바이패스하여 테스트합니다. 올바른 클라이언트 인증서 및 헤더를 제공하는 경우 토큰을 요청할 수 있습니다.

    # curl -L -k -H "X-Remote-User: joe" \
       --cert /etc/pki/tls/certs/authproxy.pem \
       https://[MASTER]:8443/oauth/token/request
  2. 클라이언트 인증서를 제공하지 않으면 요청이 거부되어야 합니다.

    # curl -L -k -H "X-Remote-User: joe" \
       https://[MASTER]:8443/oauth/token/request
  3. 구성된 challengeURL 로의 리디렉션이 표시됩니다(추가 쿼리 매개 변수 포함).

    # curl -k -v -H 'X-Csrf-Token: 1' \
       '<masterPublicURL>/oauth/authorize?client_id=openshift-challenging-client&response_type=token'
  4. WWW-Authenticate 기본 챌린지, 협상 챌린지 또는 두 가지 챌린지가 있는 401 응답이 표시되어야 합니다.

    #  curl -k -v -H 'X-Csrf-Token: 1' \
        '<redirected challengeURL from step 3 +query>'
  5. Kerberos 티켓을 사용하거나 사용하지 않고 oc 명령행에 로그인을 테스트합니다.

    1. kinit를 사용하여 Kerberos 티켓을 생성한 경우 이를 삭제합니다.

      # kdestroy -c cache_name 1
      1
      Kerberos 캐시의 이름을 제공합니다.
    2. Kerberos 자격 증명을 사용하여 oc 명령줄에 로그인합니다.

      # oc login

      프롬프트에 Kerberos 사용자 이름과 암호를 입력합니다.

    3. oc 명령줄에서 로그아웃합니다.

      # oc logout
    4. Kerberos 인증 정보를 사용하여 티켓을 받습니다.

      # kinit

      프롬프트에 Kerberos 사용자 이름과 암호를 입력합니다.

    5. oc 명령줄에 로그인할 수 있는지 확인합니다.

      # oc login

      구성이 올바르면 별도의 인증 정보를 입력하지 않아도 로그인할 수 있습니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.