"Keystoneauth 인증 플러그인"의 두 판 사이의 차이

 
(같은 사용자의 중간 판 12개는 보이지 않습니다)
1번째 줄: 1번째 줄:
==개요==
==개요==
{{소문자}}
[[분류: Keystoneauth]]
[[분류: Keystoneauth]]
;Authentication Plugins
;Authentication Plugins
;인증 플러그인
;인증 플러그인
https://docs.openstack.org/keystoneauth/latest/authentication-plugins.html
https://docs.openstack.org/keystoneauth/latest/authentication-plugins.html
{{작성중}}


==소개==
==소개==
207번째 줄: 207번째 줄:
</syntaxhighlight>
</syntaxhighlight>


==연맹==
==페더레이션==
다음 V3 플러그인은 연맹을 지원하기 위해 제공됩니다:
다음 V3 플러그인은 페더레이션을 지원하기 위해 제공됩니다:


* <code>MappedKerberos</code>: 연맹(매핑된) Kerberos.
* <code>MappedKerberos</code>: 페더레이션(매핑된) Kerberos.
* <code>Password</code>: SAML2 패스워드 인증.
* <code>Password</code>: SAML2 패스워드 인증.
* <code>v3:OpenIDConnectAccessToken</code>: 기존의 OpenID Connect 액세스 토큰을 재사용하는 플러그인.
* <code>v3:OpenIDConnectAccessToken</code>: 기존의 OpenID Connect 액세스 토큰을 재사용하는 플러그인.
216번째 줄: 216번째 줄:
* <code>v3:OpenIDConnectClientCredentials</code>: OpenID Connect 클라이언트 자격증명 그랜트 타입.
* <code>v3:OpenIDConnectClientCredentials</code>: OpenID Connect 클라이언트 자격증명 그랜트 타입.
* <code>v3:OpenIDConnectPassword</code>: OpenID Connect 자원 소유자 패스워드 자격증명 그랜트 타입.
* <code>v3:OpenIDConnectPassword</code>: OpenID Connect 자원 소유자 패스워드 자격증명 그랜트 타입.
* <code>Keystone2Keystone</code>: Keystone 간 연맹.
* <code>Keystone2Keystone</code>: Keystone 간 페더레이션.


Keystone2Keystone 플러그인은 특별한데, 서비스 제공자로 작동하는 Keystone에서 세션을 생성하기 위해 신원 제공자로 작동하는 다른 Keystone 인스턴스에 대한 패스워드 인증을 입력으로 사용합니다. 예시:
Keystone2Keystone 플러그인은 특별한데, 서비스 제공자로 작동하는 Keystone에서 세션을 생성하기 위해 신원 제공자로 작동하는 다른 Keystone 인스턴스에 대한 패스워드 인증을 입력으로 사용합니다. 예시:
253번째 줄: 253번째 줄:
이 플러그인은 <code>keystoneauth1.token_endpoint.Token</code>에서 찾을 수 있습니다.
이 플러그인은 <code>keystoneauth1.token_endpoint.Token</code>에서 찾을 수 있습니다.


예를 들면 다음과 같습니다:
예시:


<syntaxhighlight lang='python'>
<syntaxhighlight lang='python'>
264번째 줄: 264번째 줄:


===V3 OAuth 1.0a 플러그인===
===V3 OAuth 1.0a 플러그인===
OAuth 1.0a 인증을 위한 플러그인도 있습니다. <code>V3OAuth1</code>이라는 헬퍼 인증 플러그인을 제공합니다. 이 플러그인은 OAuth 소비자의 키와 비밀, OAuth 액세스 토큰의 키와 비밀을 필요로 합니다. 예를 들면 다음과 같습니다:
OAuth 1.0a 인증을 위한 플러그인도 있습니다. <code>V3OAuth1</code>이라는 헬퍼 인증 플러그인을 제공합니다. 이 플러그인은 OAuth 소비자의 키와 비밀, OAuth 액세스 토큰의 키와 비밀을 필요로 합니다. 예시:


<syntaxhighlight lang='python'>
<syntaxhighlight lang='python'>
278번째 줄: 278번째 줄:


==애플리케이션 자격증명==
==애플리케이션 자격증명==
애플리케이션 자격증명 인증을 지원하는 Identity 서버와 상호작용하기 위한 특정 인증 방법이 있습니다. 애플리케이션 자격증명은 특정 프로젝트의 사용자와 연결되어 있기 때문에 기존 패스워드 인증과 달리 몇 가지 매개변수가 필요하지 않습니다. 다음 방법을 사용하여 애플리케이션 자격증명을 사용해 토큰을 인증할 수 있습니다:
* <code>ApplicationCredential</code>:
다음 예제는 세션과 함께 이 방법을 사용하는 방법을 보여줍니다:
<syntaxhighlight lang='python'>
from keystoneauth1 import session
from keystone.identity import v3
auth = v3.ApplicationCredential(
        application_credential_secret='application_credential_secret',
        application_credential_id='c2872b920853478292623be94b657090'
    )
