ทดลองใช้งานฟีเจอร์สแกนมัลแวร์อัตโนมัติของ GuardDuty

GuardDuty มีการปล่อยอัปเดตฟังก์ชันดี ๆ ออกมาครับ นั่นก็คือเมื่อมีการตรวจพบพฤติกรรมที่คาดว่าจะเกิดจากการติดมัลแวร์ใน EC2 หรือ container ต่าง ๆ จะสามารถดำเนินการทำ Malware scans ได้ สามารถลดขั้นตอนการทำงานของผู้ใช้งานไปได้เปราะหนึ่ง มีประโยชน์มาก ๆ เลยครับ

บทความนี้ได้รับการแปลมาจากบทความภาษาญี่ปุ่นที่มีชื่อว่า [神アップデート]GuardDutyがEC2やECSのマルウェア検知時のスキャンに対応したので実際にスキャンさせてみた。 โดยเจ้าของบทความนี้คือ คุณ usuda ซึ่งเป็นชาวญี่ปุ่น โดยในบทความนี้จะมีการปรับสำนวนการเขียน รวมถึงมีการเรียบเรียงเนื้อหาใหม่ให้เข้าใจง่ายและมีความเหมาะสมมากยิ่งขึ้น

สวัสดีครับ อุสุดะครับ

ทุกท่านได้ใช้ AWS ในการตรวจจับภัยคุกคามต่าง ๆ อยู่หรือเปล่าครับ

ทาง AWS ได้ปล่อยฟังก์ชันใหม่ที่มีประโยชน์มากออกมา ซึ่งมีการประกาศเปิดตัวในงาน re:Inforce ที่จัดไปในเดือนกรกฎาคม ปี 2022 ที่ผ่านมา โดยฟังก์ชันนี้เป็นฟังก์ชันสำหรับการสแกนเมื่อมีการตรวจพบมัลแวร์ใน container workload อย่างเช่น EC2 หรือ ECS/EKS เป็นต้น

รายละเอียดเพิ่มเติม : https://aws.amazon.com/th/blogs/aws/new-for-amazon-guardduty-malware-detection-for-amazon-ebs-volumes/

โดยในครั้งเราจะมาลองใช้งานฟังก์ชันนี้กันครับ

 

