組み込みシステムの開発をGitHubでスピードアップ

Image of Chris Reddington

ソフトウェアやハードウェアが普及した世界で、GitHubはミッションクリティカルな組み込みシステムを安全に開発できるよう支援します。


ソフトウェアやハードウェアが普及した世界で、GitHubはミッションクリティカルな組み込みシステムを安全に開発できるよう支援します。

私たちが生きているこの世界は、想像以上にソフトウェアとハードウェアが密接しています。ハードウェアというと、まず何を思い浮かべますか?スマートフォン?ノートPC?洗濯機や自動車はどうでしょう?それとも、自宅のあちこちにあるたくさんのスマートホームデバイスのどれかでしょうか?

このような組み込みシステムを産業的な視点から見ると、エレベーターから飛行機、製造ラインから信号機、医療機器から革新的なロボット工学の世界まで、チャンスは無限に広がっています。

これらのシステムは、基本的にソフトウェアに依存しています。従来、こうした機器に搭載されるソフトウェアの種類は、特定のタスクに特化したものでした。たとえば自動車では、エンジンやトランスミッションの管理といった機能面を扱うシステムや、エアバッグの展開、アンチロックブレーキシステムの制御など、安全上重要なシステムなどがあります。

私たちは毎日、このような制御システムに頼っていますが、日常生活でこれらのシステムが果たす役割について考えたことはないでしょう。結局のところ、アーサー・C・クラークが言ったとおり「十分に発達した科学技術は、魔法と見分けがつかない」のです。

DevOpsとは、エンドユーザに価値を提供し続けることです。これまで述べてきたような種類のシステムにとって、品質とセキュリティは譲ることのできない、基本的な要素です。自動車のISO 26262や医療機器のIEC 62304など、数え切れないほどある機能安全性規格のいずれであっても、規格に準拠しようとすると、開発プロセスは大幅に複雑になります。ISO 27001と新しいサイバーセキュリティに関する国連の規制要件AUTOSARMisraなどの産業コーディング規格に加わってくると、組み込み開発の世界では自動化する方法を見つけることがますます重要となるのもご理解いただけると思います。

このブログでは、この種のシステムを設計、構築、デプロイする際、開発ライフサイクル全体を通じてGitHubがどのような付加価値を提供できるかをご紹介します。

共同開発

ソフトウェア開発のスタート地点は、内容をよく理解したうえで計画を立てることです。チームが明確な計画を立て、コードを書き、ユーザーに素晴らしい体験を提供できるようになれば、開発も楽しく感じます。GitHubは、計画からビルド、デプロイ、継続的なフィードバックまで、ソフトウェア開発サイクルのすべての領域を支援します。

こうした作業の基盤となるのは、バージョン管理ソフトウェアです。2008年にスタートしたGitHubを、Gitのバージョン管理ができるプラットフォームとして認識している方も多いでしょう。(最近のGitHubではもっと多くの機能を利用できます!)2008年より以前は、ソースコード管理には様々な形態が用いられていました。

ソフトウェア開発の観点から見て、バージョン管理システムにコードを保存することは、現代のソフトウェアエンジニアリングの慣習から得られる多くのメリットを享受するために欠かせません。GitHubのGitリポジトリにコードを保存すると、以下のことが可能になります。

  • コードベース上の開発履歴を完全に追跡する。
  • エンジニアリングチームは個別のブランチで作業できるため、お互いの作業を妨げることなく開発を進められる。
  • 必要に応じて、コードベースの以前のバージョンにロールバックする。
  • 本番環境のコードベースにブランチ保護ルールを追加し、変更をマージする前にピアレビューを受けるか、自動化された一連の品質ゲートをパスしなければならないようにする。
  • その他、多数。

上記の内容から、こうした重要なシステムの開発にはバージョン管理が不可欠であることがわかります。詳細な変更履歴、ブランチ保護ルールによる品質ゲートの追加、Pull Requestによるピアレビューの義務化により、コンプライアンスは開発後に別途対応したりチェックリストを追加したりするものではなく、プロセスの一部として組み込まれます。

すべての作業の安全性

組込みシステムについてセキュリティの観点から考えてみましょう。自動車に搭載されている組み込みコンピュータを誰かに乗っ取られたとしたら、どうなるでしょうか?その影響は個々のシステムによって異なりますが、壊滅的なものになる可能性があります。安全装置に関するシステムであれば、人命の損失につながりかねません。

このような背景から、重要なシステムを構築する開発チームがセキュリティを優先すべきなのは当然のことです。GitHubでは、セキュリティは全員の責任であり、後回しにしたり、本稼働前に一度だけレビューすればよいものではないと考えています。むしろ、開発ワークフローに組み込めるものであり、組み込むべきものだと考えています。前述のコンプライアンスに対する考え方と同様に、日々の作業の一部となるべきものです。

