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

OSSで始めるコンテナセキュリティ / Container Security with OSS tools

OSSで始めるコンテナセキュリティ / Container Security with OSS tools

クラスメソッド株式会社が主催するイベント DevelopersIO 2022 で発表した「OSSで始めるコンテナセキュリティ」の登壇資料です。
https://classmethod.jp/m/developers-io/

資料内のURLは、PDFをダウンロードするとクリックで遷移できます。

「コンテナセキュリティってなんかいろいろあるけど、結局なにからやればいいの?」という方向けに、コンテナセキュリティの全体像や概要を解説しつつ、コンテナセキュリティに対応するためのOSSを紹介するセッションです。

TERAOKA Keisuke

July 26, 2022
Tweet

More Decks by TERAOKA Keisuke

Other Decks in Technology

Transcript

  1. 2 発表者紹介 寺岡 慶佑(と ち) • 2020年11月クラスメソッド入社 • 前職: Webサービス開発・運用

    ◦ Amazon ECS/EKSを用いた構成 • 好きなAWSサービス ◦ AWS App Runner ◦ Amazon EKS • 2022 APN ALL AWS Certifications Engineer • 2021 APN AWS Top Engineer • 趣味 ◦ 紅茶、ビール @toda_kk
  2. • コンテナを使いたいが、セキュリティが不安 ◦ 利用経験がない で、コンテナ特有 事情がわからない • すでにコンテナを利用し始めているが、不正に侵入されな いか心配 ◦

    具体的な脅威がわからない ◦ ど ように侵入を防げ 良いかわからない • コンテナ セキュリティ対応 イメージがつかない ◦ 例え 、Amazon EC2 ようなVMだったらIDSやアンチマルウェ アソフトを入れるなど、イメージがつきやすい 5 よくあるご相談
  3. 6 コンテナを扱う上で、出てくる要素が多い コンテナ イメージ レジストリ Dockerfile ECR Fargate Kubernetes コンテナ

    ホスト コントロール プレーン データプレーン オーケストレーター コンテナ ランタイム CI/CD ECS EKS EC2 BuildKit
  4. • NIST SP 800-190 アプリケーションコンテナセキュリティガイ ド ◦ https://www.ipa.go.jp/files/000085279.pdf ◦ コンテナ利用における脅威と対策をまとめたも

    • CIS Docker Benchmarks ◦ https://www.cisecurity.org/benchmark/docker ◦ Docker利用におけるセキュリティベンチマーク • MITRE ATT&CK Containers Matrix ◦ https://attack.mitre.org/matrices/enterprise/containers/ ◦ 攻撃者 視点に立って脅威を整理したも 7 コンテナセキュリティにおけるフレームワーク
  5. • イメージ リスク ◦ イメージ 脆弱性 ◦ イメージ 設定 不備

    ◦ 埋め込まれたマルウェア ◦ 埋め込まれた平文 機密情報 ◦ 信頼できないイメージ 使用 • レジストリ リスク ◦ レジストリへ セキュアでない接続 ◦ レジストリ内 古いイメージ ◦ 認証・認可 不十分な制限 9 NIST SP 800-190を紹介
  6. • オーケストレーター リスク ◦ 制限 ない管理者アクセス ◦ 不正アクセス ◦ コンテナ間

    ネットワークトラフィック 不十分な分離 ◦ ワークロード 機微性レベル 混在 ◦ オーケストレーターノード 信頼 • コンテナ リスク ◦ ランタイムソフトウェア内 脆弱性 ◦ コンテナから 無制限 ネットワークアクセス ◦ セキュアでないコンテナランタイム 設定 ◦ アプリ 脆弱性 ◦ 未承認コンテナ 10 NIST SP 800-190を紹介
  7. • ホストOS リスク ◦ 大きなアタックサーフェス ◦ 共有カーネル ◦ ホストOSコンポーネント 脆弱性

    ◦ 不適切なユーザーアクセス権 ◦ ホストOSファイルシステム 改ざん 11 NIST SP 800-190を紹介
  8. • イメージ ビルド時 リスクを想定 • Log4Shellなどアプリケーション 脆弱性を含んだコンテナ イメージを作成し実行 • アプリケーション

    脆弱性を利用して、実行中 コンテナ 外部から任意 コードを実行されてしまう 12 コンテナ利用における脅威 シナリオ① Attacker Container 任意 コードを実行 アプリケーション 脆弱性を含んだコンテナ
  9. • イメージ ビルド時 リスクを想定 • Dockerfileに機密情報を直接書き込んだ上でイメージを作 成 ◦ AWSアクセスキーやDB 接続・認証情報など

    • 実行中 コンテナ外部からdocker historyコマンドで機密 情報が奪取されてしまう 13 コンテナ利用における脅威 シナリオ② Attacker Container docker history 機密情報を含んだ コンテナ
  10. • コンテナ実行時 リスクを想定 • なんらか 手段でコンテナ 接続経路や認証情報が奪取 され、docker/kubectl execコマンドで侵入される •

    コンテナ上でコインマイナーなど不正なファイルをダウン ロードされ、実行されてしまう 14 コンテナ利用における脅威 シナリオ③ Attacker Container 侵入 ダウンロード Malware
  11. • 関連するAWSサービスと機能を羅列してみる ◦ Amazon ECRによる、コンテナイメージ 脆弱性スキャン ▪ 基本スキャン / 拡張スキャン

    ◦ Amazon ECRにおける、レジストリ保護 ▪ コンテナイメージ ライフサイクルポリシー ▪ レジストリ アクセスポリシー、暗号化 ◦ AWS Security HubやAWS Configによる、マネージドサービス 構成管理 ▪ ECR、ECS、EKSに関するチェック項目やマネージドルール ◦ Amazon Inspectorによる、Amazon EC2 脆弱性検知 ◦ Amazon GuardDutyによる、Amazon EKS 監査ログ監視 ▪ EKSクラスターにおける脅威 発生を検知 18 AWSサービスによる対応方法を考える
  12. • 必要となる対応内容 、ケースバイケース ◦ 重視したい脅威やリスク 、企業や組織ごとに異なる ◦ セキュリティポリシーにもよる • ここで挙げたも

    、あくまでもマネージドサービス ◦ 導入や管理 手間が省けるが、カバーできない範囲もある ◦ 特に「コンテナランタイム 保護」 部分 、現状で AWS サービスだけで 対応できない • 比較的少額と いえ有料 サービスもある で、もっと気 軽に試してみたい 26 AWSサービスによる対応 みで充分か?
  13. • Trivy 、コンテナイメージ 脆弱性スキャンツール • Falco 、ランタイム保護を提供するツール • どちらもLinux Foundationが提供するKubernetesセキュリ

    ティ認定試験 カリキュラムに組み込まれている ◦ Certified Kubernetes Security Specialist (CKS) ◦ コンテナセキュリティにおいてデファクトスタンダードなツールと 言える 29 TrivyとFalcoについて
  14. 32

  15. • Aqua Security社が中心となって開発されているOSS ◦ 元 日本 個人開発 OSSだった • 元

    コンテナイメージ 脆弱性スキャンが主な機能だった が、現在に 他にも機能が豊富 ◦ DockerfileやIaCツール 設定チェック(Lint)機能 ◦ ファイルシステムやGitリポジトリを指定したスキャンも可能 • Kubernetesであれ 、オーケストレーター保護も可能 ◦ 実行中 クラスターを丸ごとスキャンできる 33 Trivyと ? https://aquasecurity.github.io/trivy/dev/ https://github.com/aquasecurity/trivy https://knqyf263.hatenablog.com/entry/2019/08/20/120713
  16. • Trivyをインストールする 34 コンテナイメージ 脆弱性スキャン $ rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.30.2/trivy_0.30.2_Linux-64bit.rpm $

    apt-get install trivy $ yum install trivy $ brew install aquasecurity/trivy/trivy $ docker run aquasec/trivy https://aquasecurity.github.io/trivy/dev/getting-started/installation/
  17. • コンテナイメージをスキャンしてみる $ trivy image nginx:latest 2022-07-26T05:55:58.469Z INFO Vulnerability scanning

    is enabled 2022-07-26T05:55:58.469Z INFO Secret scanning is enabled 2022-07-26T05:55:58.470Z INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning 2022-07-26T05:55:58.470Z INFO Please see also https://aquasecurity.github.io/trivy/0.30.2/docs/secret/scanning/#recommendation for faster secret detection 2022-07-26T05:56:11.940Z INFO Detected OS: debian 2022-07-26T05:56:11.940Z INFO Detecting Debian vulnerabilities... 2022-07-26T05:56:12.061Z INFO Number of language-specific files: 0 nginx:latest (debian 11.4) Total: 149 (UNKNOWN: 0, LOW: 93, MEDIUM: 23, HIGH: 26, CRITICAL: 7) 35 コンテナイメージ 脆弱性スキャン https://aquasecurity.github.io/trivy/dev/docs/vulnerability/scanning/image/
  18. • 出力する脆弱性を重大度でフィルタリングする $ trivy image --severity HIGH,CRITICAL nginx:latest 2022-07-26T05:57:02.030Z INFO

    Vulnerability scanning is enabled 2022-07-26T05:57:02.030Z INFO Secret scanning is enabled 2022-07-26T05:57:02.030Z INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning 2022-07-26T05:57:02.030Z INFO Please see also https://aquasecurity.github.io/trivy/0.30.2/docs/secret/scanning/#recommendation for faster secret detection 2022-07-26T05:57:02.039Z INFO Detected OS: debian 2022-07-26T05:57:02.039Z INFO Detecting Debian vulnerabilities... 2022-07-26T05:57:02.075Z INFO Number of language-specific files: 0 nginx:latest (debian 11.4) Total: 33 (HIGH: 26, CRITICAL: 7) 37 コンテナイメージ 脆弱性スキャン
  19. • ECRに保存されたイメージをスキャンしてみる $ aws ecr get-login-password --region ap-northeast-1 | docker

    login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com $ trivy image 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/dvwa:latest 2022-07-26T05:58:00.004Z INFO Vulnerability scanning is enabled 2022-07-26T05:58:00.005Z INFO Secret scanning is enabled 2022-07-26T05:58:00.005Z INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning 2022-07-26T05:58:00.005Z INFO Please see also https://aquasecurity.github.io/trivy/0.30.2/docs/secret/scanning/#recommendation for faster secret detection 2022-07-26T05:58:00.345Z INFO Detected OS: debian 2022-07-26T05:58:00.345Z INFO Detecting Debian vulnerabilities... 2022-07-26T05:58:00.527Z INFO Number of language-specific files: 0 2022-07-26T05:58:00.821Z WARN This OS version is no longer supported by the distribution: debian 9.5 2022-07-26T05:58:00.822Z WARN The vulnerability detection may be insufficient because security updates are not provided 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/dvwa:latest (debian 9.5) Total: 2114 (UNKNOWN: 13, LOW: 353, MEDIUM: 694, HIGH: 740, CRITICAL: 314) 38 コンテナイメージ 脆弱性スキャン
  20. • イメージ ビルド時 リスクを想定 • Log4Shellなどアプリケーション 脆弱性を含んだコンテナ イメージを作成し実行 • アプリケーション

    脆弱性を利用して、実行中 コンテナ 外部から任意 コードを実行されてしまう 40 (再掲) コンテナ利用における脅威 シナリオ① Attacker Container 任意 コードを実行 アプリケーション 脆弱性を含んだコンテナ
  21. • 古いバージョン Elasticsearchイメージをスキャン ◦ Log4Shell(CVE-2021-44828) 検出されないも 、Log4j 別 脆弱性(CVE-2021-44832)が検出された ◦

    ベンダーから公式に提供されるコンテナイメージ 日々更新さ れていくため、脆弱性情報も更新される ◦ $ trivy image docker.elastic.co/elasticsearch/elasticsearch:7.16.2-amd64 (中略) Java (jar) Total: 17 (UNKNOWN: 1, LOW: 2, MEDIUM: 9, HIGH: 5, CRITICAL: 0) 41 脅威シナリオ①に対する対応策 https://dev.classmethod.jp/articles/amazon-inspector-container-image-scan-log4shell/ https://www.creationline.com/lab/aquasecurity/47375 https://www.creationline.com/lab/aquasecurity/47868
  22. • Trivyで コンテナイメージ 脆弱性スキャンだけでなく、 Dockerfile 設定に不備がないかチェックできる • ビルトインポリシーとして aquasecurity/defses を利用

    ◦ カスタムポリシーを作成して適用することも可能 FROM ubuntu:latest RUN apt-get update RUN apt-get install curl wget EXPOSE 22 42 Dockerfile 設定チェック https://aquasecurity.github.io/trivy/dev/docs/misconfiguration/scanning/ https://aquasecurity.github.io/trivy/dev/docs/misconfiguration/policy/builtin/ Dockerfile
  23. • ディレクトリを指定して設定チェックを実行する 43 Dockerfile 設定チェック $ trivy config ./ (中略)

    MEDIUM: Specify a tag in the 'FROM' statement for image 'ubuntu' When using a 'FROM' statement you should use a specific tag to avoid uncontrolled behavior when the image is updated. See https://avd.aquasec.com/misconfig/ds001 Dockerfile:1 1 [ FROM ubuntu:latest HIGH: Specify at least 1 USER command in Dockerfile with non-root user as argument Running containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile. See https://avd.aquasec.com/misconfig/ds002 MEDIUM: Port 22 should not be exposed in Dockerfile Exposing port 22 might allow users to SSH into the container. See https://avd.aquasec.com/misconfig/ds004 Dockerfile:6 6 [ EXPOSE 22 HIGH: The instruction 'RUN <package-manager> update' should always be followed by '<package-manager> install' in the same RUN statement. The instruction 'RUN <package-manager> update' should always be followed by '<package-manager> install' in the same RUN statement. See https://avd.aquasec.com/misconfig/ds017 Dockerfile:3 3 [ RUN apt-get update HIGH: '-y' flag is missed: 'apt-get install curl wget' 'apt-get' calls should use the flag '-y' to avoid manual user input. See https://avd.aquasec.com/misconfig/ds021 Dockerfile:4 4 [ RUN apt-get install curl wget
  24. • 出力に従ってDockerfileを修正し、再度チェックする ◦ Dockerfileを修正 ◦ 再度Trivyで設定チェック ▪ 警告なしで終了 $ trivy

    config ./ 2022-07-24T10:31:44.612Z INFO Misconfiguration scanning is enabled 2022-07-24T10:31:44.855Z INFO Detected config files: 1 44 Dockerfile 設定チェック FROM ubuntu:22.04 RUN apt-get update && apt-get install -y curl wget USER ubuntu Dockerfile
  25. • イメージ ビルド時 リスクを想定 • Dockerfileに機密情報を直接書き込んだ上でイメージを作 成 ◦ AWSアクセスキーやDB 接続・認証情報など

    • 実行中 コンテナ外部からdocker historyコマンドで機密 情報が奪取されてしまう 45 (再掲) コンテナ利用における脅威 シナリオ② Attacker Container docker history 機密情報を含んだ コンテナ
  26. • AWSアクセスキーなどを書き込んだDockerfileを用意 FROM ubuntu:22.04 COPY app.sh / RUN chmod +x

    /app.sh ENTRYPOINT ["/app.sh"] 46 脅威シナリオ②に対する対応策 Dockerfile export AWS_ACCOUNT_ID=123456789012 export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY app.sh
  27. • コンテナイメージをビルドし、Trivyでスキャンを実行 ◦ trivy configコマンドで 機密情報 スキャンに対応していない で、trivy imageコマンドを実行する必要がある $

    docker build -t aws-secrets-image . $ trivy image aws-secrets-image (中略) /app.sh (secrets) Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 2) CRITICAL: AWS (aws-access-key-id) AWS Access Key ID /app.sh:4 4 [ export AWS_ACCESS_KEY_ID=******************** HIGH: AWS (aws-account-id) AWS Account ID /app.sh:3 3 [ export AWS_ACCOUNT_ID=************ CRITICAL: AWS (aws-secret-access-key) AWS Secret Access Key /app.sh:5 5 [ export AWS_SECRET_ACCESS_KEY=**************************************** 47 脅威シナリオ②に対する対応策
  28. • Aqua Security社 AWSパートナーであり、Trivyによる実行 結果をSecurity Hubによって管理することも可能 49 補足: Security Hubと

    統合も可能 https://aws.amazon.com/jp/blogs/security/how-to-build-ci-cd-pipeline-container-vulnerability-scanning-trivy-and-aws-security-hub/
  29. name: build jobs: build: name: Build runs-on: ubuntu-20.04 steps: -

    name: Checkout code uses: actions/checkout@v2 - name: Build an image from Dockerfile run: | docker build -t my-app:${{ github.sha }} . - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: image-ref: 'my-app:${{ github.sha }}' format: 'table' exit-code: '1' ignore-unfixed: true vuln-type: 'os,library' severity: 'CRITICAL,HIGH' • Trivy ActionがAqua Security社から提供されている 50 CI/CDへ 組み込み: GitHub Actions https://github.com/aquasecurity/trivy-action .github/workflows/build.yaml
  30. • Kubernetesクラスター上 コンテナをスキャンし、脆弱性 や機密情報 有無、設定チェックができる • CLI 他に、Trivy-OperatorをKubernetesクラスター内に常 駐させることで定期的なスキャンが実現できる $

    trivy k8s –report=summary cluster-name 51 Kubernetesオーケストレーター保護 https://aquasecurity.github.io/trivy/dev/docs/kubernetes/cli/scanning/ https://github.com/aquasecurity/trivy-operator https://aquasecurity.github.io/trivy-operator/v0.1.5/
  31. • Trivyを利用することで、コンテナイメージスキャンや Dockerfile設定チェックを容易に導入できる ◦ CI/CDパイプラインへ 組み込みも容易 ◦ 他にも機能が豊富 • Kubernetesであれ

    、オーケストレーター保護も可能 • 近年、サプライチェーンセキュリティ 文脈から注目されて いるSBOM 作成も可能 ◦ Software Bill Of Materials ◦ ソフトウェアに含まれる依存関係やライブラリ 種類などをリス ト化したも 52 Trivyに関するまとめ
  32. 53

  33. • Sysdig社が中心となって開発されているOSS ◦ 現在 CNCF(Cloud Native Computing Foundation)に寄贈され ている •

    ランタイムセキュリティを提供するツール ◦ ランタイムにおける振る舞いを動的にスキャンし、異常な振る 舞いを検知する ◦ コンテナに限らず、ホスト ランタイム保護なども可能 • 振る舞い 検知に注力したツールである ◦ 異常な振る舞い 検知に加えて防止まで実施したい場合 、 商用製品であるSysdig Secureを導入する必要がある 54 Falcoと ? https://falco.org/ https://github.com/falcosecurity/falco
  34. • Falcoをインストールする $ sudo rpm --import https://falco.org/repo/falcosecurity-3672BA8F.asc $ sudo curl

    -s -o /etc/yum.repos.d/falcosecurity.repo https://falco.org/repo/falcosecurity-rpm.repo $ sudo yum -y install kernel-devel-$(uname -r) $ sudo yum -y install falco 57 Amazon Linux 2 on EC2環境で実行してみる https://falco.org/docs/getting-started/installation/
  35. • Falcoを実行してみる ◦ 動作確認 ため 一時的な実行 $ sudo falco Mon

    Jul 26 06:00:00 2022: Falco version 0.32.1 Mon Jul 26 06:00:00 2022: Falco initialized with configuration file /etc/falco/falco.yaml Mon Jul 26 06:00:00 2022: Loading rules from file /etc/falco/falco_rules.yaml: Mon Jul 26 06:00:00 2022: Loading rules from file /etc/falco/falco_rules.local.yaml: Mon Jul 26 06:00:00 2022: Starting internal webserver, listening on port 8765 58 Amazon Linux 2 on EC2環境で実行してみる
  36. • 別 ターミナルから不正な操作を実行してみる ◦ /bin 以下にファイル作成 操作を実行 • 上記 不正なコマンドが実行されたイベントを検知し、実

    行ログが出力される $ sudo touch /bin/surprise 59 Amazon Linux 2 on EC2環境で実行してみる $ sudo falco Mon Jul 26 06:00:00 2022: Falco version 0.32.1 Mon Jul 26 06:00:00 2022: Falco initialized with configuration file /etc/falco/falco.yaml Mon Jul 26 06:00:00 2022: Loading rules from file /etc/falco/falco_rules.yaml: Mon Jul 26 06:00:00 2022: Loading rules from file /etc/falco/falco_rules.local.yaml: Mon Jul 26 06:00:00 2022: Starting internal webserver, listening on port 8765 06:00:05.421034435: Error File below a known binary directory opened for writing (user=<NA> user_loginuid=-1 command=touch /bin/surprise file=/bin/surprise parent=sudo pcmdline=sudo touch /bin/surprise gparent=bash container_id=host image=<NA>)
  37. • Falco 起動時に設定ファイルがロードされる ◦ /etc/falco/falco.yaml • ルール設定ファイルが別にあり、Falco 設定ファイルで ルール設定ファイル リストを指定している

    • デフォルトで 下記 ように指定されている https://falco.org/docs/configuration/ https://falco.org/docs/rules/ 60 ルール 設定ファイル rules_file: - /etc/falco/falco_rules.yaml - /etc/falco/falco_rules.local.yaml - /etc/falco/rules.d /etc/falco/falco.yaml
  38. • プリセットなルールによって不正な操作が検出された - macro: bin_dir condition: fd.directory in (/bin, /sbin,

    /usr/bin, /usr/sbin) - rule: Write below binary dir desc: an attempt to write to any file below a set of binary directories condition: > bin_dir and evt.dir = < and open_write and not package_mgmt_procs and not exe_running_docker_save and not python_running_get_pip and not python_running_ms_oms and not user_known_write_below_binary_dir_activities output: > File below a known binary directory opened for writing (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2] container_id=%container.id image=%container.image.repository) priority: ERROR tags: [filesystem, mitre_persistence] 61 不正な操作 検出を定義したルール /etc/falco/falco_rules.yaml
  39. • カスタムルールを設定することで、プリセットなルールを上 書きできる ◦ 独自にファイルパスを指定することも可能 - rule: Write below binary

    dir desc: an attempt to write to any file below a set of binary directories condition: > bin_dir and evt.dir = < and open_write and not package_mgmt_procs and not exe_running_docker_save and not python_running_get_pip and not python_running_ms_oms and not user_known_write_below_binary_dir_activities output: > File below a known binary directory opened for writing (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2] container_id=%container.id image=%container.image.repository) priority: NOTICE tags: [filesystem, mitre_persistence] 62 ルールを変更してみる /etc/falco/falco_rules.local.yaml
  40. • 別 ターミナルから不正な操作を実行してみる ◦ 先ほどと同じコマンドを実行する • 実行ログが ERROR から NOTICE

    に変わっている 06:10:00.630082418: Notice File below a known binary directory opened for writing (user=root user_loginuid=-1 command=touch /bin/surprise2 file=/bin/surprise2 parent=sudo pcmdline=sudo touch /bin/surprise2 gparent=sh container_id=host image=<NA>) $ sudo touch /bin/surprise2 63 変更したルールを動作確認してみる
  41. • コンテナ実行時 リスクを想定 • なんらか 手段でコンテナ 認証情報が奪取され、 docker/kubectl execコマンドなどで侵入される •

    コンテナ上でマイニングツールなど不正なファイルをダウ ンロードされ、実行されてしまう 64 (再掲) コンテナ利用における脅威 シナリオ③ Attacker Container 侵入 ダウンロード Malware
  42. • コンテナ内部へ shellアクセスを検知する ◦ docker execコマンド 実行 ◦ shellアクセスを検知 $

    sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1d524a3860c1 nginx "/docker-entrypoint.…" 31 seconds ago Up 30 seconds 80/tcp test-nginx $ sudo docker exec -it test-nginx /bin/bash root@1d524a3860c1:/# 65 脅威シナリオ③に対する対応策 06:11:00.369783385: Notice A shell was spawned in a container with an attached terminal (user=root user_loginuid=-1 test-nginx (id=1d524a3860c1) shell=bash parent=runc cmdline=bash terminal=34816 container_id=1d524a3860c1 image=nginx)
  43. • コンテナ外部から ファイルダウンロードを検知する ◦ パッケージ管理ツールやファイルダウンロード 実行 ◦ 実行やファイルダウンロードを検知 66 脅威シナリオ③に対する対応策

    11:11:20.346614943: Error Package management process launched in container (user=root user_loginuid=-1 command=apt install wget container_id=1d524a3860c1 container_name=test-nginx image=nginx:latest) 11:11:30.690053716: Notice Ingress remote file copy tool launched in container (user=root user_loginuid=-1 command=wget -P /tmp/ https://www.google.com parent_process=bash container_id=1d524a3860c1 container_name=test-nginx image=nginx:latest) root@1d524a3860c1:/# apt install wget root@1d524a3860c1:/# wget -P /tmp/ https://www.google.com
  44. • Dockerコンテナとして実行してみる ◦ 別 ホスト上で実行する ◦ 動作確認 ため -it オプションで一時的な実行

    $ docker run -it --rm \ --privileged \ -v /var/run/docker.sock:/host/var/run/docker.sock \ -v /dev:/host/dev \ -v /proc:/host/proc:ro \ -v /boot:/host/boot:ro \ -v /lib/modules:/host/lib/modules:ro \ -v /usr:/host/usr:ro \ -v /etc:/host/etc:ro \ falcosecurity/falco:latest 68 Falcoをコンテナとして実行してみる https://falco.org/docs/getting-started/running/
  45. • Dockerコンテナとして実行してみる ◦ Falco起動 前に、ホストにDriverがインストールされる 69 * Setting up /usr/src

    links from host * Running falco-driver-loader for: falco version=0.32.1, driver version=2.0.0+driver * Running falco-driver-loader with: driver=module, compile=yes, download=yes ================ Cleaning phase ================ * 1. Check if kernel module 'falco' is still loaded: - OK! There is no 'falco' module loaded. * 2. Check all versions of kernel module 'falco' in dkms: - There are some versions of 'falco' module in dkms. * 3. Removing all the following versions from dkms: 2.0.0+driver - Removing 2.0.0+driver... ------------------------------ Deleting module version: 2.0.0+driver completely from the DKMS tree. ------------------------------ Done. - OK! Removing '2.0.0+driver' succeeded. [SUCCESS] Cleaning phase correctly terminated. ================ Cleaning phase ================ * Looking for a falco module locally (kernel 5.10.118-111.515.amzn2.x86_64) * Trying to download a prebuilt falco module from https://download.falco.org/driver/2.0.0%2Bdriver/x86_64/falco_amazonlinux2_5.10.118-111.515.amzn2.x86_64_1.ko * Download succeeded * Success: falco module found and inserted Falcoをコンテナとして実行してみる
  46. 70 Falcoをコンテナとして実行してみる • Dockerコンテナとして実行してみる ◦ Driverインストール後、Falcoが起動する 2022-07-26T15:15:00+0000: Falco version 0.32.1

    2022-07-26T15:15:00+0000: Falco initialized with configuration file /etc/falco/falco.yaml 2022-07-26T15:15:00+0000: Loading rules from file /etc/falco/falco_rules.yaml: 2022-07-26T15:15:01+0000: Loading rules from file /etc/falco/falco_rules.local.yaml: 2022-07-26T15:15:01+0000: Starting internal webserver, listening on port 8765
  47. • 別 ターミナルから不正な操作を実行してみる ◦ 先ほどと同様 • 不正な操作を検知し、実行ログが出力される $ sudo touch

    /bin/surprise 71 Falcoをコンテナとして実行してみる 2022-07-26T16:15:00+0000: Falco version 0.32.1 2022-07-26T12:15:00+0000: Falco initialized with configuration file /etc/falco/falco.yaml 2022-07-26T12:15:00+0000: Loading rules from file /etc/falco/falco_rules.yaml: 2022-07-26T12:15:01+0000: Loading rules from file /etc/falco/falco_rules.local.yaml: 2022-07-26T12:15:01+0000: Starting internal webserver, listening on port 8765 2022-07-20T12:16:00.519875924+0000: Error File below a known binary directory opened for writing (user=root user_loginuid=-1 command=touch /bin/surprise file=/bin/surprise parent=sudo pcmdline=sudo touch /bin/surprise gparent=sh container_id=host image=<NA>)
  48. • カスタムルール設定ファイルを含んだコンテナイメージを ビルドして起動する - rule: Write below binary dir desc:

    an attempt to write to any file below a set of binary directories condition: > bin_dir and evt.dir = < and open_write and not package_mgmt_procs and not exe_running_docker_save and not python_running_get_pip and not python_running_ms_oms and not user_known_write_below_binary_dir_activities output: > File below a known binary directory opened for writing (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2] container_id=%container.id image=%container.image.repository) priority: NOTICE tags: [filesystem, mitre_persistence] 72 カスタムルールを適用する falco_rules.local.yaml FROM falcosecurity/falco:latest COPY falco_rules.local.yaml /etc/falco/ Dockerfile
  49. • カスタムルール設定ファイルを含んだコンテナイメージを ビルドして起動する • カスタムルールが適用されたFalco コンテナイメージが 実行される $ docker build

    -t custom-falco:latest . $ docker run -it --rm \ --privileged \ -v /var/run/docker.sock:/host/var/run/docker.sock \ -v /dev:/host/dev \ -v /proc:/host/proc:ro \ -v /boot:/host/boot:ro \ -v /lib/modules:/host/lib/modules:ro \ -v /usr:/host/usr:ro \ -v /etc:/host/etc:ro \ custom-falco:latest 73 カスタムルールを適用する
  50. 76 ECS on EC2環境で実行してみる { "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "requiresCompatibilities":

    [ "EC2" ], "containerDefinitions": [ { "name": "test-falco", "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/custom-falco:v1", "privileged": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/test-falco-ec2-task", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } } } ] } ECSタスク定義(一部抜粋)
  51. 77 ECS on EC2環境で実行してみる { "volumes": [ { "name": "host-docker-sock",

    "host": { "sourcePath": "/var/run/docker.sock" } }, { "name": "host-dev", "host": { "sourcePath": "/dev" } }, { "name": "host-proc", "host": { "sourcePath": "/proc" } }, { "name": "host-boot", "host": { "sourcePath": "/boot" } }, { "name": "host-lob-modules", "host": { "sourcePath": "/lib/modules" } }, { "name": "host-usr", "host": { "sourcePath": "/usr" } }, { "name": "host-etc", "host": { "sourcePath": "/etc" } } ], "containerDefinitions": [ { "mountPoints": [ { "containerPath": "/host/var/run/docker.sock", "sourceVolume": "host-docker-sock"}, { "containerPath": "/host/dev", "sourceVolume": "host-dev" }, { "containerPath": "/host/proc", "sourceVolume": "host-proc", "readOnly": true }, { "containerPath": "/host/boot", "sourceVolume": "host-boot", "readOnly": true }, { "containerPath": "/host/lib/modules", "sourceVolume": "host-lob-modules", "readOnly": true }, { "containerPath": "/host/usr", "sourceVolume": "host-usr", "readOnly": true }, { "containerPath": "/host/etc", "sourceVolume": "host-etc", "readOnly": true } ] } ] } ECSタスク定義(一部抜粋)
  52. • FalcoコンテナをDaemonSetとして実行する • 公式からHelm Chartが用意されている $ helm repo add falcosecurity

    https://falcosecurity.github.io/charts $ helm repo update $ helm install falco falcosecurity/falco --namespace falco --create-namespace $ kubectl get all -n falco NAME READY STATUS RESTARTS AGE pod/falco-4ds47 1/1 Running 0 120s pod/falco-qtgb9 1/1 Running 0 120s NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/falco 2 2 2 2 2 <none> 118s 79 EKS on EC2環境で実行してみる https://falco.org/docs/getting-started/deployment/ https://github.com/falcosecurity/charts/tree/master/falco https://github.com/falcosecurity/deploy-kubernetes/tree/main/kubernetes/falco/templates • マニフェストをapplyして実行することも可能
  53. • Fargateで DAEMONタイプ / DaemonSet がサポートされ ていない • 同一コンテナ上でアプリケーションと一緒にFalco(および pdig)を起動する必要がある

    ◦ Falcoで Sidecarで 起動がサポートされていない ◦ falcosecurity/kilt を利用するとSidecarとして起動できるようだ が…… • ptraceを利用するため、タスク定義でLinux Capabilitiesとし て SYS_PTRACE を許可する必要がある ◦ ptraceでイベントを取得するためにpdigというツールを利用する 81 Fargate環境におけるFalco 利用方法
  54. • Kernel moduleモード(デフォルト) ◦ Linuxカーネルからシステムコール 実行イベントを取得する モード • eBPF probeモード

    ◦ eBPFを利用してシステムコール 実行イベントを取得するモー ド • Userspace instrumentationモード ◦ 実行イベントをユーザー空間から取得するモード ◦ 2022年7月現在で 、ptraceを利用するpdig みをサポート ▪ ptrace 、他プロセス 制御を提供するシステムコール 82 Falco 実行モード https://falco.org/docs/event-sources/drivers/ https://falco.org/blog/choosing-a-driver/
  55. • Fargate コンテナプロセス 、Firecracker MicroVMによっ てカーネルレベルで隔離されている • カーネル空間に対して不正にアクセスできないように、 Linux Capabilitiesが制限されている

    ◦ Privileged Containerが実行できない ◦ デフォルトで許可されているCapabilities 一覧 ▪ https://github.com/moby/moby/blob/master/oci/caps/defaults.go ◦ Fargateで タスク定義から SYS_PTRACE み追加可能 • FalcoをFargateで利用する場合 、pdigによってptraceを 利用してランタイムイベントを取得する 85 Fargateにおけるプロセス分離 設計
  56. • pdigから同一コンテナ上 プロセスを指定してイベントを 取得する ◦ pdig ${command} / pdig -p

    ${process_id} • Falcoで そ イベントをルールベースで評価しアラートを 発生させる仕組み ◦ falco -u --pidfile /var/run/falco.pid 86 pdig 注意点 https://github.com/falcosecurity/pdig
  57. • pdig falcosecurity/libs という別 モジュールに依存して いる ◦ 2022年7月現在、libs アップデートにpdigが追いついていない ため、READMEに記載

    手順で pdigを実行できない • もしpdigを利用したい場合 、ソースコードからコンパイル する必要がある ◦ 具体的な利用イメージ 、下記リポジトリが参考になる ▪ kris-nova/falco-trace ▪ paavan98pm/ecs-fargate-pv1.4-falco • ContainersFromTheCouch: https://www.youtube.com/watch?v=OYGKjmFeLqI ▪ tomoyamachi/falco-on-distroless-fargate 87 pdig 注意点
  58. • ランタイム 振る舞いを動的にスキャンして、異常な振る 舞いを検知できる ◦ ECS / EKS いずれ 環境でも導入可能

    • プリセットなルールが用意されているため導入が容易 ◦ カスタムルールも設定可能 • 少なくとも現状で 、Fargateで 利用 正直厳しい ◦ FargateでeBPFなどがサポートされることに期待 ▪ https://github.com/aws/containers-roadmap/issues/1027 88 Falcoに関するまとめ https://falco.org/ https://github.com/falcosecurity/falco
  59. • コンテナライフサイクルに沿ってリスクを整理し、各フェー ズにおける対応を検討することが有効 ◦ イメージ リスク ◦ レジストリ リスク ◦

    オーケストレーター リスク ◦ コンテナ リスク ◦ ホストOS リスク • まず OSSツールを用いて、気軽にコンテナセキュリティを 始めてみよう • AWS マネージドサービスも活用することで多角的なコン テナセキュリティが実現できる 本セッション まとめ 90
  60. コンテナセキュリティ全般 • [AWS Black Belt Online Seminar] コンテナセキュリティ入門 ◦ https://aws.amazon.com/jp/blogs/news/aws-black-belt-online-seminar-

    container-security-introduction/ • Liz Rice “Container Security” (O'Reilly Media) ◦ https://www.oreilly.com/library/view/container-security/978149205669 0/ 93 参考資料
  61. Dockerfile • Dockerfile ベスト・プラクティス ◦ https://docs.docker.jp/develop/develop-images/dockerfile_best-practic es.html • Dockerfile ベストプラクティス

    Top 20 – Sysdig ◦ https://sysdig.jp/blog/dockerfile-best-practices-2/ Falco • Loris Degioanni, Leonardo Grasso “Practical Cloud Native Security with Falco” (O'Reilly Media) ◦ https://www.oreilly.com/library/view/practical-cloud-native/978109811 8563/ 94 参考資料
  62. 95 Amazon ECS • Best Practices - Security - Amazon

    Elastic Container Service ◦ https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/se curity.html • Securing your Amazon ECS applications: Best practices ◦ https://speakerdeck.com/toricls/securing-your-amazon-ecs-applications- best-practices Amazon EKS • EKS Best Practices Guides ◦ https://aws.github.io/aws-eks-best-practices/ 参考資料
  63. • Aqua Enterprise • Snyk Container • Trend Micro Cloud

    One ◦ Container Security ◦ Workload Security 97 コンテナセキュリティに対応した商用製品