Skip to content

Latest commit

 

History

History
291 lines (204 loc) · 8.96 KB

auth_ldap.md

File metadata and controls

291 lines (204 loc) · 8.96 KB

LDAPによる認証

ここではLDAPを用いた認証を行ってみます。

LDAPサーバーの準備

もし、すでに利用可能なLDAPやADなどがあればそちらをご使用ください。手元にLDAP環境がない場合、OpenLDAPコンテナなどを準備ください。

ここでは、AccountなどがセットアップされたLDAP環境を用います。 ワークショップ内で使用するスクリプトなどは、準備した環境があるのでダウンロードしてください。

OpenLDAPコンテナの起動

まず以下のコマンドでLDAPコンテナを起動します。

$ ./1.start_ldap_server.sh

docker psなどでコンテナが起動したことを確認ください。

OpenLDAPコンテナとの通信確認

LDAPサーバーとの通信を確認するには、以下のコマンドを叩いてエントリーが取得できることを確認ください。以下ではITグループに所属しているユーザー一覧を表示します。

$ ./3.list_it_members.sh
# extended LDIF
#
# LDAPv3
# base <cn=it,ou=um_group,dc=ourcorp,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# it, um_group, ourcorp.com
dn: cn=it,ou=um_group,dc=ourcorp,dc=com
objectClass: groupOfUniqueNames
objectClass: top
cn: it
uniqueMember: cn=bob,ou=people,dc=ourcorp,dc=com
uniqueMember: cn=deepak,ou=people,dc=ourcorp,dc=com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

LDAP auth methodの設定

次にVault側でLDAP auth methodを設定します。

$ ./_2.enable_auth_ldap.sh

こちらの中身はこうなっています。

vault auth enable -path=ldap-um ldap

echo "Configure Unique Member group lookups"

# Using group of unique names lookups

vault write auth/ldap-um/config \
    url="${LDAP_URL}" \
    binddn="${BIND_DN}" \
    bindpass="${BIND_PW}" \
    userdn="${USER_DN}" \
    userattr="${USER_ATTR}" \
    groupdn="${GROUP_DN}" \
    groupfilter="${UM_GROUP_FILTER}" \
    groupattr="${UM_GROUP_ATTR}" \
    insecure_tls=true

まず、vault auth enableでAuth methodを有効化します。 その後vault write auth/ldap-um/configで、LDAPサーバーとの通信に必要な設定を行っています。

vault auth listコマンドでLDAP認証が作成されていることを確認ください。

$ vault auth list
Path         Type        Accessor                  Description
----         ----        --------                  -----------
approle/     approle     auth_approle_4bd66d05     n/a
ldap-um/     ldap        auth_ldap_ff29eb9c        n/a
token/       token       auth_token_8c9e5cf0       token based credentials

シークレットを準備

次にこのワークショップで用いるシークレットを準備します。Secret engineはKVエンジンを使用します。もし、まだ設定していない場合は以下のコマンドでKVを有効化してください。

