使用 aws cloudtrail lookup-events 指令搜尋事件
aws cli : 2.2.4因為工作上的需求, 可能需要定時去查詢或是紀錄特定事件
例如 RDS 上面密碼變更的行為, 但是因為 CloudTrail 預設只保留 90 天的 log
如果不想要將相關 log 轉到 S3 或是其他的地方. 目前想到 2 種方式
定時使用 aws cli 去進行相關查詢. ( 如果有特定對象的話 )
使用 AWS CloudWatch Event Rule 結合 SNS 發送通知儲存
今天來嘗試的是方式 1
AWS Resource Target: RDS Aurora with MySQL
針對行為: 更改 masterUserPassword
實驗做法
建立 RDS database
更改 master User Password
去 CloudTrail 的 Event history 進行查詢
以上的方式可以在 Console 查詢到 RDS 進行 master 使用者密碼變更
那如果想要使用 aws cli 應該如何進行呢? 目前使用 aws cloudtrail lookup-events 指令來進行
首先嘗試直接下指令, 但是你會發現這樣的輸出實在太多, 效果不彰
# aws cloudtrail lookup-events
接下來加上限制輸出的輸量
# aws cloudtrail lookup-events --max-results 1
這樣好多了, 因為資料很短, 所以有助於了解輸出資料的格式
再來嘗試加上起始時間
# aws cloudtrail lookup-events --start-time 2021-07-19 --end-time 2021-07-20
然後試試看加上我們要找的屬性, 使用 eventname 來進行過濾
# aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=ModifyDBCluster --region us-east-1
這邊要注意你要查詢的 Region 是否符合你的資源所在區域
另外不同的 DB, 有可能是出現再 ModifyDBCluster 也有可能是 ModifyDBInstance, 這點請依照實際的狀況調整
這樣的輸出, 只要是 ModifyDBCluster 都會被列入, 但是我想要針對有變更 master password 才納入, 所以使用 jq 來進行處理
輸出的結果我們只想取出
userIdentity.UserName - 來知道是誰設定
eventTime - 事件時間
eventName - 事件名稱
awsRegion - 發生區域
sourceIPAddress - 來源 IP
requestParameters.materUserPassword - 用來識別有變更密碼行為
dBClusterIdentifier - DB 名稱
例如輸出的資料為 (部份)
{
"eventVersion": "1.08",
"userIdentity": {
"type": "IAMUser",
"principalId": "AIDAJ7LK4OH5WD54F4P5U",
"arn": "arn:aws:iam::78212783195:user/1303067",
"accountId": "782127831905",
"accessKeyId": "ASIA4MGTTTNQN75FOXWD",
"userName": "1303067",
"sessionContext": {
"sessionIssuer": {},
"webIdFederationData": {},
"attributes": {
"mfaAuthenticated": "true",
"creationDate": "2021-07-19T14:08:35Z"
}
}
},
"eventTime": "2021-07-19T15:01:45Z",
"eventSource": "rds.amazonaws.com",
"eventName": "ModifyDBCluster",
"awsRegion": "us-east-1",
"sourceIPAddress": "59.126.193.27",
"userAgent": "aws-internal/3 aws-sdk-java/1.11.975 Linux/4.9.230-0.1.ac.224.84.332.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.242-b08 java/1.8.0_242 vendor/Oracle_Corporation cfg/retry-mode/legacy",
"requestParameters": {
"dBClusterIdentifier": "test20210719",
"applyImmediately": true,
"masterUserPassword": "****",
"allowMajorVersionUpgrade": false
},
.... (恕略)
最後的指令為
# aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=ModifyDBCluster --region us-east-1 --query 'Events[*].CloudTrailEvent' | jq -r '.[]' | jq -c '. | select(.requestParameters.masterUserPassword) | {username: .userIdentity.userName, eventTime: .eventTime, eventName: .eventName, awsRegion: .awsRegion, sourceIPAddress: .sourceIPAddress, masterUserPassword: .requestParameters.masterUserPassword, dBClusterIdentifier: .requestParameters.dBClusterIdentifier}' | jq .
jq 的部份
-r output raw strings, not JSON texts;
-c compact instead of pretty-printed output;
這邊要讓自己記住的 jq 用法
用 select ( ) 選取我們希望要符合的資料, 以這個例子來說就是 .requestParameters.masterUserPassword
使用 | pipe 串接後, 用 大括號 { }, 然後用冒號為區隔, 定義輸出欄為名稱與 value, 例如 輸出名稱 username: 內容去對應 .userIdentity.userName
輸出參考
{
"username": "1303067",
"eventTime": "2021-07-19T14:28:03Z",
"eventName": "ModifyDBCluster",
"awsRegion": "us-east-1",
"sourceIPAddress": "59.127.193.27",
"masterUserPassword": "****",
"dBClusterIdentifier": "test20210719"
}
這樣又跟 AWS 靠近一步
~ enjoy it
Reference:
https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html
https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events-cli.html
沒有留言:
張貼留言