星期二, 8月 10, 2021

使用 aws cloudtrail lookup-events 指令搜尋事件

使用 aws cloudtrail lookup-events 指令搜尋事件

aws cli : 2.2.4


因為工作上的需求, 可能需要定時去查詢或是紀錄特定事件

例如  RDS 上面密碼變更的行為, 但是因為 CloudTrail 預設只保留 90 天的 log


如果不想要將相關 log 轉到 S3 或是其他的地方. 目前想到 2 種方式

  1. 定時使用 aws cli 去進行相關查詢. ( 如果有特定對象的話 )

  2. 使用 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:



沒有留言: