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. 実践 DevSecOps パイプライン
    ~システム開発へのセキュリティの取り入れ方~
    技育祭2022
    2022.03.18

    View Slide

  2. 森田 浩平 / @mrtc0
    GMO ペパボ株式会社 セキュリティ対策室
    シニアエンジニア
    whoami
    OWASP Fukuoka Chapter Leader
    セキュリティ・キャンプ 講師 / ステアリングコミッティ
    https://blog.ssrf.in/

    View Slide

  3. Agenda
    • DevSecOps とは何か、なぜそれが必要とされているのかについて
    今日の内容
    • Test Driven Security の実施と DevSecOps パイプラインの構築について

    View Slide

  4. システム開発で生じる脆弱性

    View Slide

  5. Vulnerabilities
    • XSS (クロスサイトスクリプティング )
    • SQL インジェクション
    • OS コマンドインジェクション
    • CSRF (クロスサイトリクエストフォージェリ )
    • SSRF (サーバーサイドリクエストフォージェリ )
    • ディレクトリトラバーサル
    • オープンリダイレクト
    • 認可不備
    • etc…
    アプリケーションの脆弱性
    共通脆弱性タイプ一覧
    CWE概説:IPA 独立行政法人 情報処理推進機構
    https://www.ipa.go.jp/security/vuln/CWE.html

    View Slide

  6. Vulnerabilities
    • フィイアウォールやアクセス制御の設定不備
    • ミドルウェアの設定不備
    • OS / ミドルウェアの既知の脆弱性
    • バケットの公開
    • etc
    インフラの脆弱性

    View Slide

  7. Vulnerability
    • クレデンシャルの漏洩
    • サプライチェーン攻撃
    • 開発環境のセキュリティ
    • プライバシー周り
    その他の脆弱性

    View Slide

  8. Vulnerability
    • 攻撃者はアプリケーション、インフラ、組織という巨大で複雑なシステムのなかに、一つの穴
    を見つければ勝ちの世界
    • 防御側は一つも穴を作るわけにはいかない世界
    防御側が不利な世界
    防御側はどうやって守る?
    • 「GitHub にはマルウェアが置いてあって危ないのでアクセスを禁止します」
    • 「設定を間違えるといけないので、実行コマンドを指差し確認しましょう」
    • 「ライブラリやソフトウェアを使うたびに脆弱性をチェックしましょう」

    View Slide

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

    View Slide

  10. DevSecOps

    View Slide

  11. Vulnerability
    https://github.com/OWASP/DevSecOpsGuideline/blob/6dcf8669be5d2cc395c4a9a5400f2bc936addb19/assets/images/DevSecOps-cycle.png
    開発工程のすべてでセキュリティを考慮する

    View Slide

  12. DevSecOps
    Shift Left

    View Slide

  13. Vulnerability
    • DevSecOps パイプラインを整備する
    • Insecure な状態に気づける / 自動修復する、自動化された仕組み
    • Test Driven Security を実践し、一定水準のセキュリティを満たせる仕組みを作る
    • DevSecOps にチャレンジするカルチャーの醸成
    • ツールの導入だけでは成功しない。知識やスキル、マインドセットを持つ
    DevSecOps を実践するには?

    View Slide

  14. DevSecOps パイプラインと
    Test Driven Security

    View Slide

  15. 実践 DevSecOps パイプライン
    DevSecOps パイプライン

    View Slide

  16. 実践 DevSecOps パイプライン
    DevSecOps パイプライン

    View Slide

  17. 実践 DevSecOps パイプライン
    • 継続的にセキュリティテストが実施できるようにする
    • すべてのテストが Green になったら Production Deploy できる
    Test Driven Security

    View Slide

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

    View Slide

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

    View Slide

  20. 実践 DevSecOps パイプライン
    Application Security
    Test Driven Security
    • アプリケーションコードのテストとして実装する
    • SAST や DAST ツールを利用する
    https://gitlab.com/gitlab-org/gitlab/-/blob/8400d5c5c27024aa8ef5a7ff2ec1c0b8a98c5cde/spec/lib/gitlab/emoji_spec.rb

    View Slide

  21. 実践 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"
    }

    View Slide

  22. 実践 DevSecOps パイプライン
    状態が変更しても検知 / 対応できるようにする = ガードレールを用意する
    Test Driven Security
    Production Security
    • Gatekeeper による制約を満たさないリソースの監査・ブロック
    • パブリッククラウドの機能を使ったポリシーの作成と違反の検知

    View Slide

  23. 実践 DevSecOps パイプライン
    運用環境の監視やインシデントレスポンスの準備も必須
    Test Driven Security
    Monitoring / Incident Response
    • 不審なアクティビティをログとして集約する
    • 不審なアクティビティを検知できるようにする
    • プレイブックの作成や対応プロセスの強化

    View Slide

  24. 実践 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. 複数スキャナの利用、脅威モデリングの実施、インシデント演習

    View Slide

  25. 実践 DevSecOps パイプライン
    • ソフトウェアによる自動化だけでなく、組織文化の醸成も必要
    カルチャー
    セキュリティテストのスキルや知識を身に着け、マインドセットの切り替えが必要
    • セキュリティオンボーディング
    • セキュリティトレーニング
    • セキュリティチャンピオン制度

    View Slide

  26. 実践 DevSecOps パイプライン

    View Slide

  27. 実践 DevSecOps パイプライン
    DevSecOps パイプライン

    View Slide

  28. 実践 DevSecOps パイプライン
    • アプリケーションやインフラで利用するクレデンシャルをコードに含めない
    クレデンシャルのハードコードを防ぐ
    主な漏洩経路... フロントエンド JavaScript , モバイルアプリ, パブリックリポジトリなど
    • PaaS の環境変数に設定したり、パブリッククラウドの KMS や Hashicorp Vault にクレデ
    ンシャルを格納する
    • うっかり commit / push しないように pre-commit フックを設定しておく

    View Slide

  29. 実践 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 ...

    View Slide

  30. 実践 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 オプションやマルチステージビルドなどを利用することを推奨

    View Slide

  31. 実践 DevSecOps パイプライン
    DevSecOps パイプライン

    View Slide

  32. 実践 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

    View Slide

  33. 実践 DevSecOps パイプライン
    • Dependabot や Renovate を活用してアップデート可能な環境を作る
    • 利用しているバージョンと最新バージョンとの乖離状況を確認できる
    • 自動テストでアップデート可能か検証できる環境を用意できる
    依存ライブラリの脆弱性チェック

    View Slide

  34. 実践 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 {

    View Slide

  35. 実践 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

    View Slide

  36. 実践 DevSecOps パイプライン
    Semgrep

    View Slide

  37. 実践 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

    View Slide

  38. 実践 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 |
    +--------------+------------------+----------+-------------------+---------------+---------------------------------------+

    View Slide

  39. 実践 DevSecOps パイプライン
    DevSecOps パイプライン

    View Slide

  40. 実践 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

    View Slide

  41. 実践 DevSecOps パイプライン
    • セキュリティテストを CI で実行するようにし、検知内容を PR にコメントする
    • e.g. Brakeman + Semgrep
    • ルールの追加や修正が難しいところも Semgrep などで補完できる(多層防御)
    スキャンツールを CI に組み込む

    View Slide

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

    View Slide

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

    View Slide

  44. 実践 DevSecOps パイプライン
    • ツールには誤検知があります
    • False Negative … 脆弱性が存在するのに見逃してしまう
    • False Positive … 脆弱性ではないのに検知されてしまう
    • 脆弱性があるとしても、攻撃可能かどうかはシステムによります
    • 特定のメソッドや設定の使用が攻撃の条件としてあったりする e.g. CVE-2020-5267
    • 攻撃可能だとしても、すぐにアップデートするべきかどうかはシステムによります
    • Attack Vector が Local だったり、再現性が難しいものであったり
    脆弱性との向き合い方
    ツールの結果を鵜呑みにせずに、リスク評価を行っていくことが大切

    View Slide

  45. 実践 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
    -----------------------------------------------

    View Slide

  46. 実践 DevSecOps パイプライン
    DevSecOps パイプライン例 - Rails

    View Slide

  47. 実践 DevSecOps パイプライン
    責任共有モデル
    https://a.sfdcstatic.com/content/dam/www/ocms/jp/assets/pdf/misc/heroku-cloud-security.pdf
    https://aws.amazon.com/jp/compliance/shared-responsibility-model/

    View Slide

  48. まとめ

    View Slide

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

    View Slide

  50. 採用案内
    \ セキュリティエンジニアも募集してます!!1 /
    「ペパボ セキュリティエンジニア」で検索 !

    View Slide