こんにちは、上坂(@takashiuesaka)です。
今回は前回の続きです。
前回はEventHubsが認証済みデバイスからだけイベントデータを受け付けるようにするために、PublisherとSASTokenの使い方を説明をしました。
そのためには共有アクセスポリシーのキーをデバイスに渡すのではなく、あらかじめ生成済みのTokenをデバイスに渡すのが良いやり方である、という説明もしましたが、このTokenが不本意にも盗まれてしまって変なイベントが飛んでくるようになってしまった場合はどうしたら良いでしょうか。
こんな時のために、Publisher/<PUBLISHER_NAME>の単位でエンドポイントを無効にすることができます。
コードは次の通りです。
var serviceNamespace = "<SERVICE_NAMESPACE>"; | |
var eventHubsName = "<EVENTHUBS_NAME>"; | |
var deviceName = "myDevice"; | |
// 管理権限を持つ共有アクセスポリシー | |
var sharedAccessPolicyName = "<NAME>"; | |
var sharedAccessPolicyKey = "<KEY>"; | |
// メタデータの取得 | |
var manageTokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sharedAccessPolicyName, sharedAccessPolicyKey); | |
var timeSpan = TimeSpan.FromHours(1); | |
var retryPolicy = new Microsoft.ServiceBus.RetryExponential(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(60), 5); | |
var nmSettings = new NamespaceManagerSettings() { OperationTimeout = timeSpan, RetryPolicy = retryPolicy, TokenProvider = manageTokenProvider }; | |
var manager = new Microsoft.ServiceBus.NamespaceManager(ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, ""), nmSettings); | |
var revoked = manager.RevokePublisher(eventHubsName, deviceName); |
無効にしたエンドポイントに対してイベントを送信すると、エラーになります。
無効にしたエンドポイントは再度有効にすることもできます。
manager.RestorePublisher(eventHubsName, deviceName); // 既にRestore済みでも、エラーにならない |
このようにして、EventHubsはセキュリティを担保することができました。
さて、最後についでなんですが、どのデバイスから送信されたのかを判別する方法ですが、前回のコードを見ていただくとわかる通り、PartitionKeyにデバイス名をセットしています。
data.PartitionKey = deviceName;
受信時にPartitionKeyを取得することができますので、これを用いてデバイスを特定することが可能です。イベントデータ内にデバイス名やIdを入れることももちろんできますが、もっとお手軽なのでお勧めです。