GitHub Advanced Securityの主要な3つの機能を試してみた

GitHub Advanced Securityの主要な3つの機能を試してみた

こんにちは、豊島です。

はじめに

GitHub Advanced Securityの3つの主要な機能(Dependabotコードスキャンシークレットスキャン)を試してみました。

GitHub Advanced Securityの主要な3つの機能について

  • そもそもGitHub Advanced Security(以下GHAS)とは

GitHub Advanced Security (GHAS) は、開発者を支援するアプリケーションセキュリティソリューションです。 Advanced Securityはワークフローに直接組み込まれているため、開発を遅らせることなく、脆弱性と資格情報の漏洩を防ぐことができます。 GitHub Advanced Security は、専属のセキュリティコンサルタントに、世界中のセキュリティ専門家の分析情報を使って、すべてのコード行を確認してもらうようなものです。

GHAS とは

各ソリューションを表にまとめてみました

機能 概要 チェックタイミング パブリックリポジトリ プライベートリポジトリ
Dependabot - プロジェクトで利用されているライブラリとフレームワークの更新を定期的にチェック
- 既知の脆弱性を含む依存関係の更新のプルリクエストを自動で作成可能
- 脆弱性がない場合でも依存関係を最新の状態に保つプルリクエストを自動で作成可能
- 定期的(頻度は設定可能)
- 新しい脆弱性が報告されたとき
- 依存関係に新しいバージョンがリリースされたとき
無料 無料
コードスキャン - プルリクエストのワークフロー内でソースコードを分析
- セキュリティの脆弱性やコーディングエラーをチェック
- プルリクエスト作成時
- プッシュ時(設定による)
- 定期的なスケジュール(設定による)
無料 有料(従量制[1])[2]
シークレットスキャン - ソースコード内のAPIキーやトークンなどの機密情報の不慮の露出を特定(規定ではGitHubパートナーが提供する設定が適用されており、カスタムパターンの設定が可能)
- コミット時にコードをスキャンし、シークレットが存在する場合はプッシュをブロックする
- コミット時(プッシュ前)
- プッシュ時
- 既存のリポジトリに対して定期的に
無料 有料[3]

それぞれの設定を確認

リポジトリの画像を例に設定しています
Securityタブから

  • Dependabot alerts
  • Code scanning alerts
  • Secret scanning alerts

がEnableになっていることを確認します(デフォルトではSecret scanning alertsのみEnableになっていますね)
setting_before
設定後
setting_after

Dependabotを試してみる

すでにDependabotのアラートが3つあがっているため、#1から確認していきます
list_dependabot
Create Dependabot security updateからプルリクエストを作成していきます

右側にSeverity(重大度の評価とスコア)といったメタデータが表示されています
詳細を知りたい方はDependabot アラートのメタデータについてを参照ください

alerts_1_create
作成できたようなので、Review security updateから確認します。
alerts_1_update
問題がなければマージしましょう(マージ後にアラートが消えていました)
alerts_1_pr

続けて#2も同様に実施します。
alert_2_create

Create中に失敗しました。どうやら他のパッケージとの依存関係が原因のようです。
しかし内容をよく見るとnextのバージョンが14.2.10であればOKなため、package.jsonのバージョンを変えてマニュアルでインストールしてみたところアラートが消えました。
alert_2_error

今回はパブリックリポジトリを対象に適用しましたが、GitHub Enterprise Cloud (GHEC)と組み合わせることでプライベートリポジトリにも適用することができます

(おまけ) Dependency graphからSBOMを出力してみる

Dependency graph(依存関係グラフ)からSBOMが出力できたので、おまけとして手順を残します。
Settingsタブ Code securityからDependency graphEnabledになっていることを確認してください。(画像ではInsightsタブがアクティブになっていますが、Settingsから確認できます)
dependency_graph_setting
InsightsタブDependency graphにあるExport SBOMから出力可能です
export_sbom

Dependency graph(依存関係グラフ)が利用可能なリポジトリ

コードスキャンを試してみる

演習用のリポジトリで試していきます

