This is an automated email from the ASF dual-hosted git repository.
wenming pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/master by this push:
new 0468d7891 feat: support hcv namespace (#11277)
0468d7891 is described below
commit 0468d78918c268d82f7c975f4326f4a0e79f3c10
Author: Zeping Bai <[email protected]>
AuthorDate: Thu May 23 16:37:31 2024 +0800
feat: support hcv namespace (#11277)
---
apisix/secret/vault.lua | 16 ++++++++--
docs/en/latest/admin-api.md | 1 +
docs/en/latest/terminology/secret.md | 12 ++++++--
docs/zh/latest/admin-api.md | 5 ++--
docs/zh/latest/terminology/secret.md | 6 ++++
t/secret/vault.t | 57 ++++++++++++++++++++++++++++++++++++
6 files changed, 89 insertions(+), 8 deletions(-)
diff --git a/apisix/secret/vault.lua b/apisix/secret/vault.lua
index f5dcb7a24..40b5d404b 100644
--- a/apisix/secret/vault.lua
+++ b/apisix/secret/vault.lua
@@ -37,6 +37,9 @@ local schema = {
token = {
type = "string",
},
+ namespace = {
+ type = "string",
+ },
},
required = {"uri", "prefix", "token"},
}
@@ -58,11 +61,18 @@ local function make_request_to_vault(conf, method, key,
data)
token = conf.token
end
+ local headers = {
+ ["X-Vault-Token"] = token
+ }
+ if conf.namespace then
+ -- The namespace rule is referenced in
+ --
https://developer.hashicorp.com/vault/docs/enterprise/namespaces#vault-api-and-namespaces
+ headers["X-Vault-Namespace"] = conf.namespace
+ end
+
local res, err = httpc:request_uri(req_addr, {
method = method,
- headers = {
- ["X-Vault-Token"] = token
- },
+ headers = headers,
body = core.json.encode(data or {}, true)
})
diff --git a/docs/en/latest/admin-api.md b/docs/en/latest/admin-api.md
index 158c81543..e2807622e 100644
--- a/docs/en/latest/admin-api.md
+++ b/docs/en/latest/admin-api.md
@@ -1466,6 +1466,7 @@ When `{secretmanager}` is `vault`:
| uri | True | URI | URI of the vault server.
|
|
| prefix | True | string | key prefix
| token | True | string | vault token. |
|
+| namespace | False | string | Vault namespace, no default value |
`admin` |
Example Configuration:
diff --git a/docs/en/latest/terminology/secret.md
b/docs/en/latest/terminology/secret.md
index c38ffb68c..bc233f3d9 100644
--- a/docs/en/latest/terminology/secret.md
+++ b/docs/en/latest/terminology/secret.md
@@ -123,9 +123,9 @@ curl http://127.0.0.1:9180/apisix/admin/consumers \
Through the above steps, the `key` configuration in the `key-auth` plugin can
be saved in the environment variable instead of being displayed in plain text
when configuring the plugin.
-## Use Vault to manage secrets
+## Use HashiCorp Vault to manage secrets
-Using Vault to manage secrets means that you can store secrets information in
the Vault service and refer to it through variables in a specific format when
configuring plugins. APISIX currently supports [Vault KV engine version
V1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1).
+Using HashiCorp Vault to manage secrets means that you can store secrets
information in the Vault service and refer to it through variables in a
specific format when configuring plugins. APISIX currently supports [Vault KV
engine version V1](https://developer.hashicorp.com/vault/docs/secrets/kv/kv-v1).
### Usage
@@ -133,7 +133,7 @@ Using Vault to manage secrets means that you can store
secrets information in th
$secret://$manager/$id/$secret_name/$key
```
-- manager: secrets management service, could be the Vault, AWS, etc.
+- manager: secrets management service, could be the HashiCorp Vault, AWS, etc.
- id: APISIX Secrets resource ID, which needs to be consistent with the one
specified when adding the APISIX Secrets resource
- secret_name: the secret name in the secrets management service
- key: the key corresponding to the secret in the secrets management service
@@ -168,6 +168,12 @@ secrets:
uri: 127.0.0.1:8200
```
+:::tip
+
+It now supports the use of the [`namespace`
field](../admin-api.md#request-body-parameters-11) to set the multi-tenant
namespace concepts supported by [HashiCorp Vault
Enterprise](https://developer.hashicorp.com/vault/docs/enterprise/namespaces#vault-api-and-namespaces)
and HCP Vault.
+
+:::
+
Step 3: Reference the APISIX Secrets resource in the `key-auth` plugin and
fill in the key information:
```shell
diff --git a/docs/zh/latest/admin-api.md b/docs/zh/latest/admin-api.md
index 1d2e17c3a..461771a95 100644
--- a/docs/zh/latest/admin-api.md
+++ b/docs/zh/latest/admin-api.md
@@ -358,7 +358,7 @@ Route 对象 JSON 配置示例:
"desc": "hello world",
"remote_addrs": ["127.0.0.1"], # 一组客户端请求 IP 地址
"vars": [["http_user", "==", "ios"]], # 由一个或多个 [var, operator, val] 元素组成的列表
- "upstream_id": "1", # upstream 对象在 etcd 中的 id ,建议使用此值
+ "upstream_id": "1", # upstream 对象在 etcd 中的 id,建议使用此值
"upstream": {}, # upstream 信息对象,建议尽量不要使用
"timeout": { # 为 route 设置 upstream
的连接、发送消息、接收消息的超时时间。
"connect": 3,
@@ -652,7 +652,7 @@ Service 对象 JSON 配置示例:
{
"id": "1", # id
"plugins": {}, # 指定 service 绑定的插件
- "upstream_id": "1", # upstream 对象在 etcd 中的 id ,建议使用此值
+ "upstream_id": "1", # upstream 对象在 etcd 中的 id,建议使用此值
"upstream": {}, # upstream 信息对象,不建议使用
"name": "test svc", # service 名称
"desc": "hello world", # service 描述
@@ -1476,6 +1476,7 @@ Secret 资源请求地址:/apisix/admin/secrets/{secretmanager}/{id}
| uri | 是 | URI | Vault 服务器的 URI
| |
| prefix | 是 | 字符串 | 密钥前缀
| token | 是 | 字符串 | Vault 令牌 |
|
+| namespace | 否 | 字符串 | Vault 命名空间,该字段无默认值 | `admin` |
配置示例:
diff --git a/docs/zh/latest/terminology/secret.md
b/docs/zh/latest/terminology/secret.md
index c59f0d4ce..100a44475 100644
--- a/docs/zh/latest/terminology/secret.md
+++ b/docs/zh/latest/terminology/secret.md
@@ -169,6 +169,12 @@ secrets:
uri: 127.0.0.1:8200
```
+:::tip
+
+它现在支持使用 [`namespace`
字段](../admin-api.md#secret-config-body-requset-parameters] 设置 [HashiCorp Vault
Enterprise](https://developer.hashicorp.com/vault/docs/enterprise/namespaces#vault-api-and-namespaces)
和 HCP Vault 所支持的多租户命名空间概念。
+
+:::
+
第三步:在 `key-auth` 插件中引用 APISIX Secret 资源,填充秘钥信息:
```shell
diff --git a/t/secret/vault.t b/t/secret/vault.t
index b3db13179..607604f7a 100644
--- a/t/secret/vault.t
+++ b/t/secret/vault.t
@@ -236,3 +236,60 @@ failed to decode result, res: \{\"errors\":\[\"permission
denied\"\]}\n
GET /t
--- response_body_like
failed to decode result, res: \{\"errors\":\[\"permission denied\"\]}\n
+
+
+
+=== TEST 10: setup route
+--- config
+ location /t {
+ content_by_lua_block {
+ local t = require("lib.test_admin").test
+ local code, body = t('/apisix/admin/routes/1',
+ ngx.HTTP_PUT,
+ [[{
+ "plugins": {
+ "serverless-pre-function": {
+ "phase": "access",
+ "functions": [
+ "return function(conf, ctx) ngx.log(ngx.ERR,
'HCV_NAMESAPCE:'..(ctx.var.http_x_vault_namespace or '_'));
require('apisix.core').response.exit(200); end"
+ ]
+ }
+ },
+ "uri": "/*"
+ }]]
+ )
+
+ if code >= 300 then
+ ngx.status = code
+ end
+ ngx.say(body)
+ }
+ }
+--- request
+GET /t
+--- response_body
+passed
+
+
+
+=== TEST 11: hit route (test namespace header)
+--- config
+ location /t {
+ content_by_lua_block {
+ local vault = require("apisix.secret.vault")
+ local conf = {
+ prefix = "kv/apisix",
+ token = "test",
+ uri = "http://localhost:1984/mock",
+ namespace = "apisix",
+ }
+ local value, err = vault.get(conf, "/apisix-key/jack/key")
+ if err then
+ return ngx.say(err)
+ end
+ }
+ }
+--- request
+GET /t
+--- error_log
+HCV_NAMESAPCE:apisix