sess = session.Session(auth=auth)
</syntaxhighlight>
==OAuth2.0 클라이언트 자격증명==
==OAuth2.0 클라이언트 자격증명==
==OAuth2.0 상호TLS 클라이언트 자격증명==
{{WARNING}}
RFC 6749 에 따르면 액세스 토큰은 HTTPS를 사용하는 요청에만 추가되어야 합니다.
{{/WARNING}}
 
OAuth2.0 클라이언트 자격증명 부여를 지원하는 Identity 서버와 상호작용하기 위한 특정 인증 방법이 있습니다. 다른 인증 방법과의 주요 차이점은 인증이 성공한 후 <code>session</code>이 이후의 요청에 OAuth2.0 액세스 토큰이 포함된 “Authorization” 헤더를 추가한다는 점입니다. OAuth2.0 클라이언트 자격증명을 사용하여 토큰을 인증하는 데 사용할 수 있는 방법은 다음과 같습니다:
 
* <code>OAuth2ClientCredential</code>:
 
다음 예제는 세션에서 이 방법을 사용하는 방법을 보여줍니다:
 
<syntaxhighlight lang='python'>
from keystoneauth1 import session
from keystone.identity import v3
 
auth = v3.OAuth2ClientCredential(
        oauth2_endpoint='https://keystone.host/identity/v3/OS-OAUTH2/token',
        oauth2_client_id='f96a2fec117141a6b5fbaa0485632244',
        oauth2_client_secret='client_credential_secret'
    )
sess = session.Session(auth=auth)
</syntaxhighlight>
 
==OAuth2.0 상호-TLS 클라이언트 자격증명==
{{WARNING}}
RFC 8705 에 따라 상호-TLS를 사용하는 요청에 대해서만 액세스 토큰을 추가해야 합니다.
{{/WARNING}}
 
OAuth 2.0 상호-TLS 클라이언트 인증을 지원하는 Identity 서버와 상호작용하기 위한 특정 인증 방법이 있습니다. 다른 인증 방법과의 눈에 띄는 차이점은 인증을 통과한 후 <code>session</code>이 OAuth 2.0 인증서 기반 액세스 토큰이 포함된 "Authorization" 헤더를 추가하여 후속 요청을 보낸다는 것입니다. 다음 방법을 사용하여 OAuth 2.0 상호-TLS 클라이언트 자격증명을 사용하여 토큰을 인증할 수 있습니다:
 
* <code>OAuth2mTlsClientCredential</code>:
 
다음 예제는 세션에서 메소드 사용법을 보여줍니다:
 
<syntaxhighlight lang='python'>
from keystoneauth1 import session
from keystone.identity import v3
auth = v3.OAuth2mTlsClientCredential(
        auth_url='http://keystone.host:5000/v3',
        oauth2_endpoint='https://keystone.host/identity/v3/OS-OAUTH2/token',
        oauth2_client_id='f96a2fec117141a6b5fbaa0485632244'
    )
sess = session.Session(auth=auth)
</syntaxhighlight>
 
==토큰 없는 인증==
==토큰 없는 인증==
토큰 없는 인증을 위한 플러그인도 있습니다. 이는 토큰을 발급할 필요 없이 X.509 TLS 클라이언트 인증서를 사용하여 클라이언트 작업을 Identity 서버 내에서 승인하는 방법을 제공합니다. 저희는 다음과 같은 토큰 없는 인증 플러그인을 제공합니다:
* <code>TokenlessAuth</code>:
이 플러그인은 주로 서비스 클라이언트가 토큰을 검증하는 데 사용되며, 실제로 이 플러그인을 사용하는 예시는 다음과 같습니다:
<syntaxhighlight lang='python'>
from keystoneauth1 import session
from keystoneauth1.identity import v3
auth = v3.TokenlessAuth(auth_url='https://keystone:5000/v3',
                        domain_name='my_service_domain')
sess = session.Session(
                auth=auth,
                cert=('/opt/service_client.crt',
                      '/opt/service_client.key'),
                verify='/opt/ca.crt')
