KubernetesのPodに機密情報を受け渡してみる

2018.11.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ECSでごっつ簡単に機密情報を環境変数に展開できるようになりました!

ECSコンテナ内への機密情報(DB接続情報など)の受け渡しが非常に簡単になりました!!

なるほどなるほど。。

ではKubernetesの場合どうやって機密情報を受け渡せば良いの??そんな思いが込み上げてきたのでKubernetesでの機密情報の受け渡しについて調べてみました。

機密情報の受け渡しにはSecretリソースを使おう

Kubernetesで機密情報を管理するにはSecretリソースを利用します。Secretリソースを利用することで機密情報をより安全に扱うことができます。 Podから機密情報を取得するまでのフローは以下のようになります。

  1. kubectlを使用しSecretを作成する(機密情報はMasterのetcd(KVS)に保持されます)
  2. PodからSecretを読み込む

簡単ですね。 Secretを作成する方法はいくつかありますが、今回は「定義ファイルから作成する」方法を試してみようと思います。また、PodのSecretの読み込みに関しても同様にいくつか方法はありますが、「環境変数として読み込む」方法を試してみようと思います。

実行環境

  • Docker for Mac:Version 18.06.1-ce-mac73
  • Kubernetes:v1.10.3

kubectlを使用しSecretを作成する

機密情報としてusernamepasswordをPodに引き渡すことにします。 usernamepasswordの値であるadminP@ssw0rdは、そのままの状態ではなくbase64でエンコードした状態で定義ファイルに記載します。

$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n 'P@ssw0rd' | base64
UEBzc3cwcmQ=

エンコードした値を定義ファイルに記載します。

secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: UEBzc3cwcmQ=

次に定義ファイルを元にSecretリソースを作成し、登録された情報を確認してみます。

$ kubectl create -f ./secret.yaml
secret/mysecret created

$ kubectl get secrets mysecret -o yaml
apiVersion: v1
data:
  password: UEBzc3cwcmQ=
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: 2018-11-23T07:47:11Z
  name: mysecret
  namespace: default
  resourceVersion: "902527"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: fc841b26-eef3-11e8-9146-025000000001
type: Opaque

Secretリソースが登録されました。

PodからSecretを読み込む

Secretを環境変数で読み込むためのPodの定義ファイルを作成します。

sample-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: nginx-container
      image: nginx:1.14
      env:
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: username
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: password

この定義ファイルを利用しPodを作成します。

$ kubectl apply -f sample-pod.yaml
pod/sample-pod created

Podに接続し環境変数が読み込めているか確認してみましょう!

$kubectl exec -it sample-pod env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=sample-pod
SECRET_USERNAME=admin
SECRET_PASSWORD=P@ssw0rd
・・・・

ちゃんと機密情報を受け渡せました!!

あとがき

Secretリソースを使うことでPodに機密情報を受け渡すことができました。ただyamlファイル自体の機密情報はbase64でエンコードされているだけなので十分注意して扱う必要があります。 yamlファイルをリポジトリ管理する場合はkubesecなどのソフトウェアで機密情報を暗号化することをオススメします。