Microsoft Azure には、API を管理する機能があります。API を製品やサービスに組み込む必要がある場合は、Azure API Management プラットフォームを利用することができます。
Azure で API を管理するときに取り組むべき重要なタスクの1つは、アクセス許可です。次のような事項に関してよく検討して適切に対処する必要があります。
- エンドポイントにクエリできるのは誰か?
- どのメソッドがどの時点で許可されるか?
- ユーザーやサービスによるアクセスをきめ細かくコントロールするにはどうすればいいか?
- (そのほか、状況に応じて様々な考慮事項)
Azure は、他の多くのサービスと同様に、役割ベースのアクセスコントロール(role-based access control、RBAC)を介してアクセスをコントロールします。役割を定義し、その役割に応じたアクセスを許可するという仕組みで、アクセスできるものとできないものを詳細なレベルでコントロールできます。
API ロールの割り当てを管理する方法はいくつかありますが、便利な方法として PowerShell の使用があります。すでに各種の PowerShell スクリプトを使っている場合は、このプロセスを自動化するのに PowerShell を使用するのが最適です。
Azure API Management で新しくロール割り当てを行うには、いくつかのステップを踏む必要があります。
- アクセスを割り当てるすべての API を定義する
- アクセスを割り当てる API のスコープを設定する
- 各 API のスコープ対象となる Azure ロールの定義を作成する
- ロールをすべての API に割り当てる
具体的にはどうすればいいか、以下に説明します。
前提条件
このブログの記述をフォローする場合は、次の点を確認してください。
- Windows PowerShell 5.1 または PowerShell Core 6以降がインストールされている
- Az PowerShell モジュール(Install-Module -Name Az)がインストールされている
- [Connect-AzAccount](https://adamtheautomator.com/connect-azaccount-powershell/)を使用して Azure サブスクリプション認証済み
- 単一の API で Azure API Management サービスが生成済み
コンテキストの確立
PowerShell で Azure API を使用して何かを実行するためには、まず新しいコンテキストを作成する必要があります。新しいコンテキストを作成するには、New-AzApiManagementContext コマンドを使用します。このコマンドを実行して、リソースグループと API Management サービスの名前を指定します。
$azrContext = New-AzManagementContext -ResourceGroupName $ApiManagementServiceResourceGroup -ServiceName $ApiManagementServiceName
対象となる API の検出
コンテキストオブジェクトを作成したら、次のタスクは、新しいロールを適用するべき API を検出することです。PowerShell でこれを行うには、Get-AzApiManagementApi を使用します。
下のコード例では、名前が $ApiMatchPattern にある文字列と一致するすべての API を検索しています。
$apis = Get-AzureRmApiManagementApi -Context $azrContext).where({ $_.Name -match $ApiMatchPattern })
スコープの設定
ロール定義を作成するには、1つ以上のスコープを設定する必要があります。これらのスコープは、作成時にロール定義に割り当てられます。
上記のコードで返された API の ID を使用し、それぞれのスコープ文字列を作成するコード例は、次のようになります。各変数は、環境に応じて適切な値を入力する必要があります。
$scopes = $apis.ApiId | foreach {
$strFormat = $AzureSubscriptionId,$ApiManagementServiceResourceGroup,$ApiManagementServiceName,$_
'/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.ApiManagement/service/{2}/apis/{3}' -f $strFormat
}
ロールの定義
スコープを作成したら、ロールの定義を行います。例えば、’Read’ ロールの定義は、次のようにコーディングすることができます。
if (-not (Get-AzRoleDefinition -Name $AzureRoleName)) {
Write-Verbose -Message "No role with name [$($AzureRoleName)] found. Creating..."
switch ($APIRights) {
'Read' {
## Use the API Management Service Reader Role as a template
$role = Get-AzRoleDefinition 'API Management Service Reader Role'
$role.Actions.Add('Microsoft.ApiManagement/service/apis/read')
}
default {
throw "Unrecognized input: [$_]"
}
}
$role.Id = $null
$role.Name = $AzureRoleName
$role.Description = $AzureRoleDescription
$role.AssignableScopes.Clear()
$scopes | foreach {
$role.AssignableScopes.Add($_)
}
New-AzRoleDefinition -Role $role
}
ロールの割り当て
最後に、Nw-AzRoleAssignment コマンドレットを使ってロール割り当てを行います。ロール割り当てには、ロールを割り当てるグループの ID (プリンシパル ID) が必要ですが、プリンシパル ID は Get-AzAdGroup コマンドレットで見つけることができます。
プリンシパル IDを取得したら、作成したスコープ文字列ごとにロールを割り当てます。
$principal = Get-AzADGroup -SearchString $PrincipalName
$principalId = $principal.Id.Guid
$scopes | foreach {
New-AzRoleAssignment -ObjectId $principalId -RoleDefinitionName $AzureRoleName -Scope $_
}
ロール割り当てが終了すれば、すべて完了です。
まとめ
このブログでは、PowerShell を使用して Azure ロールを作成し API に割り当てる方法を説明しました。ここで紹介したコードは、Install-Script -Name Grand-AzureApiAccess を実行するとダウンロードできます。
説明に使ったのは、単純な1つのユースケースだけですが、PowerShell を使用して、より複雑なロジックをスクリプトに組み込み、API アクセス許可の割り当てプロセス全体を自動化することもできます。どういった自動化が可能か、API PowerShell コマンドレットを調べてみてください。