</syntaxhighlight>
==이름으로 플러그인 로딩==
==이름으로 플러그인 로딩==
auth_token 미들웨어 및 서비스 간 통신에서는 이름으로 로드할 플러그인을 지정할 수 있습니다. 그러면 지정한 플러그인에 따라 사용가능한 인증 옵션이 결정됩니다. 현재 keystoneauth에서 사용가능한 인증 플러그인은 다음과 같습니다:
* http_basic: <code>keystoneauth1.http_basic.HTTPBasicAuth</code>
* none: <code>keystoneauth1.noauth.NoAuth</code>
* password: <code>keystoneauth1.identity.generic.Password</code>
* token: <code>keystoneauth1.identity.generic.Token</code>
* v2password: <code>keystoneauth1.identity.v2.Password</code>
* v2token: <code>keystoneauth1.identity.v2.Token</code>
* v3applicationcredential: <code>keystoneauth1.identity.v3.ApplicationCredential</code>
* v3password: <code>keystoneauth1.identity.v3.Password</code>
* v3token: <code>keystoneauth1.identity.v3.Token</code>
* v3fedkerb: <code>keystoneauth1.extras.kerberos.MappedKerberos</code>
* v3kerberos: <code>keystoneauth1.extras.kerberos.Kerberos</code>
* v3oauth1: <code>keystoneauth1.extras.oauth1.v3.OAuth1</code>
* v3oidcaccesstoken: <code>keystoneauth1.identity.v3.OpenIDConnectAccessToken</code>
* v3oidcauthcode: <code>keystoneauth1.identity.v3.OpenIDConnectAuthorizationCode</code>
* v3oidcdeviceauthz: <code>keystoneauth1.loading._plugins.identity.v3.OpenIDConnectDeviceAuthorization</code>
* v3oidcclientcredentials: <code>keystoneauth1.identity.v3.OpenIDConnectClientCredentials</code>
* v3oidcpassword: <code>keystoneauth1.identity.v3.OpenIDConnectPassword</code>
* v3samlpassword: <code>keystoneauth1.extras._saml2.v3.Password</code>
* v3tokenlessauth: <code>keystoneauth1.identity.v3.TokenlessAuth</code>
* v3totp: <code>keystoneauth1.identity.v3.TOTP</code>
* v3oauth2clientcredential: <code>keystoneauth1.identity.v3.OAuth2ClientCredential</code>
* v3oauth2mtlsclientcredential: <code>keystoneauth1.identity.v3.OAuth2mTlsClientCredential</code>
==인증 플러그인 생성==
==인증 플러그인 생성==
===Identity 플러그인 생성===
===Identity 플러그인 생성===
새로운 인증 메커니즘을 Identity 서비스에 구현한 경우, 기존 Identity 메커니즘을 위한 많은 인프라를 재사용할 수 있습니다. V2 Identity API는 본질적으로 동결되었으므로, 새로운 플러그인은 V3 API를 위한 것이어야 합니다.
다른 플러그인들과 결합할 수 있는 새로운 V3 플러그인을 구현하려면 <code>keystoneauth1.identity.v3.AuthMethod</code> 베이스 클래스를 구현하고 <code>get_auth_data()</code> 함수를 구현해야 합니다. 만약 플러그인이 기존 <code>keystoneauth1.identity.v3.AuthMethod</code>와 함께 사용할 수 없다면 <code>keystoneauth1.identity.v3.Auth</code>를 직접 오버라이드해야 합니다.
새로운 <code>AuthMethod</code>는 필요한 모든 매개변수를 <code>__init__()</code>을 통해 받아야 하며, <code>get_auth_data()</code>에서 이 플러그인의 고유 식별자(예: password)와 인증 서버에 보낼 값들의 페이로드를 포함하는 딕셔너리를 튜플로 반환해야 합니다. 세션, 호출하는 인증 객체 및 요청 헤더도 이 함수에 전달되어 플러그인이 이를 사용하거나 조작할 수 있습니다.
또한 <code>keystoneauth1.identity.v3.Auth</code>를 상속받는 클래스를 제공하여야 하며, 새로운 <code>AuthMethod</code>의 인스턴스를 <code>keystoneauth1.identity.v3.Auth</code>의 <code>auth_methods</code> 매개변수로 전달해야 합니다.
관례상(그리고 위와 같이) 이러한 클래스는 PluginType과 PluginTypeMethod(예: <code>Password</code>와 <code>PasswordMethod</code>)로 명명됩니다.
===커스텀 플러그인 생성===
===커스텀 플러그인 생성===
새 플러그인을 구현하려면 베이스 클래스 <code>keystoneauth1.plugin.BaseAuthPlugin</code>을 구현하고 <code>get_endpoint()</code>, <code>get_token()</code>, <code>invalidate()</code> 메소드를 제공해야 합니다.
<code>get_token()</code>은 플러그인에서 토큰 문자열을 조회하기 위해 호출됩니다. 플러그인은 받은 토큰을 캐시해야 하며, 토큰이 여전히 유효한 경우 새 토큰을 가져오는 대신 이를 재사용해야 합니다. 플러그인이 서버와 통신할 수 있도록 세션 객체가 제공됩니다. (참고: 이 요청을 수행할 때 authenticated=False를 사용해야 재귀 호출을 피할 수 있습니다.) 반환 값은 문자열 형태의 토큰이어야 합니다.
<code>get_endpoint()</code>는 특정 서비스 요청의 기본 URL을 결정하기 위해 호출됩니다. 함수에 제공되는 키워드 인수는 <code>keystoneauth1.session.Session.request()</code>의 endpoint_filter 변수에 의해 제공됩니다. 플러그인이 엔드포인트를 결정하기 위해 외부 소스와 통신할 수 있도록 세션 객체도 제공됩니다. 이 함수는 일반적으로 요청당 한 번 호출되므로, 필요한 경우 플러그인은 이러한 응답을 캐시해야 합니다. 반환 값은 통신할 기본 URL이어야 합니다.
<code>invalidate()</code>는 현재 사용자 자격증명을 지워 다음 <code>get_token()</code> 호출 시 새 토큰을 가져올 수 있도록 구현해야 합니다.
가장 간단한 플러그인 예시는 <code>keystoneauth1.token_endpoint.Token</code> 플러그인입니다.

