Secrets管理とRBAC
コンテナ環境で機密データを管理し、Role-Based Access Control(RBAC)を実装するための高度な戦略を学びます。
「Secrets管理とRBAC」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
コンテナ環境を安全にする
ようこそ。このレッスンでは、コンテナ化されたアプリケーションにとって重要なセキュリティプラクティスであるシークレット管理とロールベースアクセス制御(RBAC)について詳しく学びます。
これらの概念は、機密データを保護し、コンテナ環境で許可されたエンティティだけが特定の操作を実行できるようにするために不可欠です。

シークレットのハードコーディングの危険性
APIキー、データベースのパスワード、秘密証明書などの機密情報を、アプリケーションコードやDockerfileに直接ハードコーディングすることは、大きなセキュリティリスクです。
- 露出: コードリポジトリやビルド済みイメージにアクセスできる人は、簡単に情報を確認できます。
- 制御不足: シークレットを変更するには、アプリケーション全体を再ビルドして再デプロイする必要があります。
- コンプライアンス上の問題: 多くのセキュリティのベストプラクティスや規制要件に違反します。
環境変数(使用には注意)
シークレットを渡す一般的な方法として、環境変数がありますが、必ずしも安全とは限りません。Dockerでは -e フラグで環境変数を渡せ、アプリケーションから読み取ることができます。
ただし、環境変数は簡単に確認でき(例: docker inspect)、シェルの履歴やログに残る可能性があります。特に機密性の高いデータには、より適した方法があります。
Docker Secretsを実際に使う
Docker Secretsを使うと、機密データを安全に保存し、コンテナへ安全に渡すことができます。シークレットをコンテナにアタッチすると、/run/secrets/ に一時ファイルとしてマウントされます。
まず、シークレットを作成します(例: echo "my_secure_pass" | docker secret create app_secret -)。その後、アプリケーションから読み取ることができます。
import os
def main():
secret_path = "/run/secrets/app_secret"
try:
with open(secret_path, 'r') as f:
secret_value = f.read().strip()
print(f"Secret read: {secret_value}")
except FileNotFoundError:
print("Secret file not found. Make sure it's mounted.")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
main()Kubernetes Secretsの概要
Docker Secretsと同様に、Kubernetesにも機密情報を保存・管理するための「Secrets」というオブジェクトがあります。これらのシークレットは、Pod内にファイルとしてマウントしたり、環境変数として公開したりできます。
重要: Kubernetes Secretsはデフォルトでは暗号化されず、Base64エンコードされるだけです。そのため、簡単にデコードできます。保存時のデータを真に暗号化するには、追加の設定(KMS統合など)が必要です。
K8s Secretsを使ってデプロイする
Kubernetes Secretを定義し、Pod内で使用する方法の例を見てみましょう。シークレットはYAMLで定義することも、kubectl コマンドで作成することもできます。
作成した後、Podからシークレットを参照し、ボリュームとしてマウントしたり、その値を環境変数として注入したりできます。
apiVersion: v1
kind: Pod
metadata:
name: my-secret-pod
spec:
containers:
- name: my-app-container
image: busybox
command: ["sh", "-c", "echo Username: $(cat /etc/secrets/username) Password: $(cat /etc/secrets/password)"]
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: my-k8s-secret外部シークレット保管庫
非常に機密性の高いデータを扱う場合や、複数のクラスターや環境にまたがってシークレットを管理する場合、外部シークレット管理ツールを使うと、次のような高度な機能を利用できます。
- 一元管理: すべてのシークレットに対する信頼できる単一の情報源を提供します。
- 保存時および転送中の暗号化: より強固なセキュリティを保証します。
- 動的シークレット: 短期間だけ有効な認証情報を自動的に生成します。
- 監査とアクセス制御: きめ細かな権限設定と包括的なログ記録を提供します。
代表的な選択肢には、HashiCorp Vault、AWS Secrets Manager、Azure Key Vaultがあります。
RBACとは
ロールベースアクセス制御(RBAC)は、許可されたユーザーだけにシステムへのアクセスを制限する方法です。個々のユーザーに直接権限を割り当てるのではなく、権限を「ロール」にまとめ、そのロールをユーザーに割り当てます。
コンテナオーケストレーションでは、RBACによってユーザー、アプリケーション、サービスが、リソース(Pod、Deployment、Secretsなど)を操作するために必要な権限だけを持つようにします。
K8s RBACの構成要素
Kubernetes RBACでは、いくつかの主要なリソースタイプを使用します。
- Role: 特定のnamespace内での権限を定義します(例: 「dev」namespaceで「podを閲覧できる」)。
- ClusterRole: クラスター全体にわたる権限を定義します(例: 「すべてのpodを閲覧できる」、「ノードを管理できる」)。
- RoleBinding: Roleで定義された権限を、namespace内のユーザー、グループ、またはサービスアカウントに付与します。
- ClusterRoleBinding: ClusterRoleで定義された権限を、クラスター全体でユーザー、グループ、またはサービスアカウントに付与します。
RBACの例: アクセスを制限する
特定のサービスアカウントに、あるnamespace内のpodの一覧表示と取得だけを許可する例を見てみましょう。これにより、最小権限の原則を適用できます。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods-binding
namespace: default
subjects:
- kind: ServiceAccount
name: pod-viewer-sa # Name of the ServiceAccount to bind to
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io理解度を確認する
機密データの保護とアクセス制御について学びました。ここで簡単に理解度を確認しましょう。
復習: アプリケーションを安全にする
よくできました。このレッスンでは、コンテナセキュリティにおける2つの重要な柱について学びました。
- シークレット管理: Docker SecretsとKubernetes Secretsを使って機密データを保護し、それぞれの利点と制限を理解します。
- ロールベースアクセス制御(RBAC): Kubernetesで、最小権限の原則を実現するきめ細かな権限を設定します。
これらを身につけることで、より堅牢で安全なコンテナ化アプリケーションを構築できます。
よくある質問
「Secrets管理とRBAC」レッスンは無料ですか?
はい。「Secrets管理とRBAC」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「Secrets管理とRBAC」で何を学びますか?
コンテナ環境で機密データを管理し、Role-Based Access Control(RBAC)を実装するための高度な戦略を学びます。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Secrets管理とRBAC」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- コンテナイメージのセキュリティスキャン
- コンテナのランタイムセキュリティ
- Secrets管理とRBAC
- ネットワークポリシーと最小権限ネットワーク