สรุปแบบง่าย ๆ (แต่ยาว)

  • ภาพรวมฟังก์ชัน
    • บริการตรวจจับภัยคุกคามบน AWS, GuardDuty สามารถรองรับการสแกนมัลแวร์ได้แล้ว
    • ชื่อของฟังก์ชัน คือ Malware Protection
    • ถึงแม้จะมีคำว่า Protection อยู่ในชื่อฟังก์ชัน แต่การทำงานจริง ๆ จะเป็นการตรวจจับ
    • ไม่ได้หยุดการทำงานของมัลแวร์โดยตรง
  • การเปิดใช้งาน
    • เป็นฟังก์ชันเสริมของ GuardDuty สามารถตั้งค่าเปิด-ปิดการใช้งานได้
    • เมื่อเริ่มใช้งาน GuardDuty เป็นครั้งแรก ฟังก์ชันนี้จะถูกเปิดใช้งานให้โดยอัตโนมัติ (ค่า Default)
    • สำหรับ GuardDuty ที่เปิดใช้งานอยู่ก่อนแล้ว จำเป็นจะต้องทำการเปิดใช้งานฟังก์ชันนี้ด้วยตนเอง
  • ค่าบริการ
    • 30 วันแรกนับจากการเริ่มเปิดใช้งาน ไม่มีค่าบริการ
    • ค่าบริการในการสแกน EBS Volume คิดเป็นต่อ GB
      • Region ในแถบ Virginia 0.03 USD/GB/เดือน
      • Region ในแถบ Singapore 0.05 USD/GB/เดือน
      • Region ในแถบ Tokyo 0.05 USD/GB/เดือน
  • Region ที่รองรับ
    • รองรับเกือบทุก Region
  • การทำงานของฟังก์ชัน
    • การจะสแกนมัลแวร์ได้ จำเป็นจะต้องใช้ผลการตรวจจับของ GuardDuty (เรียกว่า Findings) เป็น Trigger สำหรับเปิดใช้ระบบการสแกนมัลแวร์
      • Findings ที่สามารถเป็น Trigger เริ่มการสแกนได้ คือ Findings จำพวกที่ต้องสงสัยว่าจะเป็นการเคลื่อนไหวของมัลแวร์ เช่น Backdoor:EC2/C&CActivity.B หรือ CryptoCurrency:EC2/BitcoinTool.B!DNS เป็นต้น
      • เมื่อมีประเภทของ Findings ใด ๆ (Finding Types) ที่เข้าข่ายดังกล่าวเกิดขึ้น จะทำการ Trigger ระบบสแกนมัลแวร์โดยอัตโนมัติ
      • การสแกนจะทำโดยใช้ IAM Role ที่สร้างขึ้นมาใหม่สำหรับใช้ในการสแกนโดยเฉพาะ
    • GuardDuty จะทำการระบุ EBS ของเป้าหมายที่จะสแกน แล้วสร้าง Snapshot ขึ้นมา
      • เนื่องจากทำการสแกนผ่าน Snapshot จึงไม่มีผลกระทบต่อ Resource ที่มีอยู่ก่อนแล้ว
      • เนื่องจากทำการสแกนผ่าน Snapshot จึงไม่จำเป็นต้องเพิ่มตัว Agent ใด ๆ เข้าไปในทรัพยากรที่มีอยู่
    • จะทำการตรวจหาภัยคุกคามจำพวก Trojan horse, Worm, Crypto Miner, Rootkit, Bot เป็นต้น
    • EC2 ที่ทำการสแกนไปแล้ว จะไม่ทำการสแกนซ้ำอีกภายใน 24 ชั่วโมง
    • สามารถเพิ่มเข้า/นำออกเป้าหมายที่จะทำการสแกนได้โดยการใช้ Tags
    • สามารถทำงานกับ EBS ที่เข้ารหัสด้วย KMS ได้
    • เมื่อทำการสแกนเสร็จสิ้น จะทำการลบ Snapshot ที่สร้างขึ้นมาทันที
      • สามารถตั้งค่าให้เก็บ Snapshot นั้นไว้ได้
    • หากสแกนแล้วพบมัลแวร์ จะทำการสร้าง Findings ขึ้นมา
      • หากสแกนไม่พบมัลแวร์ จะไม่มีการสร้าง Findings
      • มีการบันทึกประวัติการสแกนเก็บไว้
      • Log บันทึกการสแกนสามารถเข้าถึงได้ผ่านทาง CloudWatch Logs
  • ไม่รองรับการใช้งานใน Fargate (ข้อมูลเมื่อวันที่ 2 พ.ค. 2023)
  • รองรับการทำงานกับ file system หลายรูปแบบ รวมถึงการสแกนไฟล์ประเภทที่นิยมใช้ในการเผยแพร่มัลแวร์หรือไฟล์ที่มักจะมีมัลแวร์ติดมาด้วยทั้งในระบบปฏิบัติการ Windows และ Linux เช่น PDF files, archives, binaries, scripts, installers, email databases, plain emails เป็นต้น

ภาพรวมของการอัปเดต

Amazon GuardDuty เป็นบริการของ AWS สำหรับตรวจจับภัยคุกคามหลาย ๆ รูปแบบครับ เช่น การสแกน EC2 จากภายนอก, การติดมัลแวร์, การสื่อสารกับ C&C Server, Coin Mining, การรั่วไหลของข้อมูล IAM, การเข้าถึง S3 โดยไม่ได้รับอนุญาต เป็นต้น

ที่ผ่านมา GuardDuty ทำการตรวจสอบโดยอาศัยแค่ข้อมูลจากกิจกรรมต่าง ๆ อาทิเช่น DNS Log หรือเลข IP ที่วิ่งเข้า-ออก VPC ในขณะที่เกิดการสื่อสารใด ๆ เป็นหลักเท่านั้น ไม่ได้ทำการตรวจสอบเข้าไปถึงข้อมูลด้านในของ EC2 จริง ๆ ครับ

การอัปเดตในครั้งนี้ได้ทำให้ GuardDuty มีความสามารถในการสแกนหามัลแวร์ใน Container หรือ EC2 ที่เกี่ยวข้อง รวมถึงเข้าตรวจสอบไฟล์มัลแวร์เหล่านั้นโดยตรงได้เมื่อมีการตรวจพบการเคลื่อนไหวที่คาดว่าน่าจะเป็นของมัลแวร์เพิ่มขึ้นมาครับ