GitHubでは、セキュリティのワークフローへの導入に役立つツールがいくつか用意されています。その一部をもう少しご紹介しましょう。

自分が書いたコードを保護

懸念すべき点として最初に思い浮かぶのは、自分が書くコードかもしれません。私たちは人間であり、完璧ではないので、常に完璧なコードを書けるわけではありません。先ほど、開発ライフサイクルに品質チェックを追加するオプションとして、ブランチ保護ルールをご紹介しました。その品質チェックの1つとしてセキュリティを追加し、書いたコードをレビューできるとしたらどうでしょう?

そこで役立つのがGitHub Code Scanningです。この機能については、CodeQL (GitHub Code Scanningを強化するGitHubの組み込みコード解析エンジン)とサードパーティが提供するツールとの統合という2つの観点から考えることができます。

CodeQLは、C、C++、Java、Pythonなど、組み込みシステムを構築する際によく使われる言語をサポートしています。CodeQLは、コードをデータベースのような構造に変換します。変換後は、GitHubが作成した数々のクエリをすぐに使用できます。オープンソースコミュニティでこれらのクエリを拡張して、インジェクションやバッファオーバーフローの脆弱性など、コードベース内で生じるパターンを特定することも可能です。

CodeQLスキャンは、先ほど言及したPull Requestフローの一部として実行できます。つまり、本番環境のコードベースにコードをマージする前に、品質保証プロセスの一部としてセキュリティをチェックする手段が増えたということです。

Screenshot showing a GitHub code scanning failure as it potentially allowed an injection attack

 

実際、標準規格のCERT C++とAUTOSAR C++を実装するCodeQLクエリについて、Brittany O’Sheaが昨年ブログ記事を執筆しています。

ですが、既にいくつかのセキュリティスキャンツールを使用している場合はどうでしょうか?心配はいりません。GitHub Code Scanningは、SARIF出力形式をサポートさえしていれば、サードパーティツールと統合できます。

安全なパッケージを信頼

皆さんがリリースするソフトウェアは、皆さんのチームが書いたコードだけでできているわけではありません。オープンソースソフトウェアは、ますます使用されるようになっており、同じコードを一から書くのではなく、より規模の大きいコミュニティの知恵をベースにしてビルドすることを目的としています。

ですが、ここで重要な問題があります。リリースするソフトウェアに脆弱な依存関係がないことを確認するには、どうすればよいのでしょうか?答えは「オープンソースへの依存をやめること」ではありません。そうではなく、コントロールできる方法でオープンソースソフトウェアを導入するのです。これには、組織内にオープンソースプログラム用のオフィス(OSPO)を設置して、オープンソースの使用を管理することも含まれます。

GitHubには、依存関係を最新の状態に保つためのツールが用意されています。ここではDependabot依存関係のレビューをご紹介します。

Dependabotは、依存関係を最新の状態に保つのに役立つ便利なツールで、脆弱性があるパッケージを既に使用しているかどうかを識別できます。安全でない依存関係を使用している場合、ユーザーのリポジトリに個別でアラートが表示されます。これにより、適切な対応をして速やかに修正し、最新バージョンでコードにパッチを適用することができます。アラートに基づいて直接Pull Requestをオープンすれば、もっと早く修正することも可能です。

ちなみに、Dependabotには、依存関係のバージョンを積極的に最新に保つことで、さらに役立つことがあります。サポートされているパッケージマニフェスト(Maven、pipなど)の内容を追跡することで、新しいバージョンのパッケージが利用可能になるとPull Requestを開くことができます。Pull Requestは品質チェックをすべてクリアする必要があり、自動チェックや(詳細は後述)、変更をマージする前に手動で承認を得る必要もあるため、この追跡は魅力的です。

Screenshot showing a GitHub Pull Request that fixes vulnerabilities by upgrading from one version of a package to a more recent version

Dependabotは主に本番環境で既に使われているマニフェストに対して機能しますが、品質保証プロセスに保護対策を追加するにはどうすればよいでしょうか?GitHub Advanced Securityの依存関係レビュー機能が役に立ちます。

Screenshot showing dependency review as part of a GitHub Action workflow. Dependency review detected a newly introduced dependency, and blocked the workflow from progressing.

GitHub Actionの依存関係レビューを使って、Pull Requestで依存関係の変更をスキャンできます。新たに脆弱性が検出された場合(新しいパッケージを導入した場合や既存パッケージを脆弱性のあるバージョンに調整した場合など)、GitHub Actionはエラーを発生させ、Pull Requestがマージされないようにします。

シークレットを洩らさない

