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

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

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. バクラクの爆速開発を支えるIaCとセキュリティ
    @shnjtk
    2022.9.30

    View Slide

  2. Confidential © 2022 LayerX Inc.
    2
    自己紹介
    高江 信次
    LayerX バクラク事業部
    DevOpsチーム マネージャー 兼
    Payment(法人カード事業)開発チーム マネージャー
    最近はアプリ開発の方が多いですが、今日はインフラのお話をします
    @shnjtk

    View Slide

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

    View Slide

  4. Confidential © 2022 LayerX Inc.
    4
    開発チーム構成
    DevOps
    PdM、QA、Product Enabling、AI-OCR、Design
    バクラク
    申請・経費精算
    バクラク
    請求書
    バクラク
    電子帳簿保存
    バクラク
    ビジネスカード

    View Slide

  5. Confidential © 2022 LayerX Inc.
    5
    爆速開発とは
    ● 顧客への提供価値(アウトカム)が速い
    ● 背中を預け合う
    ○ お互いに信頼し、信頼には責任をもって応える
    ● プルリクを止めてはいけない
    https://tech.layerx.co.jp/entry/2021/04/15/152404
    https://www.slideshare.net/mosa_siru/ss-251224289

    View Slide

  6. Confidential © 2022 LayerX Inc.
    6
    アプリ開発でよくあるインフラの変更
    ● S3 bucketを作成したい
    ● IAM policyを変更したい
    ● DynamoDB tableを作成したい
    ● Security Groupにルールを追加したい
    ● 環境変数を格納するためのSecrets Manager secretを作成したい

    View Slide

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

    View Slide

  8. Confidential © 2022 LayerX Inc.
    8
    インフラ CI/CDパイプライン 全体構成
    DevOps
    バクラク
    申請・経費精算
    バクラク
    請求書
    バクラク
    電子帳簿保存
    バクラク
    ビジネスカード
    各アプリに共通のリソースを管理

    View Slide

  9. Confidential © 2022 LayerX Inc.
    9
    爆速開発を実現するためにDevOpsチームが目指していること
    ● DevOpsチームがブロッカーにならないように、アプリチームもインフラ開発が
    できるようにする
    ● 一定の基準(社内ポリシー)に従ってセキュリティを担保する

    View Slide

  10. Confidential © 2022 LayerX Inc.
    10
    爆速開発とセキュリティを両立するために
    ● tfsecを導入
    ● GitHub Actionで実行。PR作成時に自動的にセキュリティチェックをかける
    ● デフォルトのチェックに加えて、社内ポリシーの準拠状況も確認

    View Slide

  11. Confidential © 2022 LayerX Inc.
    11
    tfsecとは
    ● Terraformコードの静的解析ツール
    ● デフォルトで様々なセキュリティチェックを行って
    くれる
    ● チェック項目ごとにseverityが規定されており、
    設定で変更することが可能
    ● カスタムチェックルールを記述することも可能
    https://aquasecurity.github.io/tfsec/v1.28.0/

    View Slide

  12. Confidential © 2022 LayerX Inc.
    12
    tfsecのデフォルトルール: S3 bucketの場合
    https://aquasecurity.github.io/tfsec/v1.28.0/checks/aws/s3/

    View Slide

  13. 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一覧を取得するコマンド実行例

    View Slide

  14. Confidential © 2022 LayerX Inc.
    14
    tfsec活用例
    ● S3 bucketを新規作成するケースを例としてセキュリティチェックと対策を行って
    いく様子を示します

    View Slide

  15. 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.

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

  18. 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の問題が残っている間は
    マージできないようにする等

    View Slide

  19. 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/

    View Slide

  20. Confidential © 2022 LayerX Inc.
    20
    GitHub Actionによるtfsec実行
    name: tfsec
    on: [pull_request]
    jobs:
    tfsec:
    runs-on: ubuntu-latest
    steps:
    - name: checkout
    uses: actions/[email protected]
    - name: Run tfsec with reviewdog
    uses: reviewdog/[email protected]
    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実行結果

    View Slide

  21. Confidential © 2022 LayerX Inc.
    21
    まとめ
    ● 爆速開発とセキュリティの両立を実現するためにtfsecを活用
    ● デフォルトのチェックでも十分に有益なので導入の価値あり
    ● 組織やチームのポリシーに応じた柔軟な設定が可能
    ● branch protection ruleと組み合わせることにより、安全でない変更が適用
    されてしまうことを防ぐことができる

    View Slide

  22. Confidential © 2022 LayerX Inc.
    22
    バクラク事業に興味ある方、ぜひお話しましょう!
    LayerX 採用情報

    View Slide