2024년 6월 23일 (일) 13:32 기준 최신판

1 개요[ | ]

Authentication Plugins
인증 플러그인

https://docs.openstack.org/keystoneauth/latest/authentication-plugins.html

2 소개[ | ]

인증 플러그인은 OpenStack 클라이언트가 알고 있는 인증 메커니즘을 확장할 수 있는 일반적인 수단을 제공합니다.

대부분의 경우 사용되는 인증 플러그인은 OpenStack Identity 서비스(Keystone)와 함께 사용하기 위해 작성된 것들이지만, 이것이 유일한 경우는 아니며, 인증 플러그인을 사용하는 방식과 구현되는 메커니즘은 완전히 커스터마이즈된 인증 솔루션을 포괄할 수 있을 정도로 일반적이어야 합니다.

OpenStack Identity 서버(예: Keystone)와 함께 사용하기 위해 의도된 인증 플러그인의 하위집합을 Identity 플러그인이라고 합니다.

3 사용가능한 플러그인[ | ]

Keystoneauth는 여러 가지 플러그인을 제공하며, 특히 Identity 플러그인을 제공합니다.

3.1 V2 Identity 플러그인[ | ]

표준 V2 Identity 플러그인은 모듈 keystoneauth1.identity.v2에 정의되어 있습니다.

포함된 플러그인은 다음과 같습니다:

  • Password: 사용자 이름과 비밀번호를 사용하여 V2 Identity 서비스에 대해 인증합니다.
  • Token: 기존 토큰을 사용하여 V2 Identity 서비스에 대해 인증합니다.

V2 Identity 플러그인은 반드시 V2 Identity 서버 URL의 루트를 가리키는 auth_url을 사용해야 합니다. 예: http://hostname:5000/v2.0.

3.2 V3 Identity 플러그인[ | ]

표준 V3 Identity 플러그인은 모듈 keystoneauth1.identity.v3에서 정의됩니다.

V3 Identity 플러그인은 V2 플러그인과 약간 다른데, V3 인증 요청은 여러 인증 방법을 포함할 수 있습니다. 이를 처리하기 위해 V3는 다양한 AuthMethod 클래스를 정의합니다:

  • PasswordMethod: 사용자명과 패스워드를 사용하여 V3 identity 서비스에 대해 인증합니다.
  • TokenMethod: 기존 토큰을 사용하여 V3 identity 서비스에 대해 인증합니다.
  • ReceiptMethod: 기존 auth-receipt를 사용하여 V3 identity 서비스에 대해 인증합니다. 이 방법은 최소 하나 이상의 다른 방법과 함께 사용해야 합니다.
  • TOTPMethod: Time-Based One-Time Password (TOTP)를 사용하여 V3 identity 서비스에 대해 인증합니다.
  • TokenlessAuth: 토큰 없이 V3 identity 서비스에 대해 인증합니다.
  • ApplicationCredentialMethod: 애플리케이션 자격 증명을 사용하여 V3 identity 서비스에 대해 인증합니다.
  • KerberosMethod: Kerberos를 사용하여 V3 identity 서비스에 대해 인증합니다.
  • OAuth2ClientCredentialMethod: OAuth2.0 클라이언트 자격 증명을 사용하여 V3 identity 서비스에 대해 인증합니다.
  • OAuth2mTlsClientCredential: OAuth2.0 Mutual-TLS 클라이언트 자격 증명을 사용하여 V3 identity 서비스에 대해 인증합니다.

AuthMethod 객체는 Auth 플러그인에 전달됩니다:

from keystoneauth1 import session
from keystoneauth1.identity import v3
password = v3.PasswordMethod(username='user',
                             password='password',
                             user_domain_name='default')
auth = v3.Auth(auth_url='http://my.keystone.com:5000/v3',
               auth_methods=[password],
               project_id='projectid')
sess = session.Session(auth=auth)

auth 인스턴스가 생성된 이후에도 추가적인 방법을 추가할 수 있습니다:

