如何在 Azure 中存储审计数据

How to store audit data in Azure

我们正处于在现有 Web 应用程序中构建审计跟踪的设计阶段。该应用程序在 Windows Azure 上运行并使用 SQL Azure 数据库。

审核日志必须按用户或对象类型过滤(例如显示用户的所有操作,或显示对对象执行的所有操作)。

我们必须选择如何存储数据,我们应该使用 SQL Azure,还是应该使用 table 存储?我们更喜欢 table 存储(更便宜​​)..

然而'problem'和table存储是如何定义分区键的。我们的 SQL 数据库中有数千名客户(应用程序用户),每个客户都在自己的租户中。使用租户ID作为分区键不够具体,所以我们必须在分区键中添加一些东西。那么问题来了:根据过滤的需求,我们可以在partition key中添加一个用户ID,方便按用户过滤,也可以添加一个对象ID,方便按对象过滤。

所以我们看到两种可能的解决方案:
- 使用 SQL Azure 而不是 table 存储
- 使用 table 存储并使用两个具有不同分区键的 table,这意味着我们复制所有条目

有什么想法最适合我们的情况吗?还有其他更好的解决方案吗?

Azure 上的 DocumentDB 可能值得考虑。 https://azure.microsoft.com/en-us/documentation/articles/documentdb-use-cases/ 您可以将审计跟踪作为 JSON 文档存储在 DocDB 中(用户、activity、对象字段并且可以在所有字段上建立索引)

Azure Table Storage 适合存储日志数据。由于 Azure 应用服务使用 Azure Table 存储来存储诊断日志。

在想你可以考虑将PartitionKey设置为用户的租户名称,RowKey是用户的ID。根据Table Storage Data Model,我们只需要保留:

Together the PartitionKey and RowKey uniquely identify every entity within a table

或者,您可以澄清您对以下问题的担忧:

Using the tenant ID as partition key is not specific enough, so we have to add something to the partition key

此外,您可以参考 https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#overview 了解有关设计 Azure Table 存储的更多信息。

任何更新,请随时告诉我。

如果您担心以多种方式进行过滤 - 您总是可以将相同的数据写入多个分区。它真的很好用。例如,在我们的应用程序中,我们有员工和客户。当我们想要 track/trace 的互动适用于他们(可能是 phone 购买)时,我们将向我们的审计写入相同的信息(通常为 json) tables.

{
     PurchaseId: 9485,
     CustomerId: 138,
     StaffId: 509,
     ProductId: 707958,
     Quantity: 20
     Price: 31.99,
     Date: '2017-08-15 15:48:39'
 }

我们会将同一行写入以下分区:Product_707958Customer_138Staff_509。每个分区中的三行的行键相同:Purchase_9485。现在,如果我想去查询给定员工、客户或物品发生的所有事情,我只需获取整个分区。存储非常便宜,所以谁在乎你是否将它写入多个位置?

此外,考虑到您有多个租户,给您一个想法 - 您可以将 table 命名为 Tenant_[SomeId]。您可能还需要处理其他一些问题,但从某种意义上说,这是获取无模式数据的另一个关键。