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 で定義されているかスクリプト化されているかに関係なく、新しく作成された変数は読み取り/書き込みになります。 ダウンストリームの手順では、変数の値が予期せず変更される可能性があります。
たとえば、次のスクリプト スニペットを考えてみましょう。
msbuild.exe myproj.proj -property:Configuration=$(MyConfig)
前の手順で MyConfig
を Debug & deltree /y c:
に設定すると、意図しない結果になる可能性があります。 この例では、ビルド エージェントの内容を削除するだけですが、このような設定の潜在的な危険性が強調されています。
変数を読み取り専用にすることができます。
Build.SourcesDirectory
、タスク出力変数、キュー時間変数などのシステム変数は、常に読み取り専用です。
YAML で作成された変数、またはスクリプトによって実行時に作成される変数は、読み取り専用として指定できます。
スクリプトまたはタスクが新しい変数を作成すると、そのログ コマンドで isReadonly=true
フラグを渡して、変数を読み取り専用にすることができます。
YAML では、次の特定のキーを使用して読み取り専用変数を指定できます。
variables:
- name: myReadOnlyVar
value: myValue
readonly: true
シークレット変数には注意してください。 シークレット変数を設定するための推奨される方法は、UI の使用、変数グループの作成、または Azure Key Vault から提供される変数グループの使用です。 詳細については、「 シークレット変数の設定」を参照してください。
キュー時間変数
Pipelines UI エディターで変数を定義する場合、ユーザーがパイプラインの実行中にその値をオーバーライドできるようにすることができます。 これらの変数はキュー時間変数と呼ばれ、パイプライン UI エディター内で常に定義されます。
キュー時間変数は、パイプラインを手動で実行するとエンド ユーザーに公開され、値を変更できます。
ユーザーは、パイプラインに対して、キュー ビルド構成の編集権限 を持っている必要があり、キュー時に設定される変数を指定できます。
キュー時に設定できる変数を制限する
パイプラインの実行に使用される UI と REST API は、ユーザーがキュー時に新しい変数を定義するための手段を提供します。
Azure Pipelines の初期の頃、この機能には次の問題がありました。
- これで、ユーザーは定義内のパイプライン作成者によってまだ定義されていない新しい変数を定義できます。
- ユーザーは、システム変数をオーバーライドすることができました。
これらの問題に対処するために、 キュー時に設定できる変数を制限する設定を定義しました。 この設定を有効にすると、"キュー時に設定可能" として明示的にマークされている変数のみを設定できます。 つまり、この設定が有効でない限り、キューの時刻に任意の変数を設定できます。
この設定は、組織レベルとプロジェクト レベルで動作するように設計されています。
-
組織レベル:
- この設定をオンにすると、組織内のすべてのプロジェクトのすべてのパイプラインに対して、明示的に "Settable at queue time" としてマークされた変数のみを変更できるようになります。
- プロジェクト コレクション管理者は、この設定を有効または無効にすることができます。
- 組織の設定>> でこの設定にアクセスします。
-
プロジェクト レベル:
- 組織レベルと同様に、この設定を有効にすると、特定のプロジェクト内のすべてのパイプラインに対して、"Settable at queue time" としてマークされた変数のみを変更できます。
- 組織レベルの設定が有効になっている場合、すべてのプロジェクトに適用され、オフにすることはできません。
- プロジェクト管理者は、この設定を有効または無効にすることができます。
- [ プロジェクトの設定>Pipelines>Settings でこの設定にアクセスします。
次の例は、設定がオンであり、パイプラインでキュー時に設定できない 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
}
パラメーター
変数とは異なり、実行中のパイプラインではパイプライン パラメーターを変更できません。
パラメーターには、 number
や string
などのデータ型があり、特定の値のサブセットに制限できます。 この制限は、パイプラインのユーザーが構成可能な側面で、定義済みのリストからの値のみを受け入れ、パイプラインが任意のデータを受け入れないようにする必要がある場合に重要です。
シェル タスク引数パラメーターの検証を有効にする
パイプラインは、パイプライン内で実行されるタスクを参照できます。 一部のタスクには、タスクのオプションをさらに指定できる arguments
パラメーターが含まれています。
[シェル タスクの引数の検証を有効にする] の設定が有効になっている場合、引数パラメーターは、セミコロン、引用符、かっこなどの文字がシェルで正しく実行されることを確認するためにレビューを受けます。 [キューの時刻に設定できる変数を制限する] オプションと同様に、組織レベルまたはプロジェクト レベルの [設定>> でシェル タスク引数パラメーターの検証を有効にするを構成できます。
この機能を有効にすると、 arguments
パラメーターに関連する検証の問題によって、次のようなエラー メッセージがトリガーされます。
Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).
この問題を解決するには、エラー メッセージに示されているように特殊文字をエスケープして引数を調整します。 この検証は、次の特定のタスクの arguments
パラメーターに適用されます。
- PowerShell
- バッチスクリプト
- Bash (バッシュ)
- SSH
- Azureファイルコピー
- Windowsマシンファイルコピー