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

layerx-bakuraku-how-to-achieve-agility-and-secu...

shnjtk
September 30, 2022

 layerx-bakuraku-how-to-achieve-agility-and-security

shnjtk

September 30, 2022
Tweet

More Decks by shnjtk

Other Decks in Technology

Transcript

  1. Confidential © 2022 LayerX Inc. 2 自己紹介 高江 信次 LayerX バクラク事業部

    DevOpsチーム マネージャー 兼 Payment(法人カード事業)開発チーム マネージャー 最近はアプリ開発の方が多いですが、今日はインフラのお話をします @shnjtk
  2. Confidential © 2022 LayerX Inc. 3 バクラクシリーズラインナップ 仕訳・支払処理効率化 ・AI-OCRが請求書を5秒でデー タ化

    ・仕訳データを自動学習、 手入力 ゼロへ ・改正電子帳簿保存法に対応 帳票保存・ストレージ ・無料で始められる ・手入力ゼロで証憑管理 ・改正電子帳簿保存法に対応 事前稟議・支払申請 経費精算・ほかワークフロー ・AI-OCRが発注・支払書類や立替 経費の領収書を5秒でデータ化 ・承認はSlackで完結* ・稟議データはバクラク請求書へ連 携し、シームレスな内部統制構築が 可能 *経費精算のSlack連携は申請内容の通知のみ 次世代法人カード ・利用料無料 ・即日追加発行 ・最大1億円決済可能
  3. Confidential © 2022 LayerX Inc. 4 開発チーム構成 DevOps PdM、QA、Product Enabling、AI-OCR、Design

    バクラク 申請・経費精算 バクラク 請求書 バクラク 電子帳簿保存 バクラク ビジネスカード
  4. Confidential © 2022 LayerX Inc. 5 爆速開発とは • 顧客への提供価値(アウトカム)が速い •

    背中を預け合う ◦ お互いに信頼し、信頼には責任をもって応える • プルリクを止めてはいけない https://tech.layerx.co.jp/entry/2021/04/15/152404 https://www.slideshare.net/mosa_siru/ss-251224289
  5. Confidential © 2022 LayerX Inc. 6 アプリ開発でよくあるインフラの変更 • S3 bucketを作成したい

    • IAM policyを変更したい • DynamoDB tableを作成したい • Security Groupにルールを追加したい • 環境変数を格納するためのSecrets Manager secretを作成したい
  6. Confidential © 2022 LayerX Inc. 7 インフラ CI/CDパイプライン 基本構成 PR

    plan apply tfstate • planはGitHub Actionで実行 • applyはAWS CodePipeline + CodeBuild で実行 • tfstateはS3 bucketで管理 • 原則としてインフラの変更はPRベースで行う
  7. Confidential © 2022 LayerX Inc. 8 インフラ CI/CDパイプライン 全体構成 DevOps

    バクラク 申請・経費精算 バクラク 請求書 バクラク 電子帳簿保存 バクラク ビジネスカード 各アプリに共通のリソースを管理
  8. Confidential © 2022 LayerX Inc. 10 爆速開発とセキュリティを両立するために • tfsecを導入 •

    GitHub Actionで実行。PR作成時に自動的にセキュリティチェックをかける • デフォルトのチェックに加えて、社内ポリシーの準拠状況も確認
  9. Confidential © 2022 LayerX Inc. 11 tfsecとは • Terraformコードの静的解析ツール •

    デフォルトで様々なセキュリティチェックを行って くれる • チェック項目ごとにseverityが規定されており、 設定で変更することが可能 • カスタムチェックルールを記述することも可能 https://aquasecurity.github.io/tfsec/v1.28.0/
  10. Confidential © 2022 LayerX Inc. 13 社内ポリシー (一部抜粋) • 全てのAWSリソースに特定のタグを付与することを必須とする

    • 例: “confidentiality” タグ ◦ S3 bucketやDynamoDBなどデータを取り扱うリソースにおいて、そのデー タの情報資産としての分類(区分)を示す ◦ リスクアセスメントの際に、データの情報区分ごとにリソースを棚卸しする際に 有用 % aws resourcegroupstaggingapi get-resources \ --tag-filters Key=confidentiality,Values=confidential \ --query "ResourceTagMappingList[*].ResourceARN" “confidentiality: confidential” タグ値を持つリソースのARN一覧を取得するコマンド実行例
  11. Confidential © 2022 LayerX Inc. 15 手順1 : S3 bucket

    リソースを定義 resource "aws_s3_bucket" "tfsec_sample" { bucket = "tfsec-sample" } Terraformコード tfsec実行結果 Result #1 HIGH No public access block so not blocking public acls Result #2 HIGH No public access block so not blocking public policies Result #3 HIGH Bucket does not have encryption enabled Result #4 HIGH No public access block so not ignoring public acls Result #5 HIGH No public access block so not restricting public buckets Result #6 HIGH Bucket does not encrypt data with a customer managed key Result #7 MEDIUM Bucket does not have logging enabled Result #8 MEDIUM Bucket does not have versioning enabled Result #9 LOW Bucket does not have a corresponding public access block.
  12. Confidential © 2022 LayerX Inc. 16 手順2 : public access

    の問題を修正 resource "aws_s3_bucket" "tfsec_sample" { bucket = "tfsec-sample" } resource "aws_s3_bucket_public_access_block" "tfsec_sample" { bucket = aws_s3_bucket.tfsec_sample.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } Terraformコード tfsec実行結果 Result #1 HIGH Bucket does not have encryption enabled Result #2 HIGH Bucket does not encrypt data with a customer managed key Result #7 MEDIUM Bucket does not have logging enabled Result #8 MEDIUM Bucket does not have versioning enabled
  13. Confidential © 2022 LayerX Inc. 17 手順3 : encryption の問題を修正

    resource "aws_s3_bucket" "tfsec_sample" { bucket = "tfsec-sample" } resource "aws_s3_bucket_public_access_block" "tfsec_sample" { bucket = aws_s3_bucket.tfsec_sample.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } resource "aws_s3_bucket_server_side_encryption_configuration" "tfsec_sample" { bucket = aws_s3_bucket.tfsec_sample.id rule { apply_server_side_encryption_by_default { kms_master_key_id = aws_kms_key.tfsec_sample.arn sse_algorithm = "aws:kms" } } Terraformコード tfsec実行結果 Result #1 MEDIUM Bucket does not have logging enabled Result #2 MEDIUM Bucket does not have versioning enabled
  14. Confidential © 2022 LayerX Inc. 18 severityの変更: S3 bucketのversioningを必須とする例 —--

    severity_overrides: CUS001: ERROR aws-s3-enable-versioning: HIGH .tfsec/config.yml tfsec実行結果 Result #1 HIGH Bucket does not have versioning enabled Result #2 MEDIUM Bucket does not have logging enabled • 組織やチームのポリシーに応じて特定のルールを強制したい場合に有用 ◦ リポジトリのbranch protection ruleでHIGHの問題が残っている間は マージできないようにする等
  15. Confidential © 2022 LayerX Inc. 19 カスタムチェック: 特定のタグの付与を必須とする例 --- checks:

    - code: CUS001 description: aws resources must have confidentiality tag errorMessage: confidentiality tag must be specified matchSpec: action: contains name: tags value: confidentiality requiredTypes: - resource requiredLabels: - aws_s3_bucket severity: ERROR .tfsec/confidentiality_tag_tfchecks.yml tfsec実行結果 Result #1 HIGH Custom check failed for resource aws_s3_bucket.tfsec_sample. confidentiality tag must be specified tfsec実行コマンド 詳細は以下を参照 https://aquasecurity.github.io/tfsec/v1.28.0/guides/configuration/custom-checks/
  16. Confidential © 2022 LayerX Inc. 20 GitHub Actionによるtfsec実行 name: tfsec

    on: [pull_request] jobs: tfsec: runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v3 - name: Run tfsec with reviewdog uses: reviewdog/action-tfsec@master with: github_token: ${{ secrets.github_token }} level: info reporter: github-pr-review filter_mode: nofilter fail_on_error: true .github/workflows/tfsec.yml 詳細は以下を参照 https://github.com/reviewdog/action-tfsec action実行結果
  17. Confidential © 2022 LayerX Inc. 21 まとめ • 爆速開発とセキュリティの両立を実現するためにtfsecを活用 •

    デフォルトのチェックでも十分に有益なので導入の価値あり • 組織やチームのポリシーに応じた柔軟な設定が可能 • branch protection ruleと組み合わせることにより、安全でない変更が適用 されてしまうことを防ぐことができる