星期二, 8月 03, 2021

使用 aws cli 建立 CloudWatch Event Rule 與 Target - 使用現有的 Rule 為範本

使用 aws cli 建立 CloudWatch Event Rule 與 Target - 使用現有的 Rule 為範本


上一篇文章是使用 Console 的方式定義 Input Transformer 輸出到 CloudTrail Event


這一篇文章要來寫如何使用 aws cli 來建立 CloudWatch Event Rule 與 Target - 在已經有現有的 Rule 下.


環境假設

  • 已經建立 CloudWatch Event Rule, 名稱為 Notify_Create_Delete_IAM_User

  • 已經建立 SNS 通知方式 - 使用 Email 通知, 且已經完成訂閱

  • 使用 Input Transformer 設定 Notify_Create_Delete_IAM_User 這個 Rule 的 Target 為 SNS 然後設定 Input Path 與 Input Template


首先觀察先前建立的 CloudWatch Rule "Notify_Create_Delete_IAM_User" 的內容



Event pattern 為


{

  "source": [

    "aws.iam"

  ],

  "detail-type": [

    "AWS API Call via CloudTrail"

  ],

  "detail": {

    "eventSource": [

      "iam.amazonaws.com"

    ],

    "eventName": [

      "CreateUser",

      "DeleteUser"

    ]

  }

}


  • 這邊是 JSON 格式


將內容儲存為 Notify_Create_Delete_IAM_User.json


因為等等要使用到的 aws 指令輸入只接受 string 格式

所以使用 jq 指令轉為 string


# cat  Notify_Create_Delete_IAM_User.json |  jq  tostring


"{\"source\":[\"aws.iam\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"iam.amazonaws.com\"],\"eventName\":[\"CreateUser\",\"DeleteUser\"]}}"


  • 這個之前真的沒有注意到這個功能, jq 真是太好用了 


當然也可以反向使用 ( string to JSON)


# echo  "{\"source\":[\"aws.iam\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"iam.amazonaws.com\"],\"eventName\":[\"CreateUser\",\"DeleteUser\"]}}"  |  jq


{

  "source": [

    "aws.iam"

  ],

  "detail-type": [

    "AWS API Call via CloudTrail"

  ],

  "detail": {

    "eventSource": [

      "iam.amazonaws.com"

    ],

    "eventName": [

      "CreateUser",

      "DeleteUser"

    ]

  }

}




使用 aws 指令建立 AWS CloudWatch Event Rule


# aws  events  put-rule  --name "test-2021-08-02"  --region  us-east-1  --event-pattern  

"{\"source\":[\"aws.iam\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"iam.amazonaws.com\"],\"eventName\":[\"CreateUser\",\"DeleteUser\"]}}"


  • 可以到 Console 觀察有建立一個 CloudWatch Event Rule, 名稱為 test-2021-08-02

  • 使用剛剛既有的 Rule 的 Event Pattern


接下來要觀察先前建立的 CloudWatch Event  Rule Target 內容


# aws  events  list-targets-by-rule  --rule  "Notify_Create_Delete_IAMuser"  --region  us-east-1


{

    "Targets": [

        {

            "Id": "1",

            "Arn": "arn:aws:sns:us-east-1:783147821205:Notify_CreateIAMUser_20210714",

            "InputTransformer": {

                "InputPathsMap": {

                    "AccountID": "$.detail.userIdentity.accountId",

                    "Create-userName": "$.detail.responseElements.user.userName",

                    "Region": "$.detail.awsRegion",

                    "Staff-userName": "$.detail.userIdentity.userName",

                    "eventName": "$.detail.eventName",

                    "eventTime": "$.detail.eventTime",

                    "sourceIPAddress": "$.detail.sourceIPAddress"

                },

                "InputTemplate": "\"這是來自雲端課的通知,偵測到Assume Role行為\"\n\"AccountID: <AccountID>\"\n\"Region:<Region>\"\n\"建立者: <Staff-userName>\"\n\"EventTime: <eventTime>\"\n\"SourceIP: <sourceIPAddress>\"\n\"EventName: <eventName>\"\n\"建立帳號名稱: <Create-userName>\""

            }

        }

    ]

}


  • Id 的部份可以換成自訂的 ID, 使用 Console 建立的會很長

  • 我是透過 SNS 通知, 所以 SNS ARN 請換成自己的 SNS ARN


