[Hi, I'm Brendan Burns from Microsoft Azure.

I'm going to talk about secrets management in Kubernetes.

Obviously, with Kubernetes, the fundamental unit of an application is a pod, that pod has multiple containers inside of it.

But what happens when one of those containers needs access to a secret? Well, a secret could be something like a password to a database.

Or it could be a certificate needed for accessing an API or for serving an application out onto the web.

Fortunately, Kubernetes actually has built-in secrets management.

So you can actually declare a secrets resource, and a secret inside of Kubernetes is actually a collection of key-value pairs, and you can actually have multiple key-value pairs within the context of a particular secret.

You can also use the value here as the contents of a file.

So in some contexts, the key-value pair might be something like DB password is foo, that's not my real database password so don't try and use it.

Or it might be cert, and this would be the contents of a file.

All right.

So now how do we join these two things together? Well, we take a secret and place it into a pod using a volume.

So you can actually declare secret volume in the list of volumes that are part of the pod and then say, "Hey, you know what, I want to mount this volume into a particular path" say/certs within the context of that container.

So that way, if you have something like the Nginx web server, it can look into this certs directory, find the certificates that it needs in order to serve your applications securely.

Likewise, you can also mount a secret in as in environment variable.

So that in your code, you might say something like getenv("DB_password").

So that you can load the database password from an environment variable that's present in the context of your pod.

So depending on how you want to use that secret, you can choose whether you want to represent it as a file or represent it as an environment variable.

Now, when we're thinking about secrets, one thing to note is that the contents of the secret itself are stored in the Kubernetes as etcd in an unencrypted form.

Which means that every single person who has access to the etcd potentially has access to your secrets.

Obviously, this is something that is of concern to some people, especially if you have a high security situation where you want to be very careful with the handling of your secrets.

So lately what is has been developed in Kubernetes is key management story integration so that you can actually supply a key to do encryption into that etcd database.

So you can actually have your Kubernetes API server with integration with a key management store, like for example Azure Key Vault or HashiCorp vault, or any number of key management stores.

It'll actually take a key from that key management store and encrypt your secrets before they're stored into the etcd.

This means that even if somebody gains access to the data store behind the etcd, they're encrypted with the key that you have here, and obviously you're going to have access control here to limit the number of people who have access to that key.

It is worth noting, of course, though that anyone who has access to the Kubernetes API, may potentially be able to also access those secrets.

So you clearly want to be using resource-based access control on the Kubernetes API as well to ensure that only the right people have access to the secrets that you're placing inside the context of Kubernetes.

Although, that gives you an idea of how to manage secrets for your applications, and obviously, it's a best practice to use these Secrets and not store those credentials in your docker image, source control, or anything else.

So learn up on it and use it to securely deploy secrets to your applications.


안녕하세요, 저는 Microsoft Azure의 Brendan Burns입니다.

Kubernetes의 비밀 관리에 대해 이야기하겠습니다.

분명히 Kubernetes에서 애플리케이션의 기본 단위는 pod이며, 그 pod에는 내부에 여러 컨테이너가 있습니다.

하지만 이러한 컨테이너 중 하나가 비밀에 액세스해야하는 경우 어떻게됩니까? 음, 비밀은 데이터베이스에 대한 암호와 같은 것일 수 있습니다.

또는 API에 액세스하거나 웹에서 애플리케이션을 제공하는 데 필요한 인증서 일 수 있습니다.

다행히 Kubernetes에는 실제로 기본 제공 비밀 관리 기능이 있습니다.

따라서 실제로 비밀 리소스를 선언 할 수 있으며 Kubernetes 내부의 비밀은 실제로 키-값 쌍의 모음이며 실제로 특정 비밀의 컨텍스트 내에 여러 키-값 쌍을 가질 수 있습니다.

여기에서 값을 파일의 내용으로 사용할 수도 있습니다.

따라서 일부 컨텍스트에서 키-값 쌍은 DB 암호가 foo와 같은 것일 수 있습니다. 이것은 제 실제 데이터베이스 암호가 아니므로 시도하고 사용하지 마십시오.

또는 cert 일 수 있으며 이것은 파일의 내용입니다.

괜찮아.

이제이 두 가지를 어떻게 결합할까요? 음, 우리는 비밀을 가져와 볼륨을 사용하여 포드에 넣습니다.

따라서 실제로 포드의 일부인 볼륨 목록에서 비밀 볼륨을 선언 한 다음 "이 볼륨을 특정 경로에 마운트하고 싶습니다"라고 말할 수 있습니다. 해당 컨테이너 컨텍스트 내에서 say / certs.

이렇게하면 Nginx 웹 서버와 같은 것이있는 경우이 certs 디렉토리를 살펴보고 애플리케이션을 안전하게 제공하는 데 필요한 인증서를 찾을 수 있습니다.

마찬가지로 환경 변수 에서처럼 비밀을 마운트 할 수도 있습니다.

따라서 코드에서 getenv ( "DB_password")와 같이 말할 수 있습니다.

따라서 포드 컨텍스트에있는 환경 변수에서 데이터베이스 비밀번호를로드 할 수 있습니다.

따라서 해당 비밀을 사용하려는 방법에 따라 파일로 표시할지 환경 변수로 표시할지 여부를 선택할 수 있습니다.

이제 비밀에 대해 생각할 때 한 가지 주목할 점은 비밀 자체의 내용이 암호화되지 않은 형태의 etcd로 Kubernetes에 저장된다는 것입니다.

즉, etcd에 액세스 할 수있는 모든 사람은 잠재적으로 귀하의 비밀에 액세스 할 수 있습니다.

분명히 이것은 일부 사람들에게 우려되는 사항입니다. 특히 비밀을 다루는 데 매우 조심해야하는 높은 보안 상황이있는 경우 더욱 그렇습니다.

그래서 최근에 Kubernetes에서 개발 된 것은 키 관리 스토리 통합이므로 실제로 해당 etcd 데이터베이스에 암호화를 수행하는 키를 제공 할 수 있습니다.

따라서 실제로 Kubernetes API 서버를 키 관리 저장소 (예 : Azure Key Vault 또는 HashiCorp 저장소 또는 여러 키 관리 저장소)와 통합 할 수 있습니다.

실제로 해당 키 관리 저장소에서 키를 가져와 etcd에 저장되기 전에 비밀을 암호화합니다.

즉, 누군가 etcd 뒤에있는 데이터 저장소에 대한 액세스 권한을 얻더라도 여기에있는 키로 암호화되고 분명히 여기에 액세스 권한을 가진 사람의 수를 제한 할 수 있습니다. 키.

물론 Kubernetes API에 액세스 할 수있는 모든 사람이 잠재적으로 이러한 비밀에 액세스 할 수 있다는 점은 주목할 가치가 있습니다.

따라서 Kubernetes API에서 리소스 기반 액세스 제어를 사용하여 올바른 사람 만 Kubernetes 컨텍스트 내에 배치하는 비밀에 액세스 할 수 있도록해야합니다.

이는 애플리케이션의 비밀을 관리하는 방법에 대한 아이디어를 제공하지만 분명히 이러한 비밀을 사용하고 해당 자격 증명을 도커 이미지, 소스 제어 또는 다른 것에 저장하지 않는 것이 좋습니다.

따라서 그것에 대해 배우고이를 사용하여 애플리케이션에 비밀을 안전하게 배포하십시오.

  • No labels
Write a comment…