totp = v3.TOTPMethod(username='user',
                     passcode='123456',
                     user_domain_name='default')
auth.add_method(totp)

또는 MultiFactor 헬퍼 플러그인을 사용하여 한 번에 모두 간단하게 처리할 수 있으며, 이에 대한 예제는 아래 섹션에 있습니다.

일반적인 경우로 한 가지 AuthMethod만 사용하려는 경우, V2 플러그인과 더 유사하게 사용할 수 있는 다양한 AuthMethod에 대한 헬퍼 인증 플러그인이 있습니다:

  • Password: PasswordMethod만 사용하여 인증합니다.
  • Token: TokenMethod만 사용하여 인증합니다.
  • TOTP: TOTPMethod만 사용하여 인증합니다.
  • Kerberos: KerberosMethod만 사용하여 인증합니다.
auth = v3.Password(auth_url='http://my.keystone.com:5000/v3',
                   username='username',
                   password='password',
                   project_id='projectid',
                   user_domain_name='default')
sess = session.Session(auth=auth)

이것은 위의 단일 PasswordMethod를 사용하는 것과 동일한 효과를 가집니다.

V3 identity 플러그인은 V3 identity 서버 URL의 루트를 가리키는 auth_url을 사용해야 합니다, 예: http://hostname:5000/v3.

3.3 V3 Identity 플러그인과 멀티팩터[ | ]

멀티팩터 인증의 기본 예제는 필요한 모든 인증 방법을 한 번에 제공하는 것입니다.

이는 메소드 인스턴스를 사용하여 Auth 클래스를 빌드함으로써 수행할 수 있습니다:

from keystoneauth1 import session
from keystoneauth1.identity import v3

auth = v3.Auth(
    auth_url='http://my.keystone.com:5000/v3',
    auth_methods=[
        v3.PasswordMethod(
            username='user',
            password='password',
            user_domain_id="default",
        ),
        v3.TOTPMethod(
            username='user',
            passcode='123456',
            user_domain_id="default",
        )
    ],
    project_id='projectid',
)
sess = session.Session(auth=auth)

또는 헬퍼 플러그인이 대신 처리하도록 할 수 있습니다:

from keystoneauth1 import session
from keystoneauth1.identity import v3

auth = v3.MultiFactor(
    auth_url='http://my.keystone.com:5000/v3',
    auth_methods=['v3password', 'v3totp'],
    username='user',
    password='password',
    passcode='123456',
    user_domain_id="default",
    project_id='projectid',
)
sess = session.Session(auth=auth)

참고: MultiFactor 헬퍼는 auth_methods 옵션에서 인증 영수증(auth receipts)을 지원하지 않지만, auth.add_method를 사용하여 추가할 수 있습니다.

여러 방법이 필요할 때 하나의 방법만 제공하면 MissingAuthMethods 오류가 발생합니다. 이 오류를 잡아서 누락된 방법이 무엇인지 추론하고, 이를 통해 인증을 계속할 수 있는 영수증(receipt)을 추출할 수 있습니다:

auth = v3.Password(auth_url='http://my.keystone.com:5000/v3',
                   username='username',
                   password='password',
                   project_id='projectid',
                   user_domain_id='default')
sess = session.Session(auth=auth)
try:
   sess.get_token()
except exceptions.MissingAuthMethods as e:
    receipt = e.receipt
    methods = e.methods
    required_methods = e.required_auth_methods

인증을 계속하는 데 필요한 인증 방법을 알게 되면, 기존 인증 플러그인에 추가 방법을 확장할 수 있습니다:

auth.add_method(
    v3.TOTPMethod(
        username='user',
        passcode='123456',
        user_domain_id='default',
    )
)
sess.get_token()

기존 인증 방법이 없지만 영수증을 가지고 있는 경우에도 계속할 수 있습니다:

auth = v3.TOTP(
    auth_url='http://my.keystone.com:5000/v3',
    username='user',
    passcode='123456',
    user_domain_id='default',
    project_id='projectid',
)
auth.add_method(v3.ReceiptMethod(receipt=receipt))
sess = session.Session(auth=auth)
sess.get_token()

3.4 독립형 플러그인[ | ]

서비스는 identity 서비스와의 통합 없이 독립형 환경에서 배포될 수 있습니다. 독립형 서비스를 지원하기 위해 다음 플러그인이 제공됩니다:

  • HTTPBasicAuth: HTTP 기본 인증
  • NoAuth: 인증 없음

독립형 플러그인은 엔드포인트를 지정해야 하며, 이는 서비스 카탈로그에서 엔드포인트를 조회할 수 없기 때문입니다:

from keystoneauth1 import session
from keystoneauth1 import noauth

auth = noauth.NoAuth(endpoint='http://hostname:6385/')
sess = session.Session(auth=auth)

HTTPBasicAuth는 또한 사용자명과 패스워드가 필요합니다:

