ヘルムの秘密-Kubernetesの欠萜郚分





この蚘事では、BaseCRM Kubernetesむンフラストラクチャでシヌクレットを管理する方法に぀いお説明したす。







私たちの目暙は、最小限の劎力でBaseCRM KubernetesクラスタヌでHelm Chartsを䜿甚するこずです。これには、パラメヌタヌ倀ずシヌクレットの管理のみが含たれたす。 HelmたたはKubernetesには公匏の秘密管理ツヌルがないため、修正するこずにしたした。







はじめに



Kubernetesは、Googleによっお開発されたプラットフォヌムであり、クラスタヌ内のコンテナ化されたアプリケヌションの展開ずスケヌリングを自動化するためのコミュニティサポヌトが充実しおいたす。 これは、次䞖代のPaaSむンフラストラクチャを構築するために蚭蚈された、ポヌタブルで信頌性の高い自己修埩システムです。







Kubernetesに加えお、Kubernetesの公匏パッケヌゞマネヌゞャヌであるHelmを䜿甚したす。 Charts察応のテンプレヌトシステムにより、Kubernetesで実行されおいるさたざたな皮類のアプリケヌションの管理に圹立ちたす。







Helm Chartsは、Kubernetesクラスタヌ内の再利甚可胜なアプリケヌションテンプレヌト耇数のサブチャヌトを持぀最も耇雑なテンプレヌトを含むを識別、むンストヌル、および曎新するために必芁です。 Helm Chartsを䜿甚するず、耇数のバヌゞョンのチャヌトを簡単に管理できるだけでなく、盎接的なマニフェストを䜿甚しおそれらを停止できたす。







Helmを䜿甚するず、耇数のクラスタヌでのKubernetes PaaS展開での再利甚に適した耇雑なアプリケヌションチャヌトでチャヌトテンプレヌトの䞀郚を䜿甚できたす。 CI / CDを䜿甚するず、Kubernetesクラスタヌにアプリケヌションスタックを簡単に展開したり、Helmを手動で起動しお党䞖界をれロから展開したりできたす。







どのような問題を解決しようずしおいたすか



むンフラストラクチャセキュリティには、パスワヌドずアクセストヌクンが必芁です。 同時に、明確なルヌルに埓っおむンフラストラクチャに簡単にアクセスし、分散する必芁がありたす。 たた、倉曎のロギング、シヌクレットのバヌゞョン管理、ロギング、さらにはシヌクレットの倀の倉曎に関する譊告でさえ干枉したせん。 同時に、Kubernetesクラスタヌを再䜜成できるようにしたいのですが、倉曎する必芁のない資栌情報がありたす。







耇数のコピヌ、暗号化されおいないディスク、シヌクレットのロヌテヌションで問題が発生する䞀方で、VPNのGitにシヌクレットを保持する人もいたす。 他の人はそれらをクラスタに盎接登録し、䜕かが起こったずきにこのデヌタをクラスタで倱いたす。







䞀方、Kubernetesを秘密のリポゞトリであるHashicorp Vaultサヌビスず統合するこずは可胜です。 この堎合、クラスタヌはKubernetesシヌクレットの受信時にこのサヌビスを参照したす。







Vaultサヌビスを䜿甚せずにKubernetesクラスタヌにアプリケヌションをデプロむしたす。これは、セキュリティ䞊の理由からKubernetesクラスタヌの䞀郚であっおはなりたせん。 Vaultむンフラストラクチャを必芁ずせずに、ロヌカルで䜜業し、アむドル実行を実行する機胜が必芁です。







これをどうやっおやるの



Baseの基瀎から、私たちはAnsibleを䜿甚しおいたす。 たた、Helmを䜿甚しおKubernetesクラスタヌを展開するこずも決定したしたこのトピックはおそらく別の蚘事に倀するでしょう。 秘密の管理の問題に盎面しお、Ansible vaultによく䌌たhelm-secretsプラグむンを思い぀きたした。 圓時、私たちはPGPを䜿甚しお、秘密ファむル党䜓を暗号化したした。







それは単玔な決定でしたが、最初から最終的なものではないこずは明らかでした。 すぐに、各YAMLシヌクレットの個別管理に切り替えるこずにしたした。







たず、芁件のリストを䜜成し、芁件を満たすツヌルを怜玢したした。 Mozilla SOPSを芋぀けるこずができたした 。この機胜は、プラグむンの秘密管理システムのバック゚ンドずしお適切でした。







残されたのは、ヘルムシヌクレットの最初のバヌゞョンを䜿甚しお、SOPSバック゚ンドずHelmフロント゚ンドの間にシンプルなレむダヌを曞くこずだけでした。







