Docker/Kubernetes開発・運用のためのセキュリティ実践ガイド


Docker/Kubernetes開発・運用のためのセキュリティ実践ガイド (Compass Booksシリーズ)


マイナビ


著者:須田瑛大、五十嵐綾、宇佐美友也


はじめに
本書が対象とする「セキュリティ」
対象読者
対象ソフトウェアのバージョン
サンプルファイル
本書の構成
著者紹介

第1章 Docker/Kubernetesの復讐
1.0 Docker/Kubernetesの復讐
1.1 Dockerの復習
1.1.1 Dockerを構成するコンポーネント群
1.1.2 Dockerの使い方の復習
1.1.3 Dockerの仕組み
1.2 Kubernetesの復習
1.2.1 アプリケーション基盤としての利点
1.2.2 アーキテクチャ概要
1.2.3 kindによるクラスタ構築
1.2.4 kubectlの認証設定
1.2.5 主要なAPIリソースとkubectlによる操作
1.2.6 ラベルとラベルセレクタ
1.3 TLSの復習
1.3.1 概要
1.3.2 インターネットPKI(Public Key Infrastructure)
1.3.3 証明書の管理
1.3.4 証明書の操作

第2章 コンテナ運用における脅威の事例
2.0 コンテナ運用における脅威の事例
2.1 APIエンドポイントの設定ミス
2.1.1 Dockerの設定ミス
2.1.2 Kubernetesの設定ミス
2.1.3 IaaSの設定ミス
2.2 ランタイムやカーネルの脆弱性
2.2.1 runcの脆弱性
2.2.2 Dockerデーモンの脆弱性
2.2.3 カーネルの脆弱性
2.3 イメージの脆弱性
2.3.1 イメージ内容の脆弱性
2.3.2 レジストリの脆弱性
2.4 Kubernetesコンポーネントの脆弱性
2.4.1 kube-apiserverの脆弱性
2.4.2 kubeletの脆弱性
2.4.3 kubectlの脆弱性
2.4.4 Kubernetes Dashboardの脆弱性
2.4.5 関連する外部コンポーネントの脆弱性

第3章 ランタイムのセキュリティTips
3.0 ランタイムのセキュリティTips
3.1 Docker APIエンドポイントを保護する
3.1.1 TLSクライアント認証による保護
3.1.2 SSHによる保護
3.1.3 コンテナ内からDocker APIを呼び出す
3.1.4 コンテナ内からDocker APIを一層安全に呼び出す
3.2 コンテナ実行ユーザを変更する
3.2.1 ユーザを指定する
3.2.2 権限昇格を防止する(no_new_privsビット)
3.2.3 非rootユーザをrootに見せかける(User Namespace)
3.2.4 ランタイム自体を非rootで動かす(Rootless モード)
3.3 ケーパビリティやシステムコールを制限する
3.3.1 不要なケーパビリティを削除する
3.3.2 不要なシステムコールの呼び出しを禁止する(seccomp)
3.4 ファイルアクセスを制御する
3.4.1 ファイルシステムをread-onlyにする
3.4.2 ボリュームやbind-mountをread-onlyにする
3.4.3 ファイルアクセスを細かく制御する(AppArmor)
3.4.4 ファイルアクセスを細かく制御する(SELinux)
3.5 リソースを制限する
3.5.1 CPUコア使用量を制限する
3.5.2 メモリ使用量を制限する
3.5.3 プロセス数を制限する
3.5.4 ファイルディスクリプタ数を制限する
3.5.5 ストレージの使用量を制限する
3.5.6 I/Oを制限する
3.6 代替ランタイムを利用する
3.6.1 Kata Containers
3.6.2 gVisor
3.7 コンテナを監視する
3.7.1 コンテナのログを収集する
3.7.2 コンテナに関するイベントを収集する
3.7.3 コンテナの挙動を監視する(Falco)
3.7.4 ファイルアクセスを監視する(auditd)
3.7.5 コンテナのリソース使用状況を監視する
3.8 設定を検証する
3.8.1 Docker Bench for Security

