よく寄せられる質問 | Azure

Note

2022 年 12 月 31 日をもって、Microsoft Security Code Analysis (MSCA) 拡張機能は廃止されました。 MSCA は、Microsoft Security DevOps の Azure DevOps 拡張機能に置き換えられます。 構成に関する記事の手順に従い、拡張機能のインストールと構成を行ってください。

一般的な FAQ

Azure DevOps インスタンスではなく、Azure DevOps Server (旧称 Visual Studio Team Foundation Server) インスタンスに拡張機能をインストールすることはできますか?

いいえ。 この拡張機能は、Azure DevOps Server (旧称 Visual Studio Team Foundation Server) 用のダウンロードとインストールには使用できません。

Microsoft Security Code Analysis は、ビルドに対して実行しなければなりませんか?

その可能性はあります。 分析ツールの種類によって異なります。 ソース コードのみが必要な場合や、ビルド出力が必要な場合があります。

たとえば、Credential Scanner (CredScan) では、コード リポジトリのフォルダー構造内のファイルが分析されます。 この分析があるので、CredScan を実行し、セキュリティ分析ログの発行ビルド タスクをスタンドアロン ビルドで実行して、結果を取得することができます。

ビルド後の成果物を分析する BinSkim などの他のツールでは、最初にビルドが必要です。

結果が判明した時点でビルドを中断することはできますか?

はい。 いずれかのツールでログ ファイルに問題がレポートされた時点で、ビルドの中断を挿入することができます。 分析後ビルド タスクを追加し、ビルドを中断するツールのチェック ボックスをオンにします。

分析後タスクの UI では、いずれかのツールからエラーが報告されたときのみ、またはエラーと警告の両方が報告されたときにビルドを中断することを選択できます。

Azure DevOps のコマンド ライン引数は、スタンドアロン デスクトップ ツールの引数とどのような違いがありますか?

通常、Azure DevOps のビルド タスクは、セキュリティ ツールのコマンド ライン引数を直接ラップしたものです。 通常、コマンド ライン ツールに渡すすべてのものを引数としてビルド タスクに渡すことができます。

主な相違点:

  • ツールは、エージェント $(Build.SourcesDirectory) のソース フォルダーまたは %BUILD_SOURCESDIRECTORY% から実行されます。 たとえば、C:\agent_work\1\s です。
  • 引数のパスは、前に示したソース ディレクトリのルートに対して相対的に指定できます。 絶対パスを指定することもできます。 絶対パスを取得するには、Azure DevOps のビルド変数を使用するか、ローカル リソースの既知の展開場所を指定してオンプレミスのエージェントを実行します。
  • ツールでは、出力ファイルのパスまたはフォルダーが自動的に提供されます。 ビルド タスクの出力場所を指定したとしても、その場所はビルド エージェントのログの所定の場所へのパスに置き換えられます。
  • 一部のツールでは、いくつかの他のコマンド ライン引数が変更されています。 1 つの例として、GUI を起動しないようにするオプションが追加または削除される場合があります。

Azure DevOps ビルドの複数のリポジトリにわたってビルド タスク (Credential Scanner など) を実行することはできますか?

いいえ。 1 つのパイプラインで複数のリポジトリにわたってセキュリティで保護された開発ツールを実行することはできません。

指定した出力ファイルが作成されない、または指定した出力ファイルが見つからない

ビルド タスクでは、一部のユーザー入力がフィルター処理されます。 具体的には、生成された出力ファイルの場所が、ビルド エージェント上の共通の場所になるように更新されます。 この場所の詳細については、次の質問を参照してください。

ツールで生成された出力ファイルはどこに保存されますか?

ビルド タスクでは、ビルド エージェント上にある所定の場所 ($(Agent.BuildDirectory)_sdt\logs) への出力パスが自動的に追加されます。 この場所で標準化されているため、コード分析ログを生成または使用するすべてのチームが出力にアクセスできます。

ビルドをキューに追加して、ホステッド ビルド エージェント上でこれらのタスクを実行することはできますか?

はい。 この拡張機能に含まれるタスクとツールはすべて、ホステッド ビルド エージェント上で実行できます。

Note

Anti-Malware Scanner ビルド タスクには、Windows Defender が有効なビルド エージェントが必要です。 ホストされている Visual Studio 2017 以降には、このようなエージェントが用意されています。 ビルド タスクは、Visual Studio 2015 ホステッド エージェントでは実行されません。

これらのエージェントでは署名を更新することはできませんが、署名の期間を常に 3 時間未満にする必要があります。

これらのビルド タスクを、ビルド パイプラインではなくリリース パイプラインの一部として実行することはできますか?

ほとんどの場合、可能です。

ただし、リリース パイプライン内のタスクによって成果物が発行されるときは、Azure DevOps ではそれらのタスクのリリース パイプラインでの実行をサポートしません。 この不十分なサポートにより、セキュリティ分析ログの発行タスクがリリース パイプラインで正常に実行されません。 代わりに、エラー メッセージが表示され、タスクは失敗します。

