web-dev-qa-db-ja.com

HashicorpVault-パス内の1つの特定のサブノードを制限するポリシー

Hashicorp Vaultサーバーを構成しましたが、「拒否」ポリシーを除いて、すべてが正常に実行されています。

私は大多数の秘密を2レベルでグループ化しているので、次の構造に従います。

secret/client/environment/*

すべてのシークレットがクライアント/環境の構造に従うわけではありませんが、そのために、このポリシーのユーザーがアクセスできないようにする「制限された」ノードがあります。

上記の要件に基づいて、私は次のようなポリシーになりました。

# Allow access to non client / environment secrets
path "secret/"
{
  capabilities = ["create", "read", "update", "list"]
}

path "secret/+/"
{
  capabilities = ["create", "read", "update", "list"]
}

path "secret/+/+/*"
{
  capabilities = ["create", "read", "update", "list"]
}

# No access to restricted secrets
path "secret/+/+/restricted"
{
  capabilities = ["deny"]
}

path "secret/+/+/restricted/*"
{
  capabilities = ["deny"]
}

ポリシーを使用してトークンを作成し、そのトークンを「ボールトトークン機能」コマンドで使用すると、期待どおりの結果が返されます。

$vault token capabilities $(cat token.txt) secret/client/environment/blah
create, list, read, update

$vault token capabilities $(cat token.txt) secret/client/environment/restricted
deny

$vault token capabilities $(cat token.txt) secret/client/environment/restricted/blah
deny

そのトークンを使用してログインすると問題が発生します。制限されたノードの内容を一覧表示できるだけでなく、その中の任意のキーの詳細を取得することもできます(以下のすべてのレベルで)。これは、CLIとWebUIの両方に当てはまります。

シークレット/ *を許可してからシークレット/ +/+ /制限付き/ *を拒否するという単純なポリシーを試してみましたが、これは「ボールトトークン機能」コマンドでは正しく機能しませんでした。

トークンを使用してログインすると、正しいポリシーが表示されます(デフォルトも同様ですが、デフォルトにはsecret /へのアクセス許可がありません)。

secret /はkvストアとしてセットアップされているので、「vault kv list | get ...」を使用してCLIからアクセスします。

ログインしたユーザーにポリシールールを「強制」するために実行する必要のある別の手順はありますか?

1
PhilHalf

シークレットストレージにKVv2バックエンドを使用していたため、ポリシー構造が少し異なります。

アクセス許可を一覧表示するにはsecret /metadata/を指定し、create/update/readにはsecret /data/を指定する必要がありました。

例えば:

# Allow listing of all secret branches
path "secret/metadata/"
{
  capabilities = ["list"]
}
path "secret/metadata/+/"
{
  capabilities = ["list"]
}

path "secret/metadata/+/+/"
{
  capabilities = ["list"]
}

# Allow management of all keys under secret/<client>/<environment> structure
path "secret/data/+/+/+"
{
  capabilities = ["create", "read", "update"]
}

そして、制限されたノードに「拒否」を設定する代わりに、そのレベルで(現時点で)他の唯一のノードは「制限されていない」ノードであるため、次のように追加しました。

path "secret/metadata/+/+/unrestricted/"
{
  capabilities = ["list"]
}

path "secret/data/+/+/unrestricted/*"
{
  capabilities = ["create", "read", "update"]
}

Vaultポリシーはデフォルトで拒否されるため、これは望ましい効果をもたらしました。

KV2ポリシー設定の詳細は次の場所にあります: https://www.vaultproject.io/docs/secrets/kv/kv-v2.html#acl-rules

1
PhilHalf