Boundary 초기화하기

Boundary 초기화하기 (Initialize Boundary)

Boundary를 초기화하면 첫 번째 데이터베이스 리소스 — 기본 스코프, 인증 방법, admin 계정, 역할 — 가 만들어져요. 이 리소스들이 있어야 처음으로 로그인하고 클러스터를 관리할 수 있습니다. 이 과정은 데이터베이스 설정 중에 자동으로 진행되거나, recovery KMS를 사용해 수동으로 진행할 수 있어요.

시작하기 전에 컨트롤러 구성에서 설명한 대로 Boundary 데이터베이스를 이미 초기화했어야 합니다.

Terraform으로도 Boundary를 초기화하고 관리할 수 있어요. 자세한 내용은 Terraform 패턴 페이지를 참고하세요.

출처: HashiCorp Boundary docs

본문

사전 요구 사항

Boundary를 초기화하기 전에 데이터베이스를 초기화했어야 해요.

recovery KMS로 로그인

새 Boundary 인스턴스에 처음 접근하려면 컨트롤러 구성 파일에 정의된 recovery KMS(키 관리 시스템)를 사용해야 해요. 다음 예시는 하드코딩된 AEAD 키를 사용하는 구성 파일을 보여줍니다:

Note — 프로덕션 환경에서는 AWS KMS 같은 클라우드 프로바이더의 KMS를 사용해서 Boundary가 민감한 정보를 암호화하는 데 쓰는 키를 관리할 것을 HashiCorp가 권장합니다.

<truncated>
kms "aead" {
    purpose   = "root"
    aead_type = "aes-gcm"
    key       = "sP1fnF5Xz85RrXyELHFeZg9Ad2qt4Z4bgNHVGtD6ung="
    key_id    = "global_root"
}

kms "aead" {
    purpose   = "worker-auth"
    aead_type = "aes-gcm"
    key       = "8fZBjCUfN0TzjEGLQldGY4+iE9AkOvCfjh7+p0GtRBQ="
    key_id    = "global_worker-auth"
}

kms "aead" {
    purpose   = "recovery"
    aead_type = "aes-gcm"
    key       = "8fZBjCUfN0TzjEGLQldGY4+iE9AkOvCfjh7+p0GtRBQ="
    key_id    = "global_recovery"
}
<truncated>

recovery 목적의 KMS는 Boundary를 '복구(recover)'하는 데 사용되어, 슈퍼 유저로 Boundary에 인증하고 관리할 수 있게 해줘요. 또한 생성된 리소스 없이 CLI나 Terraform에서 인증해서 Boundary를 관리할 수도 있습니다.

recovery KMS 워크플로로 Boundary에 인증하려면:

CLI에서 recovery 워크플로를 사용하려면, 실행하는 모든 명령에 -recovery-config <path_to_kms_recovery_config> 플래그를 넘기거나 BOUNDARY_RECOVERY_CONFIG 환경 변수를 설정해야 해요. recovery 워크플로를 사용할 때는 실행하는 모든 명령에 대해 인증이 일어납니다. boundary authenticate 명령은 recovery KMS를 사용할 때 적용되지 않아요.

$ cat << EOF > /tmp/recovery.hcl
kms "aead" {
        purpose   = "recovery"
        aead_type = "aes-gcm"
        key       = "8fZBjCUfN0TzjEGLQldGY4+iE9AkOvCfjh7+p0GtRBQ="
        key_id    = "global_recovery"
}
EOF

# Example command
$ boundary users create <truncated> -recovery-config /tmp/recovery.hcl
...

프로바이더가 recovery KMS 워크플로를 사용하도록 구성하려면, recovery_kms_hcl의 값으로 KMS 블록을 제공하세요:

provider "boundary" {
  addr             = "https://boundary.mycorp.com:9200"
  recovery_kms_hcl = <<EOT
kms "aead" {
    purpose   = "recovery"
    aead_type = "aes-gcm"
    key       = "8fZBjCUfN0TzjEGLQldGY4+iE9AkOvCfjh7+p0GtRBQ="
    key_id    = "global_recovery"
}
EOT
}

첫 번째 로그인 계정 만들기

이 절에서는 recovery KMS 워크플로 없이 Boundary에 로그인할 수 있도록 첫 번째 인증 방법, 사용자, 계정, 역할을 구성하는 방법을 다룹니다. 예시에서는 우리가 만드는 global과 프로젝트 레벨 스코프를 위한 admin 사용자를 만들 거예요. 이렇게 하면 그 스코프 내에서 타깃을 구성하고 관리할 수 있습니다.

다음 단계를 완료하세요:

  • org와 프로젝트 스코프 만들기
  • 인증 방법 만들기
  • 로그인 계정 만들기
  • 사용자 만들기
  • 스코프를 관리할 역할 만들기

org와 프로젝트 스코프 만들기

먼저 org와 프로젝트 스코프를 만들고, 각 스코프에 대해 admin과 admin 역할 생성을 건너뜁니다. 나중 단계에서 이 스코프를 관리할 역할을 선택된 사용자에게 지정할 거예요.

