Slide 1

Slide 1 text

myzkstr.com みやざきさとる コンテナ環境をセキュアに 運用する方法

Slide 2

Slide 2 text

myzkstr.com みやざきさとる 宮﨑悟 [email protected] @s_miyaza satoru.miyazaki.31  Solaris/ZFS/Solaris Zoneがすき  フリーランスのエンジニア  北海道函館市からリモートワーク  主な仕事  某WordPress仮想マシン  コンテナセキュリティ製品評価  技術コラム掲載

Slide 3

Slide 3 text

アジェンダ 話すこと:  コンテナセキュリティとは  コンテナをセキュアに運用するためには  コンテナセキュリティの怖い話 話さないこと:  コンテナ/Kubernetesの詳細 ※SpeakerDeckで資料公開中 2020-10-24 OSC2020 Online/Fall #osc20on 3

Slide 4

Slide 4 text

本資料でのコンテナの定義  コンテナ=アプリケーションコンテナとする  アプリケーションコンテナ=Docker(もしくはDocker 互換のコンテナ)を想定  コンテナのオーケストレーションサービスとして Kubernetesを想定  ホスト=コンテナが動作するマシンのこと KubernetesのNodeに相当 2020-10-24 OSC2020 Online/Fall #osc20on 4

Slide 5

Slide 5 text

2020-10-24 OSC2020 Online/Fall #osc20on 5

Slide 6

Slide 6 text

コンテナはセキュア?  コンテナ内のアプリケーションを非特権ユーザで動作させる  コンテナホスト上で非特権ユーザでプロセスが動作  コンテナ内で1アプリケーションのみ動作させる  コンテナ内で余計なプロセスを動作させない  複数のコンテナやコンテナホスト間をつなぐネットワークは、 分離もしくは暗号化可能  コンテナ外部からの通信は、必要なポートのみ接続される 2020-10-24 OSC2020 Online/Fall #osc20on 6

Slide 7

Slide 7 text

コンテナは(デフォルトでは) セキュアと言えない  コンテナ内のアプリケーションを特権ユーザでも動作可能  コンテナホスト上で特権ユーザでプロセスが動作  コンテナ内でsystemdを起動可能  複数プロセス起動可能  ホストの特権機能もprivilegedオプションで使用可能  複数のコンテナやコンテナホスト間をつなぐネットワークは、 デフォルトではフラットなネットワークで暗号化されない  コンテナ外部への通信は、制限されない 2020-10-24 OSC2020 Online/Fall #osc20on 7

Slide 8

Slide 8 text

OSC2020 Online/Fall #osc20on 2020-10-24 8

Slide 9

Slide 9 text

コンテナをセキュアにするには  コンテナのセキュリティポリシー  ホストの堅牢化  コンテナイメージの検査  起動したコンテナの動作を監視・制御  機密データの扱い  DevSecOpsサイクルの維持 2020-10-24 OSC2020 Online/Fall #osc20on 9

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

コンテナ環境で 必須なセキュリティポリシー  攻撃者からホストへのアクセス防止  意図しないコンテナ起動防止  ホスト/コンテナの不要な通信防止  コンテナで使用するリソース制限  ホスト/コンテナの脆弱性の排除  CIS benchmarkなど 業界標準セキュリティベンチマークの適用 2020-10-24 OSC2020 Online/Fall #osc20on 11

Slide 12

Slide 12 text

サービスで扱うデータで変わるもの  会員情報  匿名情報  個人情報を除いた、アクセス情報、購買情報など  個人情報/ペイメントカード情報  業界セキュリティ基準(GDPR/PCI-DSS/HIPPAなど)への準拠  データ保管時の暗号化  暗号鍵の外部管理  通信の暗号化(外部/コンテナ間) 2020-10-24 OSC2020 Online/Fall #osc20on 12

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

コンテナホストを堅牢化するために  自分でKubernetes環境を作成する  ホストをクローズドな環境に配置  KubernetesやDocker APIのアクセス元を制限  Kubernetesのアカウント・ロールを設定  Kubernetesへアクセスする際のアカウント管理  Managed Kubernetesの使用  Kubernetes、ホスト設定の確認 2020-10-24 OSC2020 Online/Fall #osc20on 14

Slide 15

Slide 15 text