$ vault secrets enable -path=secret kv`

これにより、Vault上の/secretというPathにKVエンジンがマウントされます。

KVエンジンにシークレットを書き込みます。

$ ./_4.populage_kvs.sh

中身はこうなっています。

#!/bin/bash

vault write secret/ldap/it password="foo"
vault write secret/ldap/security password="bar"
vault write secret/ldap/engineering password="hoge"

ITグループ向け、Securityグループ向け、Engineeringグループ向けの3つのシークレットが書き込まれました。

Policyの設定

次に、これらのシークレットへのアクセスを許可するためのPolicyを準備します。

Policyの中身

ここでは以下のITグループ向けとSecurityグループ向けの2種類のPolicyを使用します。

ITグループ向け (it_policy.hcl):

# Policy for IT peopld

path "secret/ldap" {
	capabilities = [ "list" ]
}

path "secret/ldap/it" {
	capabilities = [ "create", "read", "update", "delete", "list" ]
}

Securityグループ向け (security_policy.hcl):

# Policy for security people

path "secret/ldap" {
	capabilities = [ "list" ]
}

path "secret/ldap/security" {
	capabilities = [ "create", "read", "update", "delete", "list" ]
}

それぞれのPolicyに、secret/ldap以下のそれぞれのシークレットへのアクセス権限が明示的に記載されています。

Policyの設定とグループへの適用

Policyが準備できたら、そのPolicyをLDAP上のグループと紐付けます。

$ ./5.write_associate_policy.sh

中身はこうなっています。

# create policies
vault policy write it_policy it_policy.hcl
vault policy write security_policy security_policy.hcl

# set up uniqueMember group logins
vault write auth/ldap-um/groups/it policies=it_policy
vault write auth/ldap-um/groups/security policies=security_policy

vault policy writeでPolicyを書き込み、vault write auth/ldap-um/groups/<グループ名>でグループとPolicyを紐付けます。

LDAP認証をもちいたログイン

これでVaultを通じてLDAP認証を行う準備が整いました。

まず、ITグループのメンバーでログインしてみます。

$ ./6.login_it_member.sh
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                    Value
---                    -----
token                  s.E9OVOHtCWsCHCxnf0uggkTeO
token_accessor         yAPrXcBwrEOW1aPHjkZqzgqB
token_duration         768h
token_renewable        true
token_policies         ["default" "it_policy"]
identity_policies      []
policies               ["default" "it_policy"]
token_meta_username    deepak

無事にログインされTokenが返ってきています。token_policiesに"it_policy"が設定されていることを確認ください。 また、vault token lookupで現在のTokenを確認できます。

上記のtokenを保管してください。この例では、s.E9OVOHtCWsCHCxnf0uggkTeOgaがそれに当たります。

同様にSecurityグループでのログインも行ってください。

$ ./7.login_security_member.sh
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                    Value
---                    -----
token                  s.EswSipV6qpy0UEZ6Xoxdoo7X
token_accessor         7L9pwEUOyDsbfwXczefii6Vq
token_duration         768h
token_renewable        true
token_policies         ["default" "security_policy"]
identity_policies      []
policies               ["default" "security_policy"]
token_meta_username    eve

このToken値も保管してください。 この後の作業では、これらのTokenを切り替えて作業していきます。Tokenの切り替えは、vault login <Token値>で行います。

$ vault login s.E9OVOHtCWsCHCxnf0uggkTeOga` # 上記のITグループのTokenを使用

Tokenは環境変数(VAULT_TOKEN) )からも設定できます。よって、以下のような切り替えも可能です。

$ export IT_TOKEN=s.E9OVOHtCWsCHCxnf0uggkTeO  # ITトークンの変数
$ export SECURITY_TOKEN=s.EswSipV6qpy0UEZ6Xoxdoo7X # Securityトークンの変数

$ VAULT_TOKEN=$IT_TOKEN vault <コマンド>  # コマンドをITトークンで実行
$ VAULT_TOKEN=$SECURITY_TOKEN vault <コマンド>  # コマンドをSecurityトークンで実行

シークレットの取得

それではシークレットの取得をしてみましょう。

まず、PolicyによればITグループのユーザーはsecret/ldap/itにはアクセスができるはずです。

$ VAULT_TOKEN=$IT_TOKEN vault read secret/ldap/it
Key                 Value
---                 -----
refresh_interval    768h
password            foo

無事にシークレットを取得できました。 次にSecurityグループのシークレットの取得も試してみましょう。

$ VAULT_TOKEN=$IT_TOKEN vault read secret/ldap/security
Error reading secret/ldap/security: Error making API request.

URL: GET http://127.0.0.1:8200/v1/secret/ldap/security
Code: 403. Errors:

* 1 error occurred:
	* permission denied

ITグループのPolicyではsecret/ldap/securityへのアクセス権限がないので無事にはじかれました。

同様にSecurityグループのTokenでも試してみてください。

参考リンク