{"id":349781,"date":"2023-07-05T09:01:42","date_gmt":"2023-07-05T09:01:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=349781"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=349781","title":{"rendered":"<span>\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c Kubernetes \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0438\u0437 Vault, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f external-secrets-operator<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u043a\u0443\u0431\u043e\u043c, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b&#8230;<\/em><\/p>\n<p>\u0411\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0445\u0440\u0430\u043d\u044f\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043b\u044e\u0447\u0438, \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0438\u043b\u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 Gitlab. \u0412 Kubernetes \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u043e\u043c\u0443 \u043a\u0440\u0443\u0433\u0443 \u043b\u0438\u0446, \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0441\u0435\u043a\u0440\u0435\u0442\u044b. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kubernetes, \u0442\u0430\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configmap-secret\/managing-secret-using-kubectl\/\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c kubectl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configmap-secret\/managing-secret-using-config-file\/\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configmap-secret\/managing-secret-using-kustomize\/\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kustomize<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431: \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 HashiCorp Vault \u0432 Kubernetes.\u00a0\u041c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 HashiCorp Vault, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e:\u00a0<\/p>\n<ul>\n<li>\n<p>\u041e\u043d \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043d\u0451\u043c \u043c\u043d\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ACL \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 HashiCorp Vault \u0432 Kubernetes \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u2013 \u0442\u0435\u043c\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 Vault \u0432 Kubernetes \u2013 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 AppRole, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f external-secrets-operator. <\/p>\n<blockquote>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 External Secrets Operator<\/strong><\/p>\n<p>External Secrets Operator \u2014 \u044d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 Kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a HashiCorp Vault \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u044b Kubernetes. <\/p>\n<\/blockquote>\n<p>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1bc\/3b9\/c9b\/1bc3b9c9bdcc3fed7a38f3fde028f827.png\" width=\"1600\" height=\"949\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1bc\/3b9\/c9b\/1bc3b9c9bdcc3fed7a38f3fde028f827.png\"\/><\/figure>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043f\u0440\u043e\u0439\u0434\u0451\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u0442\u0430\u043f\u0443.<\/p>\n<h2>\u0428\u0430\u0433 1: \u0421\u043e\u0437\u0434\u0430\u0451\u043c Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f: \u043f\u0440\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441 \u043e\u0431\u043b\u0430\u043a\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Terragrunt \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/github.com\/patsevanton\/vault-external-secrets-operator\/blob\/main\/terragrunt-k8s\/create-k8s-by-terraform-in-yc.md\">\u0432 \u043c\u043e\u0451\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0430 GitHub<\/a>. <\/p>\n<h2>\u0428\u0430\u0433 2: \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c HashiCorp Vault<\/h2>\n<p><em>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 Hashicorp Vault, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b.<\/em><\/p>\n<pre><code>helm install vault oci:\/\/registry-1.docker.io\/bitnamicharts\/vault --version 0.2.1 -n vault --create-namespace<\/code><\/pre>\n<p>\u041d\u0430\u0447\u043d\u0451\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u0416\u0434\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 vault-server-0 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Running.<\/p>\n<pre><code>$ kubectl get pods --namespace \"vault\" -l app.kubernetes.io\/instance=vault NAME                              READY   STATUS    RESTARTS   AGE vault-injector-6f8fb5dcff-9zhgm   1\/1     Running   0          51s vault-server-0                    0\/1     Running   0          51s <\/code><\/pre>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u0449\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u044e\u0447\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/p>\n<pre><code>$ kubectl exec -ti vault-server-0 -n vault -- vault operator init Unseal Key 1: ircItR+\/QeLTsve4J3zqw9SPGhC5rDAuxZcz4jr8u4N\/ Unseal Key 2: T\/L9vkkm3+uo0H9XxADNAsr+YUCSPctnLC\/011S79AVg Unseal Key 3: gmSD+fb5A+4P7N3QLDtoLtzuiXnQuhE\/Y4uB1RTlRU6h Unseal Key 4: nMTwQQy81EPS8eS\/\/kNicnvE5botOc5jyjHVuuqGkva7 Unseal Key 5: 1roVdnVqvZnHroOijEZFMiueeGE1WF2WWRUWJ4MWCjyF  Initial Root Token: hvs.bY28dn6cKyp6JCvPLTV3Eufb<\/code><\/pre>\n<p>\u0412 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043b\u044e\u0447. \u0420\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 HashiCorp vault \u0441 \u043e\u0431\u0449\u0438\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430:<\/p>\n<pre><code>kubectl exec -ti vault-server-0 -n vault -- vault operator unseal # ... Unseal Key 1 kubectl exec -ti vault-server-0 -n vault -- vault operator unseal # ... Unseal Key 2 kubectl exec -ti vault-server-0 -n vault -- vault operator unseal # ... Unseal Key 3<\/code><\/pre>\n<p>\u0412 <u>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c<\/u> \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u044c\u0442\u0435 \u043f\u043e\u0440\u0442 8200 \u043e\u0442 HashiCorp Vault.<\/p>\n<h2>\u0428\u0430\u0433 3: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c AppRole<\/h2>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 HashiCorp Vault.<\/p>\n<pre><code>export VAULT_ADDR=http:\/\/127.0.0.1:8200<\/code><\/pre>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c AppRole \u0432 Vault \u0438\u0437 CLI \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 Terraform-\u043a\u043e\u0434. \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043c AppRole Vault \u0447\u0435\u0440\u0435\u0437 Terraform. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435\u00a0<code>setting-approle-vault.tf<\/code>\u00a0\u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"go\"># \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 engine kv \u0438\u0437 CLI. resource \"vault_mount\" \"kvv2-secret\" {   path        = \"secret\"   type        = \"kv\"   options     = { version = \"2\" }   description = \"KV Version 2 secret engine mount\" }  # \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 approle \u0438\u0437 CLI. resource \"vault_auth_backend\" \"approle\" {   type = \"approle\" }  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e \u043f\u0443\u0442\u0438 secret\/data\/postgres resource \"vault_policy\" \"secret-read-policy\" {   name = \"read-policy\"    policy = &lt;&lt;EOT path \"secret\/data\/postgres\" {   capabilities = [\"read\", \"list\"] } EOT }  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u044c \u0434\u043b\u044f approle. resource \"vault_approle_auth_backend_role\" \"secret\" {   backend        = vault_auth_backend.approle.path   role_name      = \"secret\"   token_policies = [\"read-policy\"] }  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 (secret_id) resource \"vault_approle_auth_backend_role_secret_id\" \"id\" {   backend   = vault_auth_backend.approle.path   role_name = vault_approle_auth_backend_role.secret.role_name }  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 id \u0440\u043e\u043b\u0438 approle (role_id) output \"role_id\" {   value     = vault_approle_auth_backend_role.secret.role_id   sensitive = true }  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 (secret_id) output \"secret_id\" {   value     = vault_approle_auth_backend_role_secret_id.id.secret_id   sensitive = true } <\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u00a0<a href=\"https:\/\/github.com\/patsevanton\/vault-external-secrets-operator\/blob\/main\/vault-resource\/create-approle-vault-cli.md\">setting-approle-vault.tf<\/a>\u00a0\u0435\u0441\u0442\u044c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 vault-resource. \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043a\u0435\u043d (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 root-\u0442\u043e\u043a\u0435\u043d).<\/p>\n<pre><code>export VAULT_TOKEN=hvs.bY28dn6cKyp6JCvPLTV3Eufb<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Terraform.<\/p>\n<pre><code>terraform init terraform apply<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0441\u0435\u043a\u0440\u0435\u0442 \u0438\u0437 CLI. <\/p>\n<pre><code>$ vault kv put secret\/postgres POSTGRES_USER=admin POSTGRES_PASSWORD=123456 ==== Secret Path ==== secret\/data\/postgres  ======= Metadata ======= Key                Value ---                ----- created_time       2023-06-13T04:02:53.164920751Z custom_metadata    &lt;nil> deletion_time      n\/a destroyed          false version            1 <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e Secret Path \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00a0<code>secret\/data\/postgres<\/code> \u0441 <code>data<\/code> , \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f KV \u0432\u0435\u0440\u0441\u0438\u0438 2. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 Secret Path \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 <code>external-secret.yaml<\/code>. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/db4\/7b3\/a1b\/db47b3a1b7b62a93898faaac3d9375d0.png\" width=\"974\" height=\"641\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/db4\/7b3\/a1b\/db47b3a1b7b62a93898faaac3d9375d0.png\"\/><\/figure>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 role-id \u0438 secret-id \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code>terraform output role_id terraform output secret_id<\/code><\/pre>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c AppRole \u0432 Vault \u0438\u0437 CLI, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435\u00a0<a href=\"https:\/\/github.com\/patsevanton\/vault-external-secrets-operator\/blob\/main\/vault-resource\/create-approle-vault-cli.md\">create-approle-vault-cli.md<\/a><\/p>\n<\/blockquote>\n<h2>\u0428\u0430\u0433 4: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c External Secrets Operator<\/h2>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c helm repo External Secrets Operator.<\/p>\n<pre><code>helm repo add external-secrets https:\/\/charts.external-secrets.io<\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c External Secrets Operator.<\/p>\n<pre><code>helm install external-secrets \\ external-secrets\/external-secrets \\     --wait \\     -n external-secrets \\     --create-namespace \\     --version 0.8.3 \\     --set installCRDs=true<\/code><\/pre>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c external-secrets.<\/p>\n<ul>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u00a0<code>role_id<\/code>\u00a0\u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<code>external-secrets\/secret-store.yaml<\/code>\u00a0\u0432 \u043f\u043e\u043b\u0435\u00a0<code>roleId<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u00a0<code>secret_id<\/code>\u00a0\u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<code>external-secrets\/vault-secret.yaml<\/code>\u00a0\u0432 \u043f\u043e\u043b\u0435\u00a0<code>secret-id<\/code>. \u0424\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>external-secrets<\/code> \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c yaml \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>external-secrets.<\/code><\/p>\n<pre><code>kubectl apply -f external-secrets\/vault-secret.yaml kubectl apply -f external-secrets\/secret-store.yaml kubectl apply -f external-secrets\/external-secret.yaml<\/code><\/pre>\n<p>\u0414\u0435\u0431\u0430\u0433: <code>ClusterSecretStor<\/code>e c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>vault-backend<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c <code>CAPABILITIES - ReadWrite<\/code>.<\/p>\n<pre><code>$ kubectl get ClusterSecretStore vault-backend NAME            AGE     STATUS   CAPABILITIES   READY vault-backend   3m19s   Valid    ReadWrite      True<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 <code>ExternalSecret<\/code> \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 <code>SecretSyncedError<\/code>, \u0441\u043c\u043e\u0442\u0440\u0438\u043c <code>describe<\/code>.<\/p>\n<pre><code>$ kubectl get ExternalSecret -n external-secrets external-secret NAMESPACE          NAME              STORE           REFRESH INTERVAL   STATUS              READY external-secrets   external-secret   vault-backend   5s                 SecretSyncedError   False<\/code><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c <code>describe ExternalSecret<\/code>.<\/p>\n<pre><code>kubectl describe ExternalSecret -n external-secrets external-secret<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443\u00a0permission denied, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0443\u0442\u0438.<\/p>\n<pre><code>Code: 403. Errors:  * 1 error occurred:   * permission denied<\/code><\/pre>\n<h2>\u0428\u0430\u0433 5: \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c AppRole, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Vault CLI<\/h2>\n<p>\u0412\u0445\u043e\u0434\u0438\u043c \u0432 Vault, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f\u00a0<code>role_id<\/code>\u00a0\u0438\u00a0<code>secret_id<\/code><\/p>\n<pre><code>$ vault write auth\/approle\/login role_id=\"\" secret_id=\"\" Key                     Value ---                     ----- token                   hvs.CAESILZuXjEGHKTTUD7WjNKDXijGSDLrWTWvE6xzB6O2BXrxGh4KHGh2cy5tZEZhNFVIODdhUktjRDViQVFaUmswc20 token_accessor          tNDR6kn0R3rM1idryFOkSBmi token_duration          768h token_renewable         true token_policies          [\"default\" \"read-policy\"] identity_policies       [] policies                [\"default\" \"read-policy\"] token_meta_role_name    data <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432.<\/p>\n<pre><code>vault kv list secret<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0435\u043a\u0440\u0435\u0442.<\/p>\n<pre><code>vault kv get secret\/postgres<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u043e \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0435\u0439.<\/p>\n<pre><code class=\"go\">resource \"vault_policy\" \"secret-read-policy\" {   name = \"read-policy\"    policy = &lt;&lt;EOT path \"*\" {   capabilities = [\"read\", \"list\"] } EOT } <\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 HashiCorp Vault\u00a0 \u0432 Kubernetes \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f external-secrets-operator. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438.<\/p>\n<p>External Secrets Operator \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 Custom Resources, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0432 Kubernetes \u0442\u0430\u043a, \u043a\u0430\u043a \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0430\u0448\u0438\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c.<\/p>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h2>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/tiwarisanjay\/external-secrets-operator\">\u041a\u043e\u0434 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 external-secrets-operator<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/tiwarisanjay\/argocd-everything\/blob\/main\/argocd-ha-vault-sso\/README.md\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 AppRole \u0432 Vault<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/companies\/magnit\/articles\/745814\/\"> https:\/\/habr.com\/ru\/companies\/magnit\/articles\/745814\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u043a\u0443\u0431\u043e\u043c, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b&#8230;<\/em><\/p>\n<p>\u0411\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0445\u0440\u0430\u043d\u044f\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043b\u044e\u0447\u0438, \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0438\u043b\u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 Gitlab. \u0412 Kubernetes \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u043e\u043c\u0443 \u043a\u0440\u0443\u0433\u0443 \u043b\u0438\u0446, \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0441\u0435\u043a\u0440\u0435\u0442\u044b. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kubernetes, \u0442\u0430\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configmap-secret\/managing-secret-using-kubectl\/\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c kubectl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configmap-secret\/managing-secret-using-config-file\/\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configmap-secret\/managing-secret-using-kustomize\/\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kustomize<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431: \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 HashiCorp Vault \u0432 Kubernetes.\u00a0\u041c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 HashiCorp Vault, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e:\u00a0<\/p>\n<ul>\n<li>\n<p>\u041e\u043d \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u0438.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043d\u0451\u043c \u043c\u043d\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ACL \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 HashiCorp Vault \u0432 Kubernetes \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u2013 \u0442\u0435\u043c\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 Vault \u0432 Kubernetes \u2013 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 AppRole, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f external-secrets-operator. <\/p>\n<blockquote>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 External Secrets Operator<\/strong><\/p>\n<p>External Secrets Operator \u2014 \u044d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 Kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a HashiCorp Vault \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u044b Kubernetes. <\/p>\n<\/blockquote>\n<p>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043f\u0440\u043e\u0439\u0434\u0451\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u0442\u0430\u043f\u0443.<\/p>\n<h2>\u0428\u0430\u0433 1: \u0421\u043e\u0437\u0434\u0430\u0451\u043c Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f: \u043f\u0440\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441 \u043e\u0431\u043b\u0430\u043a\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Terragrunt \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/github.com\/patsevanton\/vault-external-secrets-operator\/blob\/main\/terragrunt-k8s\/create-k8s-by-terraform-in-yc.md\">\u0432 \u043c\u043e\u0451\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0430 GitHub<\/a>. <\/p>\n<h2>\u0428\u0430\u0433 2: \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c HashiCorp Vault<\/h2>\n<p><em>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 Hashicorp Vault, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b.<\/em><\/p>\n<pre><code>helm install vault oci:\/\/registry-1.docker.io\/bitnamicharts\/vault --version 0.2.1 -n vault --create-namespace<\/code><\/pre>\n<p>\u041d\u0430\u0447\u043d\u0451\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u0416\u0434\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 vault-server-0 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Running.<\/p>\n<pre><code>$ kubectl get pods --namespace \"vault\" -l app.kubernetes.io\/instance=vault NAME                              READY   STATUS    RESTARTS   AGE vault-injector-6f8fb5dcff-9zhgm   1\/1     Running   0          51s vault-server-0                    0\/1     Running   0          51s <\/code><\/pre>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u0449\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u044e\u0447\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/p>\n<pre><code>$ kubectl exec -ti vault-server-0 -n vault -- vault operator init Unseal Key 1: ircItR+\/QeLTsve4J3zqw9SPGhC5rDAuxZcz4jr8u4N\/ Unseal Key 2: T\/L9vkkm3+uo0H9XxADNAsr+YUCSPctnLC\/011S79AVg Unseal Key 3: gmSD+fb5A+4P7N3QLDtoLtzuiXnQuhE\/Y4uB1RTlRU6h Unseal Key 4: nMTwQQy81EPS8eS\/\/kNicnvE5botOc5jyjHVuuqGkva7 Unseal Key 5: 1roVdnVqvZnHroOijEZFMiueeGE1WF2WWRUWJ4MWCjyF  Initial Root Token: hvs.bY28dn6cKyp6JCvPLTV3Eufb<\/code><\/pre>\n<p>\u0412 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043b\u044e\u0447. \u0420\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 HashiCorp vault \u0441 \u043e\u0431\u0449\u0438\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430:<\/p>\n<pre><code>kubectl exec -ti vault-server-0 -n vault -- vault operator unseal # ... Unseal Key 1 kubectl exec -ti vault-server-0 -n vault -- vault operator unseal # ... Unseal Key 2 kubectl exec -ti vault-server-0 -n vault -- vault operator unseal # ... Unseal Key 3<\/code><\/pre>\n<p>\u0412 <u>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c<\/u> \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u044c\u0442\u0435 \u043f\u043e\u0440\u0442 8200 \u043e\u0442 HashiCorp Vault.<\/p>\n<h2>\u0428\u0430\u0433 3: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c AppRole<\/h2>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 HashiCorp Vault.<\/p>\n<pre><code>export VAULT_ADDR=http:\/\/127.0.0.1:8200<\/code><\/pre>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c AppRole \u0432 Vault \u0438\u0437 CLI \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 Terraform-\u043a\u043e\u0434. \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043c AppRole Vault \u0447\u0435\u0440\u0435\u0437 Terraform. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435\u00a0<code>setting-approle-vault.tf<\/code>\u00a0\u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"go\"># \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 engine kv \u0438\u0437 CLI. resource \"vault_mount\" \"kvv2-secret\" {   path        = \"secret\"   type        = \"kv\"   options     = { version = \"2\" }   description = \"KV Version 2 secret engine mount\" }  # \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 approle \u0438\u0437 CLI. resource \"vault_auth_backend\" \"approle\" {   type = \"approle\" }  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e \u043f\u0443\u0442\u0438 secret\/data\/postgres resource \"vault_policy\" \"secret-read-policy\" {   name = \"read-policy\"    policy = &lt;&lt;EOT path \"secret\/data\/postgres\" {   capabilities = [\"read\", \"list\"] } EOT }  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u043e\u043b\u044c \u0434\u043b\u044f approle. resource \"vault_approle_auth_backend_role\" \"secret\" {   backend        = vault_auth_backend.approle.path   role_name      = \"secret\"   token_policies = [\"read-policy\"] }  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 (secret_id) resource \"vault_approle_auth_backend_role_secret_id\" \"id\" {   backend   = vault_auth_backend.approle.path   role_name = vault_approle_auth_backend_role.secret.role_name }  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 id \u0440\u043e\u043b\u0438 approle (role_id) output \"role_id\" {   value     = vault_approle_auth_backend_role.secret.role_id   sensitive = true }  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 (secret_id) output \"secret_id\" {   value     = vault_approle_auth_backend_role_secret_id.id.secret_id   sensitive = true } <\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u00a0<a href=\"https:\/\/github.com\/patsevanton\/vault-external-secrets-operator\/blob\/main\/vault-resource\/create-approle-vault-cli.md\">setting-approle-vault.tf<\/a>\u00a0\u0435\u0441\u0442\u044c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 vault-resource. \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043a\u0435\u043d (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 root-\u0442\u043e\u043a\u0435\u043d).<\/p>\n<pre><code>export VAULT_TOKEN=hvs.bY28dn6cKyp6JCvPLTV3Eufb<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Terraform.<\/p>\n<pre><code>terraform init terraform apply<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0441\u0435\u043a\u0440\u0435\u0442 \u0438\u0437 CLI. <\/p>\n<pre><code>$ vault kv put secret\/postgres POSTGRES_USER=admin POSTGRES_PASSWORD=123456 ==== Secret Path ==== secret\/data\/postgres  ======= Metadata ======= Key                Value ---                ----- created_time       2023-06-13T04:02:53.164920751Z custom_metadata    &lt;nil> deletion_time      n\/a destroyed          false version            1 <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e Secret Path \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00a0<code>secret\/data\/postgres<\/code> \u0441 <code>data<\/code> , \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f KV \u0432\u0435\u0440\u0441\u0438\u0438 2. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 Secret Path \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 <code>external-secret.yaml<\/code>. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 role-id \u0438 secret-id \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code>terraform output role_id terraform output secret_id<\/code><\/pre>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c AppRole \u0432 Vault \u0438\u0437 CLI, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435\u00a0<a href=\"https:\/\/github.com\/patsevanton\/vault-external-secrets-operator\/blob\/main\/vault-resource\/create-approle-vault-cli.md\">create-approle-vault-cli.md<\/a><\/p>\n<\/blockquote>\n<h2>\u0428\u0430\u0433 4: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c External Secrets Operator<\/h2>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c helm repo External Secrets Operator.<\/p>\n<pre><code>helm repo add external-secrets https:\/\/charts.external-secrets.io<\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c External Secrets Operator.<\/p>\n<pre><code>helm install external-secrets \\ external-secrets\/external-secrets \\     --wait \\     -n external-secrets \\     --create-namespace \\     --version 0.8.3 \\     --set installCRDs=true<\/code><\/pre>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c external-secrets.<\/p>\n<ul>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u00a0<code>role_id<\/code>\u00a0\u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<code>external-secrets\/secret-store.yaml<\/code>\u00a0\u0432 \u043f\u043e\u043b\u0435\u00a0<code>roleId<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u00a0<code>secret_id<\/code>\u00a0\u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<code>external-secrets\/vault-secret.yaml<\/code>\u00a0\u0432 \u043f\u043e\u043b\u0435\u00a0<code>secret-id<\/code>. \u0424\u0430\u0439\u043b\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>external-secrets<\/code> \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c yaml \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>external-secrets.<\/code><\/p>\n<pre><code>kubectl apply -f external-secrets\/vault-secret.yaml kubectl apply -f external-secrets\/secret-store.yaml kubectl apply -f external-secrets\/external-secret.yaml<\/code><\/pre>\n<p>\u0414\u0435\u0431\u0430\u0433: <code>ClusterSecretStor<\/code>e c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>vault-backend<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c <code>CAPABILITIES - ReadWrite<\/code>.<\/p>\n<pre><code>$ kubectl get ClusterSecretStore vault-backend NAME            AGE     STATUS   CAPABILITIES   READY vault-backend   3m19s   Valid    ReadWrite      True<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 <code>ExternalSecret<\/code> \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 <code>SecretSyncedError<\/code>, \u0441\u043c\u043e\u0442\u0440\u0438\u043c <code>describe<\/code>.<\/p>\n<pre><code>$ kubectl get ExternalSecret -n external-secrets external-secret NAMESPACE          NAME              STORE           REFRESH INTERVAL   STATUS              READY external-secrets   external-secret   vault-backend   5s                 SecretSyncedError   False<\/code><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c <code>describe ExternalSecret<\/code>.<\/p>\n<pre><code>kubectl describe ExternalSecret -n external-secrets external-secret<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443\u00a0permission denied, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0443\u0442\u0438.<\/p>\n<pre><code>Code: 403. Errors:  * 1 error occurred:   * permission denied<\/code><\/pre>\n<h2>\u0428\u0430\u0433 5: \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c AppRole, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Vault CLI<\/h2>\n<p>\u0412\u0445\u043e\u0434\u0438\u043c \u0432 Vault, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f\u00a0<code>role_id<\/code>\u00a0\u0438\u00a0<code>secret_id<\/code><\/p>\n<pre><code>$ vault write auth\/approle\/login role_id=\"\" secret_id=\"\" Key                     Value ---                     ----- token                   hvs.CAESILZuXjEGHKTTUD7WjNKDXijGSDLrWTWvE6xzB6O2BXrxGh4KHGh2cy5tZEZhNFVIODdhUktjRDViQVFaUmswc20 token_accessor          tNDR6kn0R3rM1idryFOkSBmi token_duration          768h token_renewable         true token_policies          [\"default\" \"read-policy\"] identity_policies       [] policies                [\"default\" \"read-policy\"] token_meta_role_name    data <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432.<\/p>\n<pre><code>vault kv list secret<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0435\u043a\u0440\u0435\u0442.<\/p>\n<pre><code>vault kv get secret\/postgres<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0442\u043e \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0435\u0439.<\/p>\n<pre><code class=\"go\">resource \"vault_policy\" \"secret-read-policy\" {   name = \"read-policy\"    policy = &lt;&lt;EOT path \"*\" {   capabilities = [\"read\", \"list\"] } EOT } <\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 HashiCorp Vault\u00a0 \u0432 Kubernetes \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f external-secrets-operator. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438.<\/p>\n<p>External Secrets Operator \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 Custom Resources, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0432 Kubernetes \u0442\u0430\u043a, \u043a\u0430\u043a \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0430\u0448\u0438\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c.<\/p>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h2>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/tiwarisanjay\/external-secrets-operator\">\u041a\u043e\u0434 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 external-secrets-operator<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/tiwarisanjay\/argocd-everything\/blob\/main\/argocd-ha-vault-sso\/README.md\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 AppRole \u0432 Vault<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/companies\/magnit\/articles\/745814\/\"> https:\/\/habr.com\/ru\/companies\/magnit\/articles\/745814\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-349781","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/349781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=349781"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/349781\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=349781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=349781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=349781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}