رمزگذاری حجم EBS نمونه های آمازون EC2 با استفاده از پایتون

مقدمه
اطمینان از رعایت الزامات امنیتی سختگیرانه اغلب منجر به چالشهای غیرمنتظره میشود – در اینجا یکی از مواردی است که اخیراً به آن پرداختم. حساب مورد نظر دارای صدها نمونه EC2 با حجم های EBS است که با کلید مدیریت شده KMS AWS رمزگذاری شده است. aws/ebs
. به دلیل رعایت الزامات امنیتی سختگیرانه تر، کلید رمزگذاری باید هر 90 روز یکبار چرخانده شود. دوره پیشفرض چرخش یک ساله کلید مدیریتشده AWS دیگر کافی نیست، بنابراین تمام حجمهای نمونه EC2 باید با یک کلید مدیریتشده سفارشی (CMK) که کنترل بیشتری را فراهم میکند، دوباره رمزگذاری شوند.
با مهلت قریب الوقوع، رمزگذاری مجدد دستی تمام جلدهای EBS به سادگی امکان پذیر نبود. بنابراین من تصمیم گرفتم ابزار یا اسکریپتی را پیدا کنم که بتواند این کار دلهره آور را قبل از اینکه به توسعه خودم متوسل شوم (حتی اگر توسط هوش مصنوعی تولید شده باشد) خودکار کند. خوشبختانه من یک مخزن GitHub با یک اسکریپت پیدا کردم که 90٪ از نیازهای من را برآورده می کند و بعد از چند پیشرفت کامل شد. من می خواهم تجربه خود و اسکریپت حاصل را در این پست وبلاگ به اشتراک بگذارم تا به نفع هر سازنده ای باشد که با مشکل مشابه مواجه است. اجازه دهید ابتدا با بررسی گردش کار رمزگذاری، مرحله را تنظیم کنیم.
گردش کار رمزگذاری
رمزگذاری یا رمزگذاری مجدد یک حجم EBS که به یک نمونه EC2 متصل است، متأسفانه به سادگی تنظیم یک شناسه کلید KMS روی صدا نیست. این فرآیند کمی دوربرگردان است و شامل مراحل زیر است:
-
نمونه EC2 را خاموش کنید.
-
یک عکس فوری از حجم ایجاد کنید.
-
یک حجم جدید از عکس فوری ایجاد شده قبلی ایجاد کنید، در حالی که رمزگذاری را با کلید KMS جدید فعال کنید. اطمینان حاصل کنید که همان منطقه در دسترس بودن را با حجم اصلی انتخاب کرده اید و تنظیمات صدا را اعمال می کنید.
-
ولوم اصلی را از نمونه EC2 جدا کنید و در عین حال نام دستگاهی را که ولوم به آن وصل شده است یادداشت کنید.
-
ولوم جدید را با همان نام دستگاه فوق به نمونه EC2 وصل کنید.
-
مرحله 2 تا مرحله 6 را برای هر حجم اضافی که نمونه EC2 دارد تکرار کنید.
-
نمونه EC2 را راه اندازی کنید و بررسی کنید که به درستی اجرا می شود.
-
حجم های اصلی و عکس های فوری گرفته شده در طول این فرآیند را در صورت لزوم حذف کنید.
ملاحظات و بهترین روشها برای رمزگذاری Amazon EBS با گروههای مقیاس خودکار، نمونههای نقطهای و اشتراکگذاری عکس فوری وجود دارد، با این حال آنها برای سناریوی اصلی این پست وبلاگ مرتبط نیستند.
همانطور که می بینید، گردش کار کاملاً درگیر است و بنابراین کاندیدای عالی برای اتوماسیون می شود.
استفاده از یک اسکریپت موجود در GitHub
نیاز به رمزگذاری یا رمزگذاری مجدد حجم های EBS غیر معمول نیست، بنابراین تصور می کنم که شخصی ابزارها و اسکریپت هایی را برای آن ایجاد کرده است. در واقع، یک جستجوی سریع در گوگل سه گزینه ممکن را به همراه داشت:
-
dwbelliston/aws_volume_encryption – یک اسکریپت مبتنی بر پایتون که توسط داستین بلیستون توسعه یافته است که رمزگذاری حجم های EBS یک نمونه EC2 را هماهنگ می کند.
-
jbrt/ec2cryptomatic – ابزاری مبتنی بر Go است که توسط Julien B. بسیار شبیه به راه حل Python بالا است، اما با چند ویژگی کیفیت زندگی بیشتر.
-
aws-samples/aws-system-manager-automation-unencrypted-to-encrypted-resources – یک راه حل AWS که به طور خودکار منابع رمزگذاری نشده EBS و RDS را با استفاده از AWS Config و SSM Automation اصلاح می کند.
با توجه به اینکه Boto3 و Python بخشی از مجموعه ابزار ترجیحی من هستند، تصمیم گرفتم از راه حل aws_volume_encryption به عنوان نقطه شروع استفاده کنم. مخزن دارای یک فایل README است که به خوبی نوشته شده است که دستورالعملهای استفاده و توضیح دقیق در مورد کارهایی که هر بخش از کد انجام میدهد را ارائه میدهد. حتماً آن را بررسی کنید تا معماری و کاربرد کلی اسکریپت را درک کنید.
بهبود اسکریپت موجود
اگرچه اسکریپت اصلی سال ها پیش توسعه یافته است، اما کاملاً کاربردی است و قابلیت اطمینان آن را ثابت می کند. با این حال، من چند پیشرفت کوچک را شناسایی کردهام که میتوانند قابلیت استفاده از اسکریپت را بهبود بخشند:
-
به جای اضافه کردن گزینه های اضافی به اسکریپت، مکانیسم جستجوی اعتبار پیش فرض Boto3 را موکول کنید.
-
یک حجم رمزگذاری شده را مستقیماً از یک عکس فوری رمزگذاری شده ایجاد کنید.
-
اعتبار شناسه کلید KMS را اضافه کنید و از رمزگذاری جلدهایی که قبلاً با کلید KMS ارائه شده رمزگذاری شدهاند صرفنظر کنید. شناسه کلید KMS می تواند یکی از چهار فرمت پشتیبانی شده توسط API AWS باشد.
-
افزودن گزینه برای حفظ جلدهای اصلی و افزودن تگ های فراداده (پیشوند توسط
VolumeEncryptionMetadata:
) در صورت نیاز به بازگرداندن تغییرات حجم به آنها. -
ثبت گزارش کنسول را با مهر زمانی و جزئیات بیشتر بهبود دهید.
این پیشرفتها به من امکان میدهند فیلمنامه را به طور مؤثرتری آزمایش و محک بزنم، و سطح اطمینان بیشتری را هنگام کار بر روی حجمهای کاری تولید به من میدهند.
💡 می توانید کد منبع را در مخزن گیت هاب فورکی من که این پست وبلاگ را همراهی می کند بیابید.
اجرای اسکریپت
برای آزمایش اسکریپت، یک نمونه ویندوز EC2 با حجم ریشه رمزگذاری نشده و حجم داده ای که با استفاده از کلید مدیریت شده AWS رمزگذاری شده است ایجاد کنید:
هنگامی که نمونه EC2 اجرا شد، به ویندوز متصل شوید، جلد دوم را به عنوان درایو D: مقداردهی اولیه کنید و یک فایل متنی اضافه کنید تا بعداً به اعتبارسنجی کمک کنید.
سپس یک KMS CMK ایجاد کنید که برای رمزگذاری حجم های EBS نمونه EC2 استفاده می شود.
در نهایت، مخزن GitHub را کلون کنید یا فایل فشرده کد را دانلود کنید، سپس فایل README را دنبال کنید تا پیش نیازها از جمله Python 3.x و AWS CLI را تنظیم کنید. از آنجایی که اسکریپت به دنباله جستجوی اعتبارنامه های معمولی موکول می شود، می توانید از هر یک از روش های پشتیبانی شده استفاده کنید. معمولاً، یک نمایه را با AWS CLI پیکربندی میکنید و با استفاده از آن به آن مراجعه میکنید AWS_PROFILE
متغیر محیطی، یا از متغیرهای محیطی پرمخاطب تر از جمله استفاده می کنید AWS_ACCESS_KEY_ID
، AWS_SECRET_ACCESS_KEY
، و AWS_SESSION_TOKEN
. در هر صورت، مطمئن شوید که منطقه مورد نظر را در نمایه یا با استفاده از آن ارائه می کنید AWS_DEFAULT_REGION
متغیر محیطی
را اجرا کنید volume_encryption.py
اسکریپت در حالی که آرگومان های زیر را ارائه می کند:
-
-i
با شناسه نمونه EC2 هدف -
-k
با شناسه یا نام مستعار KMS CMK -
-p
برای حفظ حجم اصلی، که می تواند پس از تأیید اعتبار نمونه EC2 با حجم های جدید رمزگذاری شده، بررسی و حذف شود.
این دستوری است که مختص منابع من است:
python volume_encryption.py -i i-095dc6901ff37f71d -k 73d13a4a-b0b0-4ced-b82b-d86a78c89df0 -p
مدت زمانی که اسکریپت طول می کشد تا حد زیادی به اندازه حجم و وضعیت رمزگذاری حجم ها بستگی دارد. برای نمونه آزمایشی من با حجم رمزگذاری شده 30 گیگابایتی و حجم رمزگذاری شده 8 گیگابایتی، تکمیل آن کمی بیش از 6 دقیقه طول کشید. اگر بخواهم اسکریپت را دوباره با استفاده از کلید دیگری اجرا کنم، تکمیل آن بیش از 20 دقیقه طول می کشد، احتمالاً به این دلیل که رمزگذاری مجدد بیشتر طول می کشد. در هر صورت، گزارشهای کنسول شامل مُهرهای زمانی است که نشان میدهد هر مرحله چقدر طول میکشد.
$ python volume_encryption.py -i i-095dc6901ff37f71d -k 73d13a4a-b0b0-4ced-b82b-d86a78c89df0 -p
[2025-01-19T13:51:38.781614-05:00] Checking instance i-095dc6901ff37f71d
[2025-01-19T13:51:39.624892-05:00] Stopping instance i-095dc6901ff37f71d
[2025-01-19T13:52:55.908023-05:00] Create snapshot of volume vol-0c79ec8bde159fc7b (xvdb)
[2025-01-19T13:53:57.048132-05:00] Create encrypted volume from snapshot snap-0fb3ecd0eaf583f82
[2025-01-19T13:53:57.684619-05:00] Detach volume vol-0c79ec8bde159fc7b (xvdb)
[2025-01-19T13:53:58.048124-05:00] Attach volume vol-0ddb7f75257290d19 (xvdb)
[2025-01-19T13:54:13.966946-05:00] Create snapshot of volume vol-054b9017ef1f8f25c (/dev/sda1)
[2025-01-19T13:55:14.751392-05:00] Create encrypted volume from snapshot snap-0dac8c77e6e777d1a
[2025-01-19T13:55:15.271831-05:00] Detach volume vol-054b9017ef1f8f25c (/dev/sda1)
[2025-01-19T13:55:15.615831-05:00] Attach volume vol-01140d9f4c666a763 (/dev/sda1)
[2025-01-19T13:55:31.975440-05:00] Start instance i-095dc6901ff37f71d
[2025-01-19T13:55:48.251798-05:00] Clean up resources
[2025-01-19T13:55:48.252797-05:00] Delete snapshot snap-0fb3ecd0eaf583f82
[2025-01-19T13:55:48.438101-05:00] Skipping deletion of original volume vol-0c79ec8bde159fc7b (xvdb)
[2025-01-19T13:55:48.438101-05:00] Delete snapshot snap-0dac8c77e6e777d1a
[2025-01-19T13:55:48.614087-05:00] Skipping deletion of original volume vol-054b9017ef1f8f25c (/dev/sda1)
[2025-01-19T13:55:48.615090-05:00] Encryption finished
$
پس از تکمیل اسکریپت، بررسی کنید که حجم های EBS با کلید جدید KMS رمزگذاری شده باشند.
همچنین باید ببینید که جلدهای اصلی هنوز وجود دارند و تعدادی تگ ابرداده برای ردیابی توسط اسکریپت اضافه شده است. به شناسه های حجم اصلی از لاگ های کنسول اسکریپت توجه کنید (به عنوان مثال، vol-054b9017ef1f8f25c
شناسه حجم اصلی اصلی است).
در آخر، وارد نمونه EC2 شوید و مطمئن شوید که ویندوز طبق برنامه کار می کند D:\hello.txt
هنوز وجود دارد
با این حال، متوجه خواهید شد که نمونه EC2 به ظاهر کندتر از حد معمول است. این به این دلیل است که حجمهایی که از عکسهای فوری بازیابی میشوند، به طور کامل اولیه یا از قبل گرم نشدهاند. این بدان معناست که تنها زمانی که به بلوکی در حجم دسترسی پیدا میشود، از عکس فوری که در پشت صحنه در S3 ذخیره شده است، بارگذاری میشود، بنابراین تأخیر I/O افزایش مییابد. اگرچه این ممکن است در مورد موارد استفاده رایج مشکل بزرگی نباشد، برای موارد استفاده با نیازهای ورودی/خروجی دیسک بالا (مانند اجرای یک پایگاه داده)، ممکن است لازم باشد دیسک ها را به صورت دستی مقداردهی اولیه کنید.
خلاصه
با استفاده از این اسکریپت بهبودیافته، می توانید حجم های EBS هر نمونه EC2 را به راحتی (دوباره) رمزگذاری کنید. اگر حجمها را برای بسیاری از نمونهها رمزگذاری میکنید، میتوانید اسکریپت دیگری بنویسید که یک فایل CSV حاوی اطلاعات نمونه EC2 را میخواند و اجرا میکند. volume_encryption.py
در چندین نمونه به صورت موازی ابزارهای هوش مصنوعی مانند ChatGPT، Amazon Q Developer، یا GitHub Copilot میتوانند به راحتی یکی را برای شما ایجاد کنند، همانطور که من برای نیازهای خودم انجام دادم. این را به عنوان تمرینی برای مخاطبان می گذارم.
همانطور که می گویند پیشگیری بهتر از درمان است. اگر خطمشیهای امنیتی سازمان شما مستلزم این است که حجمهای EBS رمزگذاری شوند، بهطور پیشفرض از رمزگذاری آمازون EBS برای رمزگذاری خودکار هر جلد جدید EBS استفاده کنید.
این نشان می دهد که چگونه اتوماسیون و هوش مصنوعی مولد مهندسین DevOps را برای مقابله موثر با چالش های پیچیده توانمند می کند. امیدوارم این پست وبلاگ برای شما آموزنده و اسکریپت مفید باشد در صورت مواجه شدن با موقعیت های مشابه. اگر این مقاله را دوست دارید، لطفاً سایر پست های وبلاگ من را برای محتوای مفیدتر و جذاب تر در مورد AWS و DevOps بررسی کنید. از خواندن شما متشکرم و یک مورد عالی داشته باشید!