ニュース

GitHubが開発ライフサイクルのすべてをセキュアにする――、OSSを取り巻くセキュリティ動向を説明

 ギットハブ・ジャパン合同会社は18日、報道陣向けセミナー「OSSを取り巻くセキュリティ動向」を開催。GitHubを使ってアプリケーションを開発していく中で脆弱性を検知してセキュリティ対策していく方法について、GitHubの機能および開発ライフサイクルから解説した。

開発者ファースト、GitHubネイティブ、自動化のプラットフォームを提供

 前半ではGitHub リージョナルディレクターの山銅章太氏が、開発するアプリケーションのセキュリティに関する世の中の状況と、それに対するGitHubのアプローチについて解説した。

GitHub リージョナルディレクター 山銅章太氏

 冒頭で山銅氏はアプリケーションセキュリティへの取り組みについて、「GitHub上に置かれるプログラムのミスやそれによって起こるセキュリティホールについて、いかにGitHubで修正しアップデートをしっかり提供していくか、そのサポートをどうするか」ということだとして、「アプリケーション自体の安全性やセキュリティの向上にも言及するということは、それなりの大きな責任が伴ってGitHubが投資をしていかなくてはいけないことになる。GitHubの新しいページを開く」と語った。

 さて山銅氏は、コードの増加はセキュリティ侵害の増加でもあると述べた。そして、これまで5年間のメジャーなOSS(オープンソースソフトウェア)について、ソースコードの行数はほぼ直線的に伸びているのに対して、コードのセキュリティ問題が2017年ごろから急に伸びているというGitHubの調査結果を紹介した。

ソースコードの行数とセキュリティ問題の数の伸び

 その中でGitHubは、GitHub上にホストされるソフトウェアのセキュリティに多くの投資をしており、その主なものを山銅氏が紹介した。まず2019年5月にはDependabotを買収した。これはソフトウェアが依存しているライブラリのバージョンの問題を通知する技術だ。

 また、2019年9月には、ソースコード中の脆弱性を静的解析するSemmleを買収した。そのほか2019年11月には、GoogleやUberなど業界とのパートナーシップによるセキュリティ組織のGitHub Security Labと、さまざまな脆弱性報告をまとめたGitHub Advisory Databaseを発表している。なお、この3つは、後述するGitHubの機能の紹介に関係する。

GitHubのアプリケーションセキュリティへの主な投資

 続いて山銅氏は、GitHubが提供するアプリケーションセキュリティのアプローチとして、コードレビューなどと同様にセキュリティをGitHubのフローに含めることが重要だとし、「開発者ファースト」「GitHubネイティブ」「自動化」の3点を挙げた。

 「開発者ファースト」とは、これまでセキュリティ専門家に依存していたのを、開発者に近い側にもってくることだ。開発ライフサイクルでいうと、開発の最後ではなく早い段階からセキュリティ対策を考える「シフトレフト」となる。

 「GitHubネイティブ」とは、各種ツールがGitHubにまとまって同じUIで利用できることだ。「ツールが分散されていると、それぞれにログインしなくれはならなかったり、情報が分散したり、といった非効率が生じる」と山銅氏は言う。

 「自動化」とは、セキュリティ対策作業を自動化することだ。人手によるマニュアル作業だと不都合が生じることがあるため、自動化してより安全ないように改善していく。「すべて自動任せという意味ではなく、マニュアル作業で確立した作業を自動化していって安全にする」と山銅氏は説明した。

GitHubが提供するアプリケーションセキュリティのアプローチ

 最後に山銅氏は、GitHubが開発ライフサイクルのすべてをセキュアにするとして、サプライチェーン(依存ライブラリの対策)、コード(コード自身の対策)、開発ライフサイクル(GitHub上のすべてのアクションをトリガーにしてセキュリティ対策)の3つのセキュリティのためのプラットフォームを提供すると語った。

サプライチェーン、コード、開発ライフサイクルをセキュアに

開発の早い段階でセキュリティを検査するのに必要なこと

 後半ではGitHub シニアソリューションズエンジニアの田中裕一氏が、開発ライフサイクルでの具体的なセキュリティ対策と、そのためにGitHubが提供する機能を解説した。

GitHub シニアソリューションズエンジニア 田中裕一氏

 田中氏はまず、セキュリティインシデントの数が前年比48%増えているという調査結果を紹介。そのうち70%がWebアプリケーションの脆弱性を突いたものだとして、セキュリティにはいろいろな対策が必要だが、その中でもアプリケーションコードのセキュリティを担保していくことが大事だと語った。

 そこで田中氏が注目するのが、開発チームとセキュリティチームの関係だ。従来の関係では、開発がすべて終わったところでセキュリティ部門に渡してセキュリティを検証する事後対処型で、コミュニケーションもレポートを介したものとなる。

 「このようにサイロ化、分断されている状態だと、双方がやりづらさを感じる」と田中氏。開発者側にとっては、セキュリティチームのレポートが上がってきたときには次のプロジェクトに取り掛かっていて、新しいプロジェクトに前のプロジェクトが割り込んできた形となる。一方でセキュリティ側から見ると、最後の時間が限られたところで検証する形となるうえ、設計レベルの問題に関与できず、開発者が何度も同じような脆弱性を作っているように見える。

 そして、これを修復するためには、ソフトウェア開発サイクルの最初からセキュリティチームも入って、レビューするなど、いっしょに設計するのがベストだと田中氏は述べた。つまりセキュリティのシフトレフトであり、修正のコストも早い段階であるほど低くなるという。

