Keystoneauth 인증 플러그인

1 개요

Authentication Plugins
인증 플러그인

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

Crystal Clear action info.png 작성 중인 문서입니다.


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 애플리케이션 자격증명

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

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

8 토큰 없는 인증

9 이름으로 플러그인 로딩

10 인증 플러그인 생성

10.1 Identity 플러그인 생성

10.2 커스텀 플러그인 생성

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