

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon OpenSearch Service 中監控稽核日誌
<a name="audit-logs"></a>

如果您的 Amazon OpenSearch Service 網域使用精細存取控制，則您可以針對資料啟用稽核日誌。稽核日誌高度可自訂，可讓您追蹤 OpenSearch 叢集上的使用者活動，包括身分驗證成功與失敗、對 OpenSearch 的請求、索引變更以及傳入的搜尋查詢。預設設定會追蹤一組常用的使用者動作，但我們建議您根據您的確切需求量身打造設定。

就像 [OpenSearch 應用程式日誌和慢速日誌](createdomain-configure-slow-logs.md)一樣，OpenSearch Service 會將稽核日誌發佈到 CloudWatch Logs。如果已啟用，則套用[標準 CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

**注意**  
若要啟用稽核日誌，您的使用者角色必須映射至 `security_manager` 角色，讓您可以存取 OpenSearch `plugins/_security` REST API。如需詳細資訊，請參閱 [修改主要使用者](fgac.md#fgac-forget)。

**Topics**
+ [限制](#audit-logs-limitations)
+ [啟用稽核日誌](#audit-log-enabling)
+ [使用 啟用稽核記錄 AWS CLI](#audit-log-enabling-cli)
+ [使用組態 API 啟用稽核日誌記錄](#audit-log-enabling-api)
+ [稽核日誌層和類別](#audit-log-layers)
+ [稽核日誌設定](#audit-log-settings)
+ [稽核日誌範例](#audit-log-example)
+ [使用 REST API 設定稽核日誌](#audit-log-rest-api)

## 限制
<a name="audit-logs-limitations"></a>

稽核日誌具有下列限制：
+ 稽核日誌不包含被目的地網域存取政策拒絕的跨叢集搜尋請求。
+ 每個稽核日誌訊息的大小上限為 10,000 個字元。如果稽核日誌訊息超過此限制，就會被截斷。

## 啟用稽核日誌
<a name="audit-log-enabling"></a>

啟用稽核日誌分為兩個步驟。首先，您要設定網域，以便將稽核日誌發佈到 CloudWatch Logs。然後，您可以在 OpenSearch Dashboards 中啟用稽核日誌，並進行設定以符合您的需求。

**重要**  
如果您在執行這些步驟時遇到錯誤，請參閱[無法啟用稽核日誌](handling-errors.md#troubleshooting-audit-logs-error)，瞭解故障診斷資訊。

### 步驟 1：啟用稽核日誌並設定存取政策
<a name="audit-log-enable"></a>

以下步驟說明如何使用主控台啟用稽核日誌。您也可以[使用 或 OpenSearch Service API 來啟用它們 AWS CLI](#audit-log-enabling-cli)。 [OpenSearch ](#audit-log-enabling-api)

**啟用 OpenSearch Service 網域的稽核日誌 (主控台)**

1. 選擇要打開其組態的網域，然後前往 **Logs** (日誌) 索引標籤。

1. 選取 **Audit logs** (稽核日誌)，然後選取 **Enable** (啟用)。

1. 建立 CloudWatch 日誌群組或選擇現有的日誌群組。

1. 選擇包含適當許可權的存取政策，或使用主控台提供的 JSON 建立政策：

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "es.amazonaws.com"
         },
         "Action": [
           "logs:PutLogEvents",
           "logs:CreateLogStream"
         ],
         "Resource": "arn:aws:logs:{{us-east-1}}:{{111122223333}}:log-group:/aws/opensearch/domains/domain-name/*"
       }
     ]
   }
   ```

------

   建議您新增 `aws:SourceAccount` 和 `aws:SourceArn` 條件索引鍵至政策，保護自己免受[混淆代理人問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)的困擾。來源帳戶是網域的擁有者，且來源 ARN 是網域 ARN。您的網域必須位於服務軟體 R20211203 或更新版本上，才能新增這些條件索引鍵。

   例如，您可以將下列條件區塊新增至政策：

   ```
   "Condition": {
       "StringEquals": {
           "aws:SourceAccount": "{{account-id}}"
       },
       "ArnLike": {
           "aws:SourceArn": "arn:aws:es:{{region}}:{{account-id}}:domain/{{domain-name}}"
       }
   }
   ```

1. 選擇**啟用**。

### 步驟 2：開啟 OpenSearch Dashboards 中的稽核日誌
<a name="audit-log-dashboards-ui"></a>

在於 OpenSearch Service 主控台中啟用稽核日誌之後，也*必須*在 OpenSearch Dashboards 中啟用稽核日誌，並進行設定以符合您的需求。

1. 打開 OpenSearch Dashboards，在左側選單中選擇 **Security** (安全性)。

1. 選擇 **Audit logs** (稽核日誌)。

1. 選擇 **Enable audit logging** (啟用稽核日誌)。

Dashboards UI 在 **General settings** (一般設定) 和 **Compliance settings** (合規設定) 下提供稽核日誌設定的完整控制。如需所有組態選項的說明，請參閱[稽核日誌設定](#audit-log-settings)。

## 使用 啟用稽核記錄 AWS CLI
<a name="audit-log-enabling-cli"></a>

下列 AWS CLI 命令會在現有網域上啟用稽核日誌：

```
aws opensearch update-domain-config --domain-name {{my-domain}} --log-publishing-options "AUDIT_LOGS={CloudWatchLogsLogGroupArn={{arn:aws:logs:us-east-1:123456789012:log-group:my-log-group}},Enabled=true}"
```

您也可以在建立網域時啟用稽核日誌。如需詳細資訊，請參閱 [AWS CLI 命令參考](https://docs.aws.amazon.com/cli/latest/reference/)。

## 使用組態 API 啟用稽核日誌記錄
<a name="audit-log-enabling-api"></a>

下面對組態 API 的請求會啟用現有網域上的稽核日誌：

```
POST https://es.us-east-1.amazonaws.com/2021-01-01/opensearch/domain/{{my-domain}}/config
{
  "LogPublishingOptions": {
    "AUDIT_LOGS": {
      "CloudWatchLogsLogGroupArn":"arn:aws:logs:{{us-east-1}}:{{123456789012}}:log-group1:sample-domain",
      "Enabled":true
    }
  }
}
```

如需詳細資訊，請參閱《[Amazon OpenSearch Service API 參考](https://docs.aws.amazon.com/opensearch-service/latest/APIReference/API_LogPublishingOption.html)》。

## 稽核日誌層和類別
<a name="audit-log-layers"></a>

叢集通訊發生在兩個不同的*層*：REST 層和傳輸層。
+ REST layer 涵蓋與 HTTP 用戶端的通訊，例如 curl、Logstash、OpenSearch Dashboards、Java 高階 REST 用戶端、Python [Requests](https://2.python-requests.org/) 程式庫，所有到達叢集的 HTTP 請求。
+ 傳輸層涵蓋節點之間的通訊。例如，搜尋請求到達叢集之後 (透過 REST 層)，服務該請求的協調節點會將查詢傳送至其他節點、接收其回應、收集必要的文件，並將它們整理成最終回應。諸如碎片配置和重新平衡等操作也會發生在傳輸層。

您可以啟用或停用整個層的稽核日誌，以及某層的個別稽核類別。下表包含稽核類別及其可用層的摘要。


| 類別 | 描述 | 適用於 REST | 適用於傳輸 | 
| --- | --- | --- | --- | 
|  FAILED\_LOGIN  | 請求包含無效憑證，且身分驗證失敗。 | 是 | 是 | 
|  MISSING\_PRIVILEGES  | 使用者沒有提出請求的權限。 | 是 | 是 | 
|  GRANTED\_PRIVILEGES  | 使用者擁有提出請求的權限。 | 是 | 是 | 
|  OPENSEARCH\_SECURITY\_INDEX\_ATTEMPT  | 請求嘗試修改 .opendistro\_security 索引。 | 否 | 是 | 
|  AUTHENTICATED  | 請求包含有效憑證，且身分驗證成功。 | 是 | 是 | 
|  INDEX\_EVENT  | 請求對索引執行系統管理操作，例如建立索引、設定別名或執行強制合併。如需此類別包含的 indices:admin/ 動作的完整清單，請參閱 [OpenSearch 文件](https://docs.opensearch.org/latest/security-plugin/access-control/permissions/)。 | 否 | 是 | 

除了這些標準類別之外，精細存取控制還提供數個額外的類別，專為符合資料合規要求而設計。


| 類別 | 描述 | 
| --- | --- | 
|  COMPLIANCE\_DOC\_READ  | 請求對索引中的文件執行讀取事件。 | 
|  COMPLIANCE\_DOC\_WRITE  | 請求對索引中的文件執行寫入事件。 | 
|  COMPLIANCE\_INTERNAL\_CONFIG\_READ  |  請求對 `.opendistro_security` 索引執行讀取事件。  | 
|  COMPLIANCE\_INTERNAL\_CONFIG\_WRITE  | 請求對 `.opendistro_security` 索引執行寫入事件。 | 

您可擁有類別和訊息屬性的任意組合。例如，如果您傳送 REST 請求以索引文件，您可能會在稽核日誌中看到下列幾行：
+ REST 層上的 AUTHENTICATED (身分驗證)
+ 傳輸層上的 GRANTED\_PRIVILEGE (授權)
+ COMPLIANCE\_DOC\_WRITE (文件寫入到索引)

## 稽核日誌設定
<a name="audit-log-settings"></a>

稽核日誌有許多組態選項。

### 一般設定
<a name="audit-logs-general-settings"></a>

使用一般設定可啟用或停用個別類別或整個層。我們強烈建議您將 GRANTED\_PRIVILEGES 和 AUTHENTICATED 保留為排除類別。否則，會針對每個有效請求將這些類別記錄至叢集。


| 名稱 | 後端設定 | Description | 
| --- | --- | --- | 
|  REST 層  |  enable\_rest  |  啟用或停用 REST 層上發生的事件。  | 
|  REST 已停用類別  |  disabled\_rest\_categories  |  指定要在 REST 層上忽略的稽核類別。修改這些類別會大幅增加稽核日誌的大小。  | 
|  傳輸層  |  enable\_transport  |  啟用或停用傳輸層上發生的事件。  | 
|  傳輸已停用類別  |  disabled\_transport\_categories  |  指定必須在傳輸層上忽略的稽核類別。修改這些類別會大幅增加稽核日誌的大小。  | 

使用屬性設定可自訂每個日誌行中的詳細資訊量。


| 名稱 | 後端設定 | Description | 
| --- | --- | --- | 
|  批量請求  |  resolve\_bulk\_requests  |  啟用此設定會為批量請求中的每個文件產生日誌，這會大幅增加稽核日誌的大小。  | 
|  請求內文  |  log\_request\_body  |  包含請求的要求主體。  | 
|  解析索引  |  resolve\_indices  |  將別名解析為索引。  | 

使用忽略設定來排除一組使用者或 API 路徑：


| 名稱 | 後端設定 | Description | 
| --- | --- | --- | 
|  已忽略的使用者  |  ignore\_users  |  指定想要排除的使用者。  | 
|  已忽略的請求  |  ignore\_requests  |  指定想要排除的請求模式。  | 

### 合規設定
<a name="audit-logs-compliance-settings"></a>

使用合規設定可針對索引、文件或欄位級存取進行調整。


| 名稱 | 後端設定 | Description | 
| --- | --- | --- | 
|  合規日誌  |  enable\_compliance  |  啟用或停用合規日誌。  | 

您可以針對讀取和寫入事件日誌指定下列設定。


| 名稱 | 後端設定 | Description | 
| --- | --- | --- | 
|  內部組態日誌  |  internal\_config  |  啟用或停用 `.opendistro_security` 索引上的事件日誌。  | 

您可以針對讀取事件指定下列設定。


| 名稱 | 後端設定 | Description | 
| --- | --- | --- | 
|  讀取中繼資料  |  read\_metadata\_only  |  僅包含讀取事件的中繼資料。不包含任何文件欄位。  | 
|  已忽略的使用者  |  read\_ignore\_users  |  請勿針對讀取事件包含特定使用者。  | 
|  監視的欄位  |  read\_watched\_fields  |  指定針對讀取事件而監視的索引和欄位。新增監視的欄位會依據每個文件存取產生一個日誌，這會大幅增加稽核日誌的大小。監視的欄位支援索引模式和欄位模式： <pre>{<br />  "index-name-pattern": [<br />    "field-name-pattern"<br />  ],<br />  "logs*": [<br />    "message"<br />  ],<br />  "twitter": [<br />    "id",<br />    "user*"<br />  ]<br />}</pre>  | 

您可以針對寫入事件指定下列設定。


| 名稱 | 後端設定 | Description | 
| --- | --- | --- | 
|  寫入中繼資料  |  write\_metadata\_only  |  僅包含寫入事件的中繼資料。不包含任何文件欄位。  | 
|  日誌差異  |  write\_log\_diffs  |  如果 write\_metadata\_only 為 false，則只包括寫入事件之間的差異。  | 
|  已忽略的使用者  |  write\_ignore\_users  |  不包括寫入事件的特定使用者。  | 
|  監視指數  |  write\_watched\_indices  |  指定針對寫入事件而監視的索引或索引模式。新增監視的欄位會依據每個文件存取產生一個日誌，這會大幅增加稽核日誌的大小。  | 

## 稽核日誌範例
<a name="audit-log-example"></a>

本節包含索引的所有讀取和寫入事件的範例組態、搜尋請求以及產生的稽核日誌。

### 步驟 1：設定稽核日誌
<a name="audit-log-example-step1"></a>

啟用稽核日誌發佈至 CloudWatch Logs 群組之後，導覽至 OpenSearch Dashboards 稽核日誌頁面，然後選擇 **Enable audit logging** (啟用稽核日誌)。

1. 在 **General Settings** (一般設定) 中，選擇 **Configure** (設定)，並確保 **REST layer** (REST 層) 已啟用。

1. 在 **Compliance Settings** (合規設定) 中，選擇 **Configure** (設定)。

1. 在 **Write** (寫入) 下面的 **Watched Fields** (監視欄位) 中，將所有寫入事件的 `accounts` 新增至此索引。

1. 在 **Read** (讀取) 下面的 **Watched Fields** (監視欄位) 中，新增 `accounts` 索引的 `ssn` 和 `id-` 欄位：

   ```
   {
     "accounts-": [
       "ssn",
       "id-"
     ]
   }
   ```

### 步驟 2：執行讀取和寫入事件
<a name="audit-log-example-step2"></a>

1. 導覽至 OpenSearch Dashboards，選擇 **Dev Tools** (開發工具)，並索引範例文件：

   ```
   PUT accounts/_doc/0
   {
     "ssn": "123",
     "id-": "456"
   }
   ```

1. 若要測試讀取事件，請傳送下列請求：

   ```
   GET accounts/_search
   {
     "query": {
       "match_all": {}
     }
   }
   ```

### 步驟 3：觀察日誌
<a name="audit-log-example-step2"></a>

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇 **Log groups** (日誌群組)。

1. 選擇您在啟用稽核日誌時指定的日誌群組。在日誌群組中，OpenSearch Service 會為網域中的每個節點建立日誌串流。

1. 在 **Log streams** (日誌串流) 中，選擇 **Search all** (搜尋全部)。

1. 如需讀取和寫入事件，請參閱對應的日誌。在日誌出現之前，預計會有 5 秒延遲。

   **寫入稽核日誌範例** 

   ```
   {
     "audit_compliance_operation": "CREATE",
     "audit_cluster_name": "824471164578:audit-test",
     "audit_node_name": "be217225a0b77c2bd76147d3ed3ff83c",
     "audit_category": "COMPLIANCE_DOC_WRITE",
     "audit_request_origin": "REST",
     "audit_compliance_doc_version": 1,
     "audit_node_id": "3xNJhm4XS_yTzEgDWcGRjA",
     "@timestamp": "2020-08-23T05:28:02.285+00:00",
     "audit_format_version": 4,
     "audit_request_remote_address": "3.236.145.227",
     "audit_trace_doc_id": "lxnJGXQBqZSlDB91r_uZ",
     "audit_request_effective_user": "admin",
     "audit_trace_shard_id": 8,
     "audit_trace_indices": [
       "accounts"
     ],
     "audit_trace_resolved_indices": [
       "accounts"
     ]
   }
   ```

    **讀取稽核日誌範例** 

   ```
   {
     "audit_cluster_name": "824471164578:audit-docs",
     "audit_node_name": "806f6050cb45437e2401b07534a1452f",
     "audit_category": "COMPLIANCE_DOC_READ",
     "audit_request_origin": "REST",
     "audit_node_id": "saSevm9ASte0-pjAtYi2UA",
     "@timestamp": "2020-08-31T17:57:05.015+00:00",
     "audit_format_version": 4,
     "audit_request_remote_address": "54.240.197.228",
     "audit_trace_doc_id": "config:7.7.0",
     "audit_request_effective_user": "admin",
     "audit_trace_shard_id": 0,
     "audit_trace_indices": [
       "accounts"
     ],
     "audit_trace_resolved_indices": [
       "accounts"
     ]
   }
   ```

若要包含要求主體，請回到 OpenSearch Dashboards 的 **Compliance settings** (合規設定)，然後停用 **Write metadata** (寫入中繼資料)。若要排除特定使用者的事件，請將使用者新增至 **Ignored Users** (已忽略的使用者)。

如需每個稽核日誌欄位的說明，請參閱[稽核日誌欄位參考](https://docs.opensearch.org/latest/security-plugin/audit-logs/field-reference/)。如需搜尋和分析稽核日誌資料的相關資訊，請參閱 *Amazon CloudWatch Logs 使用者指南*中的[使用 CloudWatch Logs Insights 分析日誌資料](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)。

## 使用 REST API 設定稽核日誌
<a name="audit-log-rest-api"></a>

我們建議您使用 OpenSearch Dashboards 來設定稽核日誌，但您也可以使用精細存取控制 REST API。本節包含請求範例。如需 REST API 的完整文件，請參閱 [OpenSearch 文件](https://opensearch.org/docs/latest/security/access-control/api/#audit-logs)。

```
PUT _opendistro/_security/api/audit/config
{
  "enabled": true,
  "audit": {
    "enable_rest": true,
    "disabled_rest_categories": [
      "GRANTED_PRIVILEGES",
      "AUTHENTICATED"
    ],
    "enable_transport": true,
    "disabled_transport_categories": [
      "GRANTED_PRIVILEGES",
      "AUTHENTICATED"
    ],
    "resolve_bulk_requests": true,
    "log_request_body": true,
    "resolve_indices": true,
    "exclude_sensitive_headers": true,
    "ignore_users": [
      "kibanaserver"
    ],
    "ignore_requests": [
      "SearchRequest",
      "indices:data/read/*",
      "/_cluster/health"
    ]
  },
  "compliance": {
    "enabled": true,
    "internal_config": true,
    "external_config": false,
    "read_metadata_only": true,
    "read_watched_fields": {
      "read-index-1": [
        "field-1",
        "field-2"
      ],
      "read-index-2": [
        "field-3"
      ]
    },
    "read_ignore_users": [
      "read-ignore-1"
    ],
    "write_metadata_only": true,
    "write_log_diffs": false,
    "write_watched_indices": [
      "write-index-1",
      "write-index-2",
      "log-*",
      "*"
    ],
    "write_ignore_users": [
      "write-ignore-1"
    ]
  }
}
```