はじめに
Kubernetesを介してデプロイされるほとんどのアプリケーションは、外部にあるデータベース、サービス、およびその他のリソースにアクセスする必要があります。これらのリソースにアクセスするために必要なログイン情報を管理する最も簡単な方法は、Kubernetesシークレットを使用することです。シークレットは、機密情報を整理してクラスター全体に配布するのに役立ちます。
このチュートリアルでは、Kubernetesシークレットとは何か、クラスターでそれらを作成して使用する方法を学習します。
前提条件
- Kubernetesクラスター(テスト目的で、minikubeを使用して作成できます)
- Kuberneteskubectlコマンドラインツール
Kubernetesの秘密とは何ですか?
Kubernetesシークレットは、ユーザー名、パスワード、トークン、キーなどの機密データを保存するオブジェクトです。シークレットは、アプリのインストール中にシステムによって作成されるか、機密情報を保存してポッドで利用できるようにする必要がある場合はいつでもユーザーによって作成されます。
パスワード、トークン、またはキーが単にポッド定義またはコンテナイメージの一部である場合、Kubernetes操作中に誤って公開される可能性があります。したがって、シークレットの最も重要な機能は、シークレットに保存されている情報が誤って公開されるのを防ぎ、同時にユーザーが必要な場所で利用できるようにすることです。
Kubernetesシークレットタイプ
Kubernetesには、2つのカテゴリのシークレットがあります。
- システムのサービスアカウントは、組み込みのシークレットを自動的に作成します それらをAPIクレデンシャルとともにコンテナに関連付けます。
- カスタマイズされたシークレットを作成することもできます 資格情報については、ポッドで利用できるようにする必要があります。
組み込みのシークレットには、一般的な使用シナリオに対応するいくつかのタイプがあります。
組み込みタイプ | 説明 |
---|---|
Opaque | これはデフォルトのタイプのシークレットです。構成ファイルにtypeステートメントが含まれていないシークレットは、すべてこのタイプであると見なされます。不透明なシークレットは、任意のユーザーデータを保存するように設計されています。 |
kubernetes.io/service-account-token | サービスアカウントトークンシークレットは、サービスアカウントを識別するトークンを格納します。ポッドを作成すると、Kubernetesはこのシークレットを自動的に作成してポッドに関連付け、APIへの安全なアクセスを可能にします。この動作は無効にできます。 |
kubernetes.io/dockercfg | イメージのDockerレジストリにアクセスするには、有効なDockerクレデンシャルが必要です。このタイプのシークレットは、シリアル化された ~/.dockercfg を保存するために使用されます Dockerコマンドライン構成のレガシー形式。 base64でエンコードされた.dockercfg が含まれています キー。 |
kubernetes.io/dockerconfigjson | このタイプのシークレットは.dockerconfigjson を特徴としています キー。~/.docker/config.json のbase64エンコードバージョンです。 ファイル、非推奨の .dockercfg の新しいバージョン 。 |
kubernetes.io/basic-auth | 基本認証データを保存するための秘密。 username の2つのキーが含まれている必要があります およびpassword 。 |
kubernetes.io/ssh-auth | SSH接続の確立に必要なデータを保存するには、 ssh-auth を使用します タイプ。このタイプのデータフィールドには、 ssh-privatekey が含まれている必要があります キーと値のペア。 |
kubernetes.io/tls | このタイプは、TLS証明書とキーを格納するために使用されます。最も一般的な使用シナリオは入力リソースの終了ですが、 tls タイプは他のリソースでも使用されることがあります。 |
bootstrap.kubernetes.io/token | ノードのブートストラッププロセス中に使用されるトークンは、トークンシークレットタイプを使用して保存されます。このタイプは通常、 kube-system で作成されます 名前空間。 |
カスタマイズされたタイプのシークレットを定義するには、空でない文字列を type
の値として割り当てます。 シークレットファイルのフィールド。フィールドを空のままにすると、KubernetesはOpaque
を想定するようになります タイプ。カスタマイズされたタイプは、組み込みタイプによってもたらされる制約の秘密を解放します。
Kubernetesシークレットの使用
シークレットを作成するときは、それを使用するポッドによって参照される必要があります。ポッドでシークレットを利用できるようにするには:
1.ポッド内の任意の数のコンテナで使用可能なボリュームにシークレットをファイルとしてマウントします。
2.シークレットを環境変数としてコンテナにインポートします。
3. kubeletと、 imagePullSecrets
を使用します フィールド。
次のセクションでは、Kubernetesシークレットを作成する方法と、それらをデコードしてアクセスする方法について説明します。
Kubernetesシークレットを作成する
Kubernetesシークレットを作成するには、次のいずれかの方法を適用します。
-
kubectl
を使用します コマンドラインベースのアプローチの場合。 - シークレットの構成ファイルを作成します。
- Kustomizeなどのジェネレーターを使用してシークレットを生成します。
kubectlを使用してシークレットを作成する
1. kubectl
を使用してシークレットの作成を開始するには 、最初に機密情報を保存するファイルを作成します:
echo -n '[username]' > [file1]
echo -n '[password]' > [file2]
-n
オプションはecho
を指示します 文字列の最後に改行を追加しないでください。改行も文字として扱われるため、残りの文字と一緒にエンコードされ、異なるエンコード値が生成されます。
2.ここで、 kubectl
を使用します 前の手順のファイルを使用してシークレットを作成します。汎用サブコマンドを使用して、Opaque
を作成します 秘密の。また、 --from-file
を追加します 含める各ファイルのオプション:
kubectl create secret generic [secret-name] \
--from-file=[file1] \
--from-file=[file2]
出力はシークレットの作成を確認します:
3.シークレットに格納されている値のキーを提供するには、次の構文を使用します。
kubectl create secret generic [secret-name] \
--from-file=[key1]=[file1] \
--from-file=[key2]=[file2]
4.次のように入力して、シークレットが正常に作成されたことを確認します。
kubectl get secrets
このコマンドは、使用可能なシークレットのリスト(名前、タイプ、含まれるデータ値の数、および経過時間)を表示します。
構成ファイルにシークレットを作成する
1.構成ファイルに必要な情報を指定してシークレットを作成するには、保存する値をエンコードすることから始めます。
echo -n '[value1]' | base64
echo -n '[value2]' | base64
2.テキストエディタを使用してyamlファイルを作成します。ファイルは次のようになります:
apiVersion: v1
kind: Secret
metadata:
name: newsecret
type: Opaque
data:
username: dXNlcg==
password: NTRmNDFkMTJlOGZh
3.ファイルを保存し、 kubectl apply
を使用します シークレットを作成するコマンド:
kubectl apply -f [file]
ジェネレータを使用してKubernetesシークレットを作成する
Kustomizeなどのジェネレーターは、シークレットをすばやく生成するのに役立ちます。
1. Kustomizeでシークレットを作成するには、 kustomization.yaml
という名前のファイルを作成します 次のようにフォーマットします:
secretGenerator:
- name: db-credentials
files:
- username.txt
- password.txt
上記の例では、 db-credentials
シークレットの名前として、以前に作成された2つのファイル username.txt
を使用します 、および password.txt
、 データ値として。
2.または、暗号化されていないリテラルバージョンのデータ値を提供するには、literals
を含めます。 保存するキーと値のペアを含むセクション:
secretGenerator:
- name: db-credentials
literals:
- username=user
- password=54f41d12e8fa
3.ファイルを保存し、 kustomization.yaml
があるフォルダーで次のコマンドを使用します にあります:
kubectl apply -k .
出力はシークレットの作成を確認します:
kubectldescribeを使用して作成されたシークレットを表示する
kubectl describe
コマンドは、Kubernetesオブジェクトに関する基本情報を表示します。シークレットの説明を表示するために使用します。
kubectl describe secrets/[secret]
最初の例は、ファイルをデータ値として提供することによって作成された秘密を示しています。
2番目の例では、文字列リテラルを使用して作成されたシークレットについて説明します。 Data
の変更に注意してください セクション。ファイル名の代わりにキーの名前が表示されるようになりました:
秘密を解読する
1.シークレット内の値をデコードするには、次のコマンドを入力して値にアクセスします。
kubectl get secret [secret] -o jsonpath='{.data}'
出力には、データセクションに格納されているエンコードされたキーと値のペアが表示されます:
2. echoコマンドを使用してエンコードされた文字列を入力し、出力を base64
にパイプします コマンド:
echo '[encoded-value]' | base64 --decode
デコードされた文字列が出力として表示されます:
ボリュームにロードされたアクセスシークレット
1.別のボリュームのポッドにマウントされたシークレットにアクセスするには、ポッドの定義を変更して新しいボリュームを含めます。必要なボリューム名を選択しますが、それがシークレットオブジェクトの名前と同じであることを確認してください。
2.必ずreadOnly
を指定してください 本当のように。たとえば、ポッドの定義は次のようになります。
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: redis
volumeMounts:
- name: newsecret
mountPath: “/etc/newsecret”
readOnly: true
volumes:
- name: newsecret
secret:
secretName: newsecret
2.別のターミナルインスタンスを開き、 kubectl exec
を使用します ポッドのbashシェルにアクセスするコマンド:
kubectl exec -it [pod] -- /bin/bash
3. cd
/etc/newsecret
に 、シークレットに含まれているファイルを見つけます:
cd /etc/newsecret
環境変数を使用したコンテナへのプロジェクトシークレット
1. Kubernetesポッドのシークレットにアクセスする別の方法は、ポッド定義を変更してシークレットへの参照を含めることにより、シークレットを環境変数としてインポートすることです。例:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: secret-env-pod
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: newsecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: newsecret
key: password
restartPolicy: Never
2. kubectl exec
を使用します 再びポッドに打ち込む。
3. echo
を使用して環境変数をテストします コマンド:
echo $[VARIABLE]
コマンド出力には、変数にマップされた値が表示されます:
シークレットを使用してプライベートDockerレジストリからDockerイメージをプルする
1.プライベートDockerレジストリを使用するには、最初にDockerにログインする必要があります:
docker login
2.プロンプトが表示されたら、ログイン資格情報を入力します。
3.ログインが成功すると、Dockerは config.json
を更新します データをファイルします。 catコマンドを使用して、ファイルを表示します。
cat ~/.docker/config.json
auths
セクションにはauth
が含まれています キー。Dockerクレデンシャルのエンコードされたバージョンです。
4. kubectl
を使用します シークレットを作成し、 config.json
の場所を指定します ファイルとシークレットの種類:
kubectl create secret generic [secret] \
--from-file=.dockerconfigjson=./.docker/config.json \
--type=kubernetes.io/dockerconfigjson
または、Dockerへのログインを含め、上記のすべての手順を同じ行で実行します。
kubectl create secret docker-registry [secret] --docker-server:[address] --docker-username=[username] --docker-password=[password] --docker-email=[email]
5.このシークレットにアクセスできるポッドを作成するには、 yaml
を作成します それを定義するファイル。ファイルは次のようになります:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image:
imagePullSecrets:
- name: regcred
6. kubectl apply
を使用してポッドをアクティブ化して、ポッドの作成を完了します :
kubectl apply -f [file]
Kubernetesの秘密に関する考慮事項
Kubernetesの秘密 機密情報を安全に保管する方法です。ただし、使用シナリオに最適な方法を決定する前に、次の点を考慮する必要があります。
- シークレットのユーザー名とパスワードはbase-64でエンコードされています。このテキストエンコーディング技術は、データを覆い隠し、偶発的な露出を防ぎますが、悪意のあるサイバー攻撃に対しては安全ではありません。
- シークレットは、シークレットが配置されているクラスターでのみ使用できます。
- シークレットは通常、すべてのロックを解除するために使用されるマスターキーに依存しています。マスターキーを保護する方法はいくつかありますが、それらを使用すると、別のマスターキーシナリオが作成されるだけです。
これらの問題を軽減するには、以下の解決策のいくつかを適用してください。
- Kubernetesサービスアカウントを使用して、シークレットボールトへのアクセスが必要なユーザーを認証するシークレット管理ツールを統合します。
- IAM(Identity and Access Management)ツールを統合して、システムがセキュアトークンサービスのトークンを使用できるようにします。
- サードパーティのシークレットマネージャーをポッドに統合します。