Skip to main content

SnykでGitHubリポジトリのアプリケーションセキュリティを自動化

Snyk API

2021年3月31日

0 分で読めます

Snykは幅広いインテグレーションと充実したAPIを提供しており、SDLC全体にSnykを導入し、組織で開発しているすべてのコードを監視できます。

もちろん、いつも簡単にできるとは限りません。

大規模な環境では、すべてのリポジトリをSnykで監視し続けることが難しくなります。組織の成長に伴い、新しいリポジトリが増え、コードも増えていきます。それだけでなく、既存のリポジトリも変化し続けます。気がつけば、新しいプロジェクトをSnykに追加したり、既存のプロジェクトを更新したりするセキュリティ管理業務に時間がかかり、効率も悪くなってしまいます。

SnykのAppSecチームもSnykを愛用しており、私たちも同じ課題に直面し始めました。そこで、特にアプリケーションセキュリティの自動化に関する代替ワークフローの検討を開始。Tech Servicesチームが開発したSnyk APIベースのツールを活用し、スケーリングの課題をすぐに解決しました。

詳しく見ていきましょう。

1. GitHubリポジトリの情報を取得する

最初に紹介するツールはsnyk-api-importです。新しいリポジトリをプロジェクトとしてSnykに自動インポートできる、非常に強力なツールです。Snyk APIを使って、バッチインポート、エラー処理、自動再試行を行いながら、管理された安定したペースでリポジトリをSnykに自動インポートします。

このツールは、対象のリストを読み込んでSnykにインポートし、その後APIを使ってインポートのステータスを確認します。

このツールを使うには、まずインポートする対象のリストを作成する必要があります。対象は次の3つのパラメーターで構成されます。

  • 組織識別子 — 対象をインポートするSnykの組織

  • インテグレーション識別子 — 使用するインテグレーションの種類(GitHub、Bitbucket、Dockerなど)

  • 対象の詳細 — GitHubの場合は、リポジトリ名、所有者、スキャンする特定のブランチです(その他のパラメーターについてはドキュメントをご覧ください)

つまり、GitHub上のすべてのリポジトリの情報を取得し、各リポジトリの対象を生成するコードを書く必要があります。その結果が、こちらの数行のコードです。

import {Octokit} from '@octokit/rest';
import { paginateRest } from '@octokit/plugin-paginate-rest'
import * as fs from 'fs/promises'
const MyOctokit = Octokit.plugin(paginateRest);
const octokit = new MyOctokit({
 auth: process.env['GITHUB_TOKEN']
}) as Octokit;

(async () => {

 let response = await octokit.paginate("GET /orgs/{org}/repos", {
   Org: <your GitHub org>
 }, res =>
   res.data.filter(repo => !repo.fork && !repo.archived).map(repo => {
     return {
       orgId: <>,
       integrationId: <>,
       target: {
         name: repo.name,
         owner: <Your GitHUb Org>,
         branch: repo.default_branch ?? "master"
       }
   }})
 )

 console.log(`found: ${response.length} potential targets`)

 await fs.writeFile('targets.json', JSON.stringify({
   targets: response
 }))
})().catch(e => {
 console.error(e)
})

このコードの最大の魅力は、柔軟にカスタマイズできることです。グループポリシーに応じて各リポジトリのインポート先組織を指定したり、対象外にするリポジトリを設定したりできます。しかも、わずか数行のコードで実現できます。

これでsnyk-api-importを実行できます。リポジトリの数によっては時間がかかりますが、完了すれば、すべてのコードがSnykの保護対象になります。

2. 変更を常に把握する

一度インポートできましたが、リポジトリが継続的に監視されるようにするにはどうすればよいでしょうか。同じツールを毎日実行する方法もありますが、時間がかかり、効率的とは言えません。

幸い、snyk-api-importには解決策があります。インポート済みプロジェクトの一覧を生成でき、次回の実行時には差分だけをインポートします。そのため、所要時間を大幅に短縮できます(追加されたリポジトリの数にもよりますが、通常は数分です)。

3. 既存プロジェクトを更新する

変化するのは新しいリポジトリだけではありません。既存のリポジトリにも頻繁に変更が加えられます。マニフェストファイルが追加、削除されたり、リポジトリ間で移動されたりすることもあります。こうした変更も、該当するSnyk管理下のプロジェクトに反映する必要があります。

そんなときに役立つのが、もう一つのツールsnyk-scm-refreshです。

このツールは、SnykのすべてのプロジェクトがGitHub上の該当リポジトリと同期されている状態を保つために開発されました。新しいマニフェストファイルの検出、存在しなくなったマニフェストに対応するプロジェクトの削除、リポジトリ名変更時のプロジェクト更新、削除されたリポジトリの検出ができます。便利ですね。

4. CircleCIでプロセス全体を自動化する

これらのツールを使うため、毎晩実行されるシンプルなCircleCIジョブを作成しました。ジョブでは次の処理を行います。

  • GitHubからすべての対象を生成する

  • インポートツールを実行し、インポート済みプロジェクトの一覧を生成する

  • インポートツールを実行し、新しいリポジトリを同期する

  • scm refreshツールを実行し、既存のリポジトリを同期する

CircleCIのbuild_and_pushワークフロー。ジョブがすべて完了し、所要時間も表示された成功パイプライン

次に取り組む課題は、コンテナレジストリです。同様の問題ですが、少し複雑です。

自動化の力

組織固有のニーズに合わせてセキュリティツールを拡張するには、堅牢なAPIが不可欠です。今回、Snyk APIを活用して自動化を導入し、すべてのコードリポジトリがSnykで保護されているかという、複雑な課題を解決できました。プロジェクトのインポートと更新を自動化することで、セキュリティカバレッジを確保しただけでなく、効率も向上しました。これまで手作業に費やしていた時間を削減できたのです。

さらに重要なのは、APIによって既存のワークフローにSnykを組み込めたことです。この柔軟性のおかげで、複雑で多くのリソースを必要とする回避策を考える時間を節約できました。

続きを読む

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

Blog

AIコーディングエージェントが不適切なアクセス制御を繰り返し実装する理由

AIコーディングエージェントは、コンパイルが通りレビューも通過する一方で、あるテナントのデータを別のテナントに公開してしまう認可ロジックを生成することがあります。不適切なアクセス制御が検出しにくい理由と、その防止策をご紹介します。

Blog

Evo ADSのエージェント動作ガバナンスが一般提供開始:MCPの利用を管理

Evo ADSのエージェント動作ガバナンスが、MCPガバナンスから一般提供を開始しました。主要なAIコーディングエージェント全体で、MCPサーバーの利用を検出、承認、監視、記録、ブロックできます。