ก่อนหน้าที่ฟังก์ชันนี้จะถูกอัปเดตเข้ามานั้น เมื่อมีการตรวจพบกิจกรรมที่น่าสงสัย การจะสแกนหามัลแวร์นั้นจะต้องกระทำโดยผู้ใช้งานเอง เริ่มตั้งแต่การที่ผู้ใช้งานตรวจสอบผลการตรวจจับ, ทำการตัดสินใจต่าง ๆ , ขออนุญาตจากผู้ที่เกี่ยวข้อง, หลังจากที่เสียเวลาไปประมาณหนึ่งจึงจะเข้าเชื่อมต่อกับ EC2 Instance ที่คาดว่าจะมีมัลแวร์อยู่ แล้ว set up เครื่องมือสแกนมัลแวร์ซึ่งอาจจะเป็นแบบสำหรับใช้ในเชิงพาณิชย์หรือแบบใช้งานทั่วไปก็ได้ เมื่อเสร็จสิ้นกระบวนการทั้งหมดจึงจะเริ่มทำการสแกนครับ

แต่จากการอัปเดตครั้งนี้ ทำให้เราสามารถจัดการขั้นตอนตั้งแต่เมื่อเริ่มตรวจพบภัยคุกคามไปจนถึงการระบุตัวมัลแวร์ต้นเหตุนั้นได้แบบอัตโนมัติ รวดเร็ว และปลอดภัยครับ

นอกจากนี้ยังสามารถทำงานร่วมกับ AWS Security Hub ได้ ทำให้สามารถวิเคราะห์และตัดสินใจหาวิธีการรับมือที่เหมาะสมต่อไปได้ครับ

ทดลองใช้งานสแกนมัลแวร์ดู

จากนี้เราจะมาเริ่มทำจริงกันครับ สภาพแวดล้อมที่ผมใช้ในครั้งนี้มีการเปิดใช้งาน GuardDuty ไว้อยู่ก่อนแล้ว จึงจะขอเริ่มตั้งแต่ขั้นตอนการเปิดใช้งาน Malware Protection ครับ จากนั้นจะโชว์ให้ทุกท่านได้เห็นว่าการสแกนมัลแวร์จริง ๆ นั้นจะออกมาไหนรูปแบบไหน โดยขั้นตอนการทำนั้นมีเขียนอธิบายอยู่ใน User Guide นี้ด้วยเช่นกัน สามารถศึกษารายละเอียดเพิ่มเติมกันได้ครับ

นอกจากนี้ การทดลองใช้งานในครั้งนี้ผมติดปัญหาต่าง ๆ สารพัด ซึงจะเขียนใส่ไว้ในตอนท้ายครับ สำหรับท่านใดที่อยากจะลองตรวจสอบดู ก็สามารถอ่านไปจนถึงช่วงท้ายแล้วทดลองด้วยตัวเองได้ครับ

เปิดใช้งาน Malware Protection

ก่อนอื่นให้เข้ามาที่หน้า GuardDuty แล้วคลิกเลือกเมนู Malware Protection จากแถบทางด้านซ้ายครับ

คลิกที่ Enable เพื่อเปิดการใช้งาน Malware Protection

จะมีหน้าต่าง pop-up ขึ้นมาอธิบายเกี่ยวกับ Malware Protection ให้กด Enable Malware Protection

เท่านี้ก็เปิดใช้งานเรียบร้อยครับ และบริเวณด้านล่างจะมีให้ตั้งค่าว่าจะเก็บ Snapshot เอาไว้หลังจากที่ทำการสแกนเสร็จสิ้นหรือไม่ ให้เลือกตั้งค่าได้ตามต้องการ แต่ในครั้งนี้ผมจะตั้งค่าให้เก็บ Snapshot เอาไว้ครับ

สร้าง EC2 Instance และตรวจหามัลแวร์

จากนี้เราจะทำการสร้าง EC2 ขึ้นมาและใช้ EICAR (ไวรัสเสมือนสำหรับใช้ทดสอบ) เป็นเสมือนมัลแวร์ใน EC2 ให้ GuardDuty ได้ตรวจจับครับ

สำหรับตัว Finding Types ที่สามารถเป็น Trigger สำหรับเริ่มต้นการสแกนมัลแวร์ได้นั้นสามารถดูได้ที่ลิสต์นี้เลยครับ

ก่อนอื่นผมจะทำการสร้าง EC2 ขึ้นมาก่อน ซึ่งครั้งนี้จะใช้เป็นตัว Amazon Linux 2 ครับ

หลังจากเปิด EC2 แล้วก็จะใส่มัลแวร์ EICAR เข้าไป โดยจะตั้งค่าไว้ประมาณนี้ครับ

