WIUNIX ACADEMY
چرخش کلید در SOPS و age؛ گیرنده، کلید داده و دسترسی بازیابی
مهاجرت مرحلهای گیرندهٔ age رو تمرین میکنیم، دسترسی جدید و بازیابی رو جدا میسنجیم و فرق rewrap و چرخش کلید داده رو میبینیم؛ بدون ادعای پسگرفتن نسخههای قدیمی.
محیطت رو انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخهٔ سرورت رو انتخاب کن تا مراحل، دستورها و راهحلهای همون محیط رو ببینی.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه رو با مشخصات سرورت عوض کن تا متن و دستورها با هم تغییر کنن. رمز، کلید خصوصی و توکن اینجا وارد نکن. مقدارها فقط توی همین زبانه میمونن و به سرور یا لینک اشتراکگذاری فرستاده نمیشن. قبل از اجرا، DNS، گواهیها و تنظیمات دسترسی شبکه رو روی سرورت بررسی کن.
اگر آیپی، دامنه یا پورتهای نمونه با سرورت فرق دارن، بخش تنظیمات پایین رو باز کن. مقدارها رو عوض کن و «اعمال در آموزش» رو بزن؛ بعد دستورهای تازه رو کپی کن.
تنظیم مقادیر برای محیط من2 مقدار قابلتغییر
از اینجا شروع کن
آخر این آموزش چی خواهیم داشت؟
مهاجرت مرحلهای گیرندهٔ age رو تمرین میکنیم، دسترسی جدید و بازیابی رو جدا میسنجیم و فرق rewrap و چرخش کلید داده رو میبینیم؛ بدون ادعای پسگرفتن نسخههای قدیمی.
سیستمعاملها و نسخههای پوششدادهشده
مسیرهای آمادهسازی Ubuntu 26.10/26.04/24.04، Debian 13/12، خانوادهٔ RHEL/Rocky/AlmaLinux 10/9 و Arch/Manjaro rolling با مستندات در ۲۰۲۶-۱۱-۰۵ بررسی شدن. باینری خصوصیِ SOPS 3.13.3 و age 1.3.2 برای Linux x86_64/aarch64 و verifier معتبر موجود لازم است؛ اجرای ساخت کلید و رمزگشایی روی همهٔ محیطها ادعا نشده.
قبل از شروع
- محیط مدیریت آزمایشی جدا، حساب عادی Bash، مسیر خصوصی تازه بیرون Git و اینترنت مجاز برای artifactهای عمومی.
- Cosign و sigsum-verify مورد اعتماد از قبل، همراه سیاست sigsum-generic-2025-1 و کلید عمومی ناشر تأییدشده.
- ابزار پایهٔ curl، CA، coreutils، tar و Git؛ آمادهسازی بسته فقط در زمان مصوب آزمایش.
- فقط مقدار عمومیِ تمرین؛ هیچ راز واقعی، KMS/plugin/SSH recipient یا اتصال به مصرفکنندهٔ production وارد نمونه نمیشه.
اول معلوم کنیم کدوم کلید رو میچرخونیم
SOPS مقدارهای فایل رو با یک کلید داده رمز میکنه و نسخهٔ رمزشدهٔ همان کلید رو برای گیرندههای مجاز نگه میداره. در age، recipient عمومی است و identity متناظر با آن خصوصی. عوضکردن فهرست گیرندهها، ساخت کلید دادهٔ تازه و جایگزینی identity سه کار جدا هستن.
اینجا با identityهای تازه و یک مقدار YAML عمداً غیرمحرمانه، مهاجرت از گیرندهٔ قدیمی به جدید رو تمرین میکنیم و یک گیرندهٔ بازیابی هم نگه میداریم. نه راز واقعی لازم داریم و نه استقرار روی production. تمرین بیرون Git میمونه و کلید خصوصی داخل فرم مرورگر، آرگومان فرمان یا پنل متنیِ قابلانتشار نمیره.
updatekeys پوششهای رمزشدهٔ کلید داده رو با سیاست انتخابشده عوض میکنه، اما خود کلید داده رو تازه نمیکنه. rotate کلید دادهٔ تازه میسازه و مقدارها رو دوباره رمز میکنه. هیچکدوم دسترسی به نسخهٔ قدیمی فایل، کلید داده یا متن بازی رو که کسی قبلاً نگه داشته پس نمیگیرن. اگر رمز یا توکن برنامه لو رفته، آن رو باید در خود سرویس صادرکننده هم عوض کنی.
فقط نامهای عمومیِ تمرین رو در فرم بذار
در فرم، یک مسیر مطلق تازه برای تمرین و یک نام کوتاه برای سند انتخاب و اعمال کن. پوشه نباید وجود داشته باشه یا داخل working tree یک مخزن Git قرار بگیره. نام سند، اسم فایل رمزشده و قانون متناظر رو با هم عوض میکنه؛ اسم مشتری یا راز رو جای این مقدار نمونه نذار.
recipient کلید عمومی است، ولی باز هم باید از صاحب درستش و مسیر تأییدشده دریافت بشه. این فرم عمداً کلید نمیگیره. در تمرین، کلیدهای عمومی رو روی همان میزبان از فایلهای خصوصی تازه به دست میآریم؛ در کار واقعی، هویت صاحب کلید و مسئول بازیابی رو با روال محافظتشدهٔ تیم تأیید کن. مقدار ذخیرهشده در تب، مجوز دسترسی نیست.
قدم بعدی
ابزارهای توزیع و verifierهای معتبر رو بشناسیم
روی یک محیط مدیریت آزمایشی و با حساب عادی Bash کار کن. فایل اجرایی SOPS و age رو داخل همین تمرین با نسخهٔ مشخص میذاریم تا بستهٔ موجود سیستم یا فایل دیگری در PATH بیصدا جایگزین نشه. نسخههای بررسیشده در ۲۰۲۶-۱۱-۰۵، SOPS 3.13.3 و age 1.3.2 هستن؛ مسیر باینری اینجا برای Linux با معماری x86_64 یا aarch64 است.
Cosign معتبر و sigsum-verify معتبر با سیاست sigsum-generic-2025-1 باید از قبل آماده باشن؛ نسخهٔ بررسیشدهٔ v0.13.1 ابزار Sigsum این سیاست رو پشتیبانی میکنه. اگر نیستن، اول از مسیر نصب مصوب تیم آمادهشون کن. اینکه verifier رو هم از باینری بررسینشده بگیریم و با آن فایل بعدی رو تأیید کنیم، بررسی مستقل و معتبری نمیسازه.
بررسی rolling مربوط به ۲۰۲۶-۱۱-۰۵ است؛ نسخهٔ نصبشده و شاخهٔ فعلی Manjaro همچنان مهمن. Arch الان بستهٔ sops و age داره، اما این تمرین مشخص از باینری خصوصیِ نسخهدار و تأییدشده استفاده میکنه. بستهٔ Arch رو مستقیم به Manjaro وارد نکن و ارتقای چند بسته بعد از تازهکردن فهرست مخزن نساز.
همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا
cat /etc/os-release
uname -m
bash --version
pacman -Q curl ca-certificates coreutils tar git util-linux
command -v curl sha256sum awk tar install env git findmnt cosign sigsum-verify
cosign version
sigsum-verify --helpمیزبان و نسخهٔ ابزارها و وجود verifierهای مورد اعتماد معلومه. نبود پیشنیاز، کار رو قبل از دانلود یا ساخت کلید متوقف میکنه.
قدم بعدی
ابزارهای پایه رو با مدیر بستهٔ همین توزیع آماده کنیم
اگر ابزارهای پایه موجودن، نصب رو رد کن. در غیر این صورت تغییر مدیر بسته رو در زمان مناسب محیط آزمایش بررسی کن. خانوادهٔ DEB از apt استفاده میکنه، RHEL از مخزن مجاز خودش با dnf، و Arch و Manjaro از مخزن خودشان همراه بهروزرسانی کاملِ برنامهریزیشده.
SOPS بستهٔ DEB و RPM هم منتشر میکنه و Arch الان بستهٔ SOPS و age رو داره. اما همین مسیر مشخص، باینری upstream رو با بررسی پایین و فایل اجرایی خصوصیِ نسخهدار استفاده میکنه. فهرست checksum امضاشدهٔ SOPS برای artifactهای باینری تنظیم شده؛ فرض نکن همان امضا خودبهخود هر بستهٔ DEB/RPM رو هم تأیید میکنه. daemon، فایروال، حفاظت سیستم و سیاست نگهداری اعتبارنامه عوض نمیشن.
همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا
sudo pacman -Syu curl ca-certificates coreutils tar git util-linuxابزار پایه از مخزن رسمی همین توزیع موجوده؛ verifier معتبر همچنان پیشنیاز جداست.
قدم بعدی
یک پوشهٔ خصوصی تازه بیرون Git بسازیم
پنل پایین tracing پوسته رو خاموش میکنه، دسترسی فایل تازه رو خصوصی میگذاره و مسیر موجود یا symlink بیمقصد رو نمیپذیره. داخل پوشهٔ خصوصی، جای کلید، فایل رمزشده، تنظیمات خالی برای کنترل کشف کلید و ابزارها رو جدا میکنیم. هیچ مخزن Git ساخته نمیشه.
همین نشست Bash رو برای ادامه نگه دار. اگر مرحلهای خطا بده، ممکنه پوشهٔ ساختهشده باقی بمونه؛ آن رو بررسی کن و مسیر تازهای انتخاب کن، نه اینکه فایل نامرتبط رو حذف کنی. کنارهمبودن identity بازیابی با بقیه فقط برای نشاندادن سازوکار تمرینه؛ در کار واقعی، نگهداری و بکاپ بازیابی باید مستقل باشه.
همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا
set +x
umask 077
set -o pipefail
lab='/var/tmp/academy-sops-age'
doc='rotation-demo'
case "$lab" in /*) ;; *) printf '%s\n' 'STOP: require an absolute lab path.'; exit 1 ;; esac
test ! -e "$lab" && test ! -L "$lab" || exit 1
mkdir -m 0700 -- "$lab" || exit 1
probe=$(readlink -f -- "$lab") || exit 1
while :; do
test -r "$probe" && test -x "$probe" || exit 1
if test -e "$probe/.git" || test -L "$probe/.git"; then
printf '%s\n' 'STOP: an ancestor contains a Git working-tree marker.'
exit 1
fi
test "$probe" != / || break
probe=$(dirname -- "$probe") || exit 1
done
if git -C "$lab" rev-parse --show-toplevel >/dev/null 2>&1; then
printf '%s\n' 'STOP: the lab must be outside every Git working tree.'
exit 1
fi
mkdir -m 0700 -- "$lab/keys" "$lab/work" "$lab/empty-config" "$lab/downloads" "$lab/vendor" "$lab/bin" || exit 1
printf 'Private non-production lab: %s\n' "$lab"پوشهٔ خصوصی تازه بیرون Git آماده است و به فایل production دست نزدیم.
قدم بعدی
فقط artifact نسخهٔ بررسیشده رو بگیریم
معماری Linux رو از خود میزبان پیدا میکنیم و فایل عمومیِ نسخهٔ مشخص رو در پوشهٔ دانلود خصوصی میگیریم. معماری دیگر همینجا متوقف میشه. این فایلها هنوز ورودیِ تأییدنشده هستن؛ قبل از دو مرحلهٔ بررسی بعدی، فایل اجرایی رو اجرا یا از آرشیو استخراج نکن.
آرشیو age مدرک Sigsum داره و SOPS یک فهرست checksum همراه بستهٔ امضا. HTTPS و یک checksum که از همان محل تأییدنشده گرفته شده، جای بررسی ناشر موردنظر رو نمیگیرن. نسخهٔ release، ابزار بررسی و نتیجهٔ تأیید رو با مدارک تمرین نگه دار.
همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا
case "$(uname -m)" in
x86_64) arch=amd64 ;;
aarch64) arch=arm64 ;;
*) printf '%s\n' 'STOP: this binary path covers only Linux x86_64/aarch64.'; exit 1 ;;
esac
cd "$lab/downloads" || exit 1
sops_artifact="sops-v3.13.3.linux.$arch"
age_archive="age-v1.3.2-linux-$arch.tar.gz"
curl --fail --location --proto '=https' --tlsv1.2 --output "$sops_artifact" "https://github.com/getsops/sops/releases/download/v3.13.3/$sops_artifact" || exit 1
curl --fail --location --proto '=https' --tlsv1.2 --output sops-v3.13.3.checksums.txt https://github.com/getsops/sops/releases/download/v3.13.3/sops-v3.13.3.checksums.txt || exit 1
curl --fail --location --proto '=https' --tlsv1.2 --output sops-v3.13.3.checksums.sigstore.json https://github.com/getsops/sops/releases/download/v3.13.3/sops-v3.13.3.checksums.sigstore.json || exit 1
curl --fail --location --proto '=https' --tlsv1.2 --output "$age_archive" "https://github.com/FiloSottile/age/releases/download/v1.3.2/$age_archive" || exit 1
curl --fail --location --proto '=https' --tlsv1.2 --output "$age_archive.proof" "https://github.com/FiloSottile/age/releases/download/v1.3.2/$age_archive.proof" || exit 1باینری و مدرک checksum مربوط به SOPS و آرشیو و proof مربوط به age دانلود شدن؛ هنوز نصب یا اجرا نشدن.