【Kubernetesリソースシリーズ第六弾】Secretについて知る!

10月 11, 2023

どもです。ドルガバのネクタイを買いました、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-


↓オススメ教材

kubernetes

Posted by CY