[ec2-user@ip-172-31-7-114 ~]$ wget https://secure.eicar.org/eicar.com
--2023-04-26 07:34:35--  https://secure.eicar.org/eicar.com
Resolving secure.eicar.org (secure.eicar.org)... 89.238.73.97, 2a00:1828:1000:2497::2
Connecting to secure.eicar.org (secure.eicar.org)|89.238.73.97|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 68
Saving to: ‘eicar.com’

100%[======================================>] 68          --.-K/s   in 0s

2023-04-26 07:34:36 (11.6 MB/s) - ‘eicar.com’ saved [68/68]

[ec2-user@ip-172-31-7-114 ~]$ wget https://secure.eicar.org/eicar_com.zip
--2023-04-26 07:34:46--  https://secure.eicar.org/eicar_com.zip
Resolving secure.eicar.org (secure.eicar.org)... 89.238.73.97, 2a00:1828:1000:2497::2
Connecting to secure.eicar.org (secure.eicar.org)|89.238.73.97|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 184 [application/zip]
Saving to: ‘eicar_com.zip’

100%[======================================>] 184         --.-K/s   in 0s

2023-04-26 07:34:47 (31.7 MB/s) - ‘eicar_com.zip’ saved [184/184]

[ec2-user@ip-172-31-7-114 ~]$ ls -al
total 20
drwx------ 3 ec2-user ec2-user 112 Apr 26 07:34 .
drwxr-xr-x 3 root     root      22 Apr 26 07:30 ..
-rw-r--r-- 1 ec2-user ec2-user  18 Jul 15  2020 .bash_logout
-rw-r--r-- 1 ec2-user ec2-user 193 Jul 15  2020 .bash_profile
-rw-r--r-- 1 ec2-user ec2-user 231 Jul 15  2020 .bashrc
-rw-rw-r-- 1 ec2-user ec2-user  68 Jul  1  2020 eicar.com
-rw-rw-r-- 1 ec2-user ec2-user 184 Jul  1  2020 eicar_com.zip
drwx------ 2 ec2-user ec2-user  29 Apr 26 07:30 .ssh

หลังจากลงมัลแวร์สำเร็จ ก็จะทำการสร้างกิจกรรมที่น่าสงสัยขึ้นมาครับ เพราะแค่การดาวน์โหลดมัลแวร์เพียงอย่างเดียวไม่เพียงพอให้ GuardDuty สามารถตรวจจับได้ครับ

ซึ่งในครั้งนี้จะตั้งค่าให้เป็นแบบ Coin Mining ครับ

[ec2-user@ip-172-31-7-114 ~]$ nslookup pool.supportxmr.com
Server:         172.31.0.2
Address:        172.31.0.2#53

Non-authoritative answer:
pool.supportxmr.com     canonical name = pool-hk.supportxmr.com.
Name:   pool-hk.supportxmr.com
Address: 139.99.123.196
Name:   pool-hk.supportxmr.com
Address: 139.99.125.38
Name:   pool-hk.supportxmr.com
Address: 139.99.124.170

[ec2-user@ip-172-31-7-114 ~]$ curl pool.supportxmr.com
Mining Pool Online

เพียงเท่านี้การเตรียมการก็เสร็จสิ้นครับ

เช็คการตรวจจับของ GuardDuty

หลังจากลองทำมาซักพัก ก็ได้ Finding Types แบบ Mining CryptoCurrency:EC2/BitcoinTool.B มาครับ

จากนั้นการสแกนมัลแวร์ก็จะเริ่มต้นขึ้นครับ โดยสามารถตรวจเช็คได้คลิกที่เมนู Malware scans ซึ่งอยู่บริเวณแถบ Managed Console ด้านซ้ายครับ จะเห็นได้ว่าการสแกนได้เริ่มขึ้นแล้ว และตอนนี้อยู่ในสถานะ Running ครับ

หน้าจอแสดงรายละเอียดของการสแกนจะแสดงข้อมูลต่าง ๆ เช่น GuardDuty Findings ที่เป็น Trigger ของการสแกน, EC2 หรือ Volume ที่ทำการสแกน, CloudWatch Logs ที่เก็บข้อมูลรายละเอียดของการสแกนไว้ เป็นต้น

ลิงก์ของ CloudWatch Logs จะพาเรามาที่หน้า query ของ CloudWatch Logs Insight ครับ โดยส่วนตัวผมแนะนำให้เข้ามาตรวจสอบใน Log Stream โดยตรงจะดีกว่าครับ

