🗒️

クライアント認証でAzure Functionsに接続する

2024/10/26に公開

これらの記事の一部です。

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