Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
Azure Pipelines では、ユーザーが変数とパラメーターを使用して入力を収集することで、パイプラインの実行をカスタマイズできます。 ただし、ユーザー入力を受け入れると、適切に処理されない場合にセキュリティ リスクが発生する可能性もあります。 この記事では、パイプラインで変数とパラメーターを安全に使用する方法について説明します。
この記事は、Azure Pipelines のセキュリティ対策を実装するのに役立つシリーズの一部です。 詳細については、「 Azure Pipelines のセキュリティ保護」を参照してください。
前提条件
カテゴリ | 必要条件 |
---|---|
Azure DevOps | - Azure DevOps をセキュリティで保護し、Azure Pipelines を セキュリティで保護する方法に関するページの推奨事項を実装します。 - YAML と Azure Pipelines に関する基本的な知識。 詳細については、「最初の パイプラインを作成する」を参照してください。 |
権限 | - パイプラインのアクセス許可を変更するには: プロジェクト管理者グループのメンバー。 - 組織のアクセス許可を変更するには: プロジェクト コレクション管理者グループのメンバー。 |
変数
変数は、ユーザー入力を事前に収集し、パイプラインステップ間のデータ転送を容易にする便利な方法です。 ただし、YAML タスクまたはスクリプトで定義されている変数は、既定では読み取り/書き込みになります。 アップストリームの手順で設定された値によって、ダウンストリームの値が予期せず変更される可能性があります。
たとえば、次のスクリプト スニペットは、 MyConfig
という変数を呼び出します。
msbuild.exe myproj.proj -property:Configuration=$(MyConfig)
前の手順で MyConfig
変数の値を Debug & deltree /y c:
に設定した場合、このスクリプトを実行するとビルド エージェントの内容が削除され、意図しない結果になる可能性があります。 この例では、このような設定の潜在的な危険性を強調表示します。
Build.SourcesDirectory
やタスク出力変数などのシステム変数は、常に読み取り専用です。 また、スクリプトまたは YAML タスクで作成された変数を読み取り専用として指定するには、ログ コマンドで isReadonly=true
フラグを渡します。
YAML 変数定義では、特定の readonly
キーを使用して読み取り専用変数を指定できます。
variables:
- name: myReadOnlyVar
value: myValue
readonly: true
シークレット変数には特に注意してください。 シークレット変数を設定するための推奨される方法は、UI の使用、変数グループの作成、または Azure Key Vault から提供される変数グループの使用です。 詳細については、「 シークレット変数の設定」を参照してください。
キュー時間変数
Azure Pipelines UI で変数を定義するときに、ユーザーがパイプラインの実行中に値をオーバーライドできるようにするかどうかを選択できます。 ユーザーがキュー時に値を設定できるようにする変数は、キュー時間変数と呼ばれ、Azure Pipelines 変数 UI でのみ定義できます。
クラシック パイプライン エディターでは、キュー時に設定可能のチェック ボックスをオンにすることで、キュー時変数を定義します。 YAML パイプラインでは、[このパイプラインの 実行時にユーザーがこの値をオーバーライドできるようにする] を選択して、それらを指定します。
注
リリース パイプラインで、 リリース時に [Settable] を選択します。 詳細については、「リリース時に変数を編集する方法」を参照してください。
ユーザーがパイプラインを手動で実行すると、キュー時間変数を選択して値を変更できます。
ユーザーは、キュー時に設定された変数を定義できるようにするには、パイプラインに対する キュー ビルド構成の編集 アクセス許可を持っている必要があります。
キュー時に設定できる変数を制限する
パイプラインを実行する Azure Pipelines UI と REST API は、ユーザーがキュー時に新しい変数を追加する方法を提供します。 この機能を使用すると、ユーザーは、パイプライン作成者が定義していない変数を作成したり、システム変数をオーバーライドしたり、キュー時に既存の変数の値を設定したりできます。
これらの機能によって発生する問題を回避するために、キュー時に設定できる変数を制限できます。 キュー時に設定できる変数の制限設定を有効にして、ユーザーがキュー時に Settable として明示的にマークされている変数のみを設定したり、キュー時にこのパイプラインを実行するときにユーザーがこの値をオーバーライドできるようにしたりできます。
この設定は、組織レベルとプロジェクト レベルで適用できます。
プロジェクト コレクション管理者 は、 組織の設定>Pipelines>Settings で組織レベルでこの設定を適用できます。 設定が [オン] の場合、キュー時に明示的に Settable としてマークされている変数のみを、組織内のすべてのプロジェクトのすべてのパイプラインのキュー時に設定できます。
プロジェクト管理者は、プロジェクト設定>> のプロジェクト レベルでこの設定を適用できます。 設定が [オン] の場合、このプロジェクトのすべてのパイプラインに対して 、キュー時に Settable として明示的にマークされている変数のみをキュー時に設定できます。 組織レベルで設定が有効になっていない場合は、個々のプロジェクトで有効または無効にすることができます。
組織レベルの設定が有効になっている場合は、組織内のすべてのプロジェクトに適用され、プロジェクト レベルでオフにすることはできません。
次の例は、クラシック パイプラインの変数を示しています。その一部は キュー時に設定可能 とマークされています。
BuildPlatform
変数はキュー時に設定できますが、BuildConfiguration
は設定できません。
このパイプラインを実行すると、キュー時に設定可能とマークされた変数のみが、[変数] 画面に表示され、選択できます。
キュー時に設定できる変数の制限がプロジェクトまたは組織レベルで有効になっている場合、[変数の追加] ボタンは表示されません。
ビルド - キューまたは実行 - パイプライン実行 API を使用してパイプラインの実行をキューに登録し、キュー時に Settable とマークされていない変数の値を設定しようとすると、次のようなエラーが発生して失敗します。
{
"$id": "1",
"innerException": null,
"message": "You can't set the following variables (BuildConfiguration). 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
}
パラメーター
実行中のパイプラインでは、変数とは異なり、パイプライン パラメーターを変更することはできません。 パラメーターには、 number
や string
などのデータ型があり、特定の値のサブセットに制限できます。 この制限は、パイプラインのユーザーが構成可能な側面で、定義済みのリストからの値のみを受け入れ、パイプラインが任意のデータを受け入れないようにする必要がある場合に重要です。
シェル タスク引数の検証を有効にする
パイプラインは、パイプライン内で実行されるタスクを参照できます。 一部のタスクには、 arguments
パラメーターが含まれています。このパラメーターを使用すると、ユーザーはタスクのその他のオプションを指定できます。
[シェル タスクを有効にする] 引数の検証設定を適用すると、組み込みのシェル タスクのパラメーターargument
検証され、スクリプトにコマンドを挿入できる入力がチェックされます。 このチェックにより、次のパイプライン タスクで、シェルでセミコロン、引用符、かっこなどの文字が正しく実行されることが保証されます。
- PowerShell
- バッチスクリプト
- Bash
- SSH
- Azureファイルコピー
- Windowsマシンファイルコピー
組織レベルでは、[組織の設定]パイプライン>設定の下で>ことができます。また、プロジェクト レベルでは、[プロジェクトの設定]パイプライン>設定の下で有効にすることができます。 組織レベルの設定が有効になっている場合は、組織内のすべてのプロジェクトに適用され、プロジェクト レベルでオフにすることはできません。
この設定を有効にすると、 arguments
パラメーターに関連する検証の問題により、次のエラー メッセージがトリガーされます。
Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).
この問題を解決するには、エラー メッセージに示されているように特殊文字をエスケープして引数を調整します。