หน้าตาของ Logs จริง ๆ จะเป็นประมาณนี้ครับ โดยอันนี้คือ Logs ของ event EC2_SCAN_STARTED ครับ

{
    "eventDetails": {
        "accountId": "999999999999",
        "eventType": "EC2_SCAN_COMPLETED",
        "eventTime": "2023-04-26T08:56:00Z",
        "detectorId": "78c2****************************",
        "schemaVersion": "1.0"
    },
    "scanRequestDetails": {
        "requestType": "GUARDDUTY_FINDING_INITIATED",
        "scanId": "05a7****************************",
        "guardDutyRequestDetails": {
            "findingId": "96c3****************************"
        }
    },
    "resourceDetails": {
        "resourceType": "EC2_INSTANCE",
        "instanceDetails": {
            "instanceId": "i-045**************",
            "volumeDetailsList": [
                {
                    "volumeId": "vol-04a**************",
                    "deviceName": "/dev/xvda",
                    "volumeSizeGb": 8,
                }
            ]
        }
    }
}

หลังจากผ่านไปซักพักก็สามารถตรวจจับมัลแวร์ได้จับ เป็น Finding Types แบบ Execution:EC2/MaliciousFile ครับ เดี๋ยวเราจะมาตรวจสอบรายละเอียดกันครับ จะพบว่าระบบตรวจเจอ EICAR จำนวน 2 ไฟล์ โดยเราสามารถตรวจสอบชื่อไฟล์, path, หรือระดับความร้ายแรงได้ครับ

รายละเอียดของ Findings จะเขียนแสดงไว้ประมาณนี้ครับ ทำให้เราได้รู้ว่าแม้จะเป็นไฟล์ zip ระบบก็ยังสามารถทำงานได้อย่างไม่มีปัญหาครับ

"ThreatDetectedByName": {
  "ItemCount": 2,
  "UniqueThreatNameCount": 1,
  "Shortened": false,
  "ThreatNames": [
    {
      "Name": "EICAR-Test-File (not a virus)",
      "Severity": "HIGH",
      "ItemCount": 2,
      "FilePaths": [
        {
          "FilePath": "/home/ec2-user/eicar.com",
          "VolumeArn": "arn:aws:ec2:ap-southeast-1:999999999999:volume/vol-04a**************",
          "Hash": "275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f",
          "FileName": "eicar.com"
        },
        {
          "FilePath": "/home/ec2-user/eicar_com.zip=>eicar.com",
          "VolumeArn": "arn:aws:ec2:ap-southeast-1:999999999999:volume/vol-04a**************",
          "Hash": "275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f",
          "FileName": "eicar_com.zip=>eicar.com"
        }
      ]
    }
  ]
}

เราสามารถตรวจสอบรายละเอียดของผลการสแกนได้ในหน้า Malware scans ครับ ผลการสแกนคือ Infected เวลาที่ใช้ในการสแกนอยู่ที่ประมาณ 11 นาที, ขนาดไฟล์ที่สแกนคือ 1.58GB, จำนวนไฟล์ที่สแกนทั้งหมดอยู่ที่ 44,388 ไฟล์ โดยถ้ามองว่าต้องรวมเวลาที่ใช้ในการสร้าง Snapshot เข้าไปด้วยแล้ว 11 นาทีก็ถือว่าค่อนข้างเร็วเลยครับ แต่ก็อดสงสัยไม่ได้ครับว่าถ้าหากปริมาณไฟล์เพิ่มขึ้น จะใช้เวลาในการสแกนเพิ่มขึ้นเท่าไหร่

คราวนี้เรากลับมาดูที่ Findings ที่เป็น Trigger ของ Malware scans ก็จะพบว่าเราสามารถตรวจสอบ timeline ซึ่งรวมไปถึงส่วนของการสแกนได้ครับ เวลาที่ใช้ตั้งแต่เริ่มสร้าง Trigger ไปจนถึงเริ่มการสแกนอยู่ที่ประมาณ 2 นาที, เริ่มสร้าง Snapshot ไปจนถึงสแกนเสร็จสิ้นอยู่ที่ประมาณ 11 นาที, และทันทีที่สแกนเสร็จก็มีการตรวจพบ Execution:EC2/MaliciousFile ครับ แล้วก็ระบบใช้เวลาประมาณ 5 นาทีในการตรวจพบกิจกรรมน่าสงสัย นับตั้งแต่เริ่มสร้างกิจกรรมน่าสงสัยนั้นขึ้นมาครับ

