Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

セキュリティ講義

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

DevSecOps

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

DevSecOps Shift Left

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

DevSecOps パイプラインと Test Driven Security

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

実践 DevSecOps パイプライン DSOMM などを参考に成熟度を上げていく Baseline DSOMM … https://owasp.org/www-project-devsecops-maturity-model/ ● Level 1 … セキュリティの基本的なベストプラクティスを理解する ● Level 2 … セキュリティの基本的なベストプラクティスを実践する ● Level 3 … よりレベルの高いセキュリティの実践 e.g. セキュリティコードレビューの実施、既知の脆弱性の確認やアップデート e.g. SAST / DAST によるスキャンの実施、不要なコンポーネントの削除や権限見直し e.g. 複数スキャナの利用、脅威モデリングの実施、インシデント演習

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

実践 DevSecOps パイプライン

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

実践 DevSecOps パイプライン Semgrep

Slide 38

Slide 38 text

実践 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 …

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

実践 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/

Slide 49

Slide 49 text

まとめ

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

ペパボにおける セキュリティエンジニアリング

Slide 52

Slide 52 text

業務内容 • DevSecOps / Shift Left を支えるツールや基盤・プロセスの開発・導入 • インシデントレスポンスツールの開発 • 脆弱性情報の収集・分析 • 自社サービスの脆弱性診断の実施 • セキュリティトレーニングの実施 • インシデントのサポート ペパボにおけるセキュリティエンジニアリング https://tech.pepabo.com/pdf/pepabo-tech-conference-14-security-team-slide.pdf 技術スタック • カーネル ~ Web まで幅広い • Ruby, Go, Kubernetes, OpenStack, etc…

Slide 53

Slide 53 text

• ペパボの「わたしたちが大切にしている3つのこと」に共感し、行動してくれる方 求める人物像 みんなと仲良くすること / ファンを増やすこと https://speakerdeck.com/kentaro/the-secret-of-leadership-and-followership https://tech.pepabo.com/2019/09/06/why-output-is-important/ e.g. 職種・部署を超えてコラボレーションする アウトプットすること e.g. ビジョンを示して実装 / 共有する 内省、アウトカムによる成長

Slide 54

Slide 54 text

23卒新卒採用について 54

Slide 55

Slide 55 text

55 新卒採用について 【23卒】エンジニア・データサイエンティスト職募集しております!     採用サイトからご応募ください!     👉https://recruit.pepabo.com/info/graduate/ 【24卒以降の方】プレエントリーへご登録ください!     👉https://recruit.pepabo.com/info/pre-entry/

Slide 56

Slide 56 text

みなさまの ご応募お待ちしております! 56