GitLabは、最も包括的なAIを搭載したDevSecOpsプラットフォームで、ソフトウェアデリバリーライフサイクル全体を1つのプラットフォームで実現することで、より安全で迅速なソフトウェアのリリースを可能にしています。GitHubでは、GitHub内の追加のセキュリティ機能を有効にするAdvanced Securityアドオンを提供してはいますが、GitLabと比較すると、ネイティブに提供するセキュリティ機能の深さと幅広さでは機能の範囲と深さが限定的です。SDLCのすべての領域にわたってセキュリティを強化すべくGitLab Ultimateプランへの移行を検討している組織は、このガイドを参考にして両製品を比較し、またGitLabプラットフォームに移行するためのチュートリアルとしてもお役立てください。
この記事には次の内容が含まれます
- GitLab UltimateとGitHub Advanced Securityの比較
- GitHubリポジトリをGitLabに移行する方法
- GitHub Advanced SecurityからGitLab Ultimateへの機能別の移行方法
- GitLab Ultimateのセキュリティ追加機能の紹介
GitLab UltimateとGitHub Advanced Securityの比較
GitLab Ultimateは、安全なソフトウェアをより速く提供したいと考えている企業向けの、GitLabの最上位サブスクリプションプランです。GitHub Advanced Securityは、追加のセキュリティ機能を有効にするGitHub Enterpriseのアドオンです。
GitLab UltimateとGitHub Advanced Securityの類似点
GitLab UltimateとGitHub Advanced Securityの両プランに次の機能が搭載されています。
- 静的アプリケーションセキュリティテスト(SAST)、シークレットスキャン、依存関係スキャン
- コンテキスト脆弱性インテリジェンスと解決策のアドバイス
- 依存関係またはソフトウェア部品表のリスト(SBOM)
- セキュリティ指標と分析情報
GitLab UltimateとGitHub Advanced Securityの相違点
GitLab Ultimateは、次の点でGitHub Advanced Securityと異なります。
-
GitLabは、コンテナスキャン、動的アプリケーションセキュリティテスト(DAST)、Web APIファジングなどの追加のコードスキャナーをネイティブに提供します。スキャナーは、カスタムルールセットを備え最適化された、独自のオープンソーステクノロジーを組み合わせたものです。完全なリストについては、GitLab AppSecのドキュメントをご覧ください。
-
GitLabは、セキュリティ上問題のあるコードが承認なしにマージされることを防ぐため、詳細な制御機能(セキュリティガードレール)を提供しています。
-
GitLabセキュリティスキャナーは、インターネット未接続(エアギャップ)環境や制限付きネットワーク環境でも実行可能です。
-
GitLabは、組織全体のコンプライアンス違反を監視できるコンプライアンスセンターを提供しています。
さらにGitLab Ultimateでは、追加のセキュリティやコンプライアンス機能、ポートフォリオとバリューストリームの管理、アップグレード時のライブサポート機能なども提供しています。追加機能の詳細については、GitLab Ultimateのドキュメントを参照してください。
GitHubリポジトリをGitLabに移行する方法
GitLabには、GitHub.comまたはGitHub EnterpriseからGitHubプロジェクトをGitLabにインポートできるインポーターが組み込まれています。インポーターを使用すると、GitHubリポジトリだけでなく、イシュー、コラボレーター(メンバー)、プルリクエストなど他のオブジェクトもGitLabに移行できます。移行できるものの全リストについては、GitHubインポートされたデータのドキュメントを参照してください。移行は次の手順で行います。
- 左側のサイドバー上部で 新規作成(+) を選択する
- GitLab内セクションで新しいプロジェクト/リポジトリを選択する
- プロジェクトのインポートを選択する
- GitHubボタンを押す
- GitLab Self-Managedを使用している場合は、GitHubインポーターを有効にする必要があります
- 他のインポーターも同様の方法で開始できます
- これで、以下のいずれかが可能になりました
- GitHubで認証を選択して、GitHub Oauthで認証する
- GitHubのパーソナルアクセストークンを使う
- https://github.com/settings/tokens/newに移動します
- Noteフィールドにトークンの説明を入力します
- リポジトリスコープを選択します
- オプションとしてコラボレーターをインポートするには、read:orgスコープを選択します
- トークンを生成ボタンを押します
- GitLabのインポートページのパーソナルアクセストークンフィールドに、GitHubのパーソナルアクセストークンを貼り付けます
- 認証ボタンを押す
- 移行するアイテムを選択する
- 移行するプロジェクトと場所を選択する
- インポートボタンを押す
インポートされたプロジェクトがワークスペースにあることをご確認ください。GitHubからGitLabへの移行に関するさらに詳しいガイダンスは、次の動画をご覧ください。
GitHubパーソナルアクセストークンまたはGitLab REST APIを使用した移行も可能です。また、インポーターは、BitbucketやGiteaなどの他のソースからのインポートも支援します。詳細については、インポーターのドキュメントを参照してください。
機能別の移行方法
次は、GitLab UltimateのGitHub Advanced Securityが提供する各機能の活用方法について見てみましょう。続行するには、GitLab Ultimateライセンスが必要です。GitLabは、30日間の無料トライアルがお試しいただけます。
コードスキャン
GitHubでは、静的ソースコードの文脈上の脆弱性インテリジェンスやアドバイスを提供する目的でコードスキャンを実行しています。SASTを有効にすることで、GitLab内でも同じことができます。GitLab SASTスキャナーは、GitHubのCodeQLよりも幅広いプログラミング言語とフレームワークをカバーしています。
GitLabでコードスキャンを有効にすれば、SASTテンプレートを.gitlab-ci.yml
に追加するだけです。
include:
- template: Jobs/SAST.gitlab-ci.yml
テンプレートが追加されると、新しいコードがチェックインされるたびに、SASTはプロジェクトで使用されているプログラミング言語を自動的に検出します。そして、ソースコードに既知の脆弱性がないかスキャンします。
注: セキュリティスキャナーは、GitLabのセキュリティ設定からプロジェクトに追加することもできます。これにより、パイプラインを更新するためのマージリクエストを自動的に作成できます。詳細については、UIドキュメントを使用してSASTを構成するを参照してください。
フィーチャーブランチとターゲットブランチの差分のSAST結果は、マージリクエストウィジェットで表示されます。マージリクエストウィジェットには、マージリクエストで行われた変更によって導入されたSASTの結果と解決策が表示されます。
どの脆弱性にも、詳細な説明、重大度、場所、解決情報など、修正を支援するデータが表示されます。
脆弱性への対処として次が挙げられます。
- 脆弱性を無視:デベロッパーがコメントで脆弱性を無視できるようにします。そうすることで、セキュリティチームがレビューを実行できるようになります。
- イシューを作成:イシューを作成して、追加の監視が必要な脆弱性を追跡できるようにします。
これらの変更内容は、マージリクエスト内の差分表示画面でもインラインで確認できます。
SASTスキャナーのカスタマイズ
GitLabでは、SASTジョブの定義を上書きできるため、変数、依存関係、ルールなどのプロパティを変更できます。これは、SASTジョブと同じ名前のジョブ名を宣言し、上書きして実行できます。次に、テンプレートをインクルードした後にこの新しいジョブを配置し、その下に追加のキーを指定します。
たとえば、次のような設定ができます:
semgrep-sast
スキャナーが使用するバージョンを上書きするgosec-sast
を実行する前に、プライベートプロジェクトからモジュールを取得するスクリプトを実行する- すべてのスキャナーが最大深度10で検索するように設定する
include:
- template:Jobs/SAST.gitlab-ci.yml
variables:
SEARCH_MAX_DEPTH:10
semgrep-sast:
variables:
SAST_ANALYZER_IMAGE_TAG:"3.7"
gosec-sast:
before_script:
- |
cat <<EOF > ~/.netrc
machine gitlab.com
login $CI_DEPLOY_USER
password $CI_DEPLOY_PASSWORD
EOF
注: 利用可能なSASTジョブは、' SAST.gitlab-ci.yml `テンプレートにあります。設定については、利用可能なSAST CI/CD変数のドキュメントを参照してください。
SASTルールセットのカスタマイズ
GitLabはSASTアナライザーごとにコードを処理し、ルールを使用してソースコードの脆弱性を特定します。これらのルールは、スキャナーが報告する弱点の種類を決定します。
- Semgrepを基盤としたSASTスキャナーについては、GitLabが検出ルールの作成、保守、サポートを一括して提供しています。Semgrepオープンソースエンジン、GitLabの管理による検出ルール、脆弱性追跡と誤検出のためのGitLab独自の技術を集結しています。
- 他のSASTアナライザーの場合、ルールは各スキャナーのupstreamプロジェクトで定義されています。
スキャンされるリポジトリ内の設定ファイルを定義することで、SASTスキャナーの動作をカスタマイズできます。
- 事前定義されたルールを無効にする(すべてのアナライザーで利用可能)
- 事前定義されたルールを上書きする(すべてのアナライザーで利用可能)
- パススルーを使用してカスタム設定を合成することにより、事前定義されたルールを置き換える
SASTルールの設定の詳細と例については、SASTルールとルールセットのカスタマイズのドキュメントを参照してください。
シークレットスキャン
GitHubは、流出したシークレットを見つけ、ブロックし、取り消すことができるシークレットスキャンをサポートします。シークレット検出を有効にすることで、GitLab内でも同じことができます。
GitLabでシークレット検出を有効にするには、次のテンプレートを'.gitlab-ci.yml `に追加するだけです。
include:
- template: Jobs/Secret-Detection.gitlab-ci.yml
テンプレートが追加されると、新しいコードがチェックインされる(またはパイプラインが実行される)たびに、シークレットスキャナーは既知のシークレットのソースコードをスキャンします。パイプラインでのシークレット検出は、コードの各要素を別々にスキャンします。「デフォルトブランチ」を除くすべてのメソッドでは、パイプラインシークレット検出はワークツリーではなくコミットをスキャンします。シークレットスキャンの仕組みについては、シークレット検出カバレッジドキュメントを参照してください。
マージリクエストを作成する際、シークレット検出はソースブランチで行われたすべてのコミットをスキャンします。SASTと同様に、検出されたすべての脆弱性から、修正プロセスを支援するため、以下の情報(ロケーションなど)や識別子を提供します。
SASTと同様に、マージリクエストから直接、脆弱性の無視やイシューの作成など、検出された脆弱性に対するアクションを取ることができます。
シークレット検出ジョブのカスタマイズ
GitLabではシークレット検出ジョブの定義を上書きして、変数や依存関係、ルールなどのプロパティを変更できます。上書きするには、シークレット検出ジョブと同名のジョブを宣言します。次に、テンプレートをインクルードした後に新しいジョブを配置し、その下に追加のキーを指定します。たとえば、次のような設定です。
- シークレット検出ジョブの実行ステージを
security
に上書きする - 過去のコミットに対するスキャンを有効にする
- シークレットアナライザーのバージョンを4.5に変更する
include:
- template: Jobs/Secret-Detection.gitlab-ci.yml
secret_detection:
stage: security
variables:
SECRET_DETECTION_HISTORIC_SCAN: "true"
SECRETS_ANALYZER_VERSION: "4.5"
注: 利用可能なシークレット検出ジョブは、SAST.gitlab-ci.ymlテンプレートにあります。利用可能な設定は、利用可能なシークレット検出CI/CD変数のドキュメントに記載されています。
シークレット検出ルールセットのカスタマイズ
シークレット検出アナライザーでは、GitLab UIに表示されるシークレットをカスタマイズできます。次のカスタマイズオプションは、個別または組み合わせて使用できます。
- 定義済みルールを無効にする
- 定義済みルールを上書きする
- カスタム設定を合成する
- リモート設定ファイルを指定する
たとえば、.gitlab/secret-detection-ruleset.toml
というファイルをプロジェクトのルートディレクトリに作成すると、デフォルトのGitLeaksパッケージがテストトークンの検出を無視するように拡張されます。
### extended-gitleaks-config.toml
title = "extension of gitlab's default gitleaks config"
[extend]
### Extends default packaged path
path = "/gitleaks.toml"
[allowlist]
description = "allow list of test tokens to ignore in detection"
regexTarget = "match"
regexes = [
'''glpat-1234567890abcdefghij''',
]
定義済みのアナライザールールを上書きする方法については、シークレット検出のドキュメントを参照してください。
シークレット漏洩時の自動対応機能
GitLabシークレット検出は、特定のタイプの流出したシークレットを発見すると自動的に対応します。自動対応には次のようなアクションがあります。
- 自動的にシークレットを失効させる
- シークレットを発行したパートナーに通知し、パートナーはシークレットを取り消すか、その所有者に通知するか、またはその他の方法で不正利用からの保護につなげる
GitLabは、パートナーが発行した認証情報がGitLab.comの公開リポジトリに流出した場合、パートナーへの通知も可能です。クラウドやSaaS製品を運用していて、このような通知の受け取りに興味があるという場合、GitLab Token Revocation APIから呼び出されるPartner APIを実装できます。
詳しくは流出したシークレットへの自動対応を参照してください。
サプライチェーンのセキュリティ
GitHubは、自動化されたセキュリティとバージョン更新、ワンクリックのSBOMにより、ソフトウェアサプライチェーンのセキュリティ確保、管理、レポートを可能にします。GitLabは依存関係スキャンと依存関係リスト(SBOM)機能を使って、サプライチェーンセキュリティのニーズを満たすことができます。
GitLabで依存関係スキャンを有効にするには、.gitlab-ci.yml
に以下のテンプレートを追加するだけです:
include:
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
テンプレートが追加されると、新しいコードがチェックインされるたびに、依存関係スキャンがプロジェクトで使われているパッケージマネージャを自動検出します。そして、使用されている依存関係に既知の脆弱性がないかスキャンします。フィーチャーブランチとターゲットブランチの差分の依存関係のスキャン結果は、マージリクエストウィジェットに表示されます。マージリクエストウィジェットは、マージリクエストで行われた変更によって導入された依存関係スキャンの結果と解決策を表示します。マージリクエストの中で、検出された脆弱性は、識別子、証拠、解決策といった、修正を支援する関連情報を表示します。
SASTやシークレット検出と同様に、脆弱性の無視やイシューの作成など、これらの脆弱性に対するアクションをマージリクエストから直接実行できます。
依存関係スキャンの設定
ジョブの定義を上書きするには(たとえば、変数や依存関係のようなプロパティを変更するには)、上書き対象のジョブと同じ名前で新しいジョブを宣言します。テンプレートをインクルードした後に新しいジョブを配置し、その下に追加のキーを指定します。たとえば、次のコードでは以下の設定を行っています。
- 脆弱な依存関係の自動修正を無効にする
- 依存関係スキャンの実行前にビルドジョブの完了を要求する
include:
- template:Jobs/Dependency-Scanning.gitlab-ci.yml
gemnasium-dependency_scanning:
variables:
DS_REMEDIATE:"false"
dependencies:["build"]
依存関係スキャナーの設定についての詳細は、アナライザーの動作をカスタマイズするドキュメントを参照してください。
SBOMの生成
GitLabの依存関係リスト(SBOM)で、プロジェクトやグループの依存関係や、既知の脆弱性を含む依存関係の重要な詳細を確認できます。このリストには、プロジェクトにおける依存関係が集約されており、既知のものや新たに検出されたものの両方が含まれています。依存関係リストは、依存関係スキャナーがデフォルトブランチで正常に実行された後に生成されます。依存関係リストにアクセスするには
- 左サイドバーで、検索または移動先... を選択し、プロジェクトを見つけます。
- セキュリティ > 依存関係リストの順に選択します。
ここから、依存関係に関する次の情報を表示できます。
フィールド | 説明 |
---|---|
コンポーネント | 依存関係の名前とバージョン。 |
パッケージャー | 依存関係のインストールに使用されるパッケージャー。 |
ロケーション | システムの依存関係の場合、スキャンされたイメージのリストが表示されます。アプリケーションの依存関係の場合、依存関係を宣言したプロジェクト内のパッケージャー固有のロックファイルへのリンクが表示されます。また、トップレベルの依存関係への依存関係パスも表示されます(該当の依存関係が存在する場合)。 |
ライセンス | 依存関係のソフトウェアライセンスへのリンク依存関係で検出された脆弱性の数を示す警告バッジ。 |
プロジェクト | 依存関係のあるプロジェクトへのリンク。同じ依存関係を持つプロジェクトが複数ある場合、プロジェクトの合計数が表示されます。依存関係のあるプロジェクトに移動するには、プロジェクトの番号を選択し、その名前を検索して選択します。プロジェクト検索機能は、グループ階層内に最大600件のプロジェクトがあるグループでのみサポートされています。 |
詳細については、依存関係リストのドキュメントを参照してください。
セキュリティとコンプライアンスの管理
GitHub Advanced Securityを使用すると、セキュリティメトリクスとインサイトを閲覧し、コードセキュリティリスクを評価できます。次に、GitLab Ultimateで同じことをする方法を見てみましょう。
セキュリティメトリクスとインサイトの閲覧
GitLabは、アプリケーションのセキュリティ状況を評価するのに役立つセキュリティダッシュボードを提供しています。ダッシュボードには、プロジェクトで実行されたセキュリティスキャナーによって検出された脆弱性のメトリクス、評価、チャートがまとめて表示されます。
- グループ内のすべてのプロジェクトの30日、60日、90日間の期間にわたる脆弱性の傾向
- 脆弱性の重大度に基づく各プロジェクトの評価(A~Fの文字グレード評価)
- 過去365日以内に検出された脆弱性の総数とその重大度
セキュリティダッシュボードにアクセスする方法:
- 左側のサイドバーで、検索または移動先... を選択し、プロジェクトまたはグループを見つけます。
- サイドタブから、セキュリティ > セキュリティ ダッシュボードを選択します。
- 必要なものを絞り込んで検索します。
グループビューには、グループ内のすべてのプロジェクトのセキュリティ状況が表示されます。
プロジェクトビューには、あるプロジェクトのみのセキュリティ体制が表示されます。
コードのセキュリティリスクを評価
GitLab Ultimateは、デフォルトブランチのスキャン結果から脆弱性に関する情報を提供する脆弱性レポートを備えています。レポートには、パイプラインが成功したかどうかにかかわらず、すべての成功したジョブの累積結果が含まれます。すべてのレベルで、脆弱性レポートには次が表示されます。
- 重大度レベルごとの脆弱性の合計
- 一般的な脆弱性の属性のフィルター
- 表形式のレイアウトで表示される各脆弱性の詳細
脆弱性をクリックすると、その脆弱性ページにアクセスできます。このページには、脆弱性の説明、ロケーション、識別子などの情報が記載されています。以下は、SASTスキャナーによって検出されたSQLインジェクションの脆弱性のページの例です。
ここから、セキュリティチームは、理由とともに脆弱性の状態を変更し、変更をより適切に追跡するためのイシューを作成することでコラボレーションできます。
脆弱性のページから、AI搭載の各機能が集約されたGitLab Duoを活用して脆弱性を説明し、脆弱性を解決するマージリクエストを自動的に作成することもできます。 GitLab Duoの脆弱性の説明は、大規模な言語モデルを使用して次を行います。
- 脆弱性を要約する
- 脆弱性について、どのように悪用される可能性があるか、どのように修正するかをデベロッパーやセキュリティアナリストが理解できるようにする
- 緩和策を推奨する
GitLab Ultimateのセキュリティ追加機能
GitLab Ultimateには、GitHub Advanced Securityにはない多くのセキュリティ機能を搭載しています。追加のセキュリティ機能の例として、ソフトウェア開発ライフサイクル(SDLC)全体のための追加のセキュリティスキャナー、きめ細かいセキュリティガードレール、カスタム権限などが挙げられます。
SDLC全体のセキュリティスキャナー
当社のセキュリティスキャナーのポートフォリオは、SDLC全体に対応しています。
スキャナー名 | スキャン | スキャンされた言語/ファイル |
---|---|---|
静的アプリケーションセキュリティテスト(SAST) | 静的ソースコード | C/C++、Java、Python、Go、JavaScript、C #など |
動的アプリケーションセキュリティテスト(DAST) | Webアプリケーション、ライブAPIの実行 | 言語に依存しない |
Infrastructure as Code(IaC)のスキャン | IaCファイル | Terraform、AWS Cloud Formation、Ansibleなど |
コンテナのスキャン | 静的および実行中のコンテナイメージ | Dockerfile |
依存関係のスキャンとライセンスのスキャン | アプリケーションの依存関係 | Requirements.txt、Yarn、Gradle、Npmなど |
Web APIファズテスト | ランダム/不正な形式のデータをweb - apiに送信 | OpenAPI、GraphQL、HAR、Postman Collection |
カバレッジ - ガイド付きファズテスト | ランダム/不正な形式のデータを関数に送信 | C/C++、Go、Swift、Python、Rust、Java、JavaScript、AFL |
GitLabでは、サードパーティのスキャナー(英語)とカスタムスキャナー(英語)をプラットフォームに統合することもできます。スキャナーの結果は、パイプラインビュー、マージリクエストウィジェット、セキュリティダッシュボードなど、GitLabのさまざまな場所に自動的に表示されます。詳細については、セキュリティスキャナー統合ドキュメントを参照してください。
きめ細かいセキュリティとコンプライアンスポリシー
GitLabのポリシーは、セキュリティとコンプライアンスの両チームに組織内でグローバルに制御を実施する方法(英語)を提供します。セキュリティチームは次のことを保証できます。
- 適切な設定で開発チームのパイプラインにセキュリティスキャナーを実施
- すべてのスキャンジョブは、変更や修正なしで実行
- これらの調査結果に基づき、マージリクエストに対して適切な承認を提供
コンプライアンスチームは、すべてのマージリクエストに対して複数の承認者を必須とし、マージリクエストやリポジトリの設定を有効化またはロックするなど、組織の要件に基づくプロジェクトでさまざまな設定が有効になっていることを確認できます。詳細については、GitLabセキュリティポリシーのドキュメントを参照してください。
カスタムロールときめ細かい権限
GitLab Ultimateはカスタムロールを提供します(英語)。これにより、組織はニーズに見合った正確な特権と権限を持つユーザーロールを作成できます。
たとえば、ユーザーはシステム内のセキュリティの脆弱性を表示する権限を持つ「セキュリティ監査担当者」ロールを作成できますが、この権限ではソースコードを表示したり、リポジトリ内で変更を実行したりできないよう設定できます。このきめ細かい権限設定により、職務の棲み分けを明確にできます。
詳細については、カスタムロールおよび利用可能な詳細な権限のドキュメントを参照してください。
コンプライアンスセンター
コンプライアンスチームが、コンプライアンス基準の遵守状況や違反についての報告、グループのコンプライアンスフレームワークの管理などを一括して行う場所がコンプライアンスセンターです。コンプライアンスセンターには次の内容があります。
- コンプライアンス基準遵守ダッシュボードは、GitLab標準に準拠したプロジェクトの遵守状況を一覧表示します。
- コンプライアンス違反の報告は、グループ内のすべてのプロジェクトのマージリクエストアクティビティの概要を表示します。
- コンプライアンスフレームワークのレポートは、グループ内のコンプライアンスに関するすべてのフレームワークを表示します。
- コンプライアンスプロジェクトのレポートは、グループ内のプロジェクトに適用されるコンプライアンスのフレームワークを表示します。
これらのダッシュボードは、組織内のコンプライアンスを最適化するために、職務の棲み分けがきちんと守られているかを確認する上で有益です。詳細については、コンプライアンスセンターのドキュメントを参照してください。
続きを読む
この記事では、GitLab Ultimateが提供する幅広いセキュリティ機能の一部についてのみ説明しています。GitLab Ultimateが組織のセキュリティとデベロッパーの効率を向上させる方法について、詳しくは次のリソースを参照してください。
- Ultimateを選ぶ理由
- DevSecOpsチュートリアルを始める
- DevSecOpsサンプルプロジェクトの始め方
- プロジェクトをGitHubからGitLabドキュメントにインポートする
- GitHub Actionsドキュメントからの移行
- チュートリアル:最初のGitLab CI/CDパイプラインを作成して実行する
- チュートリアル:複雑なパイプラインを作成する
- CI/CD YAML構文リファレンス
監修:小松原 つかさ @tkomatsubara
(GitLab合同会社 ソリューションアーキテクト本部 シニアパートナーソリューションアーキテクト)