มา Secure AWS credentials บน local machine ด้วย aws-vault กัน

Raksit MANTANACHARU
NonTechCompany
Published in
3 min readMay 20, 2021
Épinglé par Cedric Tan sur Hilarious (pinterest.com)

ช่วงนี้มีโอกาสได้มาทำระบบที่ 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 ได้ตามนี้เลย

AWS credentials configuration
AWS profile configuration

ซึ่งปัญหาของการเก็บ 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 ต่างๆ มาใช้ได้ เช่น

ในบทความนี้ ผมจะใช้ aws-vaultในการ secure credentials ซึ่งทำงานกับ backend เช่น macOS Keychain Access หรือ Windows Credential Manager ได้

Installation

ติดตั้ง aws-vault ตาม README ได้เลยครับ

Usage

ขั้นแรกเราสร้าง vault ขึ้นมาจาก ACCESS_KEY_ID และ SECRET_ACCESS_KEY ก่อน

Adding a profile

ซึ่งการใช้งานครั้งแรก มันจะมี prompt ตาม backend ของเราขึ้นมาถามให้ใส่ password อันนี้เราต้องจำให้ได้เพราะตอนเราใช้งานมันจะเรียกถามทุกครั้ง

macOS KeyChain

จากนั้นลอง list มาดูว่า vault นี้ถูกสร้างหรือยัง

Listing all profiles

ถ้ามีแล้วก็เริ่มใช้งานผ่าน CLI ได้เลย

Using a profile

ซึ่งตัว 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 โผล่มาละ

Listing all profiles with active sessions

เราสามารถใช้งาน aws-vault กับ AWS CLI ตรงๆ ได้เลย

Using a profile with AWS CLI

หรือจะใช้กับ MFA ก็ได้เหมือนกัน

Using a profile with MFA

บาง operation ที่ไม่สามารถใช้ sts:GetSessionToken ได้ เช่น การสร้าง IAM role เราก็สามารถใช้ profile ที่ไม่มี session ก็ได้

Using a profile without a session

เนื่องจาก aws-vault มันทำงานกับ AWS profile ด้วย ดังนั้นเราสามารถ configure role หรือ MFA จาก $HOME/.aws/config ได้เลย โดยการตั้ง profile ชื่อตาม vault ของเรา ตัวอย่างเช่น

AWS profile configuration (alt.)

Summary

aws-vault เป็น tool ที่ช่วยเก็บ AWS credentials ที่ปลอดภัยกว่าเมื่อเทียบกับเก็บแบบ plain text ซึ่งสามารถทำงานร่วมกับ IAM, MFA, STS ได้

เข้าไปดูการใช้งานเต็มๆ ได้ที่นี่ครับ https://github.com/99designs/aws-vault/blob/master/USAGE.md

ลองนำไปใช้งานดูครับ เพิ่มความปลอดภัยให้ development เราได้เยอะครับ

References

--

--