メインコンテンツに移動
ビジネス x クラウド

セキュリティを何から始めれば良いか分からない開発者の方へ

2022-07-04 | 金森 政雄

はじめに

ビルダーの皆様、こんにちは。デベロッパースペシャリストソリューションアーキテクトの金森です。普段は、開発者の方に向けたイベントの企画 / 運営 / 登壇や、お客様のクラウドを活用した開発のお手伝いをしています。

この記事では、前回 の桐山さんの記事に続き開発者の方に向けたセキュリティの考え方のヒントをお届けしたいと思います。

さて、皆さんは「セキュリティ」と言われると、どう思いますか ?「 大好きです !!」という方、素晴らしいですね。
ただ、多くの方は「興味はあるし大事なのはわかっているけど・・・」という思いをお持ちなのではないでしょうか ? 

かくいう私もそうでした。この記事を読んで、「自分たちの開発にもセキュリティの取り組みを取り入れてみようかな」と思ってもらえれば嬉しいです。


X ポスト » | Facebook シェア » | はてブ »

builders.flash メールメンバー登録

builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。 
今すぐ登録 »

セキュリティかぁ・・・となるのは何故 ?

この画像のように、「セキュリティは全員の責任です」と言われたこと、皆さんもあるのではないでしょうか ? しかし、最初にも書きましたが、開発者の皆様もセキュリティの重要性は十分理解されていると思います。自分の開発しているアプリに脆弱性を組み込みたいと思う開発者の方はいないはずです。

では、なぜ多くの開発者は「セキュリティ」に関して若干の苦手意識があるのでしょうか ? 当然、これまでのご経験や担当されている業務などによって様々な理由があるはずですが、よくある疑問として、「具体的に何をすれば良いのか分からない」ということがあるのではないかと思います。

業務の中で、「セキュリティは大丈夫ですか ?」と質問されたり、「セキュリティを万全にしてほしい」と言われたご経験のある方は多いのではないでしょうか ? その時、誠実に回答しようとすると難しさがあると思います。例えば

「使っているフレームワークは最新化しているし、コーディングのベストプラクティスに沿っている」
「WAF やセキュリティスキャンを実行して脆弱性や攻撃を検知できるようにしている」

と回答できるかもしれません。けれども、それで "大丈夫" と言い切って良いものか、モヤモヤしてしまうのではないでしょうか ?

実は「セキュリティを万全にしてください」という要求はそれだけでは不十分です。現代において、ソフトウェアは日々更新され、そして残念ながら同様に攻撃者も日々様々な攻撃方法を試し、生み出しています。この状況において、全てのセキュリティの問題を解決できる銀の弾丸は現時点ではありません。しかし、私たちがセキュリティの対応や実装のためにかけることができるコストや時間は限られています。

そのため、みなさんのシステムでセキュリティを必要十分に実装するためには、

「何を」
「どんな脅威から」
「どのようにして」

守るのかを具体的に定義して、限られたリソースを適切に投入する必要があります。

「セキュリティは大丈夫ですか ?」という質問の中にはこのような具体性がありません。これは、システム開発において、要件が不確定であるという状況ととても類似しています。開発者の皆さんは何かを作るのが好きで、それにやりがいを感じているからこそ、この仕事を選ばれていると思います。しかし、要件が曖昧で、何を作れば良いのか分からない中では、開発のモチベーションが上がらず、効率的に素晴らしいものを開発することはできない、ということもよくご存知でしょう。

セキュリティでもこれは同じです。「セキュリティを万全にしてください」という要求は、具体性がなく、曖昧な要件と同じです。これでは、みなさんも具体的に何をすれば良いか分からず、モチベーションが下がってしまうのではないでしょうか ?
これが、開発者の方がセキュリティに苦手意識を持つ、1 つの理由ではないでしょうか。

Image with the text 'Security is everyone's responsibility.' and its Japanese translation, emphasizing that security involves all members, not just specialists. #AWSBuilders

セキュリティの要件を具体化するために

では、どのようにすれば "セキュリティ" を具体的な要件にすることができるでしょうか ?

セキュリティ要件の定義にも様々な方法やガイドが出されていますが、ここでは、AWS Well-Architedted フレームワーク でも セキュリティの柱の 1 つのベストプラクティス として触れられている「脅威モデリング」をご紹介したいと思います。

脅威モデリングについての日本語によるスライドで、セキュリティ設計におけるリスク定義に関する内容と、手のひらに乗ったフォークリフト型おもちゃと“RISK”と書かれた積み木の画像が含まれています。

脅威モデリングとは

脅威モデリングは設計時に潜在的なセキュリティの問題を特定し、リストアップする方法です。

自分たちのアプリケーションやサービス、開発しているモジュールに対して、どんな脅威が考えられ、それに対して影響度や、どのような対応方法、軽減策があるかを整理することで、優先度をつけて具体的な対応策を考えることができます。
下記のような情報をリストにまとめ、セキュリティ要件の特定をしていきます。

  • アセット / アクター / エントリポイント / コンポーネント / 信頼レベル

  • 脅威のリスト

  • 脅威ごとの軽減策


