Slide 1

Slide 1 text

バクラクの爆速開発を支えるIaCとセキュリティ @shnjtk 2022.9.30

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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.

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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/

Slide 20

Slide 20 text

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実行結果

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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