CLI:

$ boundary scopes create -name 'org' -scope-id 'global' \
  -recovery-config /tmp/recovery.hcl \
  -skip-admin-role-creation \
  -skip-default-role-creation
<truncated>

$ boundary scopes create -name 'project' -scope-id <org_scope_id_from_last_step> \
  -recovery-config /tmp/recovery.hcl \
  -skip-admin-role-creation \
  -skip-default-role-creation
<truncated>

Terraform:

resource "boundary_scope" "org" {
  scope_id    = "global"
  name        = "organization"
  description = "Organization scope"

  auto_create_admin_role   = false
  auto_create_default_role = false
}

resource "boundary_scope" "project" {
  name                     = "project"
  description              = "My first project"
  scope_id                 = boundary_scope.org.id
  auto_create_admin_role   = false
  auto_create_default_role = false
}

인증 방법 만들기

조직 스코프에 인증 방법을 만듭니다.

CLI:

$ boundary auth-methods create password \
  -recovery-config /tmp/recovery.hcl \
  -scope-id <org_scope_id> \
  -name 'my_method' \
  -description 'My password auth method'

Terraform:

resource "boundary_auth_method" "password" {
  name        = "my_password_auth_method"
  description = "Password auth method"
  type        = "password"
  scope_id    = boundary_scope.org.id
}

로그인 계정 만들기

인증 방법에 대한 로그인 계정을 만듭니다.

CLI:

$ boundary accounts create password \
  -recovery-config /tmp/recovery.hcl \
  -login-name "myuser" \
  -auth-method-id <auth_method_id_from_last_step>

Terraform:

resource "boundary_account" "myuser" {
  name           = "myuser"
  description    = "User account for my user"
  type           = "password"
  login_name     = "myuser"
  password       = "foofoofoo"
  auth_method_id = boundary_auth_method.password.id
}

사용자 만들기

사용자를 만들고, 이전 단계에서 만든 로그인 계정과 연결합니다. 이 사용자는 다음 단계에서 만들 역할의 주체(principal)가 될 거예요.

CLI:

$ boundary users create -scope-id <org_scope_id> \
  -recovery-config /tmp/recovery.hcl \
  -name "myuser" \
  -description "My user!"

$ boundary users add-accounts \
  -recovery-config /tmp/recovery.hcl \
  -id <myuser_user_id> \
  -account <myuser_account_id>

Terraform:

resource "boundary_user" "myuser" {
  name        = "myuser"
  description = "My user!"
  account_ids = [boundary_account.myuser.id]
  scope_id    = boundary_scope.org.id
}

스코프를 관리할 역할 만들기

다음 절은 만든 org와 프로젝트 스코프 내의 리소스를 관리하기 위해 만들어야 하는 네 가지 기본 역할을 설명합니다. 이 역할들은 boundary database init을 실행할 때 -skip-initial-login-role-creation 플래그로 생성을 건너뛰지 않았다면 Boundary가 자동으로 만들어 주는 역할과 비슷해요. 역할을 명시적으로 선언하면 Terraform이나 CLI로 독립적으로 완전히 관리할 수 있고, 그 접근을 정밀하게 정의할 수 있습니다.

다음 예시는 4가지 역할을 만듭니다:

역할 스코프 목적
global_anon_listing Global 익명(비인증) 사용자가 global 스코프의 스코프와 인증 방법을 나열할 수 있게 함.
org_anon_listing Organization 익명(비인증) 사용자가 조직 스코프의 스코프와 인증 방법을 나열할 수 있게 함.
org_admin Organization myuser 사용자에게 org 스코프의 관리 권한 부여.
project_admin Project myuser 사용자에게 프로젝트 스코프의 관리 권한 부여.
global 스코프용 익명 목록 역할

위 단계의 recovery 키 내보내기가 여전히 설정되어 있다고 가정합니다.

CLI:

# Create global anonymous listing role
$ boundary roles create -name 'global_anon_listing' \
  -recovery-config /tmp/recovery.hcl \
  -scope-id 'global'

$ boundary roles add-grants -id <global_anon_listing_id> \
  -recovery-config /tmp/recovery.hcl \
  -grant 'ids=*;type=auth-method;actions=list,authenticate' \
  -grant 'ids=*;type=scope;actions=list,no-op' \
  -grant 'ids=*;type=auth-token;actions=read:self,delete:self' \
  -grant 'ids={{.Account.Id}};actions=read,change-password'

$ boundary roles set-grant-scopes -id <global_anon_listing_id> \
  -recovery-config /tmp/recovery.hcl \
  -grant-scope-id 'this' \
  -grant-scope-id 'descendants'

$ boundary roles add-principals -id <global_anon_listing_id> \
  -recovery-config /tmp/recovery.hcl \
  -principal 'u_anon'

Terraform:

