SonarQube スキャンの構成
SonarQube は、ソース・コードの全体的な正常性と品質の概要を提供し、新しいコード内で見つかった問題を強調表示します。 コード・アナライザーは、20 を超えるコーディング言語において、NULL ポインター間接参照などの注意を要するバグ、論理エラー、リソース・リークを検出します。
以下のようにして、ソース・コードの品質を継続的に分析および測定するように SonarQube を構成します。
-
IBM Cloudコンソールで、メニューアイコンの
>Platform Automation>Toolchains をクリックします。 「ツールチェーン」ページで、ツールチェーンをクリックしてその「概要」ページを開きます。 あるいは、アプリの「概要」ページの「継続的デリバリー」カードで、**「ツールチェーンの表示」をクリックします。 次に、「概要」**をクリックします。
a. **「ツールの追加」**をクリックします。
b. 「ツール統合」セクションで**「SonarQube」**をクリックします。
-
SonarQube ツール統合のこのインスタンスの名前を入力します。
-
ツールチェーンから SonarQube カードをクリックしたときに開くようにしたい SonarQube インスタンスの URL を入力します。
-
オプション: SonarQube サーバーへの接続に使用するユーザー名を入力します。
ユーザー名を指定する必要があるのは、パスワードを使用して SonarQube サーバーに接続する場合のみです。 接続に認証トークンを使用する場合は、このフィールドを空のままにしてください。
-
SonarQube サーバーへの接続に使用するパスワードまたは認証トークンを入力します。
-
サーバーが公共のインターネット上に存在できない場合は、 [詳細設定 ]を選択します。 IBM Cloud、提供された接続の詳細を検証できず、このサーバーへの API アクセスを必要とする一部の機能が無効になります。 デリバリー・パイプラインは、このサーバーにネットワーク経由でアクセスできるプライベート・ワーカーを使用しないと機能しません。
-
「統合の作成」 をクリックします。
-
ツールチェーンの「概要」ページの**「サード・パーティー・ツール」カードで、「SonarQube」**をクリックして、接続先の SonarQube インスタンスのダッシュボードを表示します。
継続的統合パイプラインへの Sonarqube の追加
デフォルトの SonarQube インスタンス
sonarqube-configがdefaultに設定されている場合、デフォルトで SonarQube がスキャンに使用されます。 このスキャンは、 Docker-in-Dockerとして実行されます。
使用されるインスタンスは、実行中にのみ使用可能です。 そのため、ダッシュボードにアクセスできません。
-
デフォルトでは、パイプラインは SonarQube コミュニティー・エディションを使用します。このコミュニティー・エディションの checks.Many 脆弱性ルールとホスト・スポットの問題は、 Community Editionではカバーされていません。
-
Community Edition で脆弱性がチェックされているかどうかを確認するには、 Sonarqube コミュニティーの質問のスレッド を参照してください。
-
CISO に登録されている SonarQube Community Edition インスタンスであるデフォルトの実装は、ITSS 承認済みの edition.SonarQube Enterprise Edition のみではありません。
SonarQube,をダウンロードするには、SonarQubeダウンロード を参照してください
開発クラスター上の SonarQube インスタンス
sonarqube-config が cluster に設定されている場合、パイプラインは dev クラスターでのパイプライン実行中に SonarQube インスタンスを作成します。 このインスタンスには、静的スキャン・ステージが正常に runs.You SonarQube ダッシュボードには、ポート転送を使用してローカルでアクセスできます。
既存の SonarQube インスタンス
既存のパイプラインに独自の SonarQube インスタンスを追加するには、 sonarqube-config を custom に設定し、ツール統合をツールチェーンに追加し、 SonarQube ツール統合パラメータをパイプラインに追加します。 詳しくは、 SonarQubeの構成 を参照してください。
自己署名証明書付きSonarqubeサーバー
既存のsonarqubeサーバーを 使用するため、 sonarqube-config を custom に設定し、サーバーに自己署名証明書がある場合、ソナースキャナーがsonarqubeサーバーに正常に接続するには、自己署名証明書を 信頼済みCA証明書に追加 する必要があります。
パイプライン/トリガー・プロパティ sonarqube-root-certificate の値として PEM フォーマットの証明書( base64 エンコードされた秘密値または PEM フォーマットのプレーン・テキストのいずれか)を提供することで、maven 用の SonarScanner, gradle sonar 用の SonarScanner または Docker で呼び出される SonarScanner の使用状況に応じて、コンフィギュレーションが追加されます。
パラメーター
SonarQube スキャンを実行するには、パイプラインに以下の継続的統合パラメーターが必要です。
| 名前 | タイプ | 説明 | 必須またはオプションです |
|---|---|---|---|
| クラスター名 | テキスト | Docker ビルド・クラスターの名前。 | 必須 |
| dev-region | テキスト | クラスターをホストしている IBM Cloud リージョン。 | 必須 |
| opt-in-sonar | テキスト | sonarQube スキャンを有効にするオプション。 | 必須 |
| sonarqube | ツール統合 | Sonarqube ツール統合。 | オプション |
| ソナクベ設定 | テキスト | 分離された Docker-in-Docker コンテナー (デフォルト構成) または既存の開発 Kubernetes クラスター (クラスター構成) で SonarQube スキャンを実行します。 あるいは、独自の SonarQube インスタンスを持ち込み、 SonarQube ツール統合 (カスタム構成) を構成することもできます。 オプション: default、 cluster、または custom。
デフォルトは default。 詳しくは、継続的統合パイプラインへの SonarQube の追加 を参照してください。 |
必須 |
| opt-in-sonar-ホット・スポット | テキスト | ホット・スポットを検出するための Sonarqube スキャン。 | オプション |
| オプトイン・ソナー・クオリティ・ゲート | テキスト | Sonarqubeスキャンで品質ゲートの不具合を検出できるようにする。 | オプション |
| オプトイン・ソナーpr分析 | テキスト | Sonarqube スキャンによるプルリクエストの分析を許可する (このオプションは、PR がフォークされたリポジトリから投稿されていない場合にのみ機能します)。 このパラメータは App-preview PR pipeline に対してのみ有効である。 |
オプション |
| sonarqube-user-token | シークレット | sonarqube-config の場合、API アクセスに使用するユーザートークンを渡します。 custom |
オプション |
| sonarqube-root-certificate | テキストまたはセカート | sonarqube-config が custom に設定されている場合、自己署名証明書を PEM フォーマッ トのテキストまたは base64 エンコードされたシークレットとして渡す |
オプション |
パイプラインのパラメーターについて詳しくは、パイプラインのパラメーターを参照してください。
複数の SonarQube ツール統合をパイプラインに追加した場合は、ツール統合パラメーターである sonarqube パイプライン・パラメーターの値を変更して、それらのツール統合を切り替えることができます。
SonarQube にインストールされたプラグイン
DevSecOpsPipelinesは、デフォルトでSonarQubeバージョン10.0を使用します。
プリインストールされているプラグインのリストについて詳しくは、 プラグイン を参照してください。
SonarQube から報告された問題
DevSecOpsPipelinesは、SonarQubeのスキャン中に報告された問題をフィルタリングします。 パイプラインは、 CODE_SMELL タイプでも BUG タイプでもない問題に対して、コンプライアンス・インCcidencesを排他的に作成します。 パイプラインは、状況が CLOSED である問題もスキップします。
App PreviewのPRパイプラインでPull Request分析を有効にする
PR分析オプションは、PRがターゲットリポジトリと同じリポジトリから来ている(フォークではない)場合、 App Preview PR pipeline。 SonarqubeインスタンスはPR分析もサポートする必要がある。 sonarqube Developer Editionからプルリクエスト解析が可能になったため、 cluster および dind モードで使用するデフォルトのsonarqubeインスタンスは、この機能をサポートしていません。
環境変数 opt-in-sonar-pr-analysis をパイプラインに追加し、その値が空であってはならない。
SonarQube プロジェクトでクオリティ・ゲートの結果処理を有効にする
SonarQube におけるクオリティゲートとは、プロジェクトが要求されるコード品質基準を満たすかどうかを決定する一連の条件のことである。 クオリティ・ゲートの詳細については、 SonarQube ドキュメンテーションを参照。
SonarQube issueパーサーは、 Quality Gateの結果を処理することをサポートし、それが原因で障害が発生した場合、issueを作成します。 SonarQube クオリティ・ゲートの結果を処理できるようにするには、環境プロパティ opt-in-sonar-quality-gates を 1 に設定します。
opt-in-sonar-quality-gates が 1 として設定され、 独自の SonarQube インスタンスを 統合として使用している場合( sonarqube-config が custom として設定されている)、品質ゲート名をフェッチするには、 SonarQube Web API にアクセスするために必要な権限を持つ SonarQube ユーザートークンを生成し、トークンをシークレット値としてパイプライン環境プロパティ sonarqube-user-token を設定します。 必要なトークン権限の詳細については、 SonarQube トークン権限を 参照してください。
パイプラインが作成した SonarQube インスタンスまたはカスタム SonarQube ツール統合を使用する場合は、以下の手順に従って SonarQube ダッシュボードを操作してください:
-
static-scanタスクのパイプライン・ログの URL を使用して、作成された SonarQube ダッシュボードに移動します。
SonarQubeダッシュボード -
デフォルトでは、
Sonar way品質ゲートは、特定の品質ゲートに明示的に関連付けられていないすべてのプロジェクトに関連付けられます。 カスタム測定条件を持つ新しい品質ゲートも作成できる。-
ダッシュボードでクオリティ・ゲートのリストを探すには、上部のナビ・バーからクオリティ・ゲートをクリックする。
SonarQube -
新しいクオリティ・ゲートを作成するには、上部のナビ・バーからクオリティ・ゲートをクリックし、次に作成をクリックします。 品質ゲートに名前を追加し、条件メトリクスの追加/削除/更新を行うことができます。
-
プロジェクトに関連付けられている品質ゲートを検索するには、プロジェクトを選択し、[ プロジェクト設定 ] > [ 品質ゲート] をクリックします。
SonarQube -
特定のプロジェクトに(デフォルト以外の)品質ゲートを関連付けるには、プロジェクトを選択し、[ プロジェクト設定 ] > [ 品質ゲート ] > [ 常に特定の品質ゲートを使用 ] > ドロップダウンから必要な品質ゲートを選択 > [ 保存] をクリックします
caption-side=bottom"
-
-
新しいスキャンはこの品質ゲートで評価され、エビデンスはこの品質ゲートの結果から作成されるようになります。 課題は、クオリティ・ゲートの失敗の原因となった条件に基づいて作成される。
Sonarqube API の応答である品質ゲートステータスの結果フォーマットの例:
${SONAR_HOST_URL}/api/qualitygates/project_status?projectKey=${SONAR_PROJECT_KEY}:{ "projectStatus": { "status": "ERROR", "conditions": [ { "status": "ERROR", "metricKey": "new_coverage", "comparator": "LT", "errorThreshold": "80", "actualValue": "0.0" }, { "status": "OK", "metricKey": "new_duplicated_lines_density", "comparator": "GT", "errorThreshold": "3", "actualValue": "0.0" }, { "status": "ERROR", "metricKey": "new_security_hotspots_reviewed", "comparator": "LT", "errorThreshold": "100", "actualValue": "0.0" }, { "status": "ERROR", "metricKey": "new_violations", "comparator": "GT", "errorThreshold": "0", "actualValue": "14" } ], "ignoredConditions": false, "period": { "mode": "PREVIOUS_VERSION", "date": "2025-03-18T09:43:25+0000" }, "caycStatus": "compliant", "additional": { "qualityGateName": "Sonar way", "projectKey": "hello-compliance-app-compliance-check", "dashboardUrl": "http://localhost:9001/dashboard?id=hello-compliance-app-compliance-check" } } }SonarQube API の詳細については、 Sonarqube WebAPI ドキュメントを参照してください
ステータスが ERROR である各メトリック・キーに対して課題が作成され、すべての失敗したメトリックが個別に追跡され、対処されることが保証される。
例題:
caption-side=bottom"
例 SonarQube クオリティ・ゲートの失敗による証拠不成立:
{ "id": "abc", "evidence_type_id": "com.ibm.static_scan", "evidence_type_version": "1.0.0", "date": "2025-03-18T11:22:35.086Z", "origin": { }, "details": { "result": "failure", "tool": "sonarqube", "failure_reason": "tool_detected_vulnerabilities" }, "issues": [ "https://github.ibm.com/abcd/compliance-issues-20250310111628285/issues/14", "https://github.ibm.com/abcd/compliance-issues-20250310111628285/issues/15" ], "findings": [ { "id": "Metric: new_coverage", "due_date": "n/a", "severity": "high", "first_found": "2025-03-18", "url": "https://github.ibm.com/abcd/compliance-issues-repo/issues/14", "found_status": "existing", "has_exempt": false, "cvss": "n/a", "package": [] }, { "id": "Metric: new_security_hotspots_reviewed", "due_date": "n/a", "severity": "high", "first_found": "2025-03-18", "url": "https://github.ibm.com/abcd/compliance-issues-repo/issues/15", "found_status": "existing", "has_exempt": false, "cvss": "n/a", "package": [] } ], "attachments": [ { "hash": "d10a1e5d727b4f778a1d70c2ebaa2060251d56dd79", "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/d10a1e5d727b4f778a1d70c2e/content", "label": "app_issues" }, { "hash": "d76d356cc4da1afc942a6259c1222a7b079607ea7e0d64", "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/d76d356cc4da1afc942a6259c1222a7b0/content", "label": "app_hotspots" }, { "hash": "f0f84a2c2210a9c65c8430d577dafdd71bee6df5da", "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/f0f84a2c2210a9c65c8430d577dafdd71bee6e/content", "label": "app_quality_status_updated" } ], "assets": [ { "hash": "1812f77dfc646c93320794810460acd3e53", "uri": "https://github.ibm.com/abcd/compliance-app-20250310111628285.git#7a06e70001a59032d1", "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/assets/1812f77dfc646c93320794810460acd3e/index.json" } ] }
CIパイプラインで有効になっている場合は、CCで opt-in-sonar-quality-gates。 そうでなければ、CCによって発見されたクオリティ・ゲートの問題はオートクローズされることになる。 現在、この矛盾に関する警告メッセージをログに表示しています。
SonarQube,、詳しくは SonarQube ドキュメントを参照。
SonarQube ホットスポット処理の有効化
SonarQube ホットスポットは、セキュリティ上重要なコードを強調表示するもので、そのコードが本当のリスクをもたらすかどうかを判断するために、手作業によるレビューが必要である。 誤検知を発生させることなく、開発者が潜在的な脆弱性に集中できるようにする。 ホットスポットの管理について詳しくは、 SonarQube ドキュメントをご覧ください。
SonarQube ホットスポットの処理を有効にするには、環境プロパティ opt-in-sonar-hotspots を 1 に設定します。
opt-in-sonar-hotspots が 1 に設定され、 SonarQube インスタンスを インテグレーションとして使用している場合 ( sonarqube-config が custom に設定されている場合)、Web API を使用して Sonarqube が検出したホットスポットを取得するには、 SonarQube Web API にアクセスするために必要な権限を持つ SonarQube ユーザートークンを生成し、パイプライン環境プロパティ sonarqube-user-token にトークンをシークレット値として設定します。 必要なトークン権限の詳細については、 SonarQube トークン権限を 参照してください。
-
SonarQube で検出されたプロジェクトのセキュリティホットスポットを確認するには、プロジェクトを選択し、「 Security Hotspots(セキュリティホットスポット) 」をクリックします。
SonarQube -
検出されたホットスポットを確認するには、ホットスポットを選択して [Review] をクリックします。 モーダルが表示され、レビューステータスを以下のいずれかに設定できます:
To ReviewAcknowledged、Fixed、Safe。
SonarQube
opt-in-sonar-hotspots フラグを有効にすると、 SonarQube によってホットスポットが検出され、レビューステータスが設定されていない場合、issue が作成されます: Acknowledged Fixed および Safe。
SonarQube API の応答であるホットスポットの結果フォーマットの例:${SONAR_HOST_URL}/api/hotspots/search?projectKey=${SONAR_PROJECT_KEY}&p=$page&status=TO_REVIEW"
{
"hotspots": [
{
"key": "AYLD_a1_Hqacjdg4wbDR",
"component": "hello-compliance-app-compliance-check:index.js",
"project": "hello-compliance-app-compliance-check",
"securityCategory": "others",
"vulnerabilityProbability": "LOW",
"status": "TO_REVIEW",
"line": 74,
"message": "Make sure disabling content security policy frame-ancestors directive is safe here.",
"author": "abc@1.com",
"creationDate": "2022-04-01T06:29:13+0000",
"updateDate": "2022-08-22T05:18:31+0000",
"textRange": {
"startLine": 74,
"endLine": 84,
"startOffset": 0,
"endOffset": 1
},
"flows": [
{
"locations": [
{
"component": "hello-compliance-app-compliance-check:app.js",
"textRange": {
"startLine": 76,
"endLine": 82,
"startOffset": 4,
"endOffset": 5
}
}
]
}
],
"rule": {
"key": "javascript:S5732"
}
}
]
}
上記APIの結果、 To Review ステータスのホットスポットに遭遇した場合、 findings セクションにホットスポット情報を含む障害エビデンスが収集される。
例 SonarQube ホットスポット検出による証拠失敗:
{
"id": "62fc60140b2a761a969c6ad4f64d93d9c0f8f2301b1",
"evidence_type_id": "com.ibm.static_scan",
"evidence_type_version": "1.0.0",
"date": "2025-03-18T10:29:00.896Z",
"origin": {
},
"details": {
"result": "failure",
"tool": "sonarqube",
"failure_reason": "tool_detected_vulnerabilities"
},
"issues": [
"https://github.ibm.com/abcd/compliance-issues-20250310111628285/issues/13"
],
"findings": [
{
"id": "javascript:S4426",
"due_date": "n/a",
"severity": "high",
"first_found": "2025-03-18",
"url": "https://github.ibm.com/abcd/compliance-issues-20250310111628285/issues/12",
"found_status": "new",
"has_exempt": false,
"cvss": "n/a",
"package": []
},
{
"id": "Hotspot: javascript:S2068",
"due_date": "n/a",
"severity": "high",
"first_found": "2025-03-18",
"url": "https://github.ibm.com/abcd/compliance-issues-20250310111628285/issues/13",
"found_status": "new",
"has_exempt": false,
"cvss": "n/a",
"package": []
},
],
"attachments": [
{
"hash": "e579a1ab8025d280d5870eb8d4464d6d6a41a22",
"url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/e579a1ab8025d280d5870eb8d4464d6d6a41a/content",
"label": "app_issues"
},
{
"hash": "6defa891c320ae2b80ae76d03e168edc2379",
"url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/6defa891c320ae2b80ae76d03e168edc2379748d9/content",
"label": "app_hotspots"
},
{
"hash": "060a60e2d693427cde6064f72743ebb9e1d6",
"url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/060a60e2d693427cde6064f72743ebb9e1d/content",
"label": "app_quality_status_updated"
}
],
"assets": [
{
"hash": "d7391b3273e5e52852f293031d62b9",
"uri": "https://github.ibm.com/abcd/compliance-app-20250310111628285.git#4eadaaf7454b8cb0edad927",
"url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/assets/d7391b3273e5e52852f293031d62b9bf0/index.json"
}
]
}
CIパイプラインで有効になっている場合は、CCで opt-in-sonar-hotspots。 さもなければ、CCが発見したホットスポットの問題はオートクローズされる。 現在、この矛盾に関する警告メッセージをログに表示しています。
SonarQube トークンのパーミッション
既存の SonarQube インスタンスを使用し、Devops Insights に testrecord を正常にパブリッシュしてプロジェクトの Quality Gate 名を取得する場合、必要な Sonarqube エンポイントへのアクセス権限を提供するために、必要な権限を持つユーザートークンを作成し、env プロパティ sonarqube-user-token にシークレット値として設定する必要があります。
ユーザートークンを作成するには、 SonarQube ダッシュボードを開き、右上のプロフィール画像をクリック > マイアカウントを選択 > セキュリティを選択 > タイプドロップダウンから ユーザートークンを選択 > 生成をクリックします
-
Devops Insightsプラグインは、Sonarqubeサーバーに対して以下のAPIコールを行います:
-
GET api/qualitygates/project_status
以下のいずれかの権限が必要:
- システムの管理
- 指定されたプロジェクトの「管理者」権限
- 指定したプロジェクトを「ブラウズ」する
- 指定したプロジェクトで「分析を実行する
-
指定したプロジェクトの 'Browse' 権限が必要です。
-
指定したプロジェクトの「Browse」パーミッションが必要です。
-
以下のいずれかの権限が必要:
- グローバルまたはプロジェクトレベルでの「管理
- グローバルまたはプロジェクトレベルでの「分析の実行
-
-
クオリティ・ゲート名を取得するには、以下の SonarQube エンドポイントをヒットする:
-
GET api/qualitygates/get_by_project
以下のいずれかの権限が必要:
- システムの管理
- 指定されたプロジェクトの「管理者」権限
- 指定したプロジェクトを「ブラウズ」する
-
-
SonarQube 検出されたホットスポットを取得するには、以下の SonarQube エンドポイントをヒットする:
-
指定したプロジェクトの「Browse」パーミッションが必要です。
-
SonarQube Web API へのアクセス権限に関する詳細は、 SonarQube Web API ドキュメントをご参照ください
独自の構成ファイルの使用
独自の SonarQube インスタンスを使用しなくてもデフォルトの構成を変更することができます。 設定ファイルを作成したいリポジトリに sonar-project.properties ファイルを作成します。 IBM のスクリプトは、リポジトリーで既存の構成ファイル configuration sonar-project.properties を検出すると、デフォルトのファイルの代わりにそのファイルを使用します。 コンフィギュレーション・ファイルで可能な分析パラメーターについては、
分析パラメーターを参照してください。
sonarqube-project.properties ファイルに sonar.branch.name が追加されている場合は、デフォルト値として sonar-branch-name env プロパティに設定され、そうでない場合は load_repo <app-name> branch から利用可能なブランチ名が考慮される。 詳しくは、 ブランチ・アナリシスのドキュメントを参照してください。
構成ファイルに正しいログイン資格情報とホスト URL を追加したことを確認してください。
別の静的スキャン実装の使用
.pipeline-config.yaml ファイルを変更して独自のカスタム・スクリプトを static-scan ステージに追加することで、独自の静的スキャン実装を使用できます。
SonarQube に関する詳細
SonarQube, について詳しくは、 SonarQube 分析をツールチェーンに統合するをご覧ください。