【Kubernetesリソースシリーズ第六弾】Secretについて知る!
どもです。ドルガバのネクタイを買いました、saisaiです。
本日はKubernetesリソースシリーズ第六弾ということで、Secretについて記事にしてみたいと思います。
Kubernetesセンシティブな情報を取り扱う非常に重要なリソースですので、ここでしっかり使い方を学んでいきたいと思います。
Secretとは
Secretとはリソース名の通り、Kuberneteで利用する機微情報を取り扱うものです。要するに接続情報や認証情報ですね。情報はBASE64でエンコードされています。
上記のような情報は、マニフェストファイルの定義などに直接記載するとセキュリティ上よろしくありません。そこで情報を記載しているファイルを別途作成し、それをSecretで管理するという方法を利用するというわけです。
では、Secretはどのように生成しマニフェストファイルに定義されるのでしょうか。実際に設定してみたいと思います。
Secretの生成
まずはSecretを生成しましょう。Secretを生成する方法は2種類あります。コマンドを使用して生成するか、マニフェストファイルから直接することで生成できます。
まずはコマンドから作成します。例えば以下のような機微情報を含むファイルがあるとしましょう。
ファイル名:keyfile
MY-SECRET-KEY
ではこちらのファイルを利用してSecretを生成してみましょう。上記のファイルが存在するディレクトリで
$ kubectl create secret generic my-secret --from-file=./keyfile
secret/my-secret created
上記コマンドを使用することで無事Secretが作成されます。確認してみましょう。
$ kubectl get secret
NAME TYPE DATA AGE
my-secret Opaque 1 63s
作成されていることが確認できます。ついでに中身も確認しておきましょう。
$ kubectl get secret/my-secret -o yaml
apiVersion: v1
data:
keyfile: TVktU0VDUkVULUtFWQo= #暗号化された機微情報が定義されていることが確認できる
kind: Secret
metadata:
creationTimestamp: "2021-03-14T17:00:56Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:keyfile: {}
f:type: {}
manager: kubectl
operation: Update
time: "2021-03-14T17:00:56Z"
name: my-secret
namespace: default
resourceVersion: "75625"
uid: 5d457a93-11bd-44cb-996b-3569ceab8e12
type: Opaque
Secretが無事定義されていることが確認できます。非常に簡単に作成できました。やっぱりコマンドって便利ですね。
次に、手動で作成する方法もみておきましょう。
先にSecretを生成するマニフェストファイルを作成しておきます。
apiVersion: v1
kind: Secret
metadata:
name: test-secret
data:
keyfile: <ここの値をが必要>
次に、keyfileの中身をBASE64でエンコードして取得します。
$ cat keyfile | base64
TVktU0VDUkVULUtFWQo=
keyfileの中身をBASE64でエンコードした文字列を取得します。次にKeyfileの値としてマニフェストファイルに定義しましょう。
keyfile: TVktU0VDUkVULUtFWQo=
あとはこのマニフェストファイルを使用してSecretを生成します。
$ kubectl apply -f secret.yml
secret/test-secret created
無事手動でも作成することができました。
Secretを利用してみる
ここまででSecretの生成方法を一通り学習しましたが実際にはどのように使用するのでしょうか。
今回はSecretで情報を定義したPodを作成し、実際に接続して確認してみようと思います。マニフェストファイルは以下の通り。
apiVersion: v1
kind: Secret
metadata:
name: test-secret
data:
keyfile: TVktU0VDUkVULUtFWQo= # 取得した値
---
apiVersion: v1
kind: Pod
metadata:
name: test
namespace: default
spec:
containers:
- name: test
image: nginx:1.17.2-alpine
volumeMounts:
- name: secret-storage
mountPath: /home/nginx #Pod内のkeyfileが置かれる場所
volumes:
- name: secret-storage
secret: Pod内に配置するkeyfileを定義
secretName: test-secret
items:
- key: keyfile
path: keyfile
早速Secretで機微情報を設定したPodを作成してみましょう。
$ kubectl apply -f secret.yml
secret/test-secret created
pod/test created
無事PodとSecretが作成されたようです。Podに接続してみましょう。
まずはpodの情報を確認します。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 5m52s
では接続してみましょう。
$ kubectl exec -it test sh
それでは、実際にkeyfileが設置されているか、また内容も正しいのかを確認してみましょう。
# cat /home/nginx/keyfile
MY-SECRET-KEY
おお!無事に指定した場所にkeyfileが配置され、中身もしっかりBase64からデコードされています。
これで無事にSecretを使用した情報管理ができていると言えるのではないでしょうか。
ひとこと
今回はSecretについて学習しました。
とは言っても学んだのは基本的な使用方法だけで、実際に認証情報を利用するといった本来の使用方法はまだ手を出せていないのでさらに深く学習して知識をつける必要がありそうです。
いつかワンランク上の実践記事も出そうと思いますのでその時は是非ともご覧いただければと思います。
ここまで読んでいただきありがとうございました!
-saisai-
↓オススメ教材