resource "boundary_role" "global_anon_listing" {
  scope_id = "global"
  grant_strings = [
    "ids=*;type=auth-method;actions=list,authenticate",
    "ids=*;type=scope;actions=list,no-op",
    "ids=*;type=auth-token;actions=read:self,delete:self",
    "ids={{.Account.Id}};actions=read,change-password"
  ]
  principal_ids = ["u_anon"]
  grant_scope_ids = ["this", "descendants"]
}

Warning — 기본 익명 로그인 역할을 삭제하거나 그 auth token grant를 제거하지 마세요. Boundary Client Agent 데몬과 Boundary 검색 기능이 이 역할을 필요로 하기 때문에, 사용자가 auth token을 클라이언트 캐시에 추가하고 캐시된 리소스를 검색할 수 있어요.

Boundary 초기화 경로는 이 역할을 Login Grants, Login and Default Grants, 또는 HCP Boundary에서는 global_anon_listing으로 노출할 수 있습니다. 이 역할은 global 스코프의 u_anon 주체와 연결되며 자손(descendant) 스코프에도 적용되어야 해요. 기본 grant는:

ids=*;type=auth-token;actions=list,read:self,delete:self

역할을 수정하거나 제거하기 전에 배포에 맞는 역할 이름과 배포별 동작을 확인하세요.

org 스코프용 익명 목록 역할

위 단계의 recovery 키 내보내기가 여전히 설정되어 있다고 가정합니다.

CLI:

$ boundary roles create -name 'org_anon_listing' \
  -recovery-config /tmp/recovery.hcl \
  -scope-id <org_scope_id>

$ boundary roles add-grants -id <org_anon_listing_id> \
  -recovery-config /tmp/recovery.hcl \
  -grant 'ids=*;type=auth-method;actions=list,authenticate' \
  -grant 'type=scope;actions=list' \
  -grant 'ids={{.Account.Id}};actions=read,change-password'

$ boundary roles add-principals -id <org_anon_listing_id> \
  -recovery-config /tmp/recovery.hcl \
  -principal 'u_anon'

Terraform:

resource "boundary_role" "org_anon_listing" {
  scope_id = boundary_scope.org.id
  grant_strings = [
    "ids=*;type=auth-method;actions=list,authenticate",
    "type=scope;actions=list",
    "ids={{.Account.Id}};actions=read,change-password"
  ]
  principal_ids = ["u_anon"]
}
myuser용 org admin 역할

위 단계의 recovery 키 내보내기가 여전히 설정되어 있다고 가정합니다.

CLI:

$ boundary roles create -name 'org_admin' \
  -recovery-config /tmp/recovery.hcl \
  -scope-id 'global'

$ boundary roles set-grant-scopes \
  -id <org_admin_id> \
  -grant-scope-id <org_scope_id>

$ boundary roles add-grants -id <org_admin_id> \
  -recovery-config /tmp/recovery.hcl \
  -grant 'ids=*;type=*;actions=*'

$ boundary roles add-principals -id <org_admin_id> \
  -recovery-config /tmp/recovery.hcl \
  -principal <myuser_user_id>

Terraform:

resource "boundary_role" "org_admin" {
  scope_id       = "global"
  grant_scope_ids = [boundary_scope.org.id]
  grant_strings = [
    "ids=*;type=*;actions=*"
  ]
  principal_ids = [boundary_user.myuser.id]
}
myuser용 프로젝트 admin

위 단계의 recovery 키 내보내기가 여전히 설정되어 있다고 가정합니다.

CLI:

$ boundary roles create -name 'project_admin' \
  -recovery-config /tmp/recovery.hcl \
  -scope-id <org_scope_id> \
  -grant-scope-id <project_scope_id>

$ boundary roles add-grants -id <project_admin_id> \
  -recovery-config /tmp/recovery.hcl \
  -grant 'ids=*;type=*;actions=*'

$ boundary roles add-principals -id <project_admin_id> \
  -recovery-config /tmp/recovery.hcl \
  -principal <myuser_user_id>

Terraform:

resource "boundary_role" "project_admin" {
  scope_id        = boundary_scope.org.id
  grant_scope_ids = [boundary_scope.project.id]
  grant_strings = [
    "ids=*;type=*;actions=*"
  ]
  principal_ids = [boundary_user.myuser.id]
}

새 사용자로 로그인

boundary authenticate password \
  -auth-method-id <auth_method_id>

문제 해결

Boundary를 초기화할 때 흔한 문제는 다음과 같습니다:

  • 잘못된 -recovery-config 경로 — -recovery-config(또는 BOUNDARY_RECOVERY_CONFIG 환경 변수)에 전달한 경로가 컨트롤러 구성과 일치하는 recovery 목적 블록이 있는 유효한 KMS 구성 파일을 가리키는지 확인하세요.
  • Grant 문자열 오타 — 각 -grant 값이 ids=<id>;type=<type>;actions=<action> 구문을 정확히 따르는지 확인하세요. 잘못된 grant 문자열은 역할이 의도하지 않은(또는 전혀 없는) 권한을 부여하게 만듭니다.

더 알아보기 (Learn more)

Boundary를 초기화한 다음에는 Boundary 클라이언트를 설치해야 해요.