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

実践 DevSecOps パイプライン ~システム開発へのセキュリティの取り入れ方~

mrtc0
March 18, 2022

実践 DevSecOps パイプライン ~システム開発へのセキュリティの取り入れ方~

技育祭 2022 春 勉強会

mrtc0

March 18, 2022
Tweet

More Decks by mrtc0

Other Decks in Programming

Transcript

  1. 森田 浩平 / @mrtc0 GMO ペパボ株式会社 セキュリティ対策室 シニアエンジニア whoami OWASP

    Fukuoka Chapter Leader セキュリティ・キャンプ 講師 / ステアリングコミッティ https://blog.ssrf.in/
  2. Vulnerabilities • XSS (クロスサイトスクリプティング ) • SQL インジェクション • OS

    コマンドインジェクション • CSRF (クロスサイトリクエストフォージェリ ) • SSRF (サーバーサイドリクエストフォージェリ ) • ディレクトリトラバーサル • オープンリダイレクト • 認可不備 • etc… アプリケーションの脆弱性 共通脆弱性タイプ一覧 CWE概説:IPA 独立行政法人 情報処理推進機構 https://www.ipa.go.jp/security/vuln/CWE.html
  3. Vulnerability • 攻撃者はアプリケーション、インフラ、組織という巨大で複雑なシステムのなかに、一つの穴 を見つければ勝ちの世界 • 防御側は一つも穴を作るわけにはいかない世界 防御側が不利な世界 防御側はどうやって守る? • 「GitHub

    にはマルウェアが置いてあって危ないのでアクセスを禁止します」 • 「設定を間違えるといけないので、実行コマンドを指差し確認しましょう」 • 「ライブラリやソフトウェアを使うたびに脆弱性をチェックしましょう」
  4. Vulnerability • ガチガチなセキュリティポリシーは生産性を落とす • 技術で担保できるところはソフトウェアを活用しましょう 速く、安全な開発 • 「GitHub にはマルウェアが置いてあって危ないのでアクセスを禁止します」 →

    AV / EDR で端末を保護しましょう • 「設定を間違えるといけないので、実行コマンドを指差し確認しましょう」 → コード化してレビューしましょう。 Zero Touch Production に取り組みましょう • 「ライブラリやソフトウェアを使うたびに脆弱性をチェックしましょう」 → SBOM などを活用してライセンスや脆弱性の管理をしましょう
  5. Vulnerability • DevSecOps パイプラインを整備する • Insecure な状態に気づける / 自動修復する、自動化された仕組み •

    Test Driven Security を実践し、一定水準のセキュリティを満たせる仕組みを作る • DevSecOps にチャレンジするカルチャーの醸成 • ツールの導入だけでは成功しない。知識やスキル、マインドセットを持つ DevSecOps を実践するには?
  6. 実践 DevSecOps パイプライン なぜ Test Driven Security か Test Driven

    Security • テストを元に安全な実装ができるようになる • 他部署での再利用性が高い • デプロイ前にセキュリティ上の問題を検出・修正できる (一定の水準が保てる) • 抽象的なガイドラインではなく、具体的な期待値を得られる
  7. 実践 DevSecOps パイプライン 継続的なセキュリティテストの戦略として、まずは Baseline を整備する Test Driven Security •

    デプロイ先に root で SSH ログインできないこと • アプリケーションには HTTPS で接続できること • セッション Cookie には HTTP Only 属性が付与されていること • … DevOps Team と Security Team でこれらのベストプラクティスに合意を取り、 自動テストとして実装していく
  8. 実践 DevSecOps パイプライン Application Security Test Driven Security • アプリケーションコードのテストとして実装する

    • SAST や DAST ツールを利用する https://gitlab.com/gitlab-org/gitlab/-/blob/8400d5c5c27024aa8ef5a7ff2ec1c0b8a98c5cde/spec/lib/gitlab/emoji_spec.rb
  9. 実践 DevSecOps パイプライン Test Driven Security Infrastructure Security • Serverspec

    / Inspec などを使ってサーバーの状態をテストする • tfsec や Conftest などを利用してインフラコードのテストをする control 'sshd-21' do title 'Set SSH Protocol to 2' desc 'A detailed description' impact 1.0 describe sshd_config do its('Protocol') { should cmp 2 } end end package main deny[msg] { input.kind == "Deployment" not input.spec.template.spec.securityContext.runAsNonRoot msg := "Containers must not run as root" }
  10. 実践 DevSecOps パイプライン 状態が変更しても検知 / 対応できるようにする = ガードレールを用意する Test Driven

    Security Production Security • Gatekeeper による制約を満たさないリソースの監査・ブロック • パブリッククラウドの機能を使ったポリシーの作成と違反の検知
  11. 実践 DevSecOps パイプライン 運用環境の監視やインシデントレスポンスの準備も必須 Test Driven Security Monitoring / Incident

    Response • 不審なアクティビティをログとして集約する • 不審なアクティビティを検知できるようにする • プレイブックの作成や対応プロセスの強化
  12. 実践 DevSecOps パイプライン DSOMM などを参考に成熟度を上げていく Test Driven Security DSOMM …

    https://owasp.org/www-project-devsecops-maturity-model/ • Level 1 … セキュリティの基本的なベストプラクティスを理解する • Level 2 … セキュリティの基本的なベストプラクティスを実践する • Level 3 … よりレベルの高いセキュリティの実践 e.g. セキュリティコードレビューの実施、既知の脆弱性の確認やアップデート e.g. SAST / DAST によるスキャンの実施、不要なコンポーネントの削除や権限見直し e.g. 複数スキャナの利用、脅威モデリングの実施、インシデント演習
  13. 実践 DevSecOps パイプライン • アプリケーションやインフラで利用するクレデンシャルをコードに含めない クレデンシャルのハードコードを防ぐ 主な漏洩経路... フロントエンド JavaScript ,

    モバイルアプリ, パブリックリポジトリなど • PaaS の環境変数に設定したり、パブリッククラウドの KMS や Hashicorp Vault にクレデ ンシャルを格納する • うっかり commit / push しないように pre-commit フックを設定しておく
  14. 実践 DevSecOps パイプライン • クレデンシャル検出のためのソフトウェアを git の pre-commit で利用する pre-commit

    フックによるクレデンシャルハードコーディングの防止 • git-secrets … https://github.com/awslabs/git-secrets • detect-secrets … https://github.com/ibm/detect-secrets • Secretlint … https://github.com/secretlint/secretlint • gitleaks … https://github.com/zricethezav/gitleaks • truffleHog … https://github.com/trufflesecurity/truffleHog • ggshield … https://github.com/GitGuardian/ggshield $ cat ~/.gitconfig … [core] hooksPath = ~/.config/githook … $ cat ~/.config/githook/pre-commit #!/usr/bin/env bash git secrets --pre_commit_hook -- "$@" $ git commit -S -s -m 'feat: add config' config.json:2: AWS_ACCESS_KEY_ID: "AKIAIOSFODNN1EXAMPLE" [ERROR] Matched one or more prohibited patterns Possible mitigations: - Mark false positives as allowed using: git config --add secrets.allowed ...
  15. 実践 DevSecOps パイプライン Docker イメージにクレデンシャルを含めない $ cat Dockerfile FROM alpine:latest

    ENV AWS_ACCESS_KEYID AKIAIOSFODNN1EXAMPLE COPY secret.txt /etc/secret.txt RUN rm /etc/secret.txt CMD ["bash"] $ docker build -t app:test . $ docker save app:test -o image.tar $ cat 4d1390ecb1b4f3dffb…6639632b.json | jq .config.Env [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/b in", "AWS_ACCESS_KEYID=AKIAIOSFODNN1EXAMPLE" ] $ tar xf 5dabf394ca5ffcfe…72eab4764286cc4/layer.tar $ cat etc/secret.txt THIS IS SECRET !!!!!1 • ENV で指定した値は残るし、ビルド中に削除したファイルもイメージレイヤに残る • BuildKit の --mount=type=secret オプションやマルチステージビルドなどを利用することを推奨
  16. 実践 DevSecOps パイプライン 依存ライブラリの脆弱性チェック $ bundle audit Name: actionpack Version:

    5.2.2.1 CVE: CVE-2021-22885 GHSA: GHSA-hjg4-8q5f-x6fm Criticality: High URL: https://groups.google.com/g/rubyonrails-security/c/NiQl-48cXYI Title: Possible Information Disclosure / Unintended Method Execution in Action Pack Solution: upgrade to ~> 5.2.4.6, ~> 5.2.6, ~> 6.0.3, >= 6.0.3.7, >= 6.1.3.2 • 利用しているライブラリで脆弱性のあるバージョンを利用していないか検査する • bundle audit … https://github.com/rubysec/bundler-audit • npm audit … https://docs.npmjs.com/cli/v8/commands/npm-audit • Dependabot … https://docs.github.com/ja/code-security/supply-chain-security/managing-vulnerabilities-in-your-projects-dependencies/about-d ependabot-security-updates • Renovate … https://github.com/renovatebot/renovate
  17. 実践 DevSecOps パイプライン • SAST で脆弱性を作り込んでいないかチェックする SAST (Static Application Security

    Testing) ツールによる脆弱性検査 • Brakeman … https://github.com/presidentbeef/brakeman • eslint-security-plugin … https://github.com/nodesecurity/eslint-plugin-security • gosec … https://github.com/securego/gosec • CodeQL … https://codeql.github.com/ • Semgrep … https://semgrep.dev/ $ brakeman Confidence: Medium Category: SQL Injection Check: SQL Message: Possible SQL injection Code: where("title like '%#{title}%'") File: app/models/post.rb Line: 8 $ gosec ./… [.../logger.go:49] - G304 (CWE-22): Potential file inclusion via variable (Confidence: HIGH, Severity: MEDIUM) 48: } else { > 49: file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) 50: if err != nil {
  18. 実践 DevSecOps パイプライン CodeQL job: analyze: … strategy: fail-fast: false

    matrix: language: [ 'javascript' ] steps: - name: Checkout repository uses: actions/checkout@v2 - name: Initialize CodeQL uses: github/codeql-action/init@v1 with: languages: ${{ matrix.language }} - name: Autobuild uses: github/codeql-action/autobuild@v1 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v1
  19. 実践 DevSecOps パイプライン • Terraform, CloudFormation などのインフラコードを検査し、Missconfiguration を検出 する •

    e.g. S3 バケットのパブリックアクセス、ファイアウォールの全開放など インフラコードの脆弱性検出 • tfsec … https://aquasecurity.github.io/tfsec • cfsec … https://aquasecurity.github.io/cfsec • kics … https://docs.kics.io/latest/ • conftest … https://www.conftest.dev/ • Shisho… https://shisho.dev/ $ tfsec … Result #6 HIGH Public access block does not ignore public ACLs ────────────────────────────────────────────────────────────────────── ─ s3_bucket.tf Lines 9-13 ───────┬────────────────────────────────────────────────────────────── ─ 9 │ resource "aws_s3_bucket_public_access_block" "bad_example" { 10 │ bucket = aws_s3_bucket.example.id 11 │ 12 │ restrict_public_buckets = false 13 │ } ───────┴────────────────────────────────────────────────────────────── ─ ID aws-s3-ignore-public-acls Impact PUT calls with public ACLs specified can make objects public Resolution Enable ignoring the application of public ACLs in PUT calls …
  20. 実践 DevSecOps パイプライン • コンテナイメージに含まれる OS パッケージの脆弱性を検出する コンテナイメージの脆弱性検出 • trivy

    … https://github.com/aquasecurity/trivy • docker scan (Snyk) … https://docs.docker.com/engine/scan/ • clair … https://github.com/quay/clair $ trivy image --ignore-unfixed python:3.4-alpine … python:3.4-alpine (alpine 3.9.2) ================================ Total: 37 (UNKNOWN: 0, LOW: 4, MEDIUM: 16, HIGH: 13, CRITICAL: 4) +--------------+------------------+----------+-------------------+---------------+---------------------------------------+ | LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE | +--------------+------------------+----------+-------------------+---------------+---------------------------------------+ | expat | CVE-2018-20843 | HIGH | 2.2.6-r0 | 2.2.7-r0 | expat: large number of | | | | | | | colons in input makes parser | | | | | | | consume high amount... | | | | | | | -->avd.aquasec.com/nvd/cve-2018-20843 | + +------------------+ + +---------------+---------------------------------------+ | | CVE-2019-15903 | | | 2.2.7-r1 | expat: heap-based buffer | | | | | | | over-read via crafted XML input | | | | | | | -->avd.aquasec.com/nvd/cve-2019-15903 | +--------------+------------------+----------+-------------------+---------------+---------------------------------------+
  21. 実践 DevSecOps パイプライン • 有償・無償問わず様々なツールが存在する • 無償かつ CI への組み込みやすさでいうと OWASP

    ZAP に軍配が上がりそう DAST name: OWASP ZAP jobs: zap: name: Run OWASP ZAP steps: ... - name: Import Context run: zap-cli context import app.context - name: Spider run: zap-cli spider -c app -u user $URL - name: Active Scan run: zap-cli active-scan -c app -u user -r $URL - name: Build report run: zap-cli report -f xml -o report.xml - name: Report issue run: report-to-issue report.xml
  22. 実践 DevSecOps パイプライン • セキュリティテストを CI で実行するようにし、検知内容を PR にコメントする •

    e.g. Brakeman + Semgrep • ルールの追加や修正が難しいところも Semgrep などで補完できる(多層防御) スキャンツールを CI に組み込む
  23. 実践 DevSecOps パイプライン • GitHub なら Code Scanning Alerts でまとめるのがお得

    • スキャン結果を SARIF フォーマットとして出力できれば、 github/codeql-action/upload-sarif@v1 を使ってアップロードできる 脆弱性を管理する
  24. 実践 DevSecOps パイプライン • GitHub なら Code Scanning Alerts でまとめるのがお得

    • スキャン結果を SARIF フォーマットとして出力できれば、 github/codeql-action/upload-sarif@v1 を使ってアップロードできる 脆弱性を管理する
  25. 実践 DevSecOps パイプライン • ツールには誤検知があります • False Negative … 脆弱性が存在するのに見逃してしまう

    • False Positive … 脆弱性ではないのに検知されてしまう • 脆弱性があるとしても、攻撃可能かどうかはシステムによります • 特定のメソッドや設定の使用が攻撃の条件としてあったりする e.g. CVE-2020-5267 • 攻撃可能だとしても、すぐにアップデートするべきかどうかはシステムによります • Attack Vector が Local だったり、再現性が難しいものであったり 脆弱性との向き合い方 ツールの結果を鵜呑みにせずに、リスク評価を行っていくことが大切
  26. 実践 DevSecOps パイプライン • 除外設定やルール・ポリシーの追加などを積極的に行える環境を作る • 誤検知対応時のドキュメント整備や誘導の仕方を工夫する • ルールやポリシーを自動テストできるようにする ルール・ポリシーを育てていく

    # ruleid: insecure-eval-use eval(user_input) # ok: insecure-eval-use eval('print("Hardcoded eval")') $ python -m semgrep --quiet --test rules/ 1 yaml files tested check id scoring: ----------------------------------------------- (TODO: 2) rules/detect-eval.yaml ✖ insecure-eval-use TP: 1 TN: 2 FP: 1 FN: 1 test: rules/detect-eval.py, expected lines: [5, 12], reported lines: [5, 15] ----------------------------------------------- final confusion matrix: TP: 1 TN: 2 FP: 1 FN: 1 -----------------------------------------------
  27. まとめ • Test Driven Security で Shift Left しよう •

    DevSecOps パイプラインを構想しロードマップを示す • 継続させるために自動化する、コード化する • セキュリティチームと協業しよう • セキュリティチームは DevOps メンバーとコミュニケーションしたい • 速く、安全で、生産性を高める活動にともに取り組む DevSecOps = セキュリティを継続させるためのアプローチの1つ