これはたさに私たちがやったこずであり、同時に私たちの仕事の結果を公衆ず共有するこずを決定したした。 helm-secretsプラグむンのリリヌスをご芧ください 。







以䞋にその機胜のリストを瀺したすここにリストされおいるよりもさらに倚くの機胜がありたす。









システムはCI / CDのフレヌムワヌク内で機胜し、Gitリポゞトリの特定のサブディレクトリぞの隔離されたアクセスを持぀耇数の開発チヌムにサヌビスを提䟛したす。 異なるKMSキヌずPGPマスタヌキヌを予備ずしお䜿甚しお、秘密を暗号化したす。







タスクの実行を自動化および高速化するために、Makefileは内郚チャヌトリポゞトリで䜿甚されたす。










仕組み



ヘルムのむンストヌル



ヘルムプロゞェクトペヌゞの指瀺に埓いたす 。







helm-secretsプラグむンのむンストヌル



helm plugin install https://github.com/futuresimple/helm-secrets
      
      





䜿甚䟋



helm-secretsリポゞトリは、このプラグむンの䜿甚䟋ず、ヘルムチャヌト倀を保存するための察応するディレクトリ構造を提䟛したす。 kubernetesチャヌトも同様の構造をしおいたす。







この䟋では、helm-secretsリポゞトリヌのtest.sh



ファむルが䜿甚されたす。







 example/helm_vars/ ├── .sops.yaml ├── projectX │ ├── .sops.yaml │ ├── production │ │ └── us-east-1 │ │ └── java-app │ │ ├── secrets.yaml │ │ └── value.yaml │ └── sandbox │ └── us-east-1 │ └── java-app │ ├── secrets.yaml │ └── value.yaml ├── projectY │ ├── .sops.yaml │ ├── production │ │ └── us-east-1 │ │ └── java-app │ │ ├── secrets.yaml │ │ └── value.yaml │ └── sandbox │ └── us-east-1 │ └── java-app │ ├── secrets.yaml │ └── value.yaml ├── secrets.yaml └── values.yaml
      
      





この䟋を芋おみたしょう。









暗号化、埩号化など



暗号化前の䟋/ helm_vars / secrets.yaml







 global_secret: global_bar
      
      





暗号化







 helm-wrapper secrets enc example/helm_vars/secrets.yaml
      
      





その結果、暗号化されおいないキヌず暗号化された倀を持぀ファむルを取埗したす。







キヌを含むセクションの埌には、秘密の構造を暗号化たたは埩号化するために必芁なsopsデヌタがありたす。







sopsバヌゞョン、lastmodifiedたたはunencrypted_suffixなどのメタデヌタもありたす。 Mozilla SOPSプロゞェクトのWebサむトで sopsファむル圢匏に぀いお読むこずができたす。







 global_secret: ENC[AES256_GCM,data:pTyPdC6YA+z84Q==,iv:aF5hb9CS8Au0B3RWADPtP8fXYzYakU7JJ8ZxzJgHRF0=,tag:c3pCyOf0NpQU7VPL/72XPg==,type:str] sops: .
 
. 
. unencrypted_suffix: _unencrypted version: 2.0.9
      
      





今埩号化







 helm-wrapper secrets dec example/helm_vars/secrets.yaml
      
      





そしお結果







 global_secret: global_bar
      
      





これで、たずえば、耇数の秘密ファむルでキヌを怜玢する堎合など、埩号化せずにそのようなファむルを操䜜できたす。 git diff configを䜿甚しおそれらを即座に埩号化するこずもできたす。これにより、特にこの機胜をサポヌトしおいないアプリケヌションず比范しお、䜜業がさらに快適になりたす。







たた、より高床なAWS KMSのおかげで、シヌクレットのアクセス蚱可をより柔軟に管理できたす。







さらに、単玔なプラグむンコマンドを䜿甚しおシヌクレットを衚瀺および線集するず、毎日の䜜業が簡単になりたす。







 helm-wrapper secrets view example/helm_vars/secrets.yaml
      
      





埩号化埌、秘密ファむルは暙準出力に衚瀺されたす。







 helm-wrapper secrets edit example/helm_vars/secrets.yaml
      
      





edit



コマンドで、埩号化されたファむルが゚ディタヌで開き、倉曎が暗号化された圢匏で自動的に保存されたす。







これらの機胜は、ほずんどすべおのシナリオで暗号化されたデヌタの凊理を倧幅に促進したす。







ヘルムの䟋



Kubernetesクラスタヌに䜕かをデプロむしたしょう。







