Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンテナを守る技術2018/container-security-20180310

 コンテナを守る技術2018/container-security-20180310

JAWS DAYS 2018

ryo nakamaru

March 10, 2018
Tweet

More Decks by ryo nakamaru

Other Decks in Technology

Transcript

  1. 中丸 良 @pottava • AWS Certified SA, DevOps Engineer -

    Pro • CTO at SUPINF Inc. / Solutions Architect at Rescale, Inc. • クラサバ ERP → Web → クラウド / Docker → HPC / ML Profile 2
  2. 中丸 良 @pottava • AWS Certified SA, DevOps Engineer -

    Pro • CTO at SUPINF Inc. / Solutions Architect at Rescale, Inc. • クラサバ ERP → Web → クラウド / Docker → HPC / ML Profile 3 (今日のセッション概要ページより)
  3. クイズ! DockerHub 2015 年の状況で正しいものはどれ? 7 1. リポジトリごとに 平均 180 の脆弱性

    がある 2. 多くのリポジトリは 100 日以上 メンテナンスされていない 3. 脆弱な親を持つイメージは当然脆弱性も引き継ぐ
  4. これまではホストごとの管理が基本 17   EC2  Classic Web (PHP 5.3) - Port: 80

    - RDS, CW Logs を利用  SecurityGroup - TCP: 80  InstanceRole - CWLogs-Write
  5. これまではホストごとの管理が基本 18   EC2  Classic Web (PHP 5.3) - Port: 80

    - RDS, CW Logs を利用  REST API (Java 9) - Port: 8080 - DynamoDB  SecurityGroup - TCP: 80 - TCP: 8080  InstanceRole - CWLogs-Write - DynamoDB-Read
  6. ホストとアプリを適切に管理できる時代に 19 EC2  SecurityGroup - Allow nothing  InstanceRole - ECR-Read

     Classic Web (PHP 5.3) - Port: 80 - RDS, CW Logs を利用  REST API (Java 9) - Port: 80 - DynamoDB
  7. ホストとアプリを適切に管理できる時代に 20 EC2  SecurityGroup - TCP 80  TaskRole - CWLogs-Write

     SecurityGroup - Allow nothing  InstanceRole - ECR-Read  SecurityGroup - TCP 80  TaskRole - DynamoDB-Read  Classic Web (PHP 5.3) - Port: 80 - RDS, CW Logs を利用  REST API (Java 9) - Port: 80 - DynamoDB
  8. ホストまで管理する? 25 • 社内規定で許可された AWS サービスしか利用できない • ホストにインストールしないといけないものがある ‣ IDS

    / IPS などセキュリティ製品 ‣ ログ・メトリクス・トレース情報などの収集 • ハードウェアに強く依存するソフトウェアを動かしたい ‣ 特定の CPU アーキテクチャ / GPU ‣ 各種 I/O のために EC2 やカーネルの設定を変えたい
  9. awsvpc モード アプリケーション専用のネットワーク 27 ECS EC2  SecurityGroup - TCP 80

    from ALB α  SecurityGroup - TCP 80 from ALB β  REST API コンテナ A - Port: 80  REST API コンテナ B - Port: 80 ALB α ALB β
  10. アプリケーションに必要なものの定義 30  REST API コンテナ - Port 80 番を公開 -

    auth コンテナと話したい - メモリ 128 MiB 最低限確保 - メモリ 512 MiB 超えたら死 - ファイル書き込み不要 - 標準出力は CW Logs に
  11. ECS タスク定義 アプリケーションに必要なものの定義 31  REST API コンテナ - Port 80

    番を公開 - auth コンテナと話したい - メモリ 128 MiB 最低限確保 - メモリ 512 MiB 超えたら死 - ファイル書き込み不要 - 標準出力は CW Logs に ▶   {     "portMappings": [{       "ContainerPort": 80     }],     "links": ["auth:auth"],     "memoryReservation": 126,     "memory": 512,     "readonlyRootFilesystem": true,     "logConfiguration": {       "logDriver": "awslogs",       ...     }   }
  12. ECS タスク定義 32 • Docker が本来持つセキュリティオプションも数多く使える ‣ readonlyRootFilesystem (--read-only) ‣

    mountPoints.readOnly (--volume), volumesFrom.readOnly ‣ ulimits (--ulimit) / memory / cpu (--cpu-shares) ‣ linuxParameters.capabilities (--cap-add / --cap-drop) ‣ dockerSecurityOptions (--security-opt) ←SELinux, AppArmor のみ • 厳密に定義するほど 想定していない挙動を抑えることができる • 同居する他のコンテナに影響を与えないためにも
  13. アプリ実行中に攻撃やポリシー違反がないかをモニタ 3. 実行時スキャン 40  EC2  コンテナ A  コンテナ C  コンテナ

    B 何らかのサービス - 脅威の判定 - SIEM 収集. - etc.………..  監視ツール  監視ツール
  14. 41 継続的なチェック • コードベースが変わる度にポリシーを 都度 チェック(CI) • 新しく発見された脆弱性などの影響を 定期的に チェック

    • アプリケーション 実行中に 攻撃の有無やポリシー違反をチェック ‣ コンテナだけでなくホストもね
  15. コンテナの守り方 44 • コンポーネント編 ‣ ホストとコンテナ ‣ ホスト ‣ Docker

    コンテナ • ライフサイクル編 ‣ Build(ごとの都度テスト)& Ship(後の定期的なスキャン) ‣ Deploy(後の実行時スキャン)
  16. 攻撃の侵入口を減らそう 49 IAM Role、SecurityGroup の解放も 必要最小限に EC2  SecurityGroup - TCP

    80 From ELB  TaskRole - CWLogs-Write  SecurityGroup - Allow nothing  InstanceRole - ECR-Read  コンテナ - Port: 80 - CW Logs にログ
  17. 51 ホストはこれまで通りに守る • コンテナを使うからといっても。 • インスタンスハードニング、堅牢化 ‣ ホワイトリストの導入(ガイド:NIST 800-167) ‣

    パッチ管理、設定変更管理 • セキュリティ製品のインストール ‣ AWS Inspector 有用、ただ他製品との組み合わせも大事
  18. Docker ホストとして大丈夫? 52 github.com/docker/docker-bench-security The Docker Bench for Security is

    a script that checks for dozens of common best-practices around deploying Docker containers in production.
  19. VirtualMachines 56 ハイパーバイザ ホスト OS ホスト OS dockerd containerd application

    A … Containers ゲスト OS Y ゲスト OS Z VM と Docker コンテナ application B application C runc application A runc application B runc application C
  20. VirtualMachines 57 ハイパーバイザ ホスト OS ホスト OS dockerd containerd application

    A … Containers ゲスト OS Y ゲスト OS Z VM と Docker コンテナ application B application C runc application A runc application B runc application C リソースの分離が VM ほど厳密ではない • Docker コンテナは ホストのカーネルで 走る • ホストのリソースをほぼ 直接利用 する ⇨ 各種設定で綿密に縛っていく
  21. きちんとリソース制約 58 巻き込み事故を防ぐために • ulimits (--ulimit) で利用できる上限を決める • memory を指定して、それを超えたらコンテナを落とす

    • 必要なリソースを事前に厳密に計測すると安心感しかない ‣ 過剰なリソース利用が起きても 他への影響小 ‣ サイジングやスケール戦略も想定しやすい
  22. • システムコールに正しく権限チェックがかかるように • 面倒がらずちゃんと 適切なユーザを作りましょう • アプリケーションにあった方法で ‣ Dockerfile の

    USER 命令でデフォルトユーザを変更 ‣ タスク定義の user で実行時のユーザを強制 ‣ entrypoint.sh と gosu の組み合わせ ‣ etc. ルートユーザは使わない 60 AWS アカウント同様に!
  23. • 利用するバイナリ だけ をイメージに入れる ‣ できれば 静的リンク しておく(ldd / strace

    で確認) ‣ 小さい Docker イメージにも貢献 • suid, sgid がセットされたバイナリは Docker イメージで除外 • 後述の SaaS の力を借りれば・・ 実行ファイルの管理 61 不必要なファイルは削除・無効化  RUN find / -perm /6000 -type f -exec chmod a-s {} \; || true
  24. • どこと通信するのかを まず 把握 ‣ North / South: クラスタ外部とは? ‣

    East / West: クラスタ内部では? • タスク定義で有用なオプション ‣ links: 同じタスク定義内で通信が必要なとき ‣ networkMode: none、bridge、awsvpc または host ‣ disableNetworking: 該当コンテナのネットワーキングを無効に • これも後述の SaaS を使えば・・ 通信を制限する 62 通信先、解放ポートも最小限に
  25. システムコールを制限する 63 ほんとは seccomp を使いたい • ECS は seccomp 未対応、SELinux

    と AppArmor は使途違い • linuxParameters.capabilities でドロップドロップ〜 ‣ それぞれの Capability で制御できるシステムコールとにらめっこ ‣ ここで制御できないものはできない • ただ、これ突き詰める必要ある・・?
  26. • Static Application Security Testing ツール (OSS / 商用) の利用

    ‣ https://www.owasp.org/index.php/Source_Code_Analysis_Tools ‣ https://github.com/mre/awesome-static-analysis ‣ CoreOS の Clair • Docker イメージの ポリシーを定義 & チェック ‣ GoogleCloudPlatform/container-structure-test の yaml ‣ Aqua security の Manifesto CI 65 コードの静的解析、Docker イメージの解析・ポリシーテスト
  27. GoogleCloudPlatform/container-structure-test 66 コンテナの あるべき姿 をポリシーとして定義、テスト可能 ‣ 指定したコマンドに対する出力は正しいか ‣ ファイルは正しい属性で存在するか ‣

    ENTRYPOINT や CMD、環境変数、ポートなどメタデータは正しいか   $ cat << EOF > test.yaml   schemaVersion: '2.0.0'   fileExistenceTests:    - name: 'binary'    path: '/usr/bin/aws'    shouldExist: true   EOF   $ docker run --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock \    -v $(pwd):/config supinf/container-struct-test:0.2 \    -image supinf/awscli:1.14 /config/test.yaml
  28. • イメージの静的解析 ‣ coreos/clair ‣ eliasgranderubio/dagda • CI 以降、SaaS を使うことも検討

    ‣ aqua: https://www.aquasec.com/partners/aws-container-security-ecs/ ‣ NeuVector: https://neuvector.com/solutions-for-aws-ecs-security/ ‣ Twistlock: https://www.twistlock.com/solutions/amazon-ecs-security/ 新たな脅威への対応 69 Docker イメージの定期的な解析
  29. • ECR のイメージ解析 ‣ 脆弱性が仕込まれていないか ‣ 設定不備、秘密情報の混入はないか • 実行時防御 ‣

    攻撃検知、ポリシー違反のチェック ‣ 実際の挙動からセキュリティポリシーの自動生成 • IAM、KMS と統合されたコンテナレベルの RBAC、秘密情報管理 aqua 70 AWS の各サービスとも統合された商用ツール
  30. 秘密情報の扱い 74 扱う秘密情報は年々増える • ベタ書きや設定ファイルの持ち込みはありえないとしても・・ • 環境変数? ‣ 12 factor

    apps ですねわかります ‣ でもそれだといろんなところから見えちゃいますよ? ‣ 一度設定すると消すことも叶わなかったり・・
  31. 2017 年からの秘密 76 SSM Parameter Store & KMS & IAM

    Role https://aws.amazon.com/jp/blogs/news/managing-secrets-for-amazon-ecs-applications-using-parameter-store-and-iam-roles-for-tasks/
  32. みんなで意識するセキュリティ 78 それぞれがポリシーを作り、チェックされる仕組み作り • 一般的な脆弱性は当然対応するとして • Developers / Ops engineers

    ‣ 厳密に制約されたタスク定義 ‣ IAM Role, SecurityGroup, .. ‣ Docker イメージポリシー(e.g. container-structure-test.yaml ) • Security engineers ‣ SaaS の実行ファイル / Docker イメージ利用制御 ‣ SaaS のネットワークポリシー
  33. JAWS-UG コンテナ支部 82 • AWS でのコンテナ利用事例、ベストプラクティスの知見交換 • 定期的な AWS /

    コンテナ初心者向けハンズオン • 懇親会でも熱くコンテナを語る参加者のみなさん
  34. Containerize your app! 83 • クラウド / コンテナ を強みにした受託開発運用、コンサルティング •

    2015 年から Docker の本番運用を開始・豊富な CI / CD 事例 • スピンフ、と読みます・・ We’re hiring!!!
  35. ご静聴ありがとうございました 参考文献: • Cloud Native Technologies in the Fortune 100

              http://redmonk.com/fryan/2017/09/10/cloud-native-technologies-in-the-fortune-100/ • A Study of Security Vulnerabilities on Docker Hub        http://dance.csc.ncsu.edu/papers/codaspy17.pdf • NIST Special Publication 800-167 - Guide to Application Whitelisting   https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-167.pdf • タスクIAMロールとパラメータストアを利用したAmazon ECSアプリケーションの秘密情報管理   https://aws.amazon.com/jp/blogs/news/managing-secrets-for-amazon-ecs-applications- using-parameter-store-and-iam-roles-for-tasks/