ビルド タスクではツールはどこからダウンロードされますか?

ビルド タスクでは、Azure DevOps Package Management フィードからツールの NuGet パッケージをダウンロードできます。 ビルド タスクでは、ノード パッケージ マネージャーを使用することもできます。これはビルド エージェントに事前にインストールしておく必要があります。 このようなインストールの例として、コマンド npm install tslint があります。

この拡張機能をインストールすると、自分の Azure DevOps 組織にはどのような影響がありますか?

インストールすると、拡張機能によって提供されるセキュリティ ビルド タスクを組織内のすべてのユーザーが使用できるようになります。 Azure パイプラインを作成または編集する場合、これらのタスクはビルド - タスク コレクションの一覧から利用できます。 それ以外の点では、Azure DevOps 組織にこの拡張機能をインストールしても影響はありません。 インストールによって、アカウント設定、プロジェクト設定、またはパイプラインは変更されません。

この拡張機能をインストールすると、既存の Azure Pipelines は変更されますか?

いいえ。 拡張機能をインストールすると、セキュリティ ビルド タスクをパイプラインに追加できるようになります。 ただし、ツールによってビルド プロセスを操作できるように、ビルド定義を追加または更新する必要があります。

タスク固有の FAQ

このセクションでは、ビルド タスクに固有の質問について説明します。

Credential Scanner

一般的な抑制のシナリオと、その例を教えてください。

ここでは、最も一般的な 2 つの抑制シナリオの詳細について説明します。

指定パス内での特定のシークレットの出現をすべて抑制するには

次の例に示すように、CredScan 出力ファイルのシークレットのハッシュ キーが必要です。

{
    "tool": "Credential Scanner",
    "suppressions": [
    {
        "hash": "CLgYxl2FcQE8XZgha9/UbKLTkJkUh3Vakkxh2CAdhtY=",
        "_justification": "Secret used by MSDN sample, it is fake."
    }
  ]
}

警告

ハッシュ キーは、照合対象の値またはファイル コンテンツの一部から生成されます。 ソース コードを編集するとハッシュ キーが変更され、抑制ルールが無効になる可能性があります。

指定ファイル内ですべてのシークレットを抑制するには、またはシークレット ファイル自体を抑制するには

ファイルの式には、ファイル名を指定できます。 また、完全なファイル パスまたはファイル名のベース名部分も指定できます。 ワイルドカードはサポートされていません。

次の例は、ファイル <InputPath>\src\JS\lib\angular.js を抑制する方法を示しています

有効な抑制ルールの例を次に示します。

  • <InputPath>\src\JS\lib\angular.js - 指定パス内にあるファイルを抑制する
  • \src\JS\lib\angular.js
  • \JS\lib\angular.js
  • \lib\angular.js
  • angular.js - 同名の全ファイルを抑制する
{
    "tool": "Credential Scanner",
    "suppressions": [
    {
        "file": "\\files\\AdditonalSearcher.xml", 
        "_justification": "Additional CredScan searcher specific to my team"
    },
    {
        "file": "\\files\\unittest.pfx", 
        "_justification": "Legitimate UT certificate file with private key"
    }
  ]
}

警告

今後、ファイルに追加されたシークレットもすべて自動的に抑制されます。

シークレットの管理についてどのようなガイドラインが推奨されますか?

次のリソースは、機密情報を安全に管理し、アプリケーション内からシークレットにアクセスするために役立ちます。

詳細については、ブログ記事「クラウドで安全にシークレットを管理する」を参照してください。

カスタムの検索ツールを作成することはできますか?

Credential Scanner では、通常は buildsearchers.xml ファイルで定義されているコンテンツ検索ツール一式が使用されます。 このファイルには、ContentSearcher オブジェクトを表すシリアル化された XML オブジェクトの配列が記載されています。 このプログラムは、適切に実証済みの一連の検索ツールと共に配布されます。 ただし、独自のカスタムの検索ツールを実装することもできます。