ホストをクローズドな環境に配置  コンテナホストをクローズドネットワークに接続  ベアメタル、仮想化環境  クラウドサービス(IaaS/CaaS/KaaS)  SSHなどでアクセスせず、APIのみでアクセス 2020-10-24 OSC2020 Online/Fall #osc20on 15

Slide 16

Slide 16 text

ホストをクローズドな環境に配置  コンテナホストの構築は、Ansible/Terraform などで構築  Kubernetes コントローラの導入  ワーカーノードの追加  監視/ログ収集ツール/セキュリティソフトの導入  コンテナを動かすため最低限のソフトウェアで構成  Core OSなどのベースOS 2020-10-24 OSC2020 Online/Fall #osc20on 16

Slide 17

Slide 17 text

Kubernetes/Docker APIの アクセス元を制限  APIのアクセス元を制限し、公開状態にしない  IPアドレス指定  クラウドプロバイダによる認証  IdP(Identity Provider)/IDaaSによる認証 2020-10-24 OSC2020 Online/Fall #osc20on 17

Slide 18

Slide 18 text

 個人単位でアカウントを発行  もう令和なんだから、共用アカウントとか使用しない  ロールを定義  ネームスペース  サービス  アクセス権限  Kubernetsアカウントへのロール割当 2020-10-24 OSC2020 Online/Fall #osc20on 18 Kubernetesの アカウント・ロールを設定

Slide 19

Slide 19 text

Kubernetesへアクセスする際の アカウント管理  Kubernetesアカウントと外部アカウントの紐付け  クラウドプロバイダ  IdP(Azure AD/G Suiteなど)、IDaaS  もう令和なんだから、共用アカウントなんか使用しない 2020-10-24 OSC2020 Online/Fall #osc20on 19

Slide 20

Slide 20 text

Kubernetes、ホスト設定の確認  CSPM(Cloud Security Posture Management)を使用する  クラウド上のセキュリティ状態を検査する  Kubernetesとホストの設定を検査し、設定ミスを検知  クラウドプロバイダの設定ミスも検知  CIS benchmarkの実行  Kubernetes環境の設定変更を検知 2020-10-24 OSC2020 Online/Fall #osc20on 20

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

コンテナイメージ内の脆弱性  ライブラリやソフトウェアの脆弱性は日々発見され続ける  開発段階でコンテナイメージの脆弱性を確認  デプロイしたコンテナイメージの脆弱性を確認  コンテナイメージは脆弱性が見つかるたびに更新/対処する  コンテナ内で動作させるアプリケーションの脆弱性の対処  コンテナイメージの脆弱性を視覚化  脆弱性をレベル分けし、危険度が高いものだけを表示 2020-10-24 OSC2020 Online/Fall #osc20on 22

Slide 23

Slide 23 text

コンテナの脆弱性スキャン  コンテナホストに対する脆弱性スキャン  コンテナイメージに対する脆弱性スキャン  コンテナのレイヤ単位でスキャンが可能  実行中コンテナに対する脆弱性スキャン  継続的スキャン 2020-10-24 OSC2020 Online/Fall #osc20on 23

Slide 24

Slide 24 text

静的スキャンツール  コンテナ内に含まれるライブラリパッケージから、いくつか の基準で脆弱性を検知  NVD/CVE/OSベンダーなどの脆弱性情報  言語ライブラリ(Python/Node.js/Rubyなど)の脆弱性情報  脆弱性の脅威度によってレベル分け  既存のマルウェアの検知  鍵情報などが埋め込まれていないか 2020-10-24 OSC2020 Online/Fall #osc20on 24

Slide 25

Slide 25 text

継続的スキャン  コンテナ静的スキャンを、開発中からデプロイ後まで実施  実行中コンテナのイメージに脆弱性があるか  CI/CDの一部に含むことで、脆弱性の素早い対処が可能  シフトレフト 障害対応を開発に寄せること(シフトレフト)で、 開発から運用までの人的コストを下げる 2020-10-24 OSC2020 Online/Fall #osc20on 25

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

