KubernetesのSecretでMySQLのパスワードを管理する

2019年4月28日

KubernetesにおけるSecretとはパスワードやSSHの秘密鍵などの機密情報を扱うためのリソースです。同じような機能を持つリソースとしてConfigMapリソースがありますが、こちらは一般的にアプリの設定情報などを保存する場合などに利用します。

 

アプリのPod等を作成するマニフェストファイルに、設定値やパスワードなどを直接記述することも可能ですが、SecretやConfigMapを利用して分離させることでセキュリティー対策や効率的な管理をおこないやすくなります。

 

Secret自体は、GenericTLSDocker RegistryService Accountといった分類に別れており、本記事で説明するMySQLのパスワードなどの一般的な秘密情報はGenericを利用します。

 

GenericタイプのSecretを作成する方法は4つです。

・kubectlでファイルから参照 –from-file
・kubectlでenvfileから値を参照 –from-env-file
・kubectlで直接値を渡す –from-literal
・マニフェストファイルを利用

(『Kubernetes完全ガイド』Ingress 青山真也 著 p.204-205からの引用・参照)

 

本記事ではマニフェストファイルから作成したSecretを利用して、MySQLのパスワードを管理してみます。

 

大まかな流れは以下の通りです。

パスワードなどの文字列をBase64でエンコードする。
Secretのマニフェストファイルを作成しデプロイする。
MySQLコンテナ作成用のマニフェストファイルにおいてSecretを利用する。

 

 

Base64でエンコード


 

まず利用するパスワードをBase64でエンコードしておきます。下記では、hogepassというパスワード文字列をエンコードしています。

下記のような文字列が出力されます。これをSecretのマニフェストファイルに設定します。

 

デコードは–decodeを付けます。

 

 

Secretのマニフェストファイル


 

次にSecretリソースによるマニフェストファイルを作成します。このマニフェストファイルは外部への流出に細心の注意を払う必要があります。結局Base64でエンコードした文字列は上述したようにデコードすることが可能で、暗号化ではないからです。暗号化に関しては「kubesec」というオープンソースのソフトを利用します(本記事では説明しません)。

 

secret.yaml

5行目
上述したGenericの場合は、typeにOpaqueを指定します。

 

7行目

上述したパスワードをBase64でエンコードした文字列を設定しています。

 

 

Secretを作成します。

 

作成したSecretを確認します。ただし設定した値は表示されません。

 

 

Secretを利用する


 

MySQLのコンテナをDeploymentリソースによって作成します。

14〜19行目

環境変数として、作成したSecret(名前はtest-secret)を渡しています。

 

コンテナ(Pod)を作成。

 

作成したPodを確認。

 

環境変数は下記のコマンドで確認できます。

もしくは直接MYSQL_ROOT_PASSWORDを指定。

 

実際にMySQLに接続できることを確認。

 

 

作成したSecretを削除。

 

作成したDeploymentの削除。

 

 

参照文献


 

 

 

LINEで送る
Pocket

Copyright © 2019 思考の葉 All Rights Reserved.  プライバシーポリシー