🗒️
クライアント認証でAzure Functionsに接続する
これらの記事の一部です。
- クライアント認証でAzure Functionsに接続する
- Azure Functionsクライアント認証の認可コード(自己署名編)
- Azure Functionsクライアント認証の認可コード(自己CA署名編)
IoTデバイスでAzureに繋ぐ方法といえばAzure IoT Hubが鉄板ですが、デバイス数が少ないときはちょっと大げさな感じがします。デバイス数が少なくて、コード介在したいときはHTTP TriggerなAzure Functionsを用意し、IoTデバイスからHTTP投げる構成にしています。C#で良い感じにデータ加工できるのでうれしいです。
ただ、認証が悩ましい、、、。URLを長い名前にしておくだけでは、ちょっと不安です。
そこで、今回はAzure Functionsのクライアント認証を試してみたいと思います。
アーキテクチャ
それほど大げさなものではありません。
IoTデバイスとAzure Functionsの接続に使う、TLSの相互認証(Mutal Authentication)を使います。相互TLS認証とかmTLS、クライアント認証などと言われます。
IoTデバイスは、
- クライアント証明書
- クライアント秘密鍵
を持つ必要があります。
お試し
1. クライアント証明書とクライアント秘密鍵を生成
opensslで、クライアント秘密鍵を生成してから、クライアント証明書(自己署名)を作ります。
openssl genrsa 2048 > client.key
openssl req -new -key client.key > client.csr
openssl x509 -req -days 365 -signkey client.key < client.csr > client.crt
2. Azure Functionsを作成
これを参考に、Visual StudioでAzure Functionsプロジェクトを作成して、下記Functionを用意、Azureへ発行します。
やっていることは、、、HTTPヘッダーに含まれるX-ARR-ClientCertをログに出力しています。
using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
using System.Runtime.ConstrainedExecution;
using System.Security.Policy;
namespace FunctionApp1
{
public class HttpExample
{
private readonly ILogger<HttpExample> _logger;
public HttpExample(ILogger<HttpExample> logger)
{
_logger = logger;
}
[Function("HttpExample")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
{
foreach (var item in req.Headers)
{
if (item.Key.StartsWith("X-ARR-ClientCert"))
{
_logger.LogInformation($"{item.Key}={item.Value}");
}
}
return new OkObjectResult("Welcome to Azure Functions!");
}
}
}
3. クライアント証明書モードを変更
Function AppのSettings > ConfigurationにあるGeneral settings画面の、Client certificate modeをRequireに変更します。←ここがポイント!
4. curlでアクセス
クライアント認証でAzure Functionsにアクセスします。
curl--key./ client.key--cert./ client.crt https://functionapp000000000000000.azurewebsites.net/api/HttpExample
すると、ログにクライアント証明書が出力されるのが確認できます。
まとめ
- Azure Functionsは、クライアント認証できる。
- 設定箇所は、Function AppのClient certificate mode。
- 認可にあたる部分はAzure Functionsには無いので、自コードで実装しなければいけない。(クライアント証明書がHTTPヘッダーのX-ARR-ClientCertで受け取れるので。)
Discussion