รายละเอียดต่าง ๆ หลังจากที่สแกนเสร็จแล้วจะไปอยู่ใน CloudWatch Logs โดยรายละเอียดจะเป็นประมาณนี้ครับ

{
    "eventDetails": {
        "accountId": "999999999999",
        "eventType": "EC2_SCAN_COMPLETED",
        "eventTime": "2023-04-26T08:56:00Z",
        "detectorId": "78c2****************************",
        "schemaVersion": "1.0"
    },
    "scanRequestDetails": {
        "requestType": "GUARDDUTY_FINDING_INITIATED",
        "scanId": "05a7****************************",
        "guardDutyRequestDetails": {
            "findingId": "96c3****************************"
        }
    },
    "resourceDetails": {
        "resourceType": "EC2_INSTANCE",
        "instanceDetails": {
            "instanceId": "i-045**************",
            "volumeDetailsList": [
                {
                    "volumeId": "vol-04a**************",
                    "deviceName": "/dev/xvda",
                    "volumeSizeGb": 8,
                    "volumeSnapshotId": "snap-0e0**************"
                }
            ]
        }
    },
    "scanResultsSummary": {
        "scanResultStatus": "THREATS_FOUND",
        "scannedItemCount": {
            "totalGb": 2,
            "files": 44388
        }
    }
}

ลองมาเช็ค Snapshot ที่ถูกสร้างขึ้นมาดูกันครับ จะพบว่ามี Tag 3 อัน คือ GuardDutyScanId / GuardDutyExcluded / GuardDutyFindingDetected ติดเอาไว้ครับ รวมถึง KMS key ก็ใช้อันเดียวกันกับ EC2 ครับ

นี่ก็ถือว่าเราได้ตรวจสอบการทำงานเสร็จสิ้นหมดแล้วครับ

ปัญหาที่พบเจอ

การทดลองใช้งานใน Tokyo Region

ฟังก์ชัน Malware Protection รองรับการใช้งานในทุก ๆ Region ยกเว้น Region ที่เขียนไว้ด้านล่างครับ

  • AWS China (Beijing)
  • AWS China (Ningxia)
  • AWS GovCloud (US-East)
  • AWS GovCloud (US-West)

หรือก็คือ รองรับเกือบทุก Region ครับ

แต่ในขณะที่กำลังทดลองใช้งานอยู่นี้ (27 ก.ค. 2022) ฟังก์ชันนี้ยังไม่รองรับการใช้งานใน Tokyo Region ครั้งนี้ผมจึงทดลองการใช้งานใน Oregon Region ครับ

การสแกนล้มเหลวเนื่องจาก KMS

ในตอนแรก ผมใช้ EC2 ที่สร้างในสภาพแวดล้อมแบบ Default ของผมเองในการทดลองใช้งานฟังก์ชันครับ แต่ผลการสแกนกลับออกมาว่าล้มเหลว ตามที่แสดงใน CloudWatch Logs ด้านล่างนี้เลยครับ

{
    "eventDetails": {
        "accountId": "999999999999",
        "eventType": "EC2_SCAN_SKIPPED",
        "eventTime": "2022-07-26T15:50:02.017Z",
        "detectorId": "78c2****************************",
        "schemaVersion": "1.0"
    },
    "scanRequestDetails": {
        "requestType": "GUARDDUTY_FINDING_INITIATED",
        "guardDutyRequestDetails": {
            "findingId": "62c1****************************"
        }
    },
    "resourceDetails": {
        "resourceType": "EC2_INSTANCE",
        "instanceDetails": {
            "instanceId": "i-001**************",
            "volumeDetailsList": [
                {
                    "volumeId": "vol-0db**************",
                    "deviceName": "/dev/xvda",
                    "volumeSizeGb": 8,
                    "skipReason": "UNSUPPORTED_KEY_ENCRYPTION"
                }
            ]
        }
    }
}

จาก UNSUPPORTED_KEY_ENCRYPTION ทำให้ผมทราบว่าตอนนี้ปัญหาอยู่ที่ KMS key ครับ ในครั้งนั้นผมใช้ default KMS key ของ AWS ครับผม ซึ่งเมื่อไปเช็ค key policy ก็พบว่ารายละเอียดเป็นดังนี้ครับ

"Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:CreateGrant",
    "kms:DescribeKey"
],
"Resource": "*",
"Condition": {
    "StringEquals": {
        "kms:CallerAccount": "999999999999",
        "kms:ViaService": "ec2.us-west-2.amazonaws.com"
    }

เนื่องจากว่าไม่ได้ตรวจสอบอย่างละเอียดนัก จึงอาจมีการคาดเดาของผมปนไปด้วยนะครับ แต่ผมคิดว่าสาเหตุคือ เมื่อดูจาก kms:ViaService แล้วจะพบว่ามีแค่ EC2 เท่านั้นที่สิทธิ์ในการเรียกใช้งาน ทำให้ไม่สามารถเรียกใช้งานผ่าน GuardDuty ได้ครับ

เพราะเหตุนั้นผมจึงต้องทำการสร้าง KMS key ขึ้นมาใหม่ โดยหลังจากที่มอบสิทธิ์ให้กับ IAM Role ของ GuardDuty ที่ใช้ในการสแกนมัลแวร์ ก็สามารถทำการสแกนได้แบบไม่มีปัญหาใด ๆ ครับ

เปิดใช้งาน GuardDuty Tester ล้มเหลว

ในการเขียนบล็อก ผมจะใช้งาน GuardDuty Tester ในการทดลองให้เกิดการตรวจจับครับ ซึ่งนี่เป็นฟังก์ชันที่มีมาตั้งแต่ก่อนหน้าแล้ว และมี AWS Document แนะนำฟังก์ชันนี้เขียนไว้ตามด้านล่างนี้ครับ

แต่ในครั้งนี้ เมื่อผมพยายามจะใช้งานตัวฟังก์ชันนี้ กลับไม่สามารถใช้งานในส่วนของ CloudFormation ได้ครับ

เมื่อใช้ CloudFormation สร้าง Windows server instance กลับเกิด error ตามด้านล่างนี้ครับ

Instance i-06c************** failed to stabilize. Current state: shutting-down. Reason: Server.InternalError: Internal error on launch

ไม่ว่าจะลองซ้ำอีกหลาย ๆ ครั้ง หรือลองเปลี่ยน region ดู หรือเปลี่ยนมาสร้าง AMI ที่จะใช้งานด้วยตัวเองก็แล้ว ก็ยังเกิด error แบบเดิมครับ ซึ่งดูเหมือนว่าครั้งนี้ปัญหาจะอยู่ที่ AMI กับ EC2 มากกว่า GuardDuty ในครั้งนี้ผมจึงไม่ได้ใช้ GuardDuty Tester ครับ

ในทางกลับกัน หากเราสามารถเข้าใจหลักการทำงานของตัว GuardDuty Tester ได้ก็จะมีประโยชน์อย่างมากเลยครับ

รายละเอียดอื่น ๆ

ตรงนี้จะขอเขียนถึง Tip เกี่ยวกับ Resource และเนื้อหาอื่น ๆ เพิ่มเติมครับ

Finding Types ที่ถูกเพิ่มเข้ามา

เป็นไปตามลิสต์ด้านล่างนี้เลยครับ

Malware Protection finding types - Amazon GuardDuty

  • Execution:EC2/MaliciousFile
  • Execution:ECS/MaliciousFile
  • Execution:Kubernetes/MaliciousFile
  • Execution:Container/MaliciousFile
  • Execution:EC2/SuspiciousFile
  • Execution:ECS/SuspiciousFile
  • Execution:Kubernetes/SuspiciousFile
  • Execution:Container/SuspiciousFile

EC2, ECS, EKS, รวมถึง standalone container อื่น ๆ ที่ไม่ใช่จำพวก ECS cluster หรือ Kubernetes cluster นั้นมีการตรวจจับไฟล์ที่เป็นอันตรายหรือน่าสงสัย (เช่น adware, spyware, dual use tool หรือโปรแกรมที่มีโอกาสก่อให้เกิดเหตุการณ์ไม่พึงประสงค์ขึ้น) อยู่ครับ

ตั้งค่ากำหนด Resource ที่จะสแกน

ในหน้าตั้งค่าของ Malware Protection เราสามารถตั้งค่ากำหนด Resource ที่จะทำการสแกนได้ที่บริเวณ Scan options ครับ โดยการใช้ Tags เพื่อกำหนดเป้าหมายที่จะทำการสแกน หรือไม่ต้องทำการสแกนครับ

โดยตอนที่ทำการเพิ่ม Tags จะสามารถเลือก Tags ได้แค่ประเภทเดียวเท่านั้นครับ

เมื่อเลือกประเภทแล้วก็จะเข้ามาที่หน้าการตั้งค่าครับ โดยในขั้นตอนนี้การตั้งค่าจะยังไม่ถูกบันทึกครับ

ในขณะที่กำลังตั้งค่าอยู่จะสามารถเลือก Tags ประเภทไหนก็ได้ครับ แต่ตอนที่มีการเปลี่ยนประเภท Tags ที่สร้างไว้จะถูกเคลียร์ออกทั้งหมดครับ

ผมกำลังคิดอยู่ว่าจะมี policy ถูกเพิ่มเข้าไปให้แก่ Service-Linked Role เพื่อให้สอดคล้องกับการตั้งค่านี้ด้วยหรือเปล่าครับ

ส่วนรายละเอียดเพิ่มเติมเกี่ยวกับ Scan options สามารถดูได้ที่ User Guide นี้เลยครับ

ตั้งค่า IAM Role

ในการทำ Malware scans จะมีการสร้าง IAM Role ขึ้นมาใหม่นอกเหนือจาก Service-Linked Role ที่มีอยู่ก่อนแล้ว โดย IAM Role ที่สร้างขึ้นมาจะมีชื่อว่า AWSServiceRoleForAmazonGuardDutyMalwareProtection และมี managed policy AmazonGuardDutyMalwareProtectionServiceRolePolicy ติดเอาไว้ครับ

policy นี้จะรวมสิทธิ์ในการเข้าถึงเนื้อหาใน EBS snapshot, การสร้าง EBS snapshot, การใช้งาน KMS, รวมไปถึงการสร้าง logs ครับผม

ในกรณีที่ tag GuardDutyExcluded มีค่าเป็น true จะไม่สามารถสร้าง snapshot ได้ครับ

รองรับการใช้งานกับ EBS ที่ถูกเข้ารหัส

ฟังก์ชัน Malware scans สามารถทำงานกับ EBS ที่ถูกเข้ารหัสได้ครับ เพียงแต่เหมือนกับที่เขียนไว้ด้านบน คือจำเป็นจะต้องตั้งค่า KMS key policy ให้เหมาะสมด้วยครับ (หรือในทางกลับกัน เราก็สามารถใช้การตั้งค่า key policy มาบล็อกไม่ให้เกิดการสแกนได้ครับ)

และถึงแม้ว่า EBS ตัวต้นแบบไม่ได้ถูกเข้ารหัสเอาไว้ก็ตาม ตัว EBS Snapshot ที่ Malware scans สร้างขึ้นมาก็จะถูกเข้ารหัสเอาไว้ครับ โดยในกรณีนี้จะใช้ key แบบเฉพาะตัวในการเข้ารหัสครับ

การ Tracking ผ่าน CloudTrail

ฟังก์ชัน Malware scans จะใช้ IAM Role ที่เกี่ยวข้องกับการสแกนในการทำงาน ดังนั้นจึงสามารถทำการ Tracking ผ่าน CloudTrail ได้อย่างง่ายดายครับ

แค่ระบุคำค้นหาด้วย Username GuardDutyMalwareProtection ก็สามารถทำการ Tracking ได้แล้วครับ

การเชื่อม Multi-Account เข้ากับ Malware Protection

เมื่อเปิดใช้งานฟังก์ชันการจัดการ Multi-Account ของ GuardDuty ก็ยังสามารถใช้งาน Malware Protection ได้ครับ แถมยังสามารถตั้งค่าให้เปิดใช้งานเองอัตโนมัติได้ด้วยครับ

สำหรับบัญชีเดิมนั้น เนื่องจากจำเป็นต้องมี Service-Linked Role จึงไม่สามารถเปิดใช้งาน Malware Protection ได้ครับ แต่ก็มีวิธีแก้ด้วยการถอดการผูกบัญชีออกแล้วทำการผูกกลับเข้าไปใหม่อยู่ครับ (เป็นการแก้ปัญหาแบบ workaround) โดยรายละเอียดสามารถดูได้ที่นี่เลยครับ

สรุป

วันนี้ผมก็ได้มาทดลองใช้งาน GuardDuty Malware scans ครับ

ซึ่งก็เป็นฟังก์ชันที่ช่วยลดขั้นตอนการทำงานของผู้ใช้งานไปได้เปราะหนึ่งเลยครับ คงต้องบอกว่าสุดยอดไปเลยครับ

Malware Protection จะคิดค่าบริการตามปริมาณไฟล์ที่สแกนไป เพราะฉะนั้นก็คงไม่มีเหตุผลอะไรที่จะไม่เปิดใช้งานกันใช่ไหมล่ะครับ

บทความที่เกี่ยวข้อง