เช็ค Compliance ของ EC2 ด้วย Chef Inspec และ AWS Systems Manager

Check EC2 Compliance with Chef Inspec and AWS Systems Manager

Nopnithi Khaokaew (Game)
3 min readSep 24, 2021

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

ถ้าเราต้อง Manage EC2 หลายเครื่อง เราจะมีวิธีตรวจสอบยังไงว่าเครื่องไหนยังไม่ได้ติดตั้ง Antivirus บ้าง? ใช่ครับ มันคือการทำ Compliance นั่นเอง

Chef Inspec คืออะไร

Chef Inspec คือ Framework ของ Chef ที่ใช้ในการทำ Test หรือ Audit Application หรือ Infrastructure ว่ามี State เป็นไปตามที่เราต้องการมั้ย ซึ่งเค้า Provide DSL มาให้เราสามารถเขียน Compliance ได้ง่าย

เช่น ถ้าผมต้องการเช็คว่า Server มีการ Enable และรัน Apache อยู่หรือไม่

control 'apache-1' do
impact 'medium'
title 'Apache2 should be configured and running'
describe service(apache.service) do
it { should be_enabled }
it { should be_running }
end
end

เช็คว่ามี Folder/Directory อยู่หรือป่าว

control 'basic-1' do
impact 1.0
title '/etc/ssh should be a directory'
desc '
In order for OpenSSH to function correctly, its
configuration path must be a folder.
'
describe file('/etc/ssh') do
it { should be_directory }
end
end

ทีนี้จะเขียนอะไรก็สุดแท้แต่เราละ ลองดู Document เพิ่มเติมที่นี่

ซึ่งผมจะใช้ Chef Inspec คู่กับ AWS Systems Manager (SSM) นะครับ

ขั้นตอนการ Setup

1. EC2 จะต้องถูก Manage โดย SSM ก่อน

ถ้าเอาง่ายก็ใช้ Quick Setup (Host Management) เลย ซึ่งสามารถทำตาม Document ได้ที่นี่ → คลิกเลย

2. เพิ่ม Policy ในการอ่าน S3

เดี๋ยว EC2 ของเราจะต้องไปดาวน์โหลดไฟล์ Inspec มาจาก S3 (เลือก Git แทนได้)

ก็ให้เพิ่ม Policy เข้าไปด้วย ผม Setup Inventory ด้วย Quick Setup ก็จะต้องไปเพิ่ม Policy AmazonS3ReadOnlyAccessใต้ Role AmazonSSMRoleForInstancesQuickSetup หรือจะกำหนดให้มัน Specific มากกว่านี้ก็ได้นะครับ

3. สร้าง S3 Bucket

ก็ให้เราสร้าง S3 Bucket ขึ้นมา จากนั้นอัพโหลดไฟล์ Inspec (chef_inspec.rb) ขึ้นไป

ตัวอย่างไฟล์ chef_inspec.rb

control 'check-crowdstrike' do
impact 'high'
title 'CrowdStrike should be installed and running'
describe file('C:\Program Files\CrowdStrike\CSFalconService.exe') do
it { should exist }
end
describe service('CSFalconService') do
it { should be_installed }
it { should be_enabled }
it { should be_running }
end
describe port(443) do
it { should be_listening }
end
end
  • ต้องมี File ที่ C:\Program Files\CrowdStrike\CSFalconService.exe
  • CSFalconService ต้องถูก Install, Enable และรันอยู่
  • ต้องเปิด Port 443 ด้วย

จากนั้น Copy Object URL ไว้

มาใส่ใน Pattern นี้ (แทน XXX) แล้วเก็บไว้ก่อน

{"path":"XXX"}

จะได้ประมาณนี้

{"path":"https://<your-bucket-name>.ap-southeast-1.amazonaws.com/chef_inspec.rb"}

ที่จริงใช้ GitHub แทนได้นะครับสำหรับคนที่อยากได้ Benefits จาก Version Control

4. สร้าง Association ใต้ State Manager

เข้าไปที่ SSM → State Manager → Create association

  • Name: RunInSpecChecks
  • Document: AWS-RunInspecChecks
  • Source Type: S3
  • Source Info: ใส่ Pattern ที่เตรียมไว้จากข้อที่แล้ว
  • Targets: เลือกตามที่สะดวกว่าจะ Apply กับ EC2 ตัวไหนบ้าง ผมใช้เป็น Tags
  • Specify schedule: ผมเลือกเป็น Daily เวลา 01:00

ตี 1 ของทุกวัน SSM จะรัน Script เพื่อไปดาวน์โหลดไฟล์ Inspec ที่เราเขียนเก็บไว้ใน S3 นำมารัน Chef Inspec เพื่อเช็ค Compliance โดยจะรันบน EC2 ทุกตัวที่เรากำหนดไว้ใน Targets

5. ลองเช็ค Compliance

เข้าไปที่ SSM → Compliance

กรอบสีแดงคือ Compliance ที่เราเช็คจาก Chef Inspec ที่เราเขียนขึ้นมา ซึ่งยังสามารถกดตรงกรอบสีเขียวเพื่อดูรายละเอียดเพิ่มได้ว่ามี EC2 กี่เครื่องที่เป็น Non-compliant

ตรงกรอบสีน้ำเงินสามารถคลิกไปดู Compliance แต่ละเครื่องเพื่อดูได้ว่ามี Topic อะไร Compliant หรือ Non-compliant บ้าง เช่น

นั่นแปลว่าเครื่องดังกล่าวมีการติดตั้ง CrowdStrike แล้วตามที่ผมเขียนเช็คไว้

แต่ก็ยังมีส่วนที่เป็น Non-Compliant ด้วยเพราะ Port 443 ยังไม่ถูกเปิดนั่นเอง

วิธีแก้ปัญหาต่าง ๆ ที่อาจเจอ (คร่าว ๆ)

  • EC2 ที่อยู่ใน Private Subnet จะไม่สามารถใช้งาน SSM ได้ แก้ปัญหาโดยสร้าง VPC Endpoint เอา หรือจะทำเป็น NAT Gateway ก็ได้
  • ใครมี Landing Zone เพื่อทำ Centralized Network ไว้อาจจะติดที่ Firewall ด้วยนะครับ ไปไล่ Monitor และ Allow ด้วย (Script มันจะมีการดาวน์โหลด PowerShell Script กับ Chef Inspec มาติดตั้งหนะ)
  • ผมเจอปัญหาว่า Windows Server 2008 จะติดตั้ง Chef Inspec ไม่สำเร็จนะ แต่ยังไม่ได้ไล่ Troubleshoot ต่อ (พักก่อน กลัวจะต้องทำ Custom Document เอง)
  • ติดปัญหาไล่จาก Link นี้ก่อนเลย → https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-prereqs.html

ถ้าคิดว่าบทความนี้มีประโยชน์ ฝากกด clap, follow และ share บทความนี้ให้ผมด้วยนะครับ ขอบคุณมากครับ ^_^

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

Cloud Solutions Architect & Hobbyist Developer | 6x AWS Certified, CKA, CKAD, 2x HashiCorp Certified (Terraform, Vault), etc.

No responses yet