この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ECSコンテナ内への機密情報(DB接続情報など)の受け渡しが非常に簡単になりました!!
なるほどなるほど。。
ではKubernetesの場合どうやって機密情報を受け渡せば良いの??そんな思いが込み上げてきたのでKubernetesでの機密情報の受け渡しについて調べてみました。
機密情報の受け渡しにはSecretリソースを使おう
Kubernetesで機密情報を管理するにはSecretリソースを利用します。Secretリソースを利用することで機密情報をより安全に扱うことができます。 Podから機密情報を取得するまでのフローは以下のようになります。
- kubectlを使用しSecretを作成する(機密情報はMasterのetcd(KVS)に保持されます)
- PodからSecretを読み込む
簡単ですね。 Secretを作成する方法はいくつかありますが、今回は「定義ファイルから作成する」方法を試してみようと思います。また、PodのSecretの読み込みに関しても同様にいくつか方法はありますが、「環境変数として読み込む」方法を試してみようと思います。
実行環境
- Docker for Mac:Version 18.06.1-ce-mac73
- Kubernetes:v1.10.3
kubectlを使用しSecretを作成する
機密情報としてusername
、password
をPodに引き渡すことにします。
username
、password
の値であるadmin
やP@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などのソフトウェアで機密情報を暗号化することをオススメします。