from keystoneauth1 import session
from keystoneauth1 import http_basic

auth = http_basic.HTTPBasicAuth(endpoint='http://hostname:6385/',
                                username='myUser',
                                password='myPassword')
sess = session.Session(auth=auth)

4 페더레이션[ | ]

다음 V3 플러그인은 페더레이션을 지원하기 위해 제공됩니다:

  • MappedKerberos: 페더레이션(매핑된) Kerberos.
  • Password: SAML2 패스워드 인증.
  • v3:OpenIDConnectAccessToken: 기존의 OpenID Connect 액세스 토큰을 재사용하는 플러그인.
  • v3:OpenIDConnectAuthorizationCode: OpenID Connect 인증 코드 그랜트 타입.
  • v3:OpenIDConnectClientCredentials: OpenID Connect 클라이언트 자격증명 그랜트 타입.
  • v3:OpenIDConnectPassword: OpenID Connect 자원 소유자 패스워드 자격증명 그랜트 타입.
  • Keystone2Keystone: Keystone 간 페더레이션.

Keystone2Keystone 플러그인은 특별한데, 서비스 제공자로 작동하는 Keystone에서 세션을 생성하기 위해 신원 제공자로 작동하는 다른 Keystone 인스턴스에 대한 패스워드 인증을 입력으로 사용합니다. 예시:

from keystoneauth1 import session
from keystoneauth1.identity import v3
from keystoneauth1.identity.v3 import k2k

pwauth = v3.Password(auth_url='http://my.keystone.com:5000/v3',
                     username='username',
                     password='password',
                     project_id='projectid',
                     user_domain_name='Default')
k2kauth = k2k.Keystone2Keystone(pwauth, 'mysp',
                                project_id='federated_projectid')
k2ksession = session.Session(auth=k2kauth)

위 코드에서는 http://my.keystone.com:5000/v3 에 연결되는 첫 번째 Keystone 인스턴스의 패스워드 인증 정보를 사용하여 'mysp'로 식별되는 서비스 제공자 Keystone 인스턴스에 대한 세션을 생성합니다.

4.1 버전 독립형 아이덴티티 플러그인[ | ]

표준 버전 독립적 아이덴티티 플러그인은 모듈 keystoneauth1.identity.generic에 정의되어 있습니다.

아이덴티티 V2 및 V3 API 모두에서 존재하는 플러그인의 경우, 서버가 지원하는 V2와 V3 API를 확인하고 가장 적절한 API를 사용하는 추상화 기능이 있습니다.

이러한 플러그인은 다음과 같습니다:

  • Password: 사용자명/패스워드를 사용하여 V2 또는 V3 API를 통해 인증합니다.
  • Token: 기존 토큰을 사용하여 V2 또는 V3 API를 통해 인증합니다.

이 플러그인들은 먼저 아이덴티티 서버에 쿼리를 보내 사용가능한 버전을 확인하고, 플러그인과 함께 사용되는 auth_url은 사용할 아이덴티티 서버의 기본 URL을 가리켜야 합니다. auth_url이 V2 또는 V3 엔드포인트를 가리키면 플러그인은 해당 API 버전에서만 작동하게 됩니다.

4.2 간단한 플러그인[ | ]

아이덴티티 플러그인 외에도 항상 동일한 제공된 토큰과 엔드포인트를 사용할 간단한 플러그인이 있습니다. 이 플러그인은 토큰을 가지고 인증을 우회하여 후속 요청에 대한 새 토큰을 얻고자 할 때 유용합니다. 테스트, 프록시, 사용자 대신 서비스 간 인증이 좋은 예시입니다.

이 플러그인은 keystoneauth1.token_endpoint.Token에서 찾을 수 있습니다.

예시:

from keystoneauth1 import token_endpoint
from keystoneauth1 import session
a = token_endpoint.Token('http://my.keystone.com:5000/v3',
                         token=token)
s = session.Session(auth=a)

4.3 V3 OAuth 1.0a 플러그인[ | ]

OAuth 1.0a 인증을 위한 플러그인도 있습니다. V3OAuth1이라는 헬퍼 인증 플러그인을 제공합니다. 이 플러그인은 OAuth 소비자의 키와 비밀, OAuth 액세스 토큰의 키와 비밀을 필요로 합니다. 예시:

from keystoneauth1.extras import oauth1
from keystoneauth1 import session
a = oauth1.V3OAuth1('http://my.keystone.com:5000/v3',
                    consumer_key=consumer_id,
                    consumer_secret=consumer_secret,
                    access_key=access_token_key,
                    access_secret=access_token_secret)
s = session.Session(auth=a)

5 애플리케이션 자격증명[ | ]

