パイプラインで変数とパラメーターを安全に使用する方法

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

この記事では、変数とパラメーターを安全に使用してパイプライン ユーザーからの入力を収集する方法について説明します。 変数とパラメーターの使用の詳細については、次を参照してください。

シークレット変数には注意が必要です。 シークレット変数の設定が推奨される箇所は、UI、変数グループ、Azure Key Vault の変数グループです。 詳しくは、「シークレット変数を設定する」をご覧ください。

変数

変数は、ユーザーから情報を前もって収集するのに便利な方法です。 変数を使用して、パイプライン内のステップからステップにデータを渡すこともできます。

ただし、変数は慎重に使用してください。 新しく作成された変数は、YAML で定義されているか、スクリプトによって書き込まれるかにかかわらず、既定で読み取り/書き込み可能です。 ダウンストリーム ステップでは、予期しない方法で変数の値を変更できます。

たとえば、スクリプトは次のように読み取ります。

msbuild.exe myproj.proj -property:Configuration=$(MyConfig)

前の手順では、MyConfigDebug & deltree /y c: に設定できます。 この例ではビルド エージェントの内容のみを削除しますが、この設定がいかに遥かに危険なものになるかは想像がつくと思います。

変数を読み取り専用にすることができます。 Build.SourcesDirectory、タスク出力変数、キュー時間変数などのシステム変数は、常に読み取り専用です。 YAML で作成された変数、またはスクリプトによって実行時に作成される変数は、読み取り専用として指定できます。 スクリプトまたはタスクが新しい変数を作成すると、そのログ コマンドで isReadonly=true フラグを渡して、変数を読み取り専用にすることができます。

YAML では、特定のキーを使用して読み取り専用変数を指定できます。

variables:
- name: myReadOnlyVar
  value: myValue
  readonly: true

キュー時間変数

パイプライン UI エディターで変数を定義する場合は、パイプラインの実行時にユーザーがその値をオーバーライドすることを選択できます。 このような変数をキュー時間変数と呼びます。 キュー時間変数は、常にパイプライン UI エディターで定義されます。

キュー時間変数の定義のスクリーンショット。

キュー時間変数は、パイプラインを手動で実行するとエンド ユーザーに公開され、値を変更できます。 キュー時間変数の値を更新するスクリーンショット。

ユーザーは、キューに入れるときに設定された変数を指定するため、パイプラインに対するキュー ビルド構成の編集アクセス許可が必要です。

キュー時に設定できる変数を制限する

パイプラインの実行に使用される UI と REST API は、ユーザーがキュー時に新しい変数を定義するための手段を提供します。

パイプラインを実行する直前にキュー時間変数を追加するスクリーンショット。

Azure Pipelines の初期の頃、この機能には次のいくつかの問題がありました。

  • ユーザーは、定義の中でパイプライン作成者によって明示的に定義されていない新しい変数を定義することができました。
  • ユーザーは、システム変数をオーバーライドすることができました。

これらの問題を解決するために、キュー時に設定できる変数を制限する設定が定義されました。 この設定を有効にすると、"キュー時に設定可能" として明示的にマークされている変数のみを設定できます。 つまり、この設定が有効になっていないと、キュー時に任意の変数を設定できます。

この設定は、組織およびプロジェクト レベルで動作するように設計されています。

  1. 組織レベル。 設定をオンにすると、組織内のすべてのプロジェクトのすべてのパイプラインに対して、明示的に "キュー時に設定可能" とマークされた変数のみを設定できます。 設定がオフの場合、各プロジェクトがキュー時に設定された変数を制限することを選択できます。 この設定は、[組織の設定] > [パイプライン > 設定] の下にあるトグルです。 これを有効または無効にできるのは、プロジェクト コレクション管理者だけです。 組織レベルで待ち時間に設定できる変数を制限している様子を示すスクリーンショット。
  2. プロジェクト レベル。 設定をオンにすると、プロジェクト内のすべてのパイプラインに対して、明示的に "キュー時に設定可能" とマークされた変数のみを設定できます。 設定が組織レベルでオンになっている場合は、すべてのプロジェクトに対してオンになり、オフにすることはできません。 この設定は、[プロジェクトの設定] > [パイプライン > 設定] の下にあるトグルです。 これを有効または無効にできるのは、プロジェクト管理者だけです。 プロジェクト レベルでキュー時に設定できる変数を制限するスクリーンショット。

一例を見てみましょう。 たとえば、設定がオンで、パイプラインで、キュー時に設定できない my_variable という名前の変数を定義しているとします。 クラシック パイプラインで変数を定義するスクリーンショット。

次に、パイプラインを実行するとします。 [変数] パネルには変数が表示されず、[変数の追加] ボタンがありません。

設定がオンになっている変数パネルのスクリーンショット。

ビルド - キュー実行 - パイプラインの実行 REST API 呼び出しを使用してパイプラインの実行をキューに入れ、my_variable または新しい変数の値を設定すると、次のようなエラーで失敗します。

{
  "$id": "1",
  "innerException": null,
  "message": "You can't set the following variables (my_variable). If you want to be able to set these variables, then edit the pipeline and select Settable at queue time on the variables tab of the pipeline editor.",
  "typeName": "Microsoft.Azure.Pipelines.WebApi.PipelineValidationException, Microsoft.Azure.Pipelines.WebApi",
  "typeKey": "PipelineValidationException",
  "errorCode": 0,
  "eventId": 3000
}

パラメーター

変数とは異なり、パイプラインがその実行中にパイプライン パラメーターを変更することはできません。 パラメーターには、numberstring などのデータ型があり、値のサブセットに制限できます。 パラメーターの制限は、パイプラインのうちユーザーが構成可能な部分が制約付きリストからのみ値を受け取る必要がある場合に便利です。 セットアップにより、パイプラインが任意のデータを取得しないようにします。

シェル タスク引数パラメーターの検証を有効にする

パイプラインは、パイプラインで実行されるタスクを参照できます。 Azure DevOps に含まれるいくつかのタスクには、タスクのオプションをさらに指定できる引数パラメーターがあります。

[シェル タスクの引数の検証を有効にする] の設定が有効になっている場合、引数パラメーターは、シェルによって正しく実行されない可能性のある文字がないかどうか、引数パラメーターが確認されます。 文字の例としては、セミコロン、引用符、かっこなどがあります。

[キュー時に設定できる変数を制限する] オプションと同様に、シェル タスク引数パラメーターの検証を有効にするは、組織レベルの [設定]>[パイプライン]>[設定] またはプロジェクト レベルの [設定]>[パイプライン]>[設定]で構成できます。

有効にすると、検証の問題が検出され、次のようなエラー メッセージがログに記録されます。 Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

この問題を解決するには、エラー メッセージに示されているように特殊文字をエスケープして引数を調整します。

[シェル タスク引数パラメーターの検証を有効にする] が有効になっている場合、検証は次のタスクの引数パラメーターに適用されます。

  • PowerShell
  • BatchScript
  • Bash
  • SSH
  • AzureFileCopy
  • WindowsMachineFileCopy

次のステップ

入力をセキュリティで保護したら、共有インフラストラクチャをセキュリティで保護する必要もあります。