特権ユーザでの コンテナアプリケーション実行(1) 2020-10-24 OSC2020 Online/Fall #osc20on 27  コンテナ内でアプリケーションのrootユーザ権限 実行→コンテナ外でもroot権限で実行される  Docker rootless(非特権ユーザでのコンテナ実行) で回避可能  Podmanは、デフォルトでコンテナ内のUIDは、 ホストからは別UIDとして扱う  KuberentesのPod Security Policyでrootユーザで の実行を禁止(runAsUser)

Slide 28

Slide 28 text

特権ユーザでの コンテナアプリケーション実行(2) 2020-10-24 OSC2020 Online/Fall #osc20on 28  --privileged オプション付きでコンテナ起動 →コンテナホストの特権操作がコンテナで可能  KubernetesのPod Security Policy により privilegedオプションをつけたコンテナ起動を禁止 (privileged/allowedCapabilities/defaultAddCapabilities)

Slide 29

Slide 29 text

ローカルボリュームをマウントして コンテナ起動 2020-10-24 OSC2020 Online/Fall #osc20on 29  /var や /etc などのディレクトリを読書き可能で マウントしてコンテナ起動 →/var以下のdockerソケットにアクセスすること で、コンテナから別のコンテナを起動可能  KubernetesのPod Security Policy によりマウント 可能なディレクトリ(allowedHostPaths)を指定  KubernetesのPod Security Policy によりマウント できるVolume Plugin(volumes)を指定可能

Slide 30

Slide 30 text

不要なコンテナ外への通信 2020-10-24 OSC2020 Online/Fall #osc20on 30  外部からPodへの通信は制御するが、 Podから外部への通信は制限されない →不要なファイルをダウンロードされる可能性 →内部の不正なPod/コンテナから通信される可能性  KubernetesのServiceリソースにより、 Service配下のPodの通信先を制御  Firewall による制御

Slide 31

Slide 31 text

Kubernetesで設定できる セキュリティポリシー 特権(privileged)コンテナの実行 privileged ホスト名空間の使用 hostPID, hostIPC 使用可能なホストネットワークとポート hostNetwork, hostPorts Podで使用可能なFSGroupの割当て fsGroup 使用可能なボリュームタイプ volumes 使用可能なホストファイルシステム allowedHostPaths Read Only rootファイルシステムの使用 readOnlyRootFilesystem コンテナのユーザID/グループID runAsUser, runAsGroup, supplementalGroups ルート権限への昇格を制限する allowPrivilegeEscalation, defaultAllowPrivilegeEscalation 2020-10-24 OSC2020 Online/Fall #osc20on 31

Slide 32

Slide 32 text

Kubernetesで制御不可能な 意図しないコマンド実行 2020-10-24 OSC2020 Online/Fall #osc20on 32  使用できるコマンドの制限  使用するsystem callの制限  イメージに含まれていないファイル/イメージと 異なるファイルを実行しない  設定ファイルを変更してプロセス再起動

Slide 33

Slide 33 text

セキュリティソフトウェアによる ランタイム監視 2020-10-24 OSC2020 Online/Fall #osc20on 33  ランタイム監視=実行中のコンテナの監視  ランタイム監視に求められること  実行中コンテナの脆弱性検知  ファイルインジェクションの検知  起動時から変更されたファイルの実行阻止  コンテナ内で実行可能・不可能なコマンド/system callの設定  コンテナ間・コンテナ外への不正な通信の禁止(Firewall)

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

機密データの分離  セキュリティレベルが違うデータを分離  会員情報/匿名情報  個人情報/ペイメント情報  リソースで分離  Kubernetes コントローラ  Node  Namespace 2020-10-24 OSC2020 Online/Fall #osc20on 35

Slide 36

Slide 36 text

機密データ保管時の暗号化  暗号化機能付きのDBに保管  DB機能で、暗号化/復号を行う  DBへの通信経路を暗号化する必要あり  暗号化してPVに保管  コントローラ/ネームスペース/ホスト/PVでデータを分離  データを公開鍵暗号方式で暗号化して保管  暗号化するサービスと復号するサービスで鍵を分離 2020-10-24 OSC2020 Online/Fall #osc20on 36

Slide 37

Slide 37 text