使用輸出導向的方式將內容存成 notify_create_delete_iam_user_target.json


# aws  events  list-targets-by-rule  --rule  "Notify_Create_Delete_IAMuser" --region  us-east-1   > notify_create_delete_iam_user_target.json


因為之後要套用 Rule, 所以要編輯檔案


{

    "Rule":"test-2021-08-02",

    "Targets": [

        {

            "Id": "1",

            "Arn": "arn:aws:sns:us-east-1:783147821205:Notify_CreateIAMUser_20210714",

            "InputTransformer": {

                "InputPathsMap": {

                    "AccountID": "$.detail.userIdentity.accountId",

                    "Create-userName": "$.detail.responseElements.user.userName",

                    "Region": "$.detail.awsRegion",

                    "Staff-userName": "$.detail.userIdentity.userName",

                    "eventName": "$.detail.eventName",

                    "eventTime": "$.detail.eventTime",

                    "sourceIPAddress": "$.detail.sourceIPAddress"

                },

                "InputTemplate": "\"這是來自雲端課的通知,偵測到Assume Role行為\"\n\"AccountID: <AccountID>\"\n\"Region:<Region>\"\n\"建立者: <Staff-userName>\"\n\"EventTime: <eventTime>\"\n\"SourceIP: <sourceIPAddress>\"\n\"EventName: <eventName>\"\n\"建立帳號名稱: <Create-userName>\""

            }

        }

    ]

}


  • 加上 Rule 設定, 後面請接上剛剛新建立的 Rule, 然後記得加上 逗號 ,

  • Id 的部份可以換成自訂的 ID, 使用 Console 建立的會很長

  • 我是透過 SNS 通知, 所以 SNS ARN 請換成自己的 SNS ARN


完成準備檔案


使用 aws 指定套用 Rule 的 Target

我的 notify_create_delete_iam_user_target.json 在目前的目錄下


# aws  events  put-targets  --region  us-east-1  --cli-input-json  file://./notify_create_delete_iam_user_target.json


{

    "FailedEntryCount": 0,

    "FailedEntries": []

}


回 Console 驗證是否完成 :)


又向 AWS 前進一步


~ enjoy it



Reference:



星期日, 7月 18, 2021

AWS 自定義 Input Transformer 輸出 CloudTrail Event 通知小記

AWS 自定義 Input Transformer 輸出 CloudTrail Event 通知小記


上次的文章, 寫到使用 AWS CloudWatch 通知 IAM 如果新增使用者就透過 SNS 來通知


但是如果收到通知, 信件的內容長的像下列這樣



{"version":"0","id":"baf019d3-e9ce-73cf-8248-342029a1c773","detail-type":"AWS API Call via CloudTrail","source":"aws.iam","account":"838212984580","time":"2021-06-30T07:45:33Z","region":"us-east-1","resources":[],"detail":{"eventVersion":"1.08","userIdentity":{"type":"IAMUser","principalId":"AIDAIRJWANII4AJY47KV4","arn":"arn:aws:iam::938212984580:user/sakana","accountId":"847212984580","accessKeyId":"ASIA4K7LPAMDNYEVZOBN","userName":"sakana","sessionContext":{"sessionIssuer":{},"webIdFederationData":{},"attributes":{"creationDate":"2021-06-30T04:10:47Z","mfaAuthenticated":"true"}}},"eventTime":"2021-06-30T07:45:33Z","eventSource":"iam.amazonaws.com","eventName":"CreateUser","awsRegion":"us-east-1","sourceIPAddress":"xxx.32.yy.195","userAgent":"console.amazonaws.com","requestParameters":{"userName":"demouser","tags":[]},"responseElements":{"user":{"path":"/","userName":"demouser","userId":"AEDA4K7LPAMCPHPLSOBYA","arn":"arn:aws:iam::843212934570:user/demouser","createDate":"Jun 30, 2021 7:45:33 AM"}},"requestID":"5b86b4d1-c23b-48b0-9de3-f33803aefe96","eventID":"322fea0c-93ac-43f3-9786-a596fe121a6a","readOnly":false,"eventType":"AwsApiCall","managementEvent":true,"recipientAccountId":"838212984581","eventCategory":"Management"}}


雖然收到信會知道 IAM  有變動, 但是還是不好閱讀, 想要在收到信的時候, 可以快速的掌握狀況, 上述標示顏色的部份, 就是想要整理出來的資訊.

