เช็ค Compliance ของ EC2 ด้วย Chef Inspec และ AWS Systems Manager
Check EC2 Compliance with Chef Inspec and AWS Systems Manager
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (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 บทความนี้ให้ผมด้วยนะครับ ขอบคุณมากครับ ^_^