IBMの「Cost of a Data Breach 2022」レポートによると、データ漏洩の原因として特に多いのがシークレットや認証情報を公開してしまうことですが、追跡が十分に行われることはあまり多くありません。ソース管理においてシークレットを保存することはアンチパターンであり、誰でもアクセスできるソフトウェアをリリースする場合は問題になることがあります。エレベーター、自動車、製造業の生産ライン設備、モノのインターネット(IoT)デバイスなど、信頼できないハードウェアデバイス用にリリースされるソフトウェアを考えてみてください。悪意のある攻撃者は、デバイス上で実行されているソフトウェアにアクセスし、ローカルに保存されているあらゆる認証情報を取得して、こうしたシークレットを侵害に利用するかもしれません。

Screenshot showing that GitHub security scanning detected an AWS Secret Access Key in code

幸いなことに、GitHubのシークレットスキャン機能が役に立ちます。この機能は、何百ものパートナーパターンをスキャンできるだけでなく、独自のカスタムパターンも定義できます。これはコードベースのレトロスペクティブなスキャンに有効です。ですが、本番環境に侵入するのを防ぐにはどうすればよいでしょうか?そこで出番となるのが、シークレットスキャンのプッシュ保護機能です。最近、カスタムパターンも特定できるようアップデートしました

常に実情を把握する

セキュリティの観点から考えられる主要な課題の1つは、弱点がありそうな箇所を把握することです。ソフトウェアエンジニアやエンジニアリングリードは、一般的にプロジェクトの範囲内で仕事をします。一方、セキュリティ担当者は通常、組織全体のセキュリティ状況に焦点を当てます。セキュリティ担当者にとっては、どのリポジトリに脆弱性のあるコードやパッケージが含まれているか、そのリポジトリにシークレットがコミットされていないかを把握することが重要なのです。

GitHubはこれらの指標を監視、観察することの重要性を理解しているため、GitHub Enterprise Cloudでセキュリティ概要を提供しています。このセキュリティ概要では、GitHub Advanced Securityの結果を可視化し、現在のカバー率とリスク領域をまとめて把握できます。

Screenshot showing GitHub's security risk overview dashboard. It demonstrates the number of alerts generated by Dependabot, Code Scanning and Secret Scanning across enabled repositories.

Screenshot showing GitHub's security coverage overview dashboard. It shows the number of repositories that have had Dependabot, Code Scanning and Secret Scanning enabled, and helps identify potential gaps across the estate.

セキュリティ情報およびイベント管理(SIEM)ツールを利用している場合、複数のプロバイダとの統合が可能となり、管理および監視ニーズをさらにサポートできるようになったことは嬉しいニュースでしょう。

自動化で開発者の力を高める

組込みシステム向けのソフトウェアは重要であるため、安全対策や管理体制を整える必要があることをご説明しました。しかし、開発者の能力を高めるには、仕事を遂行するためのツールへのアクセスを与える必要があります。これには、ソフトウェアのビルド、テスト、デプロイを容易に実行できることも含まれます。

これまでの内容を踏まえると、GitHubのブランチ保護ルールを使用すれば、特定の基準を満たしてから、本番環境のコードベースにコードをマージするように設定できます。先ほど、ピアレビューとコラボレーションについて説明しました。ですが、自動化を使用してこのプロセスを加速させるというのはどうでしょう?

ここで役立つのがGitHub Actionsです。GitHub Actionsは、ソフトウェアワークフローを自動化できるCI/CDソリューションです。組み込みシステムの開発ライフサイクルでGitHub Actionsを使用すると、以下のことが可能になります。

  • 再利用可能なワークフローを使用して、エンジニアリングチーム全体で共通のビルドおよびデプロイメントパターンを簡単に共有する。
  • GitHub Actions のマトリックス機能、またはGitHub Actionsのクラウドホストランナー内のArm開発ツールを使用して、異なるハードウェアプラットフォーム間でクロスコンパイルする。
  • 継続的インテグレーションプロセスの一環として、ソフトウェアを自動的にビルドし、テストする。Pull Requestで、ビルドが正常に行われ、テストに成功したことを確認してから本番環境にマージする。
  • 更新されたファームウェアイメージを自動的にパッケージ化して効率的にデプロイし、エンドユーザに適切なタイミングで効果的に提供する。
  • CDプロセスの一部として更新とリリースをオーケストレーションし、組み込みシステムにファームウェアの更新を自動的にデプロイする。

GitHubで開発を続ける

以上、GitHubの概要と、組み込みソフトウェアの観点から見たGitHubの有用性についてご説明しました。開発者の生産性を高め、安全な開発を可能にするGitHubのコラボレーションプラットフォームなら、多くの場面で皆さんをさらに支援できると確信しています。

GitHub Enterpriseの無料トライアルを開始し、GitHubが日々の開発にいかに役立つかをご確認ください。