如何自動將 AWS RDS 審計日誌導出到 S3 Bucket 實例?
已發表: 2022-03-05在我們學習如何自動將 RDS 審計日誌導出到 S3 之前,您是否知道 AWS CloudWatch 會自動存儲 RDS 數據庫日誌? 是的,它們確實如此,但是它們只存儲您的數據庫實例的常規日誌。 現在,如果您想從日誌中查找特定查詢或數據怎麼辦? 哪個用戶執行了特定查詢或來自哪個 IP 地址? 誰從您的數據庫表中刪除了某些記錄?
此外,不知何故,您設法將 RDS 實例的所有審計日誌導出到 CloudWatch,這很棒。 但是,你知道嗎? CloudWatch 只會將這些日誌保留 30 天!! 要將它們保留更長時間,您需要將 CloudWatch 日誌導出到 S3 存儲桶。 您可以從 CloudWatch 控制面板手動執行此操作。 但是,如果您想為此實現自動化怎麼辦?
本指南將引導您完成自動記錄所有此類事件所需的所有步驟!!
本指南包括:
1) 調整 RDS 設置以將審核日誌發送到 CloudWatch
2) 創建一個 S3 存儲桶(用於存儲 CloudWatch 審計日誌)
3) 創建 IAM 角色(我們將用於 Lambda 自動化)
4) Lambda(自動將 CloudWatch Logs 導出到 S3 的功能)
讓我們開始!
調整 RDS 設置以將審核日誌發送到 CloudWatch
首先,我們需要調整 RDS 以將特定日誌發送到 CloudWatch。 為此,我們將創建一個選項組和一個參數組。
創建選項組
⇒ 訪問您的 Amazon RDS 儀表板。
⇒ 轉到選項組。
⇒ 單擊創建組按鈕。
⇒ 輸入該組的名稱和描述。
⇒ 選擇引擎:mysql 和引擎版本:8.0。 單擊創建。
⇒ 單擊您創建的選項組。
⇒ 在選項部分下,單擊添加選項按鈕。
⇒ 在“SERVER_AUDIT_EVENTS*”選項下,輸入您要審核的值,即 CONNECT、QUERY、QUERY_DDL、QUERY_DML、QUERY_DCL、QUERY_DML_NO_SELECT。 如果您想記錄在您的表上運行的所有查詢,只需在此字段中輸入 QUERY。
⇒ 為立即申請設置“是”。 單擊添加選項。
創建參數組
⇒ 讓我們打開 Amazon RDS 儀表板。
⇒ 單擊參數組。
⇒ 單擊創建參數組按鈕。
⇒ 選擇“參數組族”:mysql8.0
⇒ 選擇“類型”:數據庫參數組
⇒ 輸入組名和描述。 單擊創建。
⇒ 現在,單擊您創建的參數組。
⇒ 在參數下,我們將編輯某些參數並設置以下值:
⇒ 編輯參數:“log_output” ⇒ 將其值從 TABLE 更改為 FILE
⇒ 編輯參數:“slow_query_log” ⇒ 將其值從 BLANK 更改為 1
⇒ 編輯參數:“general_log” ⇒ 將其值從 BLANK 更改為 1
現在,我們都設置好了選項組和參數組。 現在,讓我們將這些組分配給我們的 RDS。
⇒ 轉到您的 RDS 儀表板。
⇒ 單擊您創建的 RDS。
⇒ 單擊修改。
⇒ 向下滾動頁面並轉到“數據庫選項”部分。
⇒ 在“DB 參數組”下,選擇您創建的參數組。
⇒ 在“選項組”下,選擇您創建的選項組。
我們現在都準備好了 RDS。 完成上述步驟後,請等待 20-30 分鐘來填充 CloudWatch 中的數據(注意:可能需要更多時間,具體取決於日誌的大小)。
CloudWatch 收集所有日誌後,您將在 CloudWatch 儀表板下看到審核日誌。 它將如下圖所示:
創建 S3 存儲桶(用於存儲 CloudWatch 審計日誌)
⇒ 轉到 Amazon S3 儀表板。
⇒ 創建一個新的桶。
⇒ 創建存儲桶後,打開它並導航到權限選項卡。
⇒ 我們需要允許 CloudWatch 將對象放入存儲桶(寫入權限)
⇒ 點擊桶策略的編輯按鈕。 輸入以下代碼:
{
“版本”:“2012-10-17”,
“陳述”: [
{
“效果”:“允許”,
“主要的”: {
“服務”:“logs.YOUR-REGION.amazonaws.com” // 即 logs.us-east-1.amazonaws.com
},
“動作”:“s3:GetBucketAcl”,
“資源”:“arn:aws:s3:::BUCKET_NAME_HERE”
},
{
“效果”:“允許”,
“主要的”: {
“服務”:“logs.YOUR-REGION.amazonaws.com”
},
“動作”:“s3:PutObject”,
“資源”:“arn:aws:s3:::BUCKET_NAME_HERE/*”,
“健康)狀況”: {
“字符串相等”:{
“s3:x-amz-acl”:“bucket-owner-full-control”
}
}
}
] }
創建 IAM 角色(我們將其用於 Lambda 自動化)
現在,我們將創建將在 Lambda 函數設置中使用的 IAM 角色。 AWS Lambda 服務將需要記錄事件和寫入我們創建的 S3 存儲桶的權限。
我們將使用“AmazonS3FullAccess”、“CloudWatchLogsFullAccess”和“CloudWatchEventsFullAccess”策略創建 IAM 角色“Export-RDS-CloudWatch-to-S3-Lambda”。
⇒ 打開您的 AWS IAM 儀表板。
⇒ 切換到角色並單擊創建角色按鈕。
⇒ 在“用例”下,選擇 Lambda 並單擊下一步。
⇒ 搜索“AmazonS3FullAccess”並選擇它。
⇒ 搜索“CloudWatchLogsFullAccess”並選擇它。
⇒ 搜索“CloudWatchEventsFullAccess”並選擇它。
⇒ 設置角色名稱:“Export-RDS-CloudWatch-to-S3-Lambda”並點擊創建角色。
Lambda(自動將 CloudWatch Logs 導出到 S3 的功能)
Lambda 函數允許您將代碼放在函數下並在觸發器上運行它。 您不需要為此設置任何服務器或設置。 非常簡單高效!
⇒ 切換到 AWS Lambda 儀表板。
⇒ 單擊函數,然後單擊創建函數按鈕。
⇒ 選擇“草稿作者”。
⇒ 設置“函數名稱”:Export-RDS-CloudWatch-Logs-To-S3
⇒ 在“運行時”下,選擇 Python 3.x。
⇒ 在“權限”下,選擇“使用現有角色”並選擇我們在上一步中創建的 IAM 角色。
⇒ 單擊創建函數並導航到代碼視圖並輸入以下腳本:
導入 boto3
導入操作系統
導入日期時間GROUP_NAME = os.environ['GROUP_NAME'] DESTINATION_BUCKET = os.environ['DESTINATION_BUCKET'] PREFIX = os.environ['PREFIX'] NDAYS = os.environ['NDAYS'] nDays = int(NDAYS)
currentTime = datetime.datetime.now()
StartDate = currentTime – datetime.timedelta(days=nDays)
EndDate = currentTime – datetime.timedelta(days=nDays – 1)fromDate = int(StartDate.timestamp() * 1000)
toDate = int(EndDate.timestamp() * 1000)BUCKET_PREFIX = os.path.join(PREFIX, StartDate.strftime('%Y{0}%m{0}%d').format(os.path.sep))
def lambda_handler(事件,上下文):
client = boto3.client('logs')
client.create_export_task(
logGroupName=GROUP_NAME,
從時間=從日期,
to=toDate,
目的地=DESTINATION_BUCKET,
目的地前綴=BUCKET_PREFIX
)
⇒ 現在,點擊配置⇒ 環境變量。
⇒ 我們需要創建 4 個變量:
⇒ DESTINATION_BUCKET:<您的 S3 存儲桶的名稱>
⇒ GROUP_NAME:<您要導出的日誌組名>
⇒ NDAYS:1
⇒ 前綴:導出日誌
⇒ 好的,你已經準備好了。 保存函數。
現在,讓我們設置自動化來運行這個 lambda 函數。
⇒ 現在,訪問您的 CloudWatch 儀表板。
⇒ 前往活動 ⇒ 規則。
⇒ 單擊創建規則。
⇒ 在事件源下,選擇計劃。
⇒ 設置固定速率或 cron 表達式來自動運行我們的 lambda 函數。
⇒ 在目標下,選擇 Lambda 函數。
⇒ 在函數下,選擇我們在上一步中創建的函數。
這是所有的了。 現在,您已經設置了一個自動將 RDS 日誌導出到 S3 的環境。 您可以根據需要保留日誌。 但是,如果您仍然遇到任何問題,請隨時在此處發表評論。 我們很想听到您的聲音!!