在 Amazon OpenSearch Service 中監控稽核日誌 - Amazon OpenSearch Service

在 Amazon OpenSearch Service 中監控稽核日誌

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

就像 OpenSearch 應用程式日誌和慢速日誌一樣,OpenSearch Service 會將稽核日誌發佈到 CloudWatch Logs。如果已啟用,則套用標準 CloudWatch 定價

注意

若要啟用稽核日誌,您的使用者角色必須映射至 security_manager 角色,讓您可以存取 OpenSearch plugins/_security REST API。如需進一步了解,請參閱 修改主要使用者

限制

稽核日誌具有下列限制:

  • 稽核日誌不包含被目的地網域存取政策拒絕的跨叢集搜尋請求。

  • 每個稽核日誌訊息的大小上限為 10,000 個字元。如果稽核日誌訊息超過此限制,就會被截斷。

啟用稽核日誌

啟用稽核日誌分為兩個步驟。首先,您必須設定網域,以便使用主控台、AWS CLI 或組態 API,將稽核日誌發佈到 CloudWatch Logs。然後,您可以使用 OpenSearch Dashboards 或精細存取控制 REST API 來調整稽核日誌設定。

重要

如果您在執行這些步驟時遇到錯誤,請參閱無法啟用稽核日誌,瞭解故障診斷資訊。

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

  1. 選擇網域並前往 Logs (日誌) 標籤。

  2. 選取 Audit logs (稽核日誌),然後選取 Enable (啟用)。

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

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com" }, "Action": [ "logs:PutLogEvents", "logs:PutLogEventsBatch", "logs:CreateLogStream" ], "Resource": "cw_log_group_arn" } ] }

    建議您新增 aws:SourceAccountaws:SourceArn 條件金鑰至政策,保護自己免受混淆代理人問題的困擾。來源帳戶是網域的擁有者,且來源 ARN 是網域 ARN。您的網域必須位於服務軟體 R20211203 或更高版本上,才能新增這些條件金鑰。

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

    "Condition": { "StringEquals": { "aws:SourceAccount": "account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:es:region:account-id:domain/domain-name" } }
  5. 選擇 Enable (啟用)

CLI 命令範例

下面的 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 命令參考

組態 API 請求範例

下面對組態 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|false } } }

如需詳細資訊,請參閱 Amazon OpenSearch Service 的組態 API 參考

在 OpenSearch Dashboards 中設定稽核日誌

啟用稽核日誌之後,請設定它們以符合您的需求。

  1. 開啟 OpenSearch Dashboards,然後選擇 Security (安全性)。

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

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

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

稽核日誌層和類別

叢集通訊發生在兩個不同的:REST 層和傳輸層。

  • REST 層涵蓋與 HTTP 用戶端的通訊,例如 curl、Logstash、OpenSearch Dashboards、Java 高階 REST 用戶端、Python 請求程式庫 — 到達叢集的所有 HTTP 請求。

  • 傳輸層涵蓋節點之間的通訊。例如,搜尋請求到達叢集之後 (透過 REST 層),服務該請求的協調節點會將查詢傳送至其他節點、接收其回應、收集必要的文件,並將它們整理成最終回應。諸如碎片配置和重新平衡等操作也會發生在傳輸層。

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

類別 描述 適用於 REST 適用於傳輸

FAILED_LOGIN

請求包含無效憑證,且身分驗證失敗。

MISSING_PRIVILEGES

使用者沒有提出請求的權限。

GRANTED_PRIVILEGES

使用者擁有提出請求的權限。

OPENSEARCH_SECURITY_INDEX_ATTEMPT

請求嘗試修改 .opendistro_security 索引。

AUTHENTICATED

請求包含有效憑證,且身分驗證成功。

INDEX_EVENT

請求對索引執行系統管理操作,例如建立索引、設定別名或執行強制合併。如需此類別包含的 indices:admin/ 動作的完整清單,請參閱 OpenSearch 文件

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