請教了 Partner , 得到了解法, 在此小記下來



首先可以到 AWS CloudTrail 的 Event history 觀察相關資訊

  • 對應自己收到的資訊, 之後想要顯示

    • userIdentity 下的

      • accountId

      • userName

    • eventName

    • awsRegion

    • sourceIPAddress

    • responseElements 下 user 下的 userName


{

    "eventVersion": "1.08",

    "userIdentity": {

        "type": "IAMUser",

        "principalId": "BIDAJ6LK4OH4WD54F3P5U",

        "arn": "arn:aws:iam::732126821902:user/sakana",

        "accountId": "783127531104",

        "accessKeyId": "ASBA2MGTTSNQFXSELCEQ",

        "userName": "sakana",

        "sessionContext": {

            "sessionIssuer": {},

            "webIdFederationData": {},

            "attributes": {

                "mfaAuthenticated": "true",

                "creationDate": "2021-07-14T14:17:37Z"

            }

        }

    },

    "eventTime": "2021-07-14T14:49:32Z",

    "eventSource": "iam.amazonaws.com",

    "eventName": "CreateUser",

    "awsRegion": "us-east-1",

    "sourceIPAddress": "210.85.244.27",

    "userAgent": "console.amazonaws.com",

    "requestParameters": {

        "userName": "test2021071401",

        "tags": []

    },

    "responseElements": {

        "user": {

            "path": "/",

            "userName": "test2021071401",

            "userId": "AIDA3MGTTTNQMPPHXXTVQ",

            "arn": "arn:aws:iam::782127831904:user/test2021071401",

            "createDate": "Jul 14, 2021 2:49:32 PM"

        }

    },

    "requestID": "7ea3d0b0-4071-4faf-b8e5-afff56ff443d",

    "eventID": "849d37e2-1235-46bc-8398-2b3eda5c325c",

    "readOnly": false,

    "eventType": "AwsApiCall",

    "managementEvent": true,

    "eventCategory": "Management",

    "recipientAccountId": "683125831904"

}


作法是開啟 AWS 的 CloudWatch, Region: Virginia ( 之前的 Events Rule 設定在這邊 )


可以編輯之前建立的 Rule ( 或是之後新建 Rule 的時候設定進去 )

Targets 我們之前是使用 SNS topic, 在 Configure input 的部份

將預設的 Matched event 改為 Input Transformer



Input Transformer 總共有 2 個欄位

  • Input Path

    • 定義要取得的 Key-value 變數

  • Input Template

    • 要顯示的內容


在 Input Path 的部份, 記得要在前面加上 $.detail

以下是 Input Path 此次設定的範例


{"AccountID":"$.detail.userIdentity.accountId","Staff-userName":"$.detail.userIdentity.userName","sourceIPAddress":"$.detail.sourceIPAddress","eventTime":"$.detail.eventTime","Region":"$.detail.awsRegion","eventName":"$.detail.eventName","Target-userName":"$.detail.responseElements.user.userName"}


  • 取出 userIdentity.accountId 定義為 AccountID

  • 取出 userIdentity.userName 定義為 Staff-userName

  • 取出 sourceIPAddress 定義為 sourceIPAddress 

  • 取出 eventTime 定義為 eventTime 

  • 取出 awsRegion 定義為 Region 

  • 取出 eventName 定義為 eventName 

  • 取出 responseElements.user.userName 定義為 Target-userName 

  • 以上請先觀察你的 Cloudwatch Event history 相關資訊


接下來是 Input Template, 這個就比較簡單了, 就是通知的信件內容

以下為此次設定的範例


"這是來自雲端課的通知,偵測到Assume Role行為"

"AccountID: <AccountID>"

"Region:<Region>"

"同仁帳號: <Staff-userName>"

"EventTime: <eventTime>"

"SourceIP: <sourceIPAddress>"

"EventName: <eventName>"

"目標帳號名稱: <Target-userName>"



接下來就是收到信的範例


"這是來自雲端課的通知,偵測到Assume Role行為"

"AccountID: 762327821902"

"Region:us-east-1"

"建立者: sakana"

"EventTime: 2021-07-14T15:22:28Z"

"SourceIP: 210.59.244.94"

"EventName: CreateUser"

"目標帳號名稱: test2021071403"


又前進一步了


~ enjoy it


Reference