taxin's notes

読書、勉強メモ etc.

Kubernetes the hard way (GCP版) #6 (データ暗号化の設定とキーの生成)

Kubernetes the hard way (GCP版)の続きです。

前回の記事はこちら。

taxintt.hatenablog.com

Chap6. Generating the Data Encryption Config and Key(データ暗号化の設定とキーの生成)

このチャプターでは、etcdの暗号化のために使用する設定ファイルと暗号化キーを利用します。
(作成したconfigファイルはChap8.でAPI Serverの設定時に利用されます。)

暗号化キーの作成

最初にetcdの暗号化のベースとなる暗号化キーを作成します。
ざっくり説明するとランダムな文字列 (32byte) を生成して、それをbase64エンコードしたものを暗号化キーとして利用します。

~/w/k/h/04 ❯❯❯ ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
~/w/k/h/04 ❯❯❯ echo $ENCRYPTION_KEY
AOSngvXL8pGASyTzG0AqvNzPL6IYk3Spg+Jlhd+pI0Q=


最初のheadコマンドで指定している/dev/urandomはランダムな文字列を出力する擬似デバイスファイルの一種です。
同じようにランダムな文字列を出力するデバイスファイルとしてdev/randomも存在します。

oplern.hatenablog.com

暗号化設定ファイルの作成

次に、暗号化設定ファイルであるEncryptionConfigを作成します。
resources.providersの部分では暗号化アルゴリズムの一つであるAES-CBCを指定しています。

KubernetesのDocumentの中でも、暗号強度の観点からAES-CBC (aescbc)の利用が推奨となっています。

The recommended choice for encryption at rest but may be slightly slower than secretbox

kubernetes.io

~/w/k/h/04 ❯❯❯ cat > encryption-config.yaml <<EOF
kind: EncryptionConfig
apiVersion: v1
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: ${ENCRYPTION_KEY}
      - identity: {}
EOF


EncryptionConfigを作成したら、各Control Planeに配布していきます。

~/w/k/h/04 ❯❯❯ for instance in controller-0 controller-1 controller-2; do
  gcloud compute scp encryption-config.yaml ${instance}:~/
done
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
encryption-config.yaml                                                                                                                                 100%  240     0.7KB/s   00:00
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
encryption-config.yaml                                                                                                                                 100%  240     2.4KB/s   00:00
Enter passphrase for key '/Users/.../.ssh/google_compute_engine':
encryption-config.yaml

(+α) etcdの暗号化キーについて

etcdの暗号化キーに関連する内容を2点補足しておきます。

暗号化方式 (共通鍵暗号化方式)について

暗号化と復号に同じ鍵を利用する方式のことを共通鍵暗号化方式を呼び、この方式の暗号化キーを用いてetcdを暗号化します。
(共通鍵暗号で使用する暗号化アルゴリズムの一つとしてAESがあります。)

ちなみにAPI Serverとの暗号化通信(TLS)では、公開鍵暗号方式によって共通鍵の交換を行った上で暗号化通信は共通鍵暗号化方式で行います

milestone-of-se.nesuke.com

暗号化アルゴリズム (AES-CBC with PKCS#7 padding)について

暗号化設定ファイルの中では、暗号化アルゴリズムとしてaescbc (AES-CBC with PKCS#7 padding)が指定されています。

最初に暗号化アルゴリズムとして、ブロック暗号の一種であるAESが指定されています。
平文をある単位のブロックに分割して暗号化する方式をブロック暗号と呼び、AESでは128bit (=16byte)単位のブロックに分割します。

また、ブロック暗号のモードの一つであるCBCも指定されています。
平文の各ブロックは前の暗号文とのXORを取ってから暗号化されます。(平文の最初のブロックに関しては「前の暗号文」が存在しないので、初期化ベクトルと呼ばれるものを利用します。)

ja.wikipedia.org

先ほども記載した通りAES暗号はブロック方式のため、16の倍数byteの平文を暗号化します。
そのため、16の倍数byteに満たない場合は16の倍数byteになるようにデータを追加 (padding) する必要があります。

そのpaddingの方式の一つとしてPKCS#7 paddingがあり、こちらもaescbcを指定することで自動的に指定されています。

qiita.com

設定時には、ブロック暗号のモードやpaddingの方式などユーザー側で変更することはできないので注意が必要です。

今回は、Chap6の内容をまとめました。