มา Secure AWS credentials บน local machine ด้วย aws-vault กัน
ช่วงนี้มีโอกาสได้มาทำระบบที่ provision อยู่บน Amazon Web Services (AWS) แน่นอนว่าเวลาเราได้แตะส่วน Authentication เพื่อเข้าไป operate กับ AWS resource ต่างๆ ผ่าน CLI นั้น เราจะต้องเก็บ access key และ profile configuration ไว้ด้วย มาดูกันว่า aws-vault จะสามารถช่วยให้เราเก็บ AWS credentials อย่างปลอดภัยได้อย่างไร
Problem statements
ปกติ เราสามารถตั้งค่า credentials และ profile ผ่าน $HOME/.aws/credentials
และ $HOME/.aws/config
ได้ตามนี้เลย
ซึ่งปัญหาของการเก็บ credentials คือเรื่อง security ครับ ซึ่งตาม blog ของ 99designs ระบุว่า access key ของเราสามารถถูกโจมตีได้ไว้ 4 scenario ด้วยกัน
1. ขโมยตรงๆ จากคอมเจ้าของเครื่องเลย
2. ขโมยผ่าน Malware
3. ขโมยจาก credentials ที่เจ้าของเผลอเอาขึ้น public repository ไป (จะเรียกว่า “แจก” เลยก็ได้นะ ฮ่าๆๆ)
4. ขโมยจากคอมของคนที่ลาออกไปแล้ว (?) ซึ่ง credentials ยังไม่ได้ถูกถอนคืน (revoke)
Possible solutions
จากปัญหาข้างต้น ทาง AWS ได้มี Best practices สำหรับจัดการ access key ของเราไว้คร่าวๆ ประมาณนี้
1. แต่ละทีมควรจะมี AWS account หรือ role แยกกัน ซึ่งมี permission ที่จำกัด เช่น ส่วนของการ access resource กับ provision infrastructure
2. มีคนหรือทีมที่ช่วยจัดการ AWS user โดยเฉพาะเลย และควรจะเปลี่ยน key อยู่เรื่อยๆ
3. ควรจะมี Multi-factor authentication สำหรับ credentials ที่ไม่ได้อยู่ในเครื่องเรา
4. ไม่ควรเก็บ credentials ไว้เป็น plain text
Apply tools
จากวิธีแก้ปัญหา เราสามารถนำ tool ต่างๆ มาใช้ได้ เช่น
- Identity and Access Management role (IAM role)
- Multi-factor authentication device (MFA)
- Security Token Service (STS) ซึ่งทำงานร่วมกับ
AssumeRole
ได้
ในบทความนี้ ผมจะใช้ aws-vault
ในการ secure credentials ซึ่งทำงานกับ backend เช่น macOS Keychain Access หรือ Windows Credential Manager ได้
Installation
ติดตั้ง aws-vault
ตาม README ได้เลยครับ
Usage
ขั้นแรกเราสร้าง vault ขึ้นมาจาก ACCESS_KEY_ID
และ SECRET_ACCESS_KEY
ก่อน
ซึ่งการใช้งานครั้งแรก มันจะมี prompt ตาม backend ของเราขึ้นมาถามให้ใส่ password อันนี้เราต้องจำให้ได้เพราะตอนเราใช้งานมันจะเรียกถามทุกครั้ง
จากนั้นลอง list มาดูว่า vault นี้ถูกสร้างหรือยัง
ถ้ามีแล้วก็เริ่มใช้งานผ่าน CLI ได้เลย
ซึ่งตัว aws-vault
มันจะไป set environment variable ให้เราเองเลย สังเกตว่า AWS_ACCESS_KEY_ID
กับ AWS_SECRET_ACCESS_KEY
ไม่เหมือนกับที่เราตั้งไว้เนื่องจาก aws-vault
ใช้ STS ในการสร้าง credentials ชั่วคราว ด้วย AssumeRole
API ดังนั้น user ของเราต้องมี permission sts:GetSessionToken
กับ sts:AssumeRole
ด้วยนะ
ถ้าเราลอง list มาดูอีกที จะสังเกตว่ามีส่วนของ session โผล่มาละ
เราสามารถใช้งาน aws-vault
กับ AWS CLI ตรงๆ ได้เลย
หรือจะใช้กับ MFA ก็ได้เหมือนกัน
บาง operation ที่ไม่สามารถใช้ sts:GetSessionToken
ได้ เช่น การสร้าง IAM role เราก็สามารถใช้ profile ที่ไม่มี session ก็ได้
เนื่องจาก aws-vault
มันทำงานกับ AWS profile ด้วย ดังนั้นเราสามารถ configure role หรือ MFA จาก $HOME/.aws/config
ได้เลย โดยการตั้ง profile ชื่อตาม vault ของเรา ตัวอย่างเช่น
Summary
aws-vault
เป็น tool ที่ช่วยเก็บ AWS credentials ที่ปลอดภัยกว่าเมื่อเทียบกับเก็บแบบ plain text ซึ่งสามารถทำงานร่วมกับ IAM, MFA, STS ได้
เข้าไปดูการใช้งานเต็มๆ ได้ที่นี่ครับ https://github.com/99designs/aws-vault/blob/master/USAGE.md
ลองนำไปใช้งานดูครับ เพิ่มความปลอดภัยให้ development เราได้เยอะครับ