これらをもとに、リスクマトリクスを作成し、脅威に対して適切な対応が行われているかを確認していきます。

次の図は脅威モデリングの例です。
また、より詳しい脅威モデリングの方法については、AWS ブログの 脅威モデリングのアプローチ方法 もご覧ください。

実際に脅威を洗い出す際には下記のような脅威のリストやセキュリティのガイドラインを参考にすることをお勧めします。

脅威モデリングの例を示す表で、セキュリティ要件を特定するための脅威と緩和策(日本語)が記載されています。ユーザーアカウントの脅威、エントリポイント、攻撃サマリー、テクニック、および予防的/発見的コントロールの詳細が書かれています。

実装のセキュリティチェックの自動化

セキュリティの要件が具体的になったら、次はセキュリティをどのように実装していくかを考えなければいけません。しかし、具体的な実装方法はセキュリティ要件によるのでこの記事で扱いきれません。一方で、セキュリティのチェックなどのプロセスは自動化を導入することで効率化することができます (開発者の皆さんは自動化は大好きですよね ?)。

そこで、ここからは皆さんの開発環境にも導入できる、自動的なセキュリティチェックの方法やプラクティスを紹介していきたいと思います。

A Japanese language diagram illustrating the AWS DevSecOps lifecycle, showing stages such as Plan, Code, Build, Test, Release, Deploy, Operate, and Monitor, with security practices and compliance steps annotated for each phase.

コーディング中のセキュリティチェック

IDE プラグインの導入

IDE プラグインの導入

皆さんが普段利用されている IDE に snyk などが提供するセキュリティプラグインを導入することで、コーディング中からセキュリティの課題を発見し、不具合を作り込んでしまうことを防ぐことができます。これらのプラグインは通常、正規表現などを利用してソースコード上にセキュリティ上の問題のある実装が行われていないかをチェックし、迅速に開発者にフィードバックを提供してくれます。

ただし、あくまでも開発者への迅速なフィードバックを目的としているものであるため、この後紹介する別のフェーズでのアプローチと組み合わせて利用することをお勧めします。

Pre-Commit フック

コーディング中の情報漏洩の中で、アクセスキーやシークレットトークン、キー情報などをハードコードしたまま、git リポジトリにコミットしてしまうというトラブルはよくある失敗です。Talismangit-secret などの Pre-Commit フックを利用することで、機密データが誤って git にコミットされることを防ぐことができます。

コードレビュー

上記のようなツールを使ったチェックは便利で、迅速なフィードバックを得ることや、単純なミスを防ぐためにはとても有用ですが、全ての問題を見つけて防ぐことができるわけではありません。経験豊富な開発者によるレビューは、ツールでは見つけづらい問題を発見したり、コード全体の品質を高めるためにも非常に効果的です。正しいプラクティスに沿った実装は多くの場合セキュリティを強化することにもつながるため、コードレビューはセキュリティにとっても価値のある活動と言えます。

一方で、コードレビューには工数がかかってしまい、特に熟練の開発者には難しい機能の実装などより価値を生み出す作業に多くの時間を費やしてほしいということも事実です。

Amazon CodeGuru Reviewer は AI によるコードレビューにより、レビュアーに負担を減らし、レビューを受ける側も迅速なフィードバックを得ることができるため、コードレビューをより効率的に行うことができるようになります。また、Security Detector というセキュリティに関する検出器により、セキュリティの問題の検査も可能です。

この機能についてより詳しく解説した記事が、こちら で公開されておりますので合わせてご覧ください。

Pre-Commit フック

コーディング中の情報漏洩の中で、アクセスキーやシークレットトークン、キー情報などをハードコードしたまま、git リポジトリにコミットしてしまうというトラブルはよくある失敗です。 Talismangit-secret などの Pre-Commit フックを利用することで、機密データが誤って git にコミットされることを防ぐことができます。

コードレビュー

上記のようなツールを使ったチェックは便利で、迅速なフィードバックを得ることや、単純なミスを防ぐためにはとても有用ですが、全ての問題を見つけて防ぐことができるわけではありません。経験豊富な開発者によるレビューは、ツールでは見つけづらい問題を発見したり、コード全体の品質を高めるためにも非常に効果的です。正しいプラクティスに沿った実装は多くの場合セキュリティを強化することにもつながるため、コードレビューはセキュリティにとっても価値のある活動と言えます。

一方で、コードレビューには工数がかかってしまい、特に熟練の開発者には難しい機能の実装などより価値を生み出す作業に多くの時間を費やしてほしいということも事実です。

Amazon CodeGuru Reviewer は AI によるコードレビューにより、レビュアーに負担を減らし、レビューを受ける側も迅速なフィードバックを得ることができるため、コードレビューをより効率的に行うことができるようになります。また、Security Detector というセキュリティに関する検出器により、セキュリティの問題の検査も可能です。

この機能についてより詳しく解説した記事が、こちら で公開されておりますので合わせてご覧ください。