まずはそれぞれの設定がEnableになっていることを確認していきます
SettingsタブのSecurity Code securityから
prepare_code_scanning
ToolsCodeQL analysisDefaultで設定していきます
setup_scanning
今回はデフォルトのまま設定していきます
enable_scanning
ActionsCodeQL Setupが完了になっていることを確認します
check_codeql_setup
SecurityタブのCode Scanningに2件あがってきています
list_code_scanning
(ここから演習順序から外れます)
alertの詳細を見るとRecommendationExampleから修正の手助けができるようになっています
今回は上部にあるCopilot Autofixを試してみたのですが、変更内容を自動で作成してくれる機能のようです
skills-introduction-to-codeql_security_code-scanning_1
プルリクエスト作成時にもCodeQLが実行され、変更内容を含めた評価が実行されています
skills-introduction-to-codeql_pull_1
マージ後に、alertは消えています
complete_code_scanning

シークレットスキャンを試してみる

演習用のリポジトリで試していきます

まずはそれぞれの設定がEnableになっていることを確認していきます
SettingsタブのSecurity Code securityから
setting_check_secret_scanning
Secret scanningPush protectionがEnableであることを確認します
setting_check_secret_scanning_detail
SecuritySecret Scanningから検出済みのSecret情報を確認することができます。
list_secret_scanning
Validityでシークレットが有効かどうかをチェックすることができます。流出してしまったシークレットが"active","inactive","Unknown"かをチェックし、対応の優先順位付けに役立ちます。
secret_validity
Secret typeでシークレットの種別をフィルターすることができます
secret_type
アラートの内容からはSecret typeごとに具体的な対応方法が記載されています(写真はAWSのため)
publicly_leaked_detail

プッシュ保護が有効化されているため、コンソール上からコミットしようとしたところポップアップが出ました。
push_console
具体的な箇所、意図したものであるかどうかの確認が出ています。これらを選択することでAllow Secretからプッシュ可能でした。

エディタから同様にプッシュしたところ、エラーが発生しました。

エラー時のログ

具体的なpathが記載されています

> git push origin main:main
remote: error: GH013: Repository rule violations found for refs/heads/main.
remote:
remote: - GITHUB PUSH PROTECTION
remote:   —————————————————————————————————————————
remote:     Resolve the following violations before pushing again
remote:
remote:     - Push cannot contain secrets
remote:
remote:
remote:      (?) Learn how to resolve a blocked push
remote:      https://docs.github.com/code-security/secret-scanning/working-with-secret-scanning-and-push-protection/working-with-push-protection-from-the-command-line#resolving-a-blocked-push
remote:
remote:
remote:       —— GitHub Personal Access Token ——————————————————————
remote:        locations:
remote:          - commit: 5af768990df6b081e2c598286ba7d99d0629806a
remote:            path: credentials.yml:6
remote:
remote:        (?) To push, remove secret from commit(s) or follow this URL to allow the secret.
remote:        https://github.com//skills-introduction-to-secret-scanning/security/secret-scanning/unblock-secret/2pNZmKbaYbFAvnuv2OsX3IUlHwq
remote:
remote:
remote:
To https://github.com//skills-introduction-to-secret-scanning.git
 ! [remote rejected] main -> main (push declined due to repository rule violations)
error: failed to push some refs to 'https://github.com//skills-introduction-to-secret-scanning.git'

最後に

Dependabotコードスキャンシークレットスキャンを試してみました。
どなたかの参考になれば幸いです。

脚注
  1. GitHub Actionsを利用するため。GitHub Actionsを無効にして実行することも可能ですが、GitHub Actions ほど優れたパフォーマンス、可視性、または Dependabot 更新ジョブの制御は提供されません。と記載がありました GitHub ActionsランナーのDependabotについて ↩︎

  2. GitHub Enterprise Cloudを利用かつGitHub Advanced Securityのライセンスを持つOrganizationによって所有されていることコード スキャンについて ↩︎

  3. GitHub Enterprise Cloudを利用かつGitHub Advanced Securityオプションが必要 シークレットスキャンについて ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.