開発チームとセキュリティチームの関係に課題
開発者側から見た不満
セキュリティ側から見た不満
将来の関係

 このときに問題になるのが、開発エンジニアとセキュリティエンジニアの人数の比率だ。GitHubで調べた結果では、その比率は500:1だという。そのため、設計のときから全面的にかかわるのは現実的には難しい。

 これに対して田中氏は、「コーディング」「レビュー」「CI(Continuous Integration)/テスト」「CD(Continuous Delivery)」「QA(Quality Assurance)」が循環する開発プロセスを図示。そして要所で、コードの静的解析や外部ライブラリの依存関係解析を自動で実行することを目指すべき姿として提示した。

 自動テストのほか、QAでは外部によるペネトレーションテストやバグバウンティなど、人手によるチェックも実行する。「外部テストの前にできるだけ脆弱性をつぶしておくことで、コストや工数を減らせる」(田中氏)。そして、そうした状況を可視化する。

開発プロセスにセキュリティ検証を組み込む

GitHubが提供するコードと依存性のセキュリティ検査機能

 続いて田中氏は、GitHubが提供するソリューションを解説した。大きく分けると、自分たちのコード内と、依存する外部のコードの2つになる。

 まず、新規コード内の脆弱性解析として、2つの機能が紹介された。

 シークレットスキャニングは、プログラムから外部のAPIを呼び出すためのシークレットトークンを、ソースコードに直接書いてしまうというよくある事故を防ぐものだ。シークレットトークンはいわばパスワードのようなもので、他人が悪用されないよう公開してはならない。これをGitHubがソースコードから自動的に検知する機能だ。

 もう一方のコードスキャニングは、ソースコード中の脆弱性を解析して検出するものだ。ちょうど10月に正式リリースとなった。「どのタイミングでも解析できるが、いちばんよく使われると思うのがプルリクエストごとに実行するものだ。脆弱性があればプルリクエストへのコメントで報告される」と田中氏は説明した。

 コードスキャニングは、前述したSemmleの、ソースコードを解析してクエリするCodeQL技術が元になっている。これを利用して脆弱性を起こすパターンをクエリすると、合致するソースコード上の場所を返してくるようになっている。コードスキャニングでは、GitHubが開発したクエリパターンや、GoogleやUberなどの業界コミュニティが公開しているクエリがあらかじめ用意されている。

 さらに、利用者が自分たちのクエリを書くこともできる。これにより、自分たちのコードに1つ問題を見つけたときに、いままでは修正して終わりだったのに対して、CodeQLのクエリにしておけば、ほかのプロジェクトや以後に書くコードに同じ脆弱性がないか確認できる。

シークレットスキャニング
コードスキャニング
GitHubや業界が作成したクエリでコードスキャンできる
見つけた問題をCodeQLにしてほかのプロジェクトを確認

 続いて、依存関係内の脆弱性解析だ。現代のソフトウェア開発では既存のライブラリやミドルウェアを使った開発が多い。山銅氏によると、新しく作られるエンタープライズアプリケーションの99%がオープンソースライブラリを参照されながら作られ、コードの9割がOSSからのコードで構成されているという。そうした中で、依存しているライブラリなどに脆弱性があると、自分のソフトウェアにも影響がある。

 依存関係のセキュリティに関する機能としては、田中氏は4つを挙げた。

 まずディペンデンシーグラフは、ソースコードから使っているオープンソースライブラリを抽出して可視化する機能だ。

 続いて、Dependabotアラートは、ソースコードが依存しているライブラリに脆弱性があったときに通知する機能である。

 Dependabotセキュリティアップデートはその発展型で、ライブラリに脆弱性があったときに、依存先を脆弱性が修正したバージョンに変更するプルリクエストを自動作成する機能だ。

 またDependabotバージョンアップデートは、脆弱性に限らず、ライブラリがアップデートれたときに、最新のバージョンにアップデートするプルリクエストを自動作成する機能だ。

 依存ライブラリの脆弱性がどれぐらい発見されるかの指標として田中氏は、2019年末の時点でGitHubが依存ライブラリの脆弱性のアラートを6200万件通知したという数字を紹介した。

ディペンデンシーグラフ、Dependabotアラート
Dependabotセキュリティアップデート、Dependabotバージョンアップデート

 これらのコード内のセキュリティと外部のコードのセキュリティの機能は、OSSプロジェクトではそのまま利用できる。そして、企業が自社環境で使うGitHub Enterpriseについては、これらのセキュリティ機能をパックにした「GitHub Advanced Security」を契約することで利用できることを田中氏は紹介した。