Webや書籍をざっとあさり、Docker / Kubernetesのセキュリティについて調査したメモ。
※この他にも多数ありましたが、まずはこのあたりからかな?というものを書き出しています。
Dockerのセキュリティ
ベースイメージ
- 公式イメージを利用する
- alpineなど、小さなイメージを利用する
- Docker Content Trustで署名チェックする
Dockerfile
- rootユーザを使わず、実行ユーザを使う
- 外部のファイルを追加する場合はチェックサムを検証する
- 機密情報は環境変数など外部から取得する構成にする
CI
- Quay.ioなどでイメージのセキュリティスキャンを行う
- Docker Bench for Securityで実行環境も含めたベストプラクティスをチェックする
ホスト
- Container-Optimized OSなど、コンテナのホストとして適切なセキュリティ原則を実装したOSを利用する
実行時
- ファイルシステムには最小の権限しか与えない
-
/var/run/docker.sock
をマウントしない -
--privileged
などで権限を付与しない - CPUやメモリ使用量に制限をかける
その他
- dockerdのリモート制御時は認証をかける
- sudo省略のためにユーザをdockerグループに追加することをしない
- docker login後はdocker logoutする
- CPUやメモリ使用量が異常なコンテナがないか監視する
- AppArmor、SELinux、GRSECなどを使用する
Kubernetesのセキュリティ
APIサーバ
- APIサーバへのアクセスを制限する
- APIの監査ログを残す
- すべてのAPIトラフィックにTLSを使用する
ネットワーキング
- CalicoによるNetworkPolicyを設定する
- Istioなどでトラフィックを暗号化する
コンテナの権限
- Service Account、RBACを適切に設定する
- SecurityContext、PodSecurityContext、PodSecurityPolicyを適切に設定する
- seccomp、AppArmor、SELinuxを利用する
- クラウドのメタデータAPIへのアクセスを制限する
Kubelet
- Kubeletの権限を制限する
- Kubeletへのアクセスを制限する
その他
- 機密情報は、base64エンコードでしかないSecretをGitリポジトリにそのままアップロードするのではなく、kubesecやサードパーティのVaultなどで暗号化して管理する
- AWSの場合、kube2iamやkiamでクラスタではなくPodに対してIAM Roleを割り当てる
- kube-benchでクラスタをチェックする
- kube-hunterによるペネトレーションテストを実施する
情報元
Web
- Docker最新動向2017秋+セキュリティの落とし穴
- Docker のセキュリティ
- コンテナを守る技術2018/container-security-20180310
- コンテナのセキュリティ(第 1 回): 3 つの主要領域
- コンテナのセキュリティ(第 2 回): ノード イメージとコンテナ イメージ
- コンテナのセキュリティ(第 3 回): Grafeas で管理するコンテナ イメージのメタデータ
- Kubernetesのセキュリティのベストプラクティス
- Securing a Cluster
- Kubernetes Security - Best Practice Guide