類別 描述

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 (文件寫入到索引)

稽核日誌設定

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

一般設定

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

名稱 後端設定 描述

REST 層

enable_rest

啟用或停用 REST 層上發生的事件。

REST 已停用類別

disabled_rest_categories

指定要在 REST 層上忽略的稽核類別。修改這些類別會大幅增加稽核日誌的大小。

傳輸層

enable_transport

啟用或停用傳輸層上發生的事件。

傳輸已停用類別

disabled_transport_categories

指定必須在傳輸層上忽略的稽核類別。修改這些類別會大幅增加稽核日誌的大小。

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

名稱 後端設定 描述

批量請求

resolve_bulk_requests

啟用此設定會為批量請求中的每個文件產生日誌,這會大幅增加稽核日誌的大小。

請求內文

log_request_body

包含請求的要求主體。

解析索引

resolve_indices

將別名解析為索引。

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

名稱 後端設定 描述

已忽略的使用者

ignore_users

指定想要排除的使用者。

已忽略的請求

ignore_requests

指定想要排除的請求模式。

合規設定

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

名稱 後端設定 描述

合規日誌

enable_compliance

啟用或停用合規日誌。

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

名稱 後端設定 描述

內部組態日誌

internal_config

啟用或停用 .opendistro_security 索引上的事件日誌。

外部組態日誌

external_config 啟用或停用外部組態事件的日誌。

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

名稱 後端設定 描述

讀取中繼資料

read_metadata_only

僅包含讀取事件的中繼資料。不包含任何文件欄位。

已忽略的使用者

read_ignore_users

請勿針對讀取事件包含特定使用者。

監視的欄位

read_watched_fields

指定針對讀取事件而監視的索引和欄位。新增監視的欄位會依據每個文件存取產生一個日誌,這會大幅增加稽核日誌的大小。監視的欄位支援索引模式和欄位模式:

{ "index-name-pattern": [ "field-name-pattern" ], "logs*": [ "message" ], "twitter": [ "id", "user*" ] }

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

名稱 後端設定 描述

寫入中繼資料

write_metadata_only

僅包含寫入事件的中繼資料。不包含任何文件欄位。

日誌差異

write_log_diffs

如果 write_metadata_only 為 false,則只包括寫入事件之間的差異。

已忽略的使用者

write_ignore_users

不包括寫入事件的特定使用者。

監視指數

write_watched_indices

指定針對寫入事件而監視的索引或索引模式。新增監視的欄位會依據每個文件存取產生一個日誌,這會大幅增加稽核日誌的大小。

稽核日誌範例

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

步驟 1:設定稽核日誌

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

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

  2. Compliance Settings (合規設定) 中,選擇 Configure (設定)。

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

  4. Read (讀取) 下面的 Watched Fields (監視欄位) 中,新增 accounts 索引的 ssnid- 欄位:

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

步驟 2:執行讀取和寫入事件

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

    PUT accounts/_doc/0 { "ssn": "123", "id-": "456" }
  2. 若要測試讀取事件,請傳送下列請求:

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

步驟 3:觀察日誌

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

  2. 在導覽窗格中,選擇 Log groups (日誌群組)。

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

  4. Log streams (日誌串流) 中,選擇 Search all (搜尋全部)。

  5. 如需讀取和寫入事件,請參閱對應的日誌。在日誌出現之前,預計會有 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 (已忽略的使用者)。

如需每個稽核日誌欄位的說明,請參閱稽核日誌欄位參考。如需搜尋和分析稽核日誌資料的相關資訊,請參閱 Amazon CloudWatch Logs 使用者指南中的使用 CloudWatch Logs Insights 分析日誌資料

使用 REST API 設定稽核日誌

我們建議您使用 OpenSearch Dashboards 來設定稽核日誌,但您也可以使用精細存取控制 REST API。本節包含請求範例。如需 REST API 的完整文件,請參閱 OpenSearch 文件

PUT _plugins/_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" ] } }