モバイルアプリケーションから大規模な金融機関のインフラストラクチャーまで、ソフトウェアの構築方法は急速に進化しており、セキュリティは開発者が最初から考慮するものとなりました。開発のペースが速まると、セキュリティ侵害のリスクが大きくなります。セキュリティに気を使っている大企業でさえ、公開されているソースコードにパスワードを残したり、お客様の個人データを漏洩したり、明らかに脆弱性があるのに重要なアプリケーションを本稼働させたり、といったことは珍しくありません。多くの企業が新しいソフトウェアをいち早くリリースしようと懸命になり、ソフトウェアの安全性を保つことに苦労しています。
このように、企業におけるソフトウェア開発は迅速な作業とセキュアな構築の両立が課題になっています。新しい開発手法はコードをより早く市場に投入できますが、不適切なツールやプロセスを使うと、セキュリティが不十分になりかねません。ここでは、エラーや違反を回避し、悪用可能な脆弱性からコードを守るベストプラクティスをご紹介します。
機密情報を安全に管理、保存する
常に適切な仕組みを用いてソフトウェアのキーを管理し、アカウント情報を公開リポジトリに残さないようにします。リポジトリには、パスワードやOAuthのトークンなど実際に使っている認証情報を保存しないでください。
個人を特定できる情報 (PII) のような機密データは、暗号化されたセキュアなデータベースに保存すべきあり、より厳格な取り扱いガイドラインが必要です。不正アクセスが原因であっても、PIIを含むデータの漏洩によって、個人に危険が及び、なりすまし犯罪などの結果を招くおそれがあります。PIIの保管場所と非本番環境を分離し、不要なアクセスを制限することがきわめて重要です。
開発ワークフローを自動化することでセキュアな環境を構築する
継続的インテグレーションやコードスキャン、デプロイメントを継続的に行うツールを活用することで、これまでにないほど簡単にコードのテストを自動化できるとともに、セキュリティを強化できます。CI/CDツールを使って、コードのバグやセキュリティ上の脆弱性をテストし、デプロイメント前に開発基準を満たしていることを確認する一連のワークフローを自動化しましょう。
これらのツールを使うことで一貫性のある、再現可能で透明性の高い環境を構築できるため、セキュアな開発プロセスを確立できます。セキュリティを監査する部署がない企業においても、ツールを活用することでこれまで以上に簡単に、セキュアな開発環境を構築できるようになります。
例えば、金融サービスにおけるソフトウェア開発では、適切な担当者がサーベンスオクスリー法 (SOX法) に従ってコードをレビューすることが義務づられており、ワークフローを自動化することでレビュータスクが必ず実施されるよう設定できます。
詳細なログと監査でリスクを管理する
プロセスでリスクを完全に排除することはできませんが、リスクを効果的に管理することは可能です。ワークフロー、変更、および監査証跡の詳細なログを保持しておくと、問題が生じた時の原因追跡に役立ちます。エラー、脆弱性、侵害などを正確に特定できれば、短時間で問題を修正し、障害を排除してコードを保護できるからです。
セキュリティを重視するためにユーザー制限を厳しくすると効率的なコラボレーションを妨げる結果になりかねないため、最低限のユーザー権限や設定のみを行う管理者もいます。このような場合、権限のない人物によるシステムの悪用や不正アクセスはまったくないと保証することはできませんが、詳細なログと監査で被害を最小限に留めることは可能です。
サードパーティーツールを活用し、連携させる
すべての開発ツールを社内で開発する方が効果的な場合もありますが、そのデメリットとしてツールの開発作業とセキュリティリスクが大きな負担となります。そのような負荷を抑えるため、サードパーティーツールの活用や連携を検討しましょう。社内で開発しようとせず、組織の主要なニーズを解決する最高品質のツールを探し出すのです。
CIからチャットまで、サードパーティツールを活用することで自社開発の負荷を抑制するだけでなく、サポートや継続的なアップデートなどツールの保守を心配することなく、開発作業に集中できます。
バグレポートを自動化する
手作業でのバグの追跡やレポートは時間がかかるうえに、内容が不正確になりがちです。ログファイルからバグを自動検出するRollbarやSentryなどのツールを使って、バグレポートの作成を簡素化しましょう。検出されたバグは、バグ追跡システムに記録されます。
セキュリティに関するプロセスを継続的に改善する セキュリティを確保するためのベストプラクティス、テクノロジー、手法は常に進化しています。ソフトウェアの安全性を保つために、新しいものに対しても同じように柔軟にアプローチし、迅速に適応する必要があります。
ソフトウェア腐敗を避ける
コードの一部や、そのコードが依存しているコードが古くなったり、保守されなくなると、ソフトウェアの品質が低下し、ソフトウェアの腐敗が発生します。こうなると、問題がソフトウェアの他の部分に広がるおそれがあります。例えば、あるコンポーネントにセキュリティの脆弱性があると、システム全体が侵害されやすくなります。
腐敗を避けるには、コード、ユニットテスト、スタティックコード分析ツール、およびその他のチェックをアップデートし、古いコードに対しても問題がないか常に監査しておく必要があります。
データをクリーニングおよび検証する
開発したソフトウェアでデータを収集し、その結果からアクションを取ることが一般的になった今日、収集したデータを検証しクリーンに保つことは、企業とユーザー双方を悪意あるデータ利用から身を守り、セキュリティを担保するのに重要なことです。たとえばフォームバリデータやその他ツールを使って、入力されたデータが貴社のシステムに格納される前に、適切にチェックを行いましょう。
データ収集に関する予防的なプロセスを設けることで、悪意のある攻撃を阻止できます。一般的なデータベースの脆弱性であるSQLインジェクションは、適切な検証プロセスが整えられていない場合に、アプリケーションを通して発生します。
SQLインジェクション脆弱性が存在すると、次のような攻撃が可能です。
- 認証をバイパスする、または特定のユーザーになりすます
- クエリーを通して機密データにアクセスする
- データベースからレコードや重要な情報を削除する
- データベースサーバーを再構成し、オペレーティングシステムにアクセスできるようにする
セキュリティを最初に考える
かつて、セキュリティは「後から考えるもの」でした。開発サイクルの最後に取り入れられ、きちんとした対応を考慮せず、ただバグを修正し、問題を解決することが求められていました。今や時代は変わり、セキュリティに対する脅威がかつてないほど増えました。
「セキュリティを最初に考える」とは、セキュリティに関する重要な話し合いのタイミングをプロセスの序盤に移すことです。早い段階からセキュリティ対策に取り組むことにより、変更が難しく高いコストがかかるようになる前に、セキュリティについて話し合い、セキュリティを考慮した設計をすることができます。
このコンセプトはシンプルですが、開発に関わるすべてのチームがセキュリティに責任を持つ必要があります。一部の企業では、セキュリティスペシャリストをスクラムチームに招き、プロセス全体を通してセキュリティを最優先に考えるようにしています。
暗号化、暗号化、暗号化
データが適切に暗号化されないと、多種多様なサイバー攻撃を受けるおそれがあります。非認証アクセスを回避する手段の一例として、暗号化されたTLSのセキュアな接続をHTTPS経由で利用することが挙げられます。HTTPSは通信の安全性を高めるために、安全な接続を検証する暗号プロトコルを利用します。このプロトコルは、サーバーからユーザーに送信される情報に対して、エンドツーエンドで階層化された暗号化を行います。暗号化により、中間者攻撃など、セキュアでない接続を悪用した侵害を防ぐことができます。
Let’s Encryptのようなサービスの登場により、ウェブサイトのSSL証明書の取得はとても簡単になりました。ウェブベースの取り組みは、常にHTTPSから始める必要があります。これは誰もが今すぐに行うべき必須事項です。
セキュアなソフトウェアの構築には時間がかかります。また、開発サイクルのすべての面でセキュリティのベストプラクティスを活用することに、責任を持って取り組む必要があります。セキュリティ侵害、ハッキング、エクスプロイトがどんどん巧妙になる一方、開発者は常に防御を強化する必要があります。
自己評価テスト
ソフトウェア開発において、機能やユーザービリティと同じか、それ以上に重要なのがセキュリティです。
あなたの企業では、ソフトウェアの脆弱性を最小限に抑える開発プロセスを実践していますか?
GitHubはセキュリティ専門家の協力を得て、安全なソフトウェア開発の自己評価テストを作成しました。20問の質問に回答することで、安全なソフトウェア開発ワークフローが実践されているかをチェックすることができます。