4장. 추가 개념
4.1. 인증
4.1.1. 개요
그러면 인증 계층에서 OpenShift Container Platform API에 대한 요청과 관련된 사용자를 확인합니다. 그런 다음 권한 부여 계층에서는 요청하는 사용자에 대한 정보를 사용하여 요청을 허용해야 하는지 여부를 결정합니다.
관리자는 마스터 구성 파일을 사용하여 인증을 구성할 수 있습니다.
4.1.2. 사용자 및 그룹
OpenShift Container Platform에서 사용자는 OpenShift Container Platform API에 요청할 수 있는 엔티티입니다. 일반적으로 OpenShift Container Platform과 상호 작용하는 개발자 또는 관리자 계정을 의미합니다.
사용자는 하나 이상의 그룹에 할당될 수 있으며, 각 그룹은 특정 사용자 집합을 나타냅니다. 그룹은 사용자에게 개별적으로 부여하는 대신 권한 부여 정책을 관리하여 여러 사용자에게 한 번에 권한을 부여할 때 유용합니다(예: 프로젝트 내 오브젝트에 대한 액세스 허용).
명시적으로 정의된 그룹 외에도 OpenShift에서 자동으로 프로비저닝하는 시스템 그룹 또는 가상 그룹이 있습니다. 클러스터 바인딩을 볼 때 볼 수 있습니다.
가상 그룹의 기본 집합에서는 특히 다음 사항에 유의하십시오.
가상 그룹 | 설명 |
---|---|
system:authenticated | 인증된 모든 사용자와 자동으로 연결됩니다. |
system:authenticated:oauth | OAuth 액세스 토큰을 사용하여 인증된 모든 사용자와 자동으로 연결됩니다. |
system:unauthenticated | 인증되지 않은 모든 사용자와 자동으로 연결됩니다. |
4.1.3. API 인증
OpenShift Container Platform API에 대한 요청은 다음과 같은 방법으로 인증됩니다.
- OAuth 액세스 토큰
-
<master>
/oauth/authorize 및
끝점을 사용하여 OpenShift Container Platform OAuth 서버에서 가져옵니다.<master>
/oauth/token -
인증: 전달자…
헤더. -
WebSocket 요청의 경우
base64url.bearer.authorization.k8s.io.<base64url-encoded-token>
형식의 WebSocket 하위 프로토콜 헤더로 전송됩니다.
-
<master>
- X.509 클라이언트 인증서
- API 서버에 대한 HTTPS 연결이 필요합니다.
- 신뢰할 수 있는 인증 기관 번들과 대조하여 API 서버에서 확인합니다.
- API 서버는 인증서를 작성하고 컨트롤러에 분배하여 자체적으로 인증합니다.
유효하지 않은 액세스 토큰 또는 유효하지 않은 인증서가 있는 요청은 401 오류와 함께 인증 계층에서 거부됩니다.
액세스 토큰이나 인증서가 없는 경우 인증 계층은 system:anonymous
가상 사용자 및 system:unauthenticated
가상 그룹을 요청에 할당합니다. 그러면 권한 부여 계층에서 익명 사용자가 할 수 있는 요청(있는 경우)을 결정합니다.
4.1.3.1. 가장
OpenShift Container Platform API 요청에는 Impersonate-User 헤더가 포함될 수 있습니다. 이 헤더는 요청자가 지정된 사용자로부터 온 것처럼 요청을 처리하려고 함을 나타냅니다. 요청에 --as=<user>
플래그를 추가하여 사용자를 가장합니다.
사용자 A가 사용자 B를 가장할 수 있으려면 사용자 A가 인증됩니다. 그런 다음 권한 부여 확인이 발생하여 사용자 A가 User B라는 사용자를 가장할 수 있는지 확인합니다. 사용자 A가 서비스 계정을 가장하도록 요청하는 경우 system:serviceaccount:namespace:name 은 OpenShift Container Platform에서 User A가 이름이 인 serviceaccount 를 네임스페이스 에서 가장할 수 있는지 확인합니다. 검사에 실패하면 403(Forbidden) 오류 코드와 함께 요청이 실패합니다.
기본적으로 프로젝트 관리자 및 편집기는 해당 네임스페이스의 서비스 계정을 가장할 수 있습니다. sudoers 역할을 사용하면 system:admin 을 가장할 수 있으며, 이로 인해 클러스터 관리자 권한이 부여됩니다. system:admin 은 클러스터를 관리하는 사용자를 위해 보안이 아닌 오타에 대해 일부 보호 권한을 부여합니다. 예를 들어 oc delete nodes --all
을 실행하면 실패하지만 oc delete nodes --all --as=system:admin
을 실행하면 성공합니다. 다음 명령을 실행하여 권한을 사용자에게 부여할 수 있습니다.
$ oc create clusterrolebinding <any_valid_name> --clusterrole=sudoer --user=<username>
사용자를 대신하여 프로젝트 요청을 생성해야 하는 경우 명령에 --as=<user> --as-group=<group1> --as-group=<group2>
플래그를 포함합니다. system:authenticated:oauth
는 프로젝트 요청을 생성할 수 있는 유일한 부트스트랩 그룹이므로 다음 예와 같이 해당 그룹을 가장해야 합니다.
$ oc new-project <project> --as=<user> \ --as-group=system:authenticated --as-group=system:authenticated:oauth
4.1.4. OAuth
OpenShift Container Platform 마스터에는 내장 OAuth 서버가 포함되어 있습니다. 사용자는 API 인증을 위해 OAuth 액세스 토큰을 가져옵니다.
사용자가 새 OAuth 토큰을 요청하면 OAuth 서버는 구성된 ID 공급자를 사용하여 요청한 사용자의 ID를 확인합니다.
그런 다음 해당 ID와 매핑되는 사용자를 결정하고 그 사용자를 위한 액세스 토큰을 만들어 제공합니다.
4.1.4.1. OAuth 클라이언트
OAuth 토큰을 요청할 때마다 토큰을 받고 사용할 OAuth 클라이언트를 지정해야 합니다. OpenShift Container Platform API를 시작하면 다음 OAuth 클라이언트가 자동으로 생성됩니다.
OAuth 클라이언트 | 사용법 |
---|---|
openshift-web-console | 웹 콘솔의 토큰을 요청합니다. |
openshift-browser-client |
대화형 로그인을 처리할 수 있는 사용자 에이전트를 사용하여 |
openshift-challenging-client |
|
추가 클라이언트를 등록하려면 다음을 수행합니다.
$ oc create -f <(echo ' kind: OAuthClient apiVersion: oauth.openshift.io/v1 metadata: name: demo 1 secret: "..." 2 redirectURIs: - "http://www.example.com/" 3 grantMethod: prompt 4 ')
- 1
- OAuth 클라이언트의
이름은
<master>/oauth/authorize 및
에 요청할 때<master>
/oauth/tokenclient_id
매개변수로 사용됩니다. - 2
secret
은<master>/oauth/token
에 요청할 때client_secret
매개변수로 사용됩니다.- 3
<master> /oauth/authorize 및
에 대한 요청에 지정된<
master>/oauth/tokenredirect_uri
매개변수는redirectURIs
의 URI 중 하나와 같아야 합니다.- 4
grantMethod
는 이 클라이언트에서 토큰을 요청할 때 사용자가 아직 액세스 권한을 부여받지 않은 경우 수행할 조치를 결정하는 데 사용됩니다. grant Options(제한 옵션)에 표시되는 동일한 값을 사용합니다.
4.1.4.2. OAuth 클라이언트로서의 서비스 계정
서비스 계정은 제한된 형태의 OAuth 클라이언트로 사용할 수 있습니다. 서비스 계정은 서비스 계정의 자체 네임스페이스 내에서 일부 기본 사용자 정보 및 역할 기반 권한에 액세스할 수 있는 부분만 요청할 수 있습니다.
-
user:info
-
user:check-access
-
role:<any_role>:<serviceaccount_namespace>
-
role:<any_role>:<serviceaccount_namespace>:!
서비스 계정을 OAuth 클라이언트로 사용하는 경우에는 다음과 같습니다.
-
client_id
는system:serviceaccount:<serviceaccount_namespace>:<serviceaccount_name>
입니다. client_secret
은 해당 서비스 계정의 API 토큰 중 하나일 수 있습니다. 예를 들면 다음과 같습니다.$ oc sa get-token <serviceaccount_name>
-
WWW-Authenticate
챌린지를 가져오려면 서비스 계정의serviceaccounts.openshift.io/oauth-want-challenges
주석을 true로 설정합니다. -
redirect_uri
는 서비스 계정의 주석과 일치해야 합니다. 서비스 계정의 URI를 OAuth 클라이언트에서 자세한 정보를 제공하므로 리디렉션합니다.
4.1.4.3. 서비스 계정의 URI를 OAuth 클라이언트로 리디렉션
주석 키에는 접두사 serviceaccounts.openshift.io/oauth-redirecturi.
또는 serviceaccounts.openshift.io/oauth-redirectreference.
가 있어야 합니다. 예를 들면 다음과 같습니다.
serviceaccounts.openshift.io/oauth-redirecturi.<name>
가장 간단한 형식의 주석을 사용하여 유효한 리디렉션 URI를 직접 지정할 수 있습니다. 예를 들면 다음과 같습니다.
"serviceaccounts.openshift.io/oauth-redirecturi.first": "https://example.com" "serviceaccounts.openshift.io/oauth-redirecturi.second": "https://other.com"
위 예에서 first
및 second
라는 접미사는 두 개의 유효한 리디렉션 URI를 구분하는 데 사용됩니다.
복잡한 구성에서는 정적 리디렉션 URI로는 충분하지 않을 수 있습니다. 예를 들어 경로의 모든 인그레스가 유효한 것으로 간주될 수 있습니다. 이 경우 serviceaccounts.openshift.io/oauth-redirectreference
접두사를 통한 동적 리디렉션 URI가 작동합니다.
예를 들면 다음과 같습니다.
"serviceaccounts.openshift.io/oauth-redirectreference.first": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}"
이 주석의 값은 직렬화된 JSON 데이터를 포함하므로 확장된 형식으로 쉽게 볼 수 있습니다.
{ "kind": "OAuthRedirectReference", "apiVersion": "v1", "reference": { "kind": "Route", "name": "jenkins" } }
이제 OAuthRedirectReference
를 통해 jenkins
라는 경로를 참조할 수 있음을 확인할 수 있습니다. 따라서 해당 경로의 모든 인그레스가 이제 유효한 것으로 간주됩니다. OAuthRedirectReference
의 전체 사양은 다음과 같습니다.
{ "kind": "OAuthRedirectReference", "apiVersion": "v1", "reference": { "kind": ..., 1 "name": ..., 2 "group": ... 3 } }
두 주석 접두사를 결합하여 참조 오브젝트에서 제공하는 데이터를 덮어쓸 수 있습니다. 예를 들면 다음과 같습니다.
"serviceaccounts.openshift.io/oauth-redirecturi.first": "custompath" "serviceaccounts.openshift.io/oauth-redirectreference.first": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}"
first
접미사는 주석을 연결하는 데 사용됩니다. jenkins
경로에 https://example.com 의 인그레스가 있다고 가정하면 이제 https://example.com/custompath 은 유효한 것으로 간주되지만 https://example.com 은 유효한 것으로 간주되지 않습니다. 데이터 덮어쓰기를 부분적으로 제공하는 형식은 다음과 같습니다.
유형 | 구문 |
---|---|
스키마 | "https://" |
호스트 이름 | "//website.com" |
포트 | "//:8000" |
경로 | "examplepath" |
호스트 이름 덮어쓰기를 지정하면 참조된 오브젝트의 호스트 이름 데이터가 교체되며 이는 바람직한 동작이 아닙니다.
위 구문의 모든 조합은 다음과 같은 형식을 사용하여 결합할 수 있습니다.
<scheme:>//<hostname><:port>/<path>
유연성을 개선하기 위해 동일한 오브젝트를 두 번 이상 참조할 수 있습니다.
"serviceaccounts.openshift.io/oauth-redirecturi.first": "custompath" "serviceaccounts.openshift.io/oauth-redirectreference.first": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}" "serviceaccounts.openshift.io/oauth-redirecturi.second": "//:8000" "serviceaccounts.openshift.io/oauth-redirectreference.second": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}"
jenkins
라는 경로에 https://example.com 수신이 있다고 가정하면 https://example.com:8000 및 https://example.com/custompath 가 모두 유효한 것으로 간주됩니다.
정적 및 동적 주석을 동시에 사용하여 원하는 동작을 수행할 수 있습니다.
"serviceaccounts.openshift.io/oauth-redirectreference.first": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}" "serviceaccounts.openshift.io/oauth-redirecturi.second": "https://other.com"
4.1.4.3.1. OAuth에 대한 API 이벤트
경우에 따라 API 서버는 API 마스터 로그에 직접 액세스하지 않고 디버그하기 어려운 예기치 않은 조건 오류 메시지를 반환합니다. 근본적인 오류 원인은 인증되지 않은 사용자에게 서버 상태에 대한 정보를 제공하지 않기 위해 의도적으로 숨겨져 있습니다.
이러한 오류 중 일부는 서비스 계정 OAuth 구성 문제와 관련이 있습니다. 이와 같은 문제는 관리자가 아닌 사용자가 볼 수 있는 이벤트에서 발견됩니다. OAuth 중에 unexpected condition 서버 오류가 발생하면 oc get events
를 실행하여 ServiceAccount
에서 해당 이벤트를 확인하십시오.
다음 예는 적절한 OAuth 리디렉션 URI가 없는 서비스 계정에 대해 경고합니다.
$ oc get events | grep ServiceAccount
출력 예
1m 1m 1 proxy ServiceAccount Warning NoSAOAuthRedirectURIs service-account-oauth-client-getter system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>
oc describe sa/<service-account-name>
을 실행하면 지정된 서비스 계정 이름과 관련된 OAuth 이벤트가 보고됩니다.
$ oc describe sa/proxy | grep -A5 Events
출력 예
Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 3m 3m 1 service-account-oauth-client-getter Warning NoSAOAuthRedirectURIs system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>
다음은 가능한 이벤트 오류 목록입니다.
리디렉션 URI 주석이 없거나 유효하지 않은 URI가 지정되었습니다
Reason Message NoSAOAuthRedirectURIs system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>
잘못된 경로가 지정되었습니다
Reason Message NoSAOAuthRedirectURIs [routes.route.openshift.io "<name>" not found, system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>]
유효하지 않은 참조 유형이 지정되었습니다
Reason Message NoSAOAuthRedirectURIs [no kind "<name>" is registered for version "v1", system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>]
SA 토큰이 없습니다
Reason Message NoSAOAuthTokens system:serviceaccount:myproject:proxy has no tokens
4.1.4.3.1.1. 잘못된 구성에서 사용되는 샘플 API 이벤트
다음 단계에서는 사용자가 손상된 상태로 전환하는 방법 한 가지와 문제를 디버그하거나 해결하는 방법을 보여줍니다.
서비스 계정을 OAuth 클라이언트로 사용하여 프로젝트를 생성합니다.
프록시 서비스 계정 오브젝트에 대한 YAML을 생성하고 경로
프록시
를 사용하는지 확인합니다.$ vi serviceaccount.yaml
다음 샘플 코드를 추가합니다.
apiVersion: v1 kind: ServiceAccount metadata: name: proxy annotations: serviceaccounts.openshift.io/oauth-redirectreference.primary: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"proxy"}}'
경로 오브젝트에 대한 YAML을 생성하여 프록시에 대한 보안 연결을 생성합니다.
$ vi route.yaml
다음 샘플 코드를 추가합니다.
apiVersion: route.openshift.io/v1 kind: Route metadata: name: proxy spec: to: name: proxy tls: termination: Reencrypt apiVersion: v1 kind: Service metadata: name: proxy annotations: service.alpha.openshift.io/serving-cert-secret-name: proxy-tls spec: ports: - name: proxy port: 443 targetPort: 8443 selector: app: proxy
배포 구성에 대한 YAML을 생성하여 프록시를 사이드카로 시작합니다.
$ vi proxysidecar.yaml
다음 샘플 코드를 추가합니다.
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: proxy spec: replicas: 1 selector: matchLabels: app: proxy template: metadata: labels: app: proxy spec: serviceAccountName: proxy containers: - name: oauth-proxy image: openshift3/oauth-proxy imagePullPolicy: IfNotPresent ports: - containerPort: 8443 name: public args: - --https-address=:8443 - --provider=openshift - --openshift-service-account=proxy - --upstream=http://localhost:8080 - --tls-cert=/etc/tls/private/tls.crt - --tls-key=/etc/tls/private/tls.key - --cookie-secret=SECRET volumeMounts: - mountPath: /etc/tls/private name: proxy-tls - name: app image: openshift/hello-openshift:latest volumes: - name: proxy-tls secret: secretName: proxy-tls
세 개의 오브젝트를 생성합니다.
$ oc create -f serviceaccount.yaml
$ oc create -f route.yaml
$ oc create -f proxysidecar.yaml
oc edit sa/proxy
를 실행하여 서비스 계정을 편집하고serviceaccounts.openshift.io/oauth-redirectreference
주석을 변경하여 존재하지 않는 경로를 가리킵니다.apiVersion: v1 imagePullSecrets: - name: proxy-dockercfg-08d5n kind: ServiceAccount metadata: annotations: serviceaccounts.openshift.io/oauth-redirectreference.primary: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"notexist"}}' ...
서비스의 OAuth 로그를 검토하여 서버 오류를 찾습니다.
The authorization server encountered an unexpected condition that prevented it from fulfilling the request.
oc get events
를 실행하여ServiceAccount
이벤트를 확인합니다.$ oc get events | grep ServiceAccount
출력 예
23m 23m 1 proxy ServiceAccount Warning NoSAOAuthRedirectURIs service-account-oauth-client-getter [routes.route.openshift.io "notexist" not found, system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>]
4.1.4.4. 통합
OAuth 토큰에 대한 모든 요청에는 <master>/oauth/authorize
에 대한 요청이 포함됩니다. 대부분의 인증 통합에서는 이 끝점 앞에 인증 프록시를 배치하거나 백업 ID 공급자에 대한 자격 증명의 유효성을 검사하도록 OpenShift Container Platform을 구성합니다. <master>/oauth/authorize
에 대한 요청은 CLI와 같은 대화형 로그인 페이지를 표시할 수 없는 사용자 에이전트에서 가져올 수 있습니다. 따라서 OpenShift Container Platform은 대화형 로그인 flows 외에도 WWW-Authenticate
챌린지를 사용한 인증을 지원합니다.
인증 프록시가 <master>/oauth/authorize
끝점 앞에 배치되면 대화형 로그인 페이지를 표시하거나 대화형 로그인 flow로 리디렉션하는 대신 인증되지 않은 브라우저가 아닌 사용자 에이전트 WWW-Authenticate 챌린지
를 보내야 합니다.
브라우저 클라이언트에 대한 CSV(Cross-site Request Forgery) 공격을 방지하기 위해 X-CSRF-Token
헤더가 요청에 있는 경우에만 기본 인증 챌린지를 보내야 합니다. 기본 WWW-Authenticate 챌린지를
수신해야 하는 클라이언트는 이 헤더를 비어 있지 않은 값으로 설정해야 합니다.
인증 프록시가 WWW-Authenticate 챌린지를
지원할 수 없거나 OpenShift Container Platform이 WWW-Authenticate 챌린지를 지원하지 않는 ID 공급자를 사용하도록 구성된 경우 사용자는 <master>/oauth/token/request
를 통해 수동으로 액세스 토큰을 가져올 수 있습니다.
4.1.4.5. OAuth 서버 메타데이터
OpenShift Container Platform에서 실행되는 애플리케이션은 내장 OAuth 서버에 대한 정보를 검색해야 할 수 있습니다. 예를 들어, 수동 구성 없이 <master>
서버의 주소를 검색해야 할 수 있습니다. 이러한 작업을 지원하기 위해 OpenShift Container Platform에서는 IETF OAuth 2.0 인증 서버 메타데이터 초안 사양을 구현합니다.
따라서 클러스터 내에서 실행되는 모든 애플리케이션은 https://openshift.default.svc/.well-known/oauth-authorization-server에 GET
요청을 발행하여 다음 정보를 가져올 수 있습니다.
{ "issuer": "https://<master>", 1 "authorization_endpoint": "https://<master>/oauth/authorize", 2 "token_endpoint": "https://<master>/oauth/token", 3 "scopes_supported": [ 4 "user:full", "user:info", "user:check-access", "user:list-scoped-projects", "user:list-projects" ], "response_types_supported": [ 5 "code", "token" ], "grant_types_supported": [ 6 "authorization_code", "implicit" ], "code_challenge_methods_supported": [ 7 "plain", "S256" ] }
- 1
https
체계를 사용하고 쿼리 또는 조각 구성 요소가 없는 URL에 해당하는 권한 부여 서버의 발행자 식별자. 권한 부여 서버에 대한 정보가 포함된.well-known
RFC 5785 리소스가 게시되는 위치입니다.- 2
- 권한 부여 서버의 권한 부여 끝점 URL. RFC 6749를 참조하십시오.
- 3
- 권한 서버의 토큰 Endpoint URL입니다. RFC 6749를 참조하십시오.
- 4
- 이 권한 부여 서버에서 지원하는 OAuth 2.0 RFC 6749 범위 값 목록이 포함된 JSON 배열. 지원되는 모든 범위 값이 제공되는 것은 아닙니다.
- 5
- 이 권한 부여 서버에서 지원하는 OAuth 2.0
response_type
값 목록이 포함된 JSON 배열. 사용된 배열 값은 RFC 7591의 "OAuth 2.0 동적 클라이언트 등록 프로토콜"에서 정의한response_types
매개변수에 사용된 것과 동일합니다. - 6
- 이 권한 부여 서버에서 지원하는 OAuth 2.0 부여 유형 값 목록이 포함된 JSON 배열. 사용된 배열 값은 RFC 7591의 OAuth 2.0 동적 클라이언트 등록 프로토콜에서 정의한
grant_types
매개변수에 사용된 것과 동일합니다. - 7
- 이 권한 부여 서버에서 지원하는 PKCE RFC 7636 코드 챌린지 방법 목록이 포함된 JSON 배열. 코드 챌린지 방법 값은 RFC 7636의 4.3절에 정의된
code_challenge_method
매개변수에 사용됩니다. 유효한 코드 챌린지 방법 값은 IANA PKCE 코드 챌린지 방법 레지스트리에 등록된 값입니다. IANA OAuth 매개변수를 참조하십시오.
4.1.4.6. OAuth 토큰 가져오기
OAuth 서버는 표준 인증 코드 부여 및 암시적 부여 OAuth 인증 flows를 지원합니다.
인증 코드 부여 방법을 사용하여 OAuth 토큰을 요청하도록 다음 명령을 실행합니다.
$ curl -H "X-Remote-User: <username>" \ --cacert /etc/origin/master/ca.crt \ --cert /etc/origin/master/admin.crt \ --key /etc/origin/master/admin.key \ -I https://<master-address>/oauth/authorize?response_type=token\&client_id=openshift-challenging-client | grep -oP "access_token=\K[^&]*"
WWW-Authenticate challenges
(예: openshift-challenging-client
)를 요청하기 위해 구성된 client_id와 함께 암시적 부여 flow(response_type=token
)를 사용하여 OAuth 토큰을 요청하는 경우, /oauth/authorize
에서 제공 가능한 서버 응답 및 처리 방법은 다음과 같습니다.
상태 | 내용 | 클라이언트 응답 |
---|---|---|
302 |
URL 조각에 |
|
302 |
|
실패, |
302 |
기타 | 리디렉션을 따르고 해당 규칙을 사용하여 결과를 처리하십시오. |
401 |
|
유형이 인식되면(예: |
401 |
| 인증할 수 있는 챌린지가 없습니다. 실패했으며 응답 본문(OAuth 토큰을 가져올 수 있는 링크 및 대체 방법에 대한 세부 사항이 포함될 수 있음)을 표시합니다. |
기타 | 기타 | 실패, 사용자에게 응답 본문을 선택적으로 표시합니다. |
암시적 부여 흐름을 사용하여 OAuth 토큰을 요청하려면 다음을 수행합니다.
$ curl -u <username>:<password> 'https://<master-address>:8443/oauth/authorize?client_id=openshift-challenging-client&response_type=token' -skv / 1 / -H "X-CSRF-Token: xxx" 2
출력 예
* Trying 10.64.33.43...
* Connected to 10.64.33.43 (10.64.33.43) port 8443 (#0)
* found 148 certificates in /etc/ssl/certs/ca-certificates.crt
* found 592 certificates in /etc/ssl/certs
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_RSA_AES_128_GCM_SHA256
* server certificate verification SKIPPED
* server certificate status verification SKIPPED
* common name: 10.64.33.43 (matched)
* server certificate expiration date OK
* server certificate activation date OK
* certificate public key: RSA
* certificate version: #3
* subject: CN=10.64.33.43
* start date: Thu, 09 Aug 2018 04:00:39 GMT
* expire date: Sat, 08 Aug 2020 04:00:40 GMT
* issuer: CN=openshift-signer@1531109367
* compression: NULL
* ALPN, server accepted to use http/1.1
* Server auth using Basic with user 'developer'
> GET /oauth/authorize?client_id=openshift-challenging-client&response_type=token HTTP/1.1
> Host: 10.64.33.43:8443
> Authorization: Basic ZGV2ZWxvcGVyOmRzc2Zkcw==
> User-Agent: curl/7.47.0
> Accept: */*
> X-CSRF-Token: xxx
>
< HTTP/1.1 302 Found
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Expires: Fri, 01 Jan 1990 00:00:00 GMT
< Location:
https://10.64.33.43:8443/oauth/token/implicit#access_token=gzTwOq_mVJ7ovHliHBTgRQEEXa1aCZD9lnj7lSw3ekQ&expires_in=86400&scope=user%3Afull&token_type=Bearer 1
< Pragma: no-cache
< Set-Cookie: ssn=MTUzNTk0OTc1MnxIckVfNW5vNFlLSlF5MF9GWEF6Zm55Vl95bi1ZNE41S1NCbFJMYnN1TWVwR1hwZmlLMzFQRklzVXRkc0RnUGEzdnBEa0NZZndXV2ZUVzN1dmFPM2dHSUlzUmVXakQ3Q09rVXpxNlRoVmVkQU5DYmdLTE9SUWlyNkJJTm1mSDQ0N2pCV09La3gzMkMzckwxc1V1QXpybFlXT2ZYSmI2R2FTVEZsdDBzRjJ8vk6zrQPjQUmoJCqb8Dt5j5s0b4wZlITgKlho9wlKAZI=; Path=/; HttpOnly; Secure
< Date: Mon, 03 Sep 2018 04:42:32 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host 10.64.33.43 left intact
OAuth 토큰 값만 보려면 다음 명령을 실행합니다.
$ curl -u <username>:<password> / 'https://<master-address>:8443/oauth/authorize?client_id=openshift-challenging-client&response_type=token' / 1 -skv -H "X-CSRF-Token: xxx" --stderr - | grep -oP "access_token=\K[^&]*" 2
출력 예
hvqxe5aMlAzvbqfM2WWw3D6tR0R2jCQGKx0viZBxwmc
코드 부여
방법을 사용하여 토큰을 요청할 수도 있습니다.
4.1.4.7. Prometheus의 인증 지표
OpenShift Container Platform은 인증 시도 중 다음과 같은 Prometheus 시스템 지표를 캡처합니다.
-
openshift_auth_basic_password_count
는oc login
사용자 이름 및 암호 시도 횟수를 계산합니다. -
openshift_auth_basic_password_count_result
는oc login
사용자 이름 및 암호 시도 횟수(성공 또는 오류)를 계산합니다. -
openshift_auth_form_password_count
는 웹 콘솔 로그인 시도 횟수를 계산합니다. -
openshift_auth_form_password_count_result
는 웹 콘솔 로그인 시도 횟수(성공 또는 오류)를 계산합니다. -
openshift_auth_password_total
은 총oc login
및 웹 콘솔 로그인 시도 횟수를 계산합니다.