WIUNIX ACADEMY
چرخش کلید در SOPS و age؛ گیرنده، کلید داده و دسترسی بازیابی
صفحهٔ 3 از 4؛ قبل از ادامه، مراحل قبلی و چیزهایی رو که لازم داری مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخهٔ سرورت رو انتخاب کن تا مراحل، دستورها و راهحلهای همون محیط رو ببینی.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه رو با مشخصات سرورت عوض کن تا متن و دستورها با هم تغییر کنن. رمز، کلید خصوصی و توکن اینجا وارد نکن. مقدارها فقط توی همین زبانه میمونن و به سرور یا لینک اشتراکگذاری فرستاده نمیشن. قبل از اجرا، DNS، گواهیها و تنظیمات دسترسی شبکه رو روی سرورت بررسی کن.
اگر آیپی، دامنه یا پورتهای نمونه با سرورت فرق دارن، بخش تنظیمات پایین رو باز کن. مقدارها رو عوض کن و «اعمال در آموزش» رو بزن؛ بعد دستورهای تازه رو کپی کن.
تنظیم مقادیر برای محیط من2 مقدار قابلتغییر
قدم بعدی
قبل از کنارگذاشتن کلید، دسترسی جدید و بازیابی رو ثابت کنیم
هر identity رو مستقل روی همان نسخهٔ تازهٔ فایل امتحان میکنیم و یک نسخهٔ رمزشده با دسترسی همزمان نگه میداریم. موفقیت از شلی که ممکنه کلید دیگری رو پیدا کرده باشه کافی نیست. digest فایلها فقط مشخص میکنه کدام نسخهٔ رمزشده بررسی شده؛ عوضشدن بایتها بهتنهایی مجوز یا محتوای درست رو ثابت نمیکنه.
در مهاجرت واقعی، این فاصلهٔ همپوشانی باید همهٔ مصرفکنندههای استقرار و CI و یک راه بازیابی مستقل رو پوشش بده. اینکه حساب انسانی روی لپتاپ رمزگشایی کرده ثابت نمیکنه حساب سرویس، توکن سختافزاری یا میزبان بازیابی هم identity جدید رو میتونه استفاده کنه.
همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا
with_identity "$lab/keys/old.txt" decrypt --output /dev/null "$doc.enc.yaml" || exit 1
with_identity "$lab/keys/new.txt" decrypt --output /dev/null "$doc.enc.yaml" || exit 1
with_identity "$lab/keys/recovery.txt" decrypt --output /dev/null "$doc.enc.yaml" || exit 1
cp -- "$doc.enc.yaml" "$lab/dual-recipient.enc.yaml" || exit 1
sha256sum "$lab/before-old.enc.yaml" "$lab/dual-recipient.enc.yaml"قدیمی و جدید و بازیابی هرکدوم مستقل فایل دارای سه گیرنده رو باز میکنن؛ هنوز هیچ کلید خصوصی کنار گذاشته نشده.
قدم بعدی
پوشش قدیمی رو حذف کنیم و کلید داده رو بچرخونیم
در همین تمرین، سیاست رو به جدید و بازیابی عوض کن، نتیجه رو بخون و updatekeys رو با identity جدیدِ قبلاً امتحانشده اجرا کن. بعد کلید دادهٔ همان فایل فعلی رو با rotate تازه میکنیم. همهٔ گزینهها قبل از اسم فایل میمونن و خطای هرکدام یعنی توقف.
اگر گیرندهٔ قدیمی ممکنه کلید دادهٔ قبلی رو دیده باشه، فقط حذف پوشش او کافی نیست. چرخش به فایل فعلی کلید دادهٔ تازه میده، ولی متن بازی که قبلاً کپی شده یا snapshot رمزشدهٔ قدیمی رو پاک نمیکنه. این پنل رمز یا توکن API هیچ برنامهای رو تغییر نمیده.
همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا
cd "$lab/work" || exit 1
cat > .sops.yaml <<POLICY
creation_rules:
- path_regex: ^rotation-demo\.enc\.yaml$
age:
- $new_recipient
- $recovery_recipient
POLICY
cat .sops.yaml
with_identity "$lab/keys/new.txt" --config "$lab/work/.sops.yaml" updatekeys "$doc.enc.yaml" || exit 1
with_identity "$lab/keys/new.txt" rotate --in-place "$doc.enc.yaml" || exit 1فایل فعلی فقط پوشش جدید و بازیابی و یک کلید دادهٔ تازه داره.
قدم بعدی
دسترسی فعلی و محدودیت تاریخچه رو جدا بسنجیم
اول مطمئن میشیم جدید و بازیابی هنوز فایل فعلی رو باز میکنن. بعد قدیمی رو روی نسخهٔ رمزشدهٔ اولیه امتحان میکنیم تا شکست روی فایل فعلی فقط از خراببودن تنظیم کلید قدیمی نباشه. در آخر میسنجیم مسیر معمول رمزگشایی SOPS با قدیمیِ تنها، پوششهای فایل فعلی رو باز نمیکنه.
موفقیت قدیمی روی فایل قدیمی همان محدودیت مهم ماست: کنارگذاشتن کلید، نسخههای قبلیِ دیگران رو پس نمیگیره. آزمون منفی فقط مسیر دسترسی فایل فعلی رو میسنجه، نه هر کلید داده یا متن بازی که قبلاً حفظ شده. قبل از کنارگذاشتن identity واقعی، نسخهٔ نهایی رمزشده، شواهد مصرفکنندهها و تصمیم نگهداری بازیابی رو ثبت کن.
همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا
with_identity "$lab/keys/new.txt" decrypt --output /dev/null "$doc.enc.yaml" || exit 1
with_identity "$lab/keys/recovery.txt" decrypt --output /dev/null "$doc.enc.yaml" || exit 1
with_identity "$lab/keys/old.txt" decrypt --output /dev/null "$lab/before-old.enc.yaml" || exit 1
if with_identity "$lab/keys/old.txt" decrypt --output /dev/null "$doc.enc.yaml"; then
printf '%s\n' 'STOP: old identity unexpectedly opens the current file.'
exit 1
else
printf '%s\n' 'Old identity cannot open current wrappers; historical ciphertext still opens.'
fi
cp -- "$doc.enc.yaml" "$lab/final-new.enc.yaml" || exit 1جدید و بازیابی فایل فعلی رو باز میکنن، قدیمی نسخهٔ اولیه رو باز میکنه و قدیمیِ تنها روی پوششهای فعلی ناموفق میمونه.
برای تمامکردن چرخش، اعتبارسنجی رو دور نزنیم
فقط بررسی متناسب با همین تمرین خصوصی رو انجام بده. خطا و نسخهٔ قابلبازیابی رو نگه دار؛ identity خصوصی، محتوای بازشده یا لاگ بیحد رو منتشر نکن. خطای MAC یعنی توقف، نه اضافهکردن ignore-mac.
identity جدید نسخهٔ دارای سه گیرنده رو باز نمیکنه
مسیر دقیق ابزار خصوصی، فایل تمرین و recipient عمومیِ مشتقشده رو ببین. سیاست عمومی رو محلی بخون و فقط وقتی پیشنهاد تغییر گیرندهها روشن شد، همان updatekeys انتخابی رو تکرار کن. ویرایش سیاست بهتنهایی فایل رمزشده رو مهاجرت نداده.
"$keygen_bin" -y "$lab/keys/new.txt"
cat "$lab/work/.sops.yaml"
"$sops_bin" filestatus "$lab/work/$doc.enc.yaml"کلید قدیمی برخلاف انتظار فایل نهایی رو باز میکنه
کنارگذاشتن کلید رو متوقف کن. تابع کنترلشده، نسخهٔ نهایی فایل و نبودن گیرنده یا منبع کلید اضافی رو بررسی کن. در شل تازه باید تابع و متغیرهای بخش قبل دوباره بارگذاری بشن؛ این رو به جستوجوی گستردهٔ کلید خصوصی تبدیل نکن.
type with_identity
sha256sum "$lab/work/$doc.enc.yaml" "$lab/final-new.enc.yaml"
"$keygen_bin" -y "$lab/keys/old.txt"قانون ایجاد منطبق پیدا نمیشه یا فرمت اشتباهه
نام دقیق سند، پسوند YAML و config صریح رو مقایسه کن. تمرین یک قانون ساده نسبت به پوشهٔ همان config داره. برای مطابقشدن نمونه، قانون پروژهٔ واقعی رو بازتر نکن؛ مسیر و فرمت بخشی از قرارداد سند هستن.
pwd
ls -l -- "$lab/work/$doc.enc.yaml" "$lab/work/.sops.yaml"
cat "$lab/work/.sops.yaml"بازیابی یا بررسی MAC خطا میده
فایل رمزشده و مسئول نگهداری identity رو حفظ کن. نسخهٔ تأییدشده رو با identity مجاز بازیابی و MAC عادی امتحان کن. شکست این بررسی یعنی آخرین identity کارکننده رو کنار نذار؛ اول جفت دقیق فایل و کلید رو پیدا کن.
with_identity "$lab/keys/recovery.txt" decrypt --output /dev/null "$lab/dual-recipient.enc.yaml"فایل اجرایی خصوصی تأیید شده اما اجرا نمیشه
گزینههای mount، مجوز فایل و معماری واقعی رو ببین. noexec یا منع سیاست میزبان با خطای checksum فرق داره. یک محل اجرای تازه و مصوب انتخاب کن یا منع مشخص رو با مسئول میزبان حل کن؛ mount رو بیبرنامه عوض نکن، مسیر سیستم رو دوباره برچسب نزن و حفاظت رو خاموش نکن.
findmnt --target "$lab" -o TARGET,SOURCE,FSTYPE,OPTIONS
stat -c '%a %n' "$lab/bin/sops" "$lab/bin/age" "$lab/bin/age-keygen"
uname -mقدم بعدی
اختیاری؛ تمرین رو به نسخهٔ دارای دسترسی همزمان برگردونیم
این برگشت اختیاری عمداً دسترسی گیرندهٔ قدیمی رو در آزمایش دوباره میاره. فقط برای تمرین مهاجرت عادی انجامش بده، نه بهعنوان واکنش خودکار به افشای کلید. قبل از کپیکردن روی فایل فعلی همین تمرین، بازیابی نسخهٔ ذخیرهشده رو تأیید کن.
فایل سیاست جدید هنوز هدف مهاجرت رو میگه؛ برگرداندن ciphertext قدیمی سیاست رو با آن هماهنگ نمیکنه. یا مرحلههای روبهجلو رو دوباره با بررسی انجام بده، یا آزمایش رو صریح در حالت برگشته نگه دار. آن رو کنارگذاری کامل کلید production گزارش نکن.
همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا
test -f "$lab/dual-recipient.enc.yaml" || exit 1
with_identity "$lab/keys/recovery.txt" decrypt --output /dev/null "$lab/dual-recipient.enc.yaml" || exit 1
cp -- "$lab/dual-recipient.enc.yaml" "$lab/work/$doc.enc.yaml" || exit 1
with_identity "$lab/keys/old.txt" decrypt --output /dev/null "$lab/work/$doc.enc.yaml" || exit 1
with_identity "$lab/keys/new.txt" decrypt --output /dev/null "$lab/work/$doc.enc.yaml" || exit 1تمرین خصوصی عمداً به نسخهٔ تأییدشدهٔ دارای دسترسی قدیمی و جدید برگشته و همین وضعیت برگشت ثبت شده.
وقتی مصرفکننده و بکاپ آمادهاند، سراغ نگهداری کلید برو
برای فایل واقعی، نسخههای رمزشده، گیرندههای مجاز، وابستگی key group یا KMS، مصرفکنندهٔ استقرار، مدت نگهداری بکاپ و مسئول بازیابی رو دقیق فهرست کن. این تمرین سادهٔ تکگروهی age جای بازنویسی آمادهٔ پروژهٔ ترکیبی KMS و Shamir نیست. اول یک فایل مصوب رو تمرین کن، از ویرایش همزمان محافظت کن و بعد روال بررسی و استقرار مخزن مالک رو دنبال کن.
بعد از پذیرش مصرفکننده و بازیابی، توزیع identity خصوصی قدیمی رو از مسیر واقعی secret store، CI یا دسترسی کاربر متوقف کن. فقط اگر سیاست نگهداری لازم میدونه و خطرش روشنه، کپی بازیابیِ کنترلشده رو حفظ کن. حذف از یک لپتاپ یا بازنویسی تاریخچهٔ Git نسخههای دیگران رو پس نمیگیره. ciphertext قدیمی در تاریخچه، بکاپ، artifact یا clone دیگر ممکنه همچنان قابل رمزگشایی باشه.
اگر identity یا متن باز افشا شده، خود رازها رو هم در سرویسشان عوض کن، اعتبارنامهٔ قبلی رو لغو کن، مصرفکنندهها رو بهروز کن و افشای تاریخی رو از مسیر رخداد بررسی کن. identity تازه و کلید دادهٔ تازه، رمزی رو که قبلاً شناخته شده دوباره ناشناخته نمیکنن.