🥢

Boundary の認証メソッドで LDAP を設定する

2023/12/19に公開

Boundary 0.14 から Userpass, OIDC auth method の他に LDAP auth method が GA となったので、ラボ環境で試してみました。
https://developer.hashicorp.com/boundary/docs/release-notes/v0_14_0

Boundary environment

Boundary の LDAP auth method は Boundary v0.14 以上の環境で利用出来ます。ここでは、以前アップグレードを行った Boundary Enterprise の環境を利用しています。

Configure LDAP auth method

LDAP auth method の設定を Boundary に対して実施していきますが、Boundary も Terraform provider が用意されているため、boundary_account_ldapboundary_managed_group_ldap を利用して Terraform で設定していきます。

Terraform のコードは以下の様になっています。

ldap_auth.tf
resource "boundary_auth_method_ldap" "mylab" {
  scope_id             = data.terraform_remote_state.first.outputs.org_id
  description          = "openldap auth method"
  name                 = "openldap auth method"
  urls                 = ["${var.ldap_url}"]
  bind_dn              = var.bind_dn
  bind_password        = var.bind_pass
  insecure_tls         = true
  group_attr           = var.group_attr
  group_dn             = var.group_dn
  group_filter         = var.group_filter
  user_dn              = var.user_dn
  user_attr            = var.user_addr
  enable_groups        = true
  state                = "active-public"
  is_primary_for_scope = true
}

resource "boundary_managed_group_ldap" "joestar" {
  auth_method_id = boundary_auth_method_ldap.mylab.id
  group_names    = ["joestar"]
  name           = "joestar-mylab"
  description    = "joestar group in ldap: jotaro, joseph "
}

resource "boundary_role" "admin" {
  name        = "mylab-project-admin-from-ldap"
  description = "admin role"
  principal_ids = [
    boundary_managed_group_ldap.joestar.id
  ]
  grant_strings = ["id=*;type=*;actions=*"]
  scope_id      = data.terraform_remote_state.first.outputs.project_id
}

boundary_auth_method_ldap リソースの scope_id の値に関しては、Terraform を用いて別途作成した Boundary リソースのアウトプットから取得し、LDAP auth method を設定する Scope を指定しています。

boundary_managed_group_ldap リソースの group_names の値は、LDAP サーバー側で定義したグループ名を記載しています。

boundary_role リソースで、boundary_managed_group_ldap リソースで定義したプリンシパルに対して、権限を付与しています。ここでは特に権限を絞ることなく、grant_strings = ["id=*;type=*;actions=*"] と定義していますが、Grant の定義を修正する事で、例えば以下の様にアクセスさせるターゲットを絞る事も可能です。

grant_strings example
  grant_strings = [
    "id=${boundary_target.postgres_ro.id};actions=*",
    "id=${boundary_target.k8s_list.id};actions=*",
    "id=*;type=session;actions=cancel:self,list,read",
    "id=*;type=target;actions=list,read",
    "id=*;type=host-catalog;actions=list,read",
    "id=*;type=host-set;actions=list,read",
    "id=*;type=host;actions=list,read"
  ]

必要な Terraform 変数ファイル等を準備した上で、terraform apply を実行し、Boundary に対して設定しています。このあたりの定義に関しては、チュートリアル LDAP authentication でも確認出来ますので、ご確認下さい。

また、Scope や 権限設定を行う Grant を含めた Boundary のドメインモデルに関しては、以下のドキュメントで確認出来ます。
https://developer.hashicorp.com/boundary/docs/concepts/domain-model

Login to Boundary with LDAP auth method

Boundary Desktop, boundary CLI それぞれでログインしてみます。

Boundary Desktop から openldap auth method を選択し、LDAP auth method でログインします。

ログインすると、このユーザーは、boundary_managed_group_ldap リソースで定義したグループに所属しているユーザーであり、全てのアクションが許可されているため、このプロジェクトに登録されている全てのターゲットがリストされます。

boundary CLI だと以下の様に、boundary authenticate ldap -auth-method-id コマンドで設定した LDAP auth method の ID を指定してログインします。

$ export BOUNDARY_ADDR="https://boundary-controller.service.consul:9200"
$ boundary authenticate ldap -auth-method-id amldap_KdUCiblVEh -login-name jotaro -keyring-type=none
Please enter the password (it will be hidden):

Authentication information:
  Account ID:      acctldap_FxweOCVVQX
  Auth Method ID:  amldap_KdUCiblVEh
  Expiration Time: Mon, 25 Dec 2023 17:17:32 JST
  User ID:         u_ymTbu4gdWP
boundary authenticate コマンドで出力されたトークンを環境変数に設定
$ export BOUNDARY_TOKEN="at_..."

ターゲットをリストし、ターゲット ID tssh_qU3d84RQ3k の Linux サーバーに対して boundary connect ssh でアクセスしてみます。

$ boundary targets list -scope-id p_BCPM8S6I9E -token env://BOUNDARY_TOKEN

Target information:
  ID:                    tssh_eX0ajhC95E
    Version:             7
    Type:                ssh
    Name:                linux-ssh-cert-2
...

  ID:                    tssh_qU3d84RQ3k
    Version:             7
    Type:                ssh
    Name:                linux-ssh-cert-1
    Description:         linux targets with ssh-cert
    Address:             xxx.xxx.xx.xxx
    Authorized Actions:
      no-op
      read
      update
      delete
      add-host-sources
      set-host-sources
      remove-host-sources
      add-credential-sources
      set-credential-sources
      remove-credential-sources
      authorize-session
...
$ boundary connect ssh -target-id tssh_qU3d84RQ3k -token env://BOUNDARY_TOKEN
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-89-generic x86_64)

...
Last login: Mon Dec 18 21:56:01 2023 from xxx.xxx.xx.xxx
demo@hashi-client-1:~ $

LDAP で認証された上で、権限もあるユーザーであるため、無事にターゲットとなる Linux サーバーにアクセスする事が出来ました。

Summary

従来から利用できる Userpass, OIDC auth method 以外に、LDAP を利用して、Boundary へアクセスするヒトの認証を行える様になりました。

References

Discussion