このセクションでは、Kubernetes の Secret を安全に管理するためのオープンソースソフトウェアである kubesec を使って、Secret の暗号化する方法を紹介します。Secret の yaml ファイルを Git などのリポジトリにそのままアップロードしてしまうと機密情報が漏れてしまいますが、機密情報を暗号化した状態でアップロードすれば漏れてしまうことを防ぐことができます。

kubesec のインストール

kubesec のパッケージをダウンロードし、/user/local/bin/kubesec に配置(インストール)します。

[root@kube-master manifest]# curl -o /usr/local/bin/kubesec -sL https://github.com/shyiko/kubesec/releases/download/0.9.2/kubesec-0.9.2-linux-amd64
[root@kube-master manifest]# 

/usr/local/bin/ ディレクトリを確認します。kubesec があることが確認できます。

[root@kube-master manifest]# ls -la /usr/local/bin/
合計 12616
drwxr-xr-x.  2 root root       21  2月  2 18:26 .
drwxr-xr-x. 12 root root      131  1月  5 07:52 ..
-rw-r--r--.  1 root root 12917404  2月  2 18:29 kubesec
[root@kube-master manifest]# 

kubesec ディレクトリのアクセス権限を変更します。

[root@kube-master manifest]# chmod +x /usr/local/bin/kubesec
[root@kube-master manifest]# 

/usr/local/bin/ ディレクトリを確認します。kubesec ディレクトリに対するアクセス権限が変更されていることが確認できます。

[root@kube-master manifest]# ls -la /usr/local/bin/
合計 12616
drwxr-xr-x.  2 root root       21  2月  2 18:26 .
drwxr-xr-x. 12 root root      131  1月  5 07:52 ..
-rwxr-xr-x.  1 root root 12917404  2月  2 18:29 kubesec
[root@kube-master manifest]# 

bash の 補完機能を有効化します。

[root@kube-master manifest]# source <(kubesec completion bash)
[root@kube-master manifest]# 

GnuPG で暗号化するための鍵生成

GnuPG の gpg コマンドを利用して暗号化を行うために、Keyring と暗号鍵を作成します。

[root@kube-master sample-secret]# gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

暗号鍵の種類を選択します。ここでは、「1」を指定します。

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
あなたの選択は? 1

鍵長を決定します。ここでは、「2048」を指定します。

RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048) 2048

鍵の有効期限を指定します。ここでは、「0(無期限)」を指定します。

要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)0

これで正しいか聞かれるので、「y(YES)」を入力します。

(null)は無期限です
これで正しいですか? (y/N) y

GnuPGを利用するために、ユーザIDの構成を求められるので、必要な情報(本名、電子メールアドレス)を入力します。

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: ●●●●●(5桁以上)
電子メール・アドレス: ●●@●●●
コメント: ●●●

最後に OK かどうか聞かれるので、「0(OK)」と入力します。

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O

暗号鍵のパスフレーズの入力を要求されるので、新規でパスフレーズを入力し、< OK > をクリックします。

以下メッセージが表示される場合には、説明に記載されているようにたくさんのランダムバイトを生成するために、キーボード操作やマウス操作を行います。

秘密鍵を保護するためにパスフレーズがいります。

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動かす、
ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生成器に
十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動かす、
ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生成器に
十分なエントロピーを供給する機会を与えることができます。
gpg: /root/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵64022A69を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 「ギリギリの信用」3、「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   ●●●●
フィンガー・プリント = ●●●● ●●●● ●●●● ●●●● ●●●● ●●●● ●●●● ●●●● ●●●● ●●●●  
↑
作成された暗号鍵の情報
uid                  ●●● (●●●) <●●●@●●●>
sub   ●●●

[root@kube-master sample-secret]#

GnuPG を利用した暗号化

Secret のマニフェストの中身を確認します。ここでは、username と password の値が base64 エンコード(暗号化はされていない)で指定さていることが確認できます。

[root@kube-master sample-secret]# cat sample-secret-encrypt.yaml 
apiVersion: v1
data:
  password: cm9vdC1wYXNzd29yZA==
  username: cm9vdA==
kind: Secret
metadata:
  name: sample-secret
type: Opaque
[root@kube-master sample-secret]# 

Secret のマニフェストの中身にある username と password の値を、kubesec を利用して暗号化します。暗号化の際に、暗号鍵のパスフレーズを要求されるので、パスフレーズを入力して下さい。

[root@kube-master sample-secret]# kubesec encrypt -i --key=pgp:(作成された暗号鍵の情報)sample-secret-encrypt.yaml 

次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"●●● (●●●) <●●●@●●●>"
2048ビットRSA鍵, ID 64022A69作成日付は2019-02-02

[root@kube-master sample-secret]# 

Secret のマニフェストの中身を確認します。ここでは、username と password の値が base64 エンコードではなく暗号化されていることが確認できます。

[root@kube-master sample-secret]# cat sample-secret-encrypt.yaml apiVersion: v1
data:
  password: dyH79FefB2vU5w6Kl4PSvT4gwrn3h6EzBWInAHFT4OwH7yhcE40E6akAwh5ttiDl.A73DF1m3SNWNnIrT.pWgY5kh49QLZpI/qQ3x3Iw==
  username: oDhZ/Zunx6dofDhsXzcBpzSrHgNyj5KGgMLfweV8cM5Pnc/2zO6wWK/f9l4u3Jo7.osLAtapCVbNGmDvx.3e0NlkncKObIDpWJ0zqjUw==
kind: Secret
metadata:
  name: sample-secret
type: Opaque
# kubesec:v:3
# kubesec:pgp:●●●●
[root@kube-master sample-secret]# 

GnuPG を利用した復号化(非暗号化)

GnuPG を利用した暗号化情報を復号化したい場合は、以下のようなコマンドを実行します。復号化の際には鍵の指定は必要ありませんが、暗号鍵のパスフレーズを要求されるので、パスフレーズを入力して下さい。

[root@kube-master sample-secret]# kubesec decrypt -i sample-secret-encrypt.yaml 

次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"●●● (●●●) <●●●@●●●>"
2048ビットRSA鍵, ID 294FEF9B作成日付は2019-02-02 (主鍵ID 64022A69)

[root@kube-master sample-secret]#