ビルド時のセキュリティチェック

静的アプリケーションセキュリティテスト (SAST)

次に、実装されたコードを CI (継続的インテグレーション) の中でビルドするステージで行うことができるプラクティスが、静的アプリケーションセキュリティテスト (SAST) です。開発されたコードにおけるセキュリティの脆弱性を、ソースコードを静的に解析することで検知します。

先ほど紹介した、Amazon CodeGuru Reviewer の Security Detector を SAST として利用することもできますし、GitHub をお使いのお客様であれば、GitHub Code Scanning 、また、OSS の SonarQube など、様々なソースコード解析ツールが存在します。

日本語で書かれた静的アプリケーションセキュリティテスト(SAST)について説明するスライド。SASTの概要、SQLインジェクションやXSSなどの例、AWSのサービス(Amazon CodeGuru Reviewer・Security Detector)、および他社サービス(GitHub Code Scanning、SonarQube、Checkmarx)が紹介されています。

テスト時のセキュリティチェック

動的アプリケーションセキュリティテスト (DAST)

ビルドも成功し、実際にアプリケーションを動作させてテストを行うフェーズまで到達した場合、セキュリティのテストも動的アプリケーションセキュリティテスト (DAST) として実施することができます。

これまでの静的なチェックでは発見できないような、システムを結合して実際に動作させた際の挙動から発生する脆弱性など、実行時の問題を発見するために有用なテストです。OWASP ZAP (Zed Attack Proxy) などを使うことで実施することができます。

SAST の結果と比較して、誤検出や検出漏れをチェックしていくことで、より効果的になります。

CI/CD パイプラインへの組み込み

ここまでご紹介してきた、SAST や DAST を CI/CD のパイプラインに組み込みことで、セキュリティテストを自動化し、開発中に迅速なフィードバックを得て、継続的にアプリケーションのセキュリティを強化していくことができます。AWS の開発者向けサービスである、Code シリーズで実現する場合、CodepPipeline で作成されたパイプラインの中で、CodeBuild から各ツールの分析やテストを実行することでこれを実現することができます。

buildspec.yaml の例

実際に CodeBuild から SonarQube でのコード解析を実行し、SAST を行うサンプルの buildspec.yaml の例を紹介しておきます。 このコードでは下記の環境変数を定義しています。

bash
SONARQUBE_URL=<利用しているSonarQube のURL>
SONARQUBE_ACCESS_TOKEN=<SonarQube で発行したアクセストークン>

------------------------
version: 0.1

phases:
  pre_build:
    commands:
      - echo Installing SAST Tool...
      - wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip
      - unzip sonar-scanner-cli-4.6.2.2472-linux.zip
      - mv sonar-scanner-4.6.2.2472-linux /opt/sonar-scanner
      - chmod -R 775 /opt/sonar-scanner
  build:
    commands:
      - echo Build started on `date`
      - /opt/sonar-scanner/bin/sonar-scanner -Dsonar.sources=. -Dproject.settings=sonar-project.properties -Dsonar.host.url=$SONARQUBE_URL -Dsonar.login=$SONARQUBE_ACCESS_TOKEN > sonarqube_scanreport.json
      - echo Build complete on `date`

ハンズオン

このような構成を実際に AWS 上で試してみることができる ハンズオン も公開されています。

まとめ

いかがでしたか ? 開発者の方にとってセキュリティは「大事なのはわかっているけれど何をしたら良いかよくわからないもの」であるために、面倒に思ってしまったり、難しく感じている面があるのではないでしょうか ?

しかし、実際はセキュリティもこの記事でご紹介した脅威モデリングなどのプロセスによって具体的な "要件" として定義していくことが可能です。そうして具体的な課題になれば、ものづくりを愛する開発者の皆さんにとっては、どう解決すれば良いかを考え、実装していく興味深い対象に見えてくるのではないでしょうか ?

またセキュリティの実装について、自動化によってライフサイクルの中でチェックしていくことで、継続的な改善もしやすくなってくるはずです。ぜひ、皆様の環境で実現しやすいところから取り組んでみてください。

この記事が、セキュリティに対して、苦手意識のあった開発者の方にとって、チャレンジのきっかけになれば嬉しく思います。「こんな取り組みしたよ」という取り組みがあればぜひ「#AWSウェブマガジン」タグをつけて投稿いただくか、勉強会などで紹介してみてください。

筆者プロフィール

金森 政雄
アマゾン ウェブ サービス ジャパン合同会社
デベロッパースペシャリスト ソリューションアーキテクト

Web、モバイル向けの自社サービスの開発やクラウドを活用したシステムの請負開発を経験後、パートナーソリューションアーキテクトとして、アマゾン ウェブ サービス ジャパン合同会社に入社。2021 年から DevAx チームとして、開発者の方に向けたイベントやワークショップの提供を中心に活動。
最近の個人的ニュースは家の近くのラーメン屋で、「まさお」という自分の名前と同じメニューがあったこと。

A cartoon illustration of a monkey wearing large square glasses, smiling, with a green and white striped background and shiny effects.