我构建了一个 Spring Boot 应用程序,并将其部署在 kuberenetes 上以及库访问权限上。当我尝试使用 kuberenets 角色访问保管库秘密引擎(任何 kv、秘密等..)时,出现权限被拒绝错误。
仅供参考,我能够访问保管库服务并从应用程序窗格中提取数据。
我的应用程序 yaml
spring:
config:
import: vault://
cloud:
vault:
config.lifecycle:
enabled: true
min-renewal: 100s
expiry-threshold: 300s
uri: http://vault.vault:8200
authentication: kubernetes
kubernetes:
role: simple-test
generic:
enabled: false
kv:
enabled: true
backend: kv
profile-separator: /
application-name: my-app
kubernetes:
secrets:
enabled: true
namespace: app
fail-fast: true
retry:
enabled: true
部署yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-vault-write
labels:
app: spring-vault-write
spec:
replicas: 3
selector:
matchLabels:
app: spring-vault-write
template:
metadata:
name: spring-vault-write
labels:
app: spring-vault-write
spec:
imagePullSecrets:
- name: registry-secret
containers:
- name: spring-vault-write
image: xxxxdocker629/spring-vault-write:latest
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
restartPolicy: Always
我的控制器(我的应用程序位于 kv2 秘密引擎下,它有 data.key 和 data.password 条目)
@RestController
@RequestMapping("/api")
public class SpringVaultWriterController {
Logger logger = LogManager.getLogger(SpringVaultWriterController.class);
@Value("${data.key}")
private String username;
@Value("${data.password}")
private String password;
@GetMapping("/secrets")
public String getList(){
logger.info("get list is : ", username + " :: " + password);
return "we got the list as : List";
}
}
为 kubernetes 角色附加策略。
path "kv/data/my-app" {
capabilities = [ "create", "read", "update", "list" ]
}
有人可以帮助我哪里出了问题或有任何解决办法吗?
根据我的观察,我发现 /var/run/secrets/kubernetes.io/serviceaccount/token 下的令牌在应用程序 pod 和保管库中是不同的。这是问题的根本原因吗?
该问题可能是由于应用程序 pod 中的 Kubernetes 服务帐户令牌与 Vault 之间不匹配造成的。
确保 JWT 令牌已正确安装在 Pod 中,位置为
/var/run/secrets/kubernetes.io/serviceaccount/token
还要验证您的策略路径应该是
kv/data/my-app/*
而不是只是 kv/data/my-app
。