اتو-اپلای امن ترافرم با conftest
خلاصهٔ کاملتر
نویسنده با یه مشکل آشنا شروع میکنه: تو جریان کاری ترافرم، یه نفر باید هر پلن رو ریویو و تأیید کنه تا اعمال بشه. تا یه حدی این کار جواب میده، ولی از یه سرعتی به بعد ریویوئر انسانی تبدیل به گلوگاه میشه؛ پلنها روی هم تلنبار میشن، مهندسها یا سرسری ردشون میکنن یا معطلشون میذارن، و در نتیجه هم سرعت و هم کیفیت ریویو افت میکنه.
اولین فکری که به ذهن میرسه سپردن ریویو به هوش مصنوعیه. نویسنده میگه AI میتونه ریویو رو تکمیل کنه، ولی نمیشه ریویوی زیرساخت تولیدی رو کاملاً بهش سپرد؛ سه دلیل: غیرقطعی بودن (یه پلن ممکنه امروز پاس بشه و فردا رد)، نقض الزامات ممیزی و انطباق که امضای انسانی با مسئولیت روشن میخوان، و مهمتر از همه اینکه مسئولیت رو از چرخهٔ بازخورد حذف میکنه و دیگه کسی صاحب تصمیم نیست.
راه سوم که نویسنده پیشنهاد میده، سنجش قطعی پلنها با policy-as-code هست. ابزارش conftest ـه که روی Open Policy Agent ساخته شده: تو سیاستها رو با زبان Rego مینویسی، بهش دادهی JSON میدی و بهت میگه داده با سیاست جور درمیاد یا نه. نکتهٔ کلیدی اینه که ترافرم میتونه پلنش رو بهصورت JSON خروجی بده؛ این فایل دقیقاً همون اطلاعاتیه که یه ریویوئر انسانی نگاه میکنه ولی تو قالبی که یه موتور سیاست میتونه بسنجه.
نویسنده یه نمونه سیاست ساده میذاره که فقط پلنهایی رو مجاز میدونه که هر تغییرش یا no-op باشه، یا ساخت یه منبع جدید، یا خوندن یه data source؛ هر update یا delete سیاست رو رد میکنه:
package main
import rego.v1
safe_actions := {"no-op", "create", "read"}
deny contains msg if {
some resource_change in input.resource_changes
some action in resource_change.change.actions
not action in safe_actions
msg := sprintf(
"resource %q has action %q, which is not in the safe set %v",
[resource_change.address, action, safe_actions],
)
}سیاست روی هر ورودی resource_changes میچرخه و چک میکنه همهٔ اکشنهاش تو مجموعهٔ امن باشن؛ اگه نباشه، یه پیام رد با اسم منبع و اکشن خاطی برمیگردونه. اگه این سیاست پاس بشه، پلن فقط منبع جدید میسازه یا data source میخونه، پس امنه که خودکار اعمال بشه؛ اگه رد بشه، پایپلاین وایمیسته و یه آدم ریویو میکنه.
وصلکردنش به CI/CD هم سادهست: بعد از پلن، خروجی رو به JSON میگیری، conftest رو اجرا میکنی و بسته به نتیجه یا terraform apply میزنی یا برای تأیید انسانی گیت میذاری. به گفتهٔ نویسنده چیزی که این روش رو خوب میکنه اینه که مرز تصمیم صریحـه؛ دیگه از کسی نمیپرسی پلن «امن به نظر میرسه یا نه»، بلکه چک میکنی قوانینی که خودت تعریف و تست و نسخهبندی کردی رو برآورده میکنه یا نه.
نویسنده نشون میده سیاست رو میشه غنیتر کرد: گیتگذاشتن بر اساس نوع منبع (مثلاً RDS و IAM همیشه دستی، CloudWatch خودکار)، بر اساس فیلدهای تغییرکرده (مثلاً فقط تغییر tags مجاز باشه)، بر اساس شعاع انفجار (تعداد منابع تغییرکرده از یه آستانه بیشتر نشه) و بر اساس محیط (تو staging خودکار، تو production دستی). این قوانین با هم ترکیب میشن و پلن باید همهشون رو پاس کنه. نویسنده تأکید میکنه هرچی AI agentها رو بیشتر وارد چرخهٔ توسعه کنی، داشتن یه راه قطعی برای تأیید امنیت پلن مهمتر میشه.
نکات کلیدی:
- ریویوئر انسانی از یه حدی به بعد گلوگاه میشه و سپردن کامل ریویو به AI بهخاطر غیرقطعی بودن و الزامات ممیزی جواب نمیده
- ترافرم میتونه پلنش رو به JSON خروجی بده که حاوی همهٔ تغییرات منابعه
- conftest با سیاستهای Rego این JSON رو بهصورت قطعی میسنجه
- تصمیم نهایی قابلممیزی، تستپذیر و تکرارپذیره
- سیاست رو میشه بر اساس نوع منبع، فیلدها، شعاع انفجار و محیط غنیتر کرد