暗号鍵の扱い  暗号鍵はKubernetesのSecurityリソースで管理  Secret自体はただのbase64エンコードされた文字列  YAMLファイルで管理するのはセキュアではない  KMS(鍵管理システム=Key Management System)の併用  Hashicorp Vault/クラウドプロバイダのKMS/pgpなどで暗号化  鍵をSecretに配置するリソース/ソフトウェアとの併用  ExternalSecretリソース/kubesec/SealedSecretリソースなど 2020-10-24 OSC2020 Online/Fall #osc20on 37

Slide 38

Slide 38 text

機密データを使用したPodを破棄  機密データを不用意に再使用しない  Podを停止することで機密データを削除  Pod上のアプリケーションでメモリ上の機密データ削除 2020-10-24 OSC2020 Online/Fall #osc20on 38

Slide 39

Slide 39 text

機密データを含む通信の暗号化  KubernetesはNode間の通信を暗号化可能  Pod間の通信は暗号化も認証もされない  解決策  アプリケーション側で経路を暗号化  既存の経路暗号化されるソリューションを使用 gRPC Istio 2020-10-24 OSC2020 Online/Fall #osc20on 39

Slide 40

Slide 40 text

gRPC(https://grpc.io/)  Google社が開発したRPC(Remote Procedure Call) 実装  Web経由のAPIなどで使用  経路としてhttp/2を使用 →TLS暗号化済み  セッション開始時に認証も可能  TLS用の証明書管理が必要 2020-10-24 OSC2020 Online/Fall #osc20on 40

Slide 41

Slide 41 text

Istio(https://istio.io/)  Istioはサービスメッシュを コントロールするソフトウェア  Istioコントルール配下のPodに、 Proxyをサイドカーパターンで配置  Proxy間の通信をmTLSで暗号化  Pod間の通信をIstioコントローラで制御可能  Istio Ingressで、Istioとの連携も可能 2020-10-24 OSC2020 Online/Fall #osc20on 41

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

セキュリティはプロセス  コンテナホスト自体の脆弱性チェック  定期的なイメージ再作成  イメージ検査  テスト(アプリケーション、ペネトレーション、負荷など)  デプロイ  未知のマルウェア、インジェクションなどへの対応  コンテナの寿命を短くする  ランタイム監視の実施  障害発生時のエスカレーション 2020-10-24 OSC2020 Online/Fall #osc20on 43

Slide 44

Slide 44 text

DevSecOpsの実践  一貫した開発・セキュリティ・運用が必要  シフトレフト  バグを運用でカバーすると高コスト  バグを開発で出し切る  運用、セキュリティコストの削減  DevSecOpsの自動化  CI/CDの考え方の導入+セキュアな考え方 2020-10-24 OSC2020 Online/Fall #osc20on 44

Slide 45

Slide 45 text

Development  ベースOSの選定  言語、ライブラリ、パッケージの選定  セキュリティ基準に則った開発  アプリケーションの静的解析  ペネトレーションテスト 2020-10-24 OSC2020 Online/Fall #osc20on 45

Slide 46

Slide 46 text

Security  セキュリティ基準の策定  CIS/NIST  GDPR/PCI-DSS/HIPS  DevとOpsに対するセキュリティ対策支援  開発のセキュリティ基準  コンテナセキュリティの方針決定  開発環境→デプロイ→本番環境のすべてをセキュアにする 2020-10-24 OSC2020 Online/Fall #osc20on 46

Slide 47

Slide 47 text

Operations  イメージアップデートとデプロイ  脆弱性スキャンの反映  動的スキャナとの組み合わせ  ログ/障害監視  障害検知時のエスカレーション 2020-10-24 OSC2020 Online/Fall #osc20on 47

Slide 48

Slide 48 text

コンテナイメージの脆弱性スキャン  スキャンにより脆弱性が見つかった場合  ベースイメージ、パッケージ、使用ライブラリの更新  イメージの再作成→脆弱性検査  新コンテナイメージのデプロイ  ローリングアップデート  カナリアデプロイ  ブルー/グリーンデプロイ  脆弱性は日々発見される 定期的に脆弱性スキャン実施する必要がある 2020-10-24 OSC2020 Online/Fall #osc20on 48

Slide 49

Slide 49 text

アプリケーションの脆弱性  アプリケーションの脆弱性  SQLインジェクション  CSR/CSRF  ファイルのインジェクション  コマンド実行  アプリケーション脆弱性の対応  アプリケーションで使用するライブラリは、最新のものを選択  脆弱性を意識したアプリケーション開発  ペネトレーションテストの実施 2020-10-24 OSC2020 Online/Fall #osc20on 49

Slide 50

Slide 50 text

CI/CDツールと 静的イメージスキャンの組み合わせ  CI/CDツール  Gitlab  GitHub Actions  Jenkins  Circle CI  Travis CI  アプリケーションのテスト/脆弱性スキャン  イメージ作成後に静的イメージスキャン 2020-10-24 OSC2020 Online/Fall #osc20on 50

Slide 51

Slide 51 text

ルーチンワークは自動化する  CI/CDツールで出来ることは自動化する  アプリケーションテスト  アプリケーション静的解析  イメージの静的スキャン  コンテナ群へのペネトレーションテスト  デプロイ  リリース中のコンテナイメージに対する脆弱性スキャン  Wazuhなど、脆弱性検査及び監視を行うツールもある 2020-10-24 OSC2020 Online/Fall #osc20on 51

Slide 52

Slide 52 text

人間は、人間に出来ることだけ行う  コード、テストの作成  レヴュー  セキュリティ設計  リリースのOK/NG  インシデント発生時の対応 2020-10-24 OSC2020 Online/Fall #osc20on 52

Slide 53

Slide 53 text

人間の脆弱性も考える  セキュリティは一番弱いところ(=人間)から狙われる  ソーシャルハック最強  アカウント管理を厳格にする?  厳格にしすぎると、逆に回避策を考えるのが人間  パスワードマネージャなどのツールに任せる  もしくはパスワードを使用しない  ゼロトラストの採用も考慮する 2020-10-24 OSC2020 Online/Fall #osc20on 53

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

Docker APIが外部に公開されてた例(1)  コンテナ環境を対象としたマルウェアKinsing(日本語化記事)  間違って設定されたオープン状態のDocker APIポートを攻撃対象  セキュリティ対策の無効化とログのクリア  多数のアプリケーション(クリプトマイナーを含む)を停止/削除  競合する悪意のあるコンテナを強制終了/イメージを削除  Kinsingマルウェアのダウンロードと実行  Kinsing自体の拡散 2020-10-24 OSC2020 Online/Fall #osc20on 55

Slide 56

Slide 56 text

Docker APIが外部に公開されてた例(2)  攻撃者が悪意あるイメージをホスト上に直接ビルド (日本語化記事)  公開されているDocker APIを使用  コンテナイメージを攻撃対象のホストでビルド  作成されたイメージはどこのレジストリにも保存されない →確認/対応しにくい  イメージの名前/IDをランダムに生成  クリプトマイニングを実行 2020-10-24 OSC2020 Online/Fall #osc20on 56

Slide 57

Slide 57 text

公開されたイメージ内に マルウェア実行するスクリプト  DzMLTによるクリプトマイニング(日本語訳)  DockerHub上に存在するイメージに含まれた  イメージ自体にマルウェアは含まれない  イメージのENTRYPOINTでsshdを起動しバックドアとする  GitHubからマルウェアをダウンロードして実行  クリプトマイニングを実行 2020-10-24 OSC2020 Online/Fall #osc20on 57

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

セキュリティよくわからない  自分で学ぶ  ThinkITで連載してます(ダイマ) https://thinkit.co.jp/series/9523  金で解決する  セキュリティに強い人材を確保・育成する  セキュリティコンサルタントを雇う  商用のコンテナセキュリティツールを使う 2020-10-24 OSC2020 Online/Fall #osc20on 59

Slide 60

Slide 60 text

商用コンテナセキュリティ製品  Aqua Security  イメージスキャン、ランタイムスキャン、監視、L3FW  日本販社あり  Prisma Cloud  イメージスキャン、ランタイムスキャン、監視、L7FW  日本販社あり  sysdig  イメージスキャン、ランタイムスキャン、監視  日本販社あり 2020-10-24 OSC2020 Online/Fall #osc20on 60

Slide 61

Slide 61 text

最後に  この資料は、コンテナのセキュリティを考える為のきっかけ  セキュリティ的な考え方はオンプレミス・IaaSと変わらない  でも、コンテナのセキュリティには違う部分もあります  自分で答えを見つけよう 2020-10-24 OSC2020 Online/Fall #osc20on 61