애플리케이션 자격증명 인증을 지원하는 Identity 서버와 상호작용하기 위한 특정 인증 방법이 있습니다. 애플리케이션 자격증명은 특정 프로젝트의 사용자와 연결되어 있기 때문에 기존 패스워드 인증과 달리 몇 가지 매개변수가 필요하지 않습니다. 다음 방법을 사용하여 애플리케이션 자격증명을 사용해 토큰을 인증할 수 있습니다:

  • ApplicationCredential:

다음 예제는 세션과 함께 이 방법을 사용하는 방법을 보여줍니다:

from keystoneauth1 import session
from keystone.identity import v3

auth = v3.ApplicationCredential(
        application_credential_secret='application_credential_secret',
        application_credential_id='c2872b920853478292623be94b657090'
    )
sess = session.Session(auth=auth)

6 OAuth2.0 클라이언트 자격증명[ | ]

Warning

RFC 6749 에 따르면 액세스 토큰은 HTTPS를 사용하는 요청에만 추가되어야 합니다.

OAuth2.0 클라이언트 자격증명 부여를 지원하는 Identity 서버와 상호작용하기 위한 특정 인증 방법이 있습니다. 다른 인증 방법과의 주요 차이점은 인증이 성공한 후 session이 이후의 요청에 OAuth2.0 액세스 토큰이 포함된 “Authorization” 헤더를 추가한다는 점입니다. OAuth2.0 클라이언트 자격증명을 사용하여 토큰을 인증하는 데 사용할 수 있는 방법은 다음과 같습니다:

  • OAuth2ClientCredential:

다음 예제는 세션에서 이 방법을 사용하는 방법을 보여줍니다:

from keystoneauth1 import session
from keystone.identity import v3

auth = v3.OAuth2ClientCredential(
        oauth2_endpoint='https://keystone.host/identity/v3/OS-OAUTH2/token',
        oauth2_client_id='f96a2fec117141a6b5fbaa0485632244',
        oauth2_client_secret='client_credential_secret'
    )
sess = session.Session(auth=auth)

7 OAuth2.0 상호-TLS 클라이언트 자격증명[ | ]

Warning

RFC 8705 에 따라 상호-TLS를 사용하는 요청에 대해서만 액세스 토큰을 추가해야 합니다.

OAuth 2.0 상호-TLS 클라이언트 인증을 지원하는 Identity 서버와 상호작용하기 위한 특정 인증 방법이 있습니다. 다른 인증 방법과의 눈에 띄는 차이점은 인증을 통과한 후 session이 OAuth 2.0 인증서 기반 액세스 토큰이 포함된 "Authorization" 헤더를 추가하여 후속 요청을 보낸다는 것입니다. 다음 방법을 사용하여 OAuth 2.0 상호-TLS 클라이언트 자격증명을 사용하여 토큰을 인증할 수 있습니다:

  • OAuth2mTlsClientCredential:

다음 예제는 세션에서 메소드 사용법을 보여줍니다:

from keystoneauth1 import session
from keystone.identity import v3
auth = v3.OAuth2mTlsClientCredential(
        auth_url='http://keystone.host:5000/v3',
        oauth2_endpoint='https://keystone.host/identity/v3/OS-OAUTH2/token',
        oauth2_client_id='f96a2fec117141a6b5fbaa0485632244'
    )
sess = session.Session(auth=auth)

8 토큰 없는 인증[ | ]

토큰 없는 인증을 위한 플러그인도 있습니다. 이는 토큰을 발급할 필요 없이 X.509 TLS 클라이언트 인증서를 사용하여 클라이언트 작업을 Identity 서버 내에서 승인하는 방법을 제공합니다. 저희는 다음과 같은 토큰 없는 인증 플러그인을 제공합니다:

  • TokenlessAuth:

이 플러그인은 주로 서비스 클라이언트가 토큰을 검증하는 데 사용되며, 실제로 이 플러그인을 사용하는 예시는 다음과 같습니다:

from keystoneauth1 import session
from keystoneauth1.identity import v3

auth = v3.TokenlessAuth(auth_url='https://keystone:5000/v3',
                        domain_name='my_service_domain')

sess = session.Session(
                auth=auth,
                cert=('/opt/service_client.crt',
                      '/opt/service_client.key'),
                verify='/opt/ca.crt')

9 이름으로 플러그인 로딩[ | ]