コンテンツ検索ツールは以下のように定義されます。

  • Name:Credential Scanner の出力ファイルで使用される、検索ツールのわかりやすい名前。 検索ツール名には、キャメルケース形式の名前付け規則を使用することをお勧めします。

  • RuleId:不変的で不明瞭な検索ツールの ID。

    • Credential Scanner の既定の検索ツールには、CSCAN0010、CSCAN0020、CSCAN0030 などの RuleId 値が割り当てられます。 最後の桁は、正規表現 (regex) を使用して検索ツール グループを結合または分割するために予約されています。
    • カスタマイズされた検索ツールの RuleId 値には、独自の名前空間が必要です。 たとえば、CSCAN-<Namespace>0010、CSCAN-<Namespace>0020、CSCAN-<Namespace>0030 などです。
    • 検索ツールの完全修飾名は、RuleId 値と検索ツール名を組み合わせたものです。 たとえば、CSCAN0010.KeyStoreFiles、CSCAN0020.Base64EncodedCertificate などです。
  • ResourceMatchPattern:検索ツールに対してチェックするファイル拡張子の正規表現。

  • ContentSearchPatterns:照合する regex ステートメントを含む文字列の配列。 検索パターンが定義されていない場合は、ResourceMatchPattern 値と一致するすべてのファイルが返されます。

  • ContentSearchFilters:検索ツールごとの誤検知を除外するための正規表現文を含む文字列の配列。

  • MatchDetails:検索ツールの各一致に追加される説明メッセージ、軽減手順、またはその両方。

  • 推奨事項:PREfast レポート形式を使用した一致の提案フィールドの内容。

  • [重大度] :問題の重大度レベルを反映した整数。 最も高い重大度レベルの値は 1 です。

    Credential Scanner のセットアップを示す XML

Roslyn アナライザー

Roslyn アナライザー タスクの使用時に発生する一般的なエラーはどのようなものですか?

不適切な Microsoft.NETCore.App バージョンを使用してプロジェクトが復元された

完全なエラー メッセージ:

"エラー: プロジェクトは Microsoft.NETCore.App バージョン x.x.x を使用して復元されましたが、現在の設定では、バージョン y.y.y が代わりに使用されます。 この問題を解決するには、復元およびこれ以降の操作 (ビルドや発行など) で同じ設定を使用していることをご確認ください。 通常、この問題は、ビルドや発行の実行時に RuntimeIdentifier プロパティを設定したが、復元時には設定していない場合に発生することがあります。

Roslyn アナライザー タスクはコンパイルの一環として実行されるので、ビルド マシンのソース ツリーがビルド可能な状態である必要があります。

メイン ビルドと Roslyn Analyzer の手順の間にある手順により、ソース ツリーがビルドできない状態になった可能性があります。 この余分な手順はおそらく dotnet.exe publish です。 Roslyn アナライザーの手順の直前に、NuGet の復元を実行する手順をコピーしてみてください。 この重複する手順によって、ソース ツリーがビルド可能な状態に戻る可能性があります。

csc.exe でアナライザー インスタンスが作成されません。

完全なエラー メッセージ:

"'csc.exe' exited with error code 1 -- An instance of analyzer AAAA cannot be created from C:\BBBB.dll : Could not load file or assembly 'Microsoft.CodeAnalysis, Version=X.X.X.X, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. ('csc.exe' はエラー コード 1 で終了しました -- アナライザー AAAA のインスタンスは C:\BBBB.dll から作成できません: ファイルまたはアセンブリ 'Microsoft.CodeAnalysis, Version=X.X.X.X, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、あるいはその依存関係の 1 つを読み込めませんでした。) The system cannot find the file specified." ('cwd' の値 '/src' が無効です。指定されたファイルがシステムに見つかりません。)

コンパイラで Roslyn アナライザーがサポートされていることを確認してください。 コマンド csc.exe/version を実行したとき、2.6 以降のバージョン値が報告される必要があります。

場合によっては、.csproj ファイルでは、Microsoft.Net.Compilers からパッケージを参照することで、ビルド マシンの Visual Studio のインストールをオーバーライドすることができます。 特定のバージョンのコンパイラを使用しない場合は、Microsoft.Net.Compilers への参照を削除します。 それ以外の場合は、参照されているパッケージのバージョンも 2.6 以降であることを確認します。

csc.exe /errorlog オプションで指定されるエラーログのパスを取得してみてください。 このオプションとパスは、Roslyn アナライザー ビルド タスクのログに示されます。 たとえば、/errorlog:F:\ts-services-123_work\456\s\Some\Project\Code\Code.csproj.sarif のようになります

C# コンパイラのバージョンが最新ではありません

最新バージョンの C# コンパイラを入手するには、Microsoft.Net.Compilers にアクセスします。 インストールされているバージョンを取得するには、コマンド プロンプトで csc.exe /version を実行します。 バージョン 2.6 以降の Microsoft.Net.Compilers NuGet パッケージを参照していることを確認します。

MSBuild と VSBuild のログが見つかりません

Roslyn アナライザー ビルド タスクでは、MSBuild ビルド タスクの MSBuild ログについて Azure DevOps にクエリを実行する必要があります。 MSBuild タスクの直後にアナライザー タスクを実行した場合、ログはまだ使用できません。 MSBuild タスクと Roslyn アナライザー タスクの間に他のタスクを配置します。 その他のタスクの例としては、BinSkim と Anti-Malware Scanner があります。

次のステップ

さらにサポートが必要な場合は、Microsoft Security Code Analysis サポートまでお問い合わせください (平日の午前 9:00 から午後 5:00 (太平洋標準時) まで営業)。