プロセスを簡玠化し、より透明にするために、ヘルムラッパヌを䜜成したした。 このヘルム甚のbashで䜜成されたバむンディングは、指定されたすべおのシヌクレットを自動的に埩号化し、埩号化されたデヌタを䜿甚しおヘルムを䜿甚した展開手順を完了したす。 ゚ラヌが発生した堎合、たたは手順が正垞に完了した堎合、シヌクレットを含むすべおの䞀時デヌタが削陀されたす。







helloworldのようなアプリケヌションの実際の䟋







 AWS_PROFILE=production helm-secrets upgrade --install --timeout 600 --wait helloworld stable/java-app --kube-context=production --namespace=projectx --set global.app_version=bff8fc4 -f helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml -f helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/values.yaml -f helm_vars/secrets.yaml -f helm_vars/values.yaml >>>>>> Decrypt Decrypting helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml >>>>>> Decrypt Decrypting helm_vars/secrets.yaml Release "helloworld" has been upgraded. Happy Helming! LAST DEPLOYED: Fri May 5 13:27:01 2017 NAMESPACE: projectx STATUS: DEPLOYED RESOURCES: ==> extensions/v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE helloworld 3 3 3 2 1h ==> v1/Secret NAME TYPE DATA AGE helloworld Opaque 10 1h ==> v1/ConfigMap NAME DATA AGE helloworld 2 1h ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE helloworld 100.65.221.245 8080/TCP 1h NOTES: Deploy success helloworld-bff8fc4 in namespace projectx >>>>>> Cleanup helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml.dec helm_vars/secrets.yaml.dec
      
      





リストからわかるように、CI偎で実行しおアプリケヌションをデプロむする特別なチヌムがありたす。 この䟋では、Javaアプリケヌション甚の内郚ナニバヌサルチャヌトを䜿甚したす。これには、構成マップ、シヌクレット、サヌビス、およびデプロむメントのテンプレヌトが含たれおいたす。







これはすべお、helmコマンドの-fオプションを䜿甚しお指定されたファむルの倀から生成されたす。 暗号化されたシヌクレットがそのようなファむルで芋぀かった堎合、スクリプトはその堎で暗号化を解陀し、ヘルムは䜕も認識したせん。







AWS KMSを䜿甚する堎合、AWS_PROFILEずいう名前を指定する必芁がありたす。







゚ラヌが発生した堎合、クリヌニングが実行されたす。







 AWS_PROFILE=production helm-wrapper upgrade --install --timeout 600 --wait helloworld stable/java-app --kube-context=wrongcontext --namespace=projectx --set global.app_version=bff8fc4 -f helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml -f helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/values.yaml -f helm_vars/secrets.yaml -f helm_vars/values.yaml >>>>>> Decrypt Decrypting helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml >>>>>> Decrypt Decrypting helm_vars/secrets.yaml Error: could not get kubernetes config for context 'wrongcontext': context "wrongcontext" does not exist >>>>>> Cleanup helm_vars/projectx/sandbox/us-east-1/java-app/helloworld/secrets.yaml.dec helm_vars/secrets.yaml.dec
      
      





このアプロヌチは、秘密を実際に䜿甚する堎合、最高レベルのセキュリティを維持しながら劎力を最小限に抑えたす。







gitで安党に䜿甚する



シヌクレットを埩号化した堎合手動で埩号化した堎合、ただ2぀のレベルのセキュリティがありたす.gitignoreを䜿甚した埩号化ファむルの陀倖ず、コミットファむルがSOPSを䜿甚しお暗号化されおいるかどうかを確認するフックの远加







これはすべお、ヘルムシヌクレットドキュメントにも含たれおおり、CI / CDプロセスによっお怜蚌されたす。







おわりに



Helm-secretsは、SOPSバック゚ンドの単なるラッパヌであり、このプラグむンのコマンドは他のツヌルに眮き換えるこずができたす。







たた、このプラグむンを䜿甚しお、公開gitリポゞトリを介しおシヌクレットを配垃し、Kubernetesに統合されたVaultingサヌビスをシヌクレットの凊理プロセスに远加しお、゜リュヌションを完成させたす。







小芏暡なむンフラストラクチャの堎合、helm-secretsプラグむンで十分です。 ぜひお楜しみください。







プロゞェクトに機胜を远加するか、単に議論する堎合は、 https//github.com/futuresimple/helm-secretsにアクセスしおください 。







参照







  1. 原文 HELM SECRETS-A MISSING PIECE IN KUBERNETES 。



All Articles