auth_token 미들웨어 및 서비스 간 통신에서는 이름으로 로드할 플러그인을 지정할 수 있습니다. 그러면 지정한 플러그인에 따라 사용가능한 인증 옵션이 결정됩니다. 현재 keystoneauth에서 사용가능한 인증 플러그인은 다음과 같습니다:

  • http_basic: keystoneauth1.http_basic.HTTPBasicAuth
  • none: keystoneauth1.noauth.NoAuth
  • password: keystoneauth1.identity.generic.Password
  • token: keystoneauth1.identity.generic.Token
  • v2password: keystoneauth1.identity.v2.Password
  • v2token: keystoneauth1.identity.v2.Token
  • v3applicationcredential: keystoneauth1.identity.v3.ApplicationCredential
  • v3password: keystoneauth1.identity.v3.Password
  • v3token: keystoneauth1.identity.v3.Token
  • v3fedkerb: keystoneauth1.extras.kerberos.MappedKerberos
  • v3kerberos: keystoneauth1.extras.kerberos.Kerberos
  • v3oauth1: keystoneauth1.extras.oauth1.v3.OAuth1
  • v3oidcaccesstoken: keystoneauth1.identity.v3.OpenIDConnectAccessToken
  • v3oidcauthcode: keystoneauth1.identity.v3.OpenIDConnectAuthorizationCode
  • v3oidcdeviceauthz: keystoneauth1.loading._plugins.identity.v3.OpenIDConnectDeviceAuthorization
  • v3oidcclientcredentials: keystoneauth1.identity.v3.OpenIDConnectClientCredentials
  • v3oidcpassword: keystoneauth1.identity.v3.OpenIDConnectPassword
  • v3samlpassword: keystoneauth1.extras._saml2.v3.Password
  • v3tokenlessauth: keystoneauth1.identity.v3.TokenlessAuth
  • v3totp: keystoneauth1.identity.v3.TOTP
  • v3oauth2clientcredential: keystoneauth1.identity.v3.OAuth2ClientCredential
  • v3oauth2mtlsclientcredential: keystoneauth1.identity.v3.OAuth2mTlsClientCredential

10 인증 플러그인 생성[ | ]

10.1 Identity 플러그인 생성[ | ]

새로운 인증 메커니즘을 Identity 서비스에 구현한 경우, 기존 Identity 메커니즘을 위한 많은 인프라를 재사용할 수 있습니다. V2 Identity API는 본질적으로 동결되었으므로, 새로운 플러그인은 V3 API를 위한 것이어야 합니다.

다른 플러그인들과 결합할 수 있는 새로운 V3 플러그인을 구현하려면 keystoneauth1.identity.v3.AuthMethod 베이스 클래스를 구현하고 get_auth_data() 함수를 구현해야 합니다. 만약 플러그인이 기존 keystoneauth1.identity.v3.AuthMethod와 함께 사용할 수 없다면 keystoneauth1.identity.v3.Auth를 직접 오버라이드해야 합니다.

새로운 AuthMethod는 필요한 모든 매개변수를 __init__()을 통해 받아야 하며, get_auth_data()에서 이 플러그인의 고유 식별자(예: password)와 인증 서버에 보낼 값들의 페이로드를 포함하는 딕셔너리를 튜플로 반환해야 합니다. 세션, 호출하는 인증 객체 및 요청 헤더도 이 함수에 전달되어 플러그인이 이를 사용하거나 조작할 수 있습니다.

또한 keystoneauth1.identity.v3.Auth를 상속받는 클래스를 제공하여야 하며, 새로운 AuthMethod의 인스턴스를 keystoneauth1.identity.v3.Authauth_methods 매개변수로 전달해야 합니다.

관례상(그리고 위와 같이) 이러한 클래스는 PluginType과 PluginTypeMethod(예: PasswordPasswordMethod)로 명명됩니다.

10.2 커스텀 플러그인 생성[ | ]

새 플러그인을 구현하려면 베이스 클래스 keystoneauth1.plugin.BaseAuthPlugin을 구현하고 get_endpoint(), get_token(), invalidate() 메소드를 제공해야 합니다.

get_token()은 플러그인에서 토큰 문자열을 조회하기 위해 호출됩니다. 플러그인은 받은 토큰을 캐시해야 하며, 토큰이 여전히 유효한 경우 새 토큰을 가져오는 대신 이를 재사용해야 합니다. 플러그인이 서버와 통신할 수 있도록 세션 객체가 제공됩니다. (참고: 이 요청을 수행할 때 authenticated=False를 사용해야 재귀 호출을 피할 수 있습니다.) 반환 값은 문자열 형태의 토큰이어야 합니다.

get_endpoint()는 특정 서비스 요청의 기본 URL을 결정하기 위해 호출됩니다. 함수에 제공되는 키워드 인수는 keystoneauth1.session.Session.request()의 endpoint_filter 변수에 의해 제공됩니다. 플러그인이 엔드포인트를 결정하기 위해 외부 소스와 통신할 수 있도록 세션 객체도 제공됩니다. 이 함수는 일반적으로 요청당 한 번 호출되므로, 필요한 경우 플러그인은 이러한 응답을 캐시해야 합니다. 반환 값은 통신할 기본 URL이어야 합니다.

invalidate()는 현재 사용자 자격증명을 지워 다음 get_token() 호출 시 새 토큰을 가져올 수 있도록 구현해야 합니다.

가장 간단한 플러그인 예시는 keystoneauth1.token_endpoint.Token 플러그인입니다.

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}