第4章 イメージのセキュリティTips
4.0 イメージのセキュリティTips
4.1 DockerfileからプライベートなGitやS3にアクセスする
4.1.1 シークレットファイルを扱う(docker build –secret)
4.1.2 ssh-agent をフォワードする(docker build –ssh)
4.2 コンテナ内で安全にイメージをビルドする
4.2.1 BuildKit
4.2.2 Kaniko
4.3 イメージの脆弱性を検査する
4.3.1 パッケージの脆弱性を検査する(Clair)
4.3.2 パッケージの脆弱性を検査する(Trivy)
4.3.3 パッケージ以外の脆弱性を検査する(Dockle)
4.4 改竄されたイメージのデプロイを防ぐ
4.4.1 イメージのダイジェスト(ハッシュ値)を指定する
4.4.2 Docker Content Trus(t Notary)で署名を検証する
4.5 プライベートレジストリを構築する(Harbor)
4.5.1 Harborをインストールする
4.5.2 Harborにイメージをpush・pull する

第5章 KubernetesクラスタのセキュリティTips
5.0 KubernetesクラスタのセキュリティTips
5.1 クラスタを最新の状態に保つために
5.1.1 リリースライフサイクルと情報の収集
5.1.2 コミュニティによる脆弱性管理
5.2 ミスや攻撃から守る API のアクセス制御
5.3 認証モジュールの選び方と使い方
5.3.1 アカウント種別と対応する認証モジュールの違い
5.3.2 X.509クライアント証明書によるユーザ認証と注意点
5.3.3 OpenID Connectによるユーザ認証
5.3.4 Webhook Token Authenticationを利用した外部認証基盤との連携
5.3.5 kubectl認証プラグインを利用した認証基盤との連携
5.3.6 外部の認証プロキシ連携と、Kubernetes内部の認証プロキシ
5.3.7 匿名ユーザの取り扱い
5.4 Service Accountによるサービス認証とアカウント管理
5.4.1 APIによるアカウントの管理
5.4.2 Service Accountによる Podの権限管理
5.5 認可モジュールの種類と利用方法
5.5.1 認可モジュール一覧と選び方
5.5.2 認可ポリシの定義
5.5.3 RBAC による認可
5.5.4 認可Webhookを利用した外部認可システム連携
5.6 Admissionコントローラによる柔軟なアクセス制御
5.6.1 主要なプラグインとその設定方法
5.6.2 EventRateLimitプラグイン
5.6.3 ImagePolicy Webhookプラグイン
5.6.4 PodSecurityPolicyプラグイン
5.7 Webhookで独自のAdmission Controlを追加する
5.7.1 WebhookConfigurationとデットロック回避などの注意点
5.7.2 AdmissionReviewとSDKの利用
5.7.3 APIサーバのクライアント認証設定
5.8 システムコンポーネント間通信の保護
5.8.1 コンポーネント間通信の全体像
5.8.2 TLSセットアップの自動化を支援するBootstrap Tokens
5.8.3 Bootstrap TokenとCSRによるNodeの起動プロセス簡略化
5.9 スケジューラによる割り当てノードの制御
5.9.1 TaintとTolerationによるノードの制限
5.9.2 Node Affinityによる特定ノードへの配置
5.9.3 Inter-Pod Topology Affinity/Anti-Affinityによる分散配置
5.9.4 AdmissionWebhookとスケジューラの連携
5.10 秘密情報を管理する
5.10.1 Secretの概要
5.10.2 Secretをノードのディスクに永続化しない
5.10.3 適切なノードのみに秘密情報へのアクセスを許可する
5.10.4 etcdに格納するリソースを暗号化する
5.10.5 KMSと連携してSecretsを管理する
5.10.6 CSIを利用する
5.11 GitOpsのためのSecret管理

第6章 アプリケーション間通信を守る
6.0 アプリケーション間通信を守る
6.1 Network Policyを使ってPodの通信を制御する
6.2 Istioを使ってPod間の通信を守る
6.2.1 アプリケーションを相互認証する
6.2.2 リクエストを認可する
6.2.3 通信レートを制限する
6.2.4 カスケード障害を防ぐ
6.3 SPIFFEによるアプリケーションの認証
6.3.1 SVIDによるワークロードの識別
6.3.2 SPIREとEnvoyによるPodの相互認証
6.4 クラスタ外部との通信を守る
6.4.1 IngressでTLS通信を終端する
6.4.2 PodでTLS通信を終端する

索引

書籍目次

Posted by shi-n