Kubernetes the hard way (GCP版)の続きです。
前回の記事はこちら。
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
も存在します。
暗号化設定ファイルの作成
次に、暗号化設定ファイルであるEncryptionConfig
を作成します。
resources.providers
の部分では暗号化アルゴリズムの一つであるAES-CBC
を指定しています。
KubernetesのDocumentの中でも、暗号強度の観点からAES-CBC
(aescbc
)の利用が推奨となっています。
The recommended choice for encryption at rest but may be slightly slower than secretbox
~/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)では、公開鍵暗号方式によって共通鍵の交換を行った上で暗号化通信は共通鍵暗号化方式で行います。
暗号化アルゴリズム (AES-CBC with PKCS#7 padding)について
暗号化設定ファイルの中では、暗号化アルゴリズムとしてaescbc
(AES-CBC with PKCS#7 padding)が指定されています。
最初に暗号化アルゴリズムとして、ブロック暗号の一種であるAESが指定されています。
平文をある単位のブロックに分割して暗号化する方式をブロック暗号と呼び、AESでは128bit (=16byte)単位のブロックに分割します。
また、ブロック暗号のモードの一つであるCBCも指定されています。
平文の各ブロックは前の暗号文とのXORを取ってから暗号化されます。(平文の最初のブロックに関しては「前の暗号文」が存在しないので、初期化ベクトルと呼ばれるものを利用します。)
先ほども記載した通りAES暗号はブロック方式のため、16の倍数byteの平文を暗号化します。
そのため、16の倍数byteに満たない場合は16の倍数byteになるようにデータを追加 (padding) する必要があります。
そのpaddingの方式の一つとしてPKCS#7 paddingがあり、こちらもaescbc
を指定することで自動的に指定されています。
設定時には、ブロック暗号のモードやpaddingの方式などユーザー側で変更することはできないので注意が必要です。
今回は、Chap6の内容をまとめました。