Auth0로 SSO 구성하기

Auth0로 SSO 구성하기 (Configure SSO with Auth0)

OIDC 인증은 조직 전반에 SSO를 널리 배포하고 싶고, 접근을 오직 Nomad 접근 제어 목록(ACL) 토큰으로만 관리하고 싶지 않을 때 유용해요.

출처: 문서

본문

구현하면 SSO는 사용자가 Nomad UI 또는 CLI에서 시작할 수 있는 대화형 로그인 절차를 가능하게 해요.

이 가이드에서는 Auth0를 아이덴티티 공급자(identity provider)로 구성해요. 구성은 Auth0의 사용자 메타데이터를 사용해 Nomad ACL에서 권한을 자동으로 부여해요.

이 작업은 여러 단계로 구성되며 다음을 포함해요:

  • Nomad 통합용 애플리케이션을 Auth0에 구성하기
  • Auth0에서 역할과 사용자 만들기
  • 사용자에게 권한을 제공하도록 Nomad ACL 정책과 역할 설정하기
  • Nomad 바인딩 규칙(binding rules)을 사용해 메타데이터 값에 따라 사용자에게 권한을 자동으로 할당하기

Auth0와 다음 Auth0 문서에 익숙해야 해요:

사전 요구 사항 (Prerequisites)

이 가이드를 완료하려면 다음이 필요해요:

클러스터를 설정해야 한다면 Nomad 퀵 스타트 튜토리얼을 참조해요.

Auth0 설정 (Set up Auth0)

  1. 네이티브 애플리케이션(native application)을 만들어요. 지침은 Auth0 애플리케이션 만들기 가이드를 참조해요.

    • Domain, Client ID, Client Secret 값을 기록해 두어요. 이 값들을 Nomad에서 auth method를 구성하는 데 사용해요.

    • 인증 과정이 완료된 후 Auth0가 사용자를 리디렉션하는 데 사용하는 콜백 URL을 설정해요. Allowed Callback URLs 필드에 다음을 입력해요:

      • <NOMAD_ADDRESS>/ui/settings/tokens: Nomad 웹 UI로 OIDC 로그인을 수행할 때의 콜백 주소예요. 수정된 HTTP 포트로 Nomad를 실행 중이라면 UI 주소가 이 값을 사용하는지 확인해요.
      • http://localhost:4649/oidc/callback: CLI로 OIDC 로그인을 수행할 때 Nomad CLI가 사용하는 콜백 주소예요.

    이 예시에서 Nomad 주소는 http://3.145.29.13:4646이에요.

    http://localhost:4649/oidc/callback
    
  2. engineering이라는 역할을 만들어요. 지침은 Auth0 역할 만들기 가이드를 참조해요.

  3. 연결 유형이 Username-Password-Authentication인 사용자를 만들어요. 해당 사용자에게 engineering 역할을 할당해요. 지침은 다음 Auth0 가이드를 참조해요:

  4. Auth0가 Nomad로 다시 보내는 토큰에 사용자 역할을 추가하는 로그인 트리거를 만들어요.

    1. 토큰에 커스텀 클레임(custom claims)을 추가하는 커스텀 액션을 만들어요. 지침은 Auth0 액션 만들기 섹션을 참조해요.

    액션에 다음 값을 지정해요:

    • Name: Nomad OIDC
    • Trigger: Login/Post Login

    액션을 만든 후, exports.onExecutePostLogin 메서드를 토큰에 사용자 역할을 추가하는 커스텀 클레임을 설정하는 메서드로 대체해요.

      const namespace = 'http://nomad.internal';
      if (event.authorization) {
        api.idToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
        api.accessToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
      }
    }
    

    http://nomad.internal 네임스페이스를 사용해 JWT RFC에 속하지 않는 클레임을 분리해요. 네임스페이스는 임의적이지만 반드시 고유해야 해요. Auth0는 네임스페이스가 없고 RFC에도 없는 클레임을 버림으로써 고유 네임스페이스의 존재를 강제해요.

    Deploy를 클릭해 Nomad OIDC 액션을 배포해요.

    1. post-login 트리거를 만들어요.

      1. Nomad 애플리케이션의 Auth0 대시보드에서 Actions를 클릭한 다음 Triggers를 클릭해요.
      2. post-login을 선택해요.
      3. Add Action 창의 Custom 탭에서 Nomad OIDC를 선택하고 흐름이 Start -> Nomad OIDC -> Complete가 되도록 Post Login 캔버스로 드래그해요.
      4. 변경 사항을 적용해요.

Nomad ACL 정책과 역할 만들기 (Create Nomad ACL policies and roles)

로그인 절차가 사용자의 정체성을 확인한 후, ACL 토큰을 만들 때 해당 사용자에게 권한을 부여해야 해요. Nomad의 auth methods는 바인딩 규칙을 사용하며, 이를 통해 Nomad의 ACL 시스템이 ACL 정책과 역할을 통해 새 토큰에 권한을 할당할 수 있어요.

auth method로 토큰에 권한을 할당하려면 먼저 정책에서 권한을 정의하고 그 정책을 역할에 할당해요. 이렇게 하면 바인딩 규칙이 역할을 이름으로 참조할 수 있어요.

Auth0 사용자용 정책 정의 (Define policy for Auth0 users)

"default" 네임스페이스와 노드 객체에 대한 읽기 전용 접근을 허용하는 engineering-read라는 정책을 만들어요.

default-read.hcl라는 정책 파일을 만들고 다음 구성을 추가한 후 저장해요.

namespace "default" {
  policy = "read"
}

// Grants read access to Nomad nodes.
node {
  policy = "read"
}

정책을 Nomad에 제출해요.

참고: NOMAD_TOKEN 환경 변수가 Nomad 관리 토큰으로 설정되어 있는지 확인해요.

Successfully wrote "engineering-read" ACL policy!

정책을 역할에 할당 (Assign the policy to a role)

다음으로 engineering-read라는 역할을 만들고 정책에 연결해요.

ID           = fc6d21c9-31cf-fd12-fe9a-7636c07f2d97
Name         = engineering-read
Description  = <none>
Policies     = engineering-read
Create Index = 18
Modify Index = 18

Nomad용 OIDC auth method 만들기 (Create the OIDC auth method for Nomad)

새 auth method를 위한 auth-method-config.json이라는 구성 파일을 만들고 다음 내용을 추가해요.

auth-method-config.json

  "OIDCDiscoveryURL": "https://<AUTH0_DOMAIN>/",
  "OIDCClientID": "<AUTH0_CLIENT_ID>",
  "OIDCClientSecret": "<AUTH0_CLIENT_SECRET>",
  "BoundAudiences": ["<AUTH0_CLIENT_ID>"],
  "AllowedRedirectURIs": [
     "<NOMAD_ADDRESS>/ui/settings/tokens",
     "http://localhost:4649/oidc/callback",
  ],
  "ListClaimMappings": {
    "http://nomad.internal/roles": "roles"
  }
}

AUTH0_DOMAIN, AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET를 Auth0 애플리케이션, 역할, 사용자 설정 섹션에서 기록한 Domain, Client ID, Client Secret 값으로 대체해요.

AllowedRedirectURIs 항목이 Auth0에서 구성한 콜백 URL과 일치하는지 확인해요.

Nomad CLI 또는 API로 auth method를 만들어요.

nomad acl auth-method create 명령을 사용해 auth method를 만들어요. 토큰 TTL(time-to-live)이 5분으로 설정되어 있다는 점을 참고해요. 옵션에 대한 전체 설명은 nomad acl auth-method create 명령 레퍼런스를 참조해요.

    -name=auth0 \
    -default=true \
    -max-token-ttl=5m \
    -token-locality=global \
    [email protected]

ACL auth methods API를 사용해 auth method를 만들어요. 페이로드는 auth-method-config.json 파일이에요.

    <NOMAD_ADDRESS>/v1/acl/auth-method \
    --data @auth-method-config.json

다음 자리 표시자를 대체해요:

  • <MANAGEMENT_TOKEN>을 Nomad 관리 토큰 값으로 대체해요.
  • <NOMAD_ADDRESS>를 http://3.145.29.13:4646 같은 Nomad 클러스터 주소로 대체해요.

auth method를 구성한 후에는 앞서 정의한 메타데이터를 사용해 사용자에게 권한 부여를 자동화할 수 있어요. 즉, auth method 신뢰가 수립되면 정체성(identity)과 auth method를 연결하는 데 필요한 것 외에는 추가 작업 없이 입증된(attested) 정체성을 역할이나 서비스에 바인딩하도록 Nomad를 구성할 수 있어요. 이것을 Nomad 바인딩 규칙으로 구성해요.

Auth0 앱 메타데이터로 ACL 역할 권한 부여 (Grant ACL role permissions with Auth0 app metadata)

engineering Auth0 역할의 사용자에게 engineering-read라는 Nomad ACL 역할을 부여해요.

    -auth-method=auth0 \
    -bind-type=role \
    -bind-name=engineering-read \
    -selector='engineering in list.roles'
Description  = <none>
Auth Method  = auth0
Selector     = "engineering in list.roles"
Bind Type    = role
Bind Name    = engineering-read
Create Time  = 2023-01-17 11:34:50.588734 +0000 UTC
Modify Time  = 2023-01-17 11:34:50.588734 +0000 UTC
Create Index = 22
Modify Index = 22

이렇게 하면 Auth0 토큰에 engineering 역할이 있는 모든 사용자가 ACL 정책과 연결된 Nomad engineering-read ACL 역할에 자동으로 연결돼요.

OIDC로 로그인 (Log in with OIDC)

이제 구성이 완료됐으니 Auth0를 사용해 Nomad에 로그인해요.

nomad login -method=auth0 CLI 명령을 사용해 Nomad에 로그인해요. -oidc-callback-addr 파라미터는 선택 사항이며 기본값은 locahost:4649이에요.

이 명령은 브라우저 페이지로 리디렉션해요. 메시지가 표시되면 Auth0 애플리케이션에 대한 Nomad 접근을 수락하고 승인해요. 그런 다음 Auth0 설정 섹션에서 만든 사용자 이름과 비밀번호로 Auth0에 로그인해요.

CLI가 ACL 토큰을 콘솔에 출력해요.


Accessor ID  = f2e78673-cbe5-8a69-1ad1-d16c2b63e9bf
Secret ID    = e3d937a3-fe2b-f144-8384-e4fcbe7e9a65
Name         = OIDC-auth0
Type         = client
Global       = true
Create Time  = 2023-01-17 11:40:36.48495 +0000 UTC
Expiry Time  = 2023-01-17 11:50:36.48495 +0000 UTC
Create Index = 17
Modify Index = 17
Policies     = []

Roles
ID                                    Name
db1b4129-3b7b-f2f5-5118-b885a1ff226e  engineering-read

Nomad 웹 UI로 이동해 Sign In 버튼을 클릭해요. 그런 다음 Sign in with auth0 버튼을 클릭해 흐름을 시작해요.

더 알아보기 (Learn more)