محیط آموزشیِ تصویرسازی‌شدهٔ آکادمی ویونیکس با تابلوی گیرنده‌های SOPS، چرخش کلید داده و مسیر بازیابی مستقل

WIUNIX ACADEMY

چرخش کلید در SOPS و age؛ گیرنده، کلید داده و دسترسی بازیابی

مهاجرت مرحله‌ای گیرندهٔ age رو تمرین می‌کنیم، دسترسی جدید و بازیابی رو جدا می‌سنجیم و فرق rewrap و چرخش کلید داده رو می‌بینیم؛ بدون ادعای پس‌گرفتن نسخه‌های قدیمی.

متوسط تا پیشرفته45 دقیقه مطالعهبه‌روزرسانی
محیطت رو انتخاب کن

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخهٔ سرورت رو انتخاب کن تا مراحل، دستورها و راه‌حل‌های همون محیط رو ببینی.

Rocky Linux 9بررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه رو با مشخصات سرورت عوض کن تا متن و دستورها با هم تغییر کنن. رمز، کلید خصوصی و توکن اینجا وارد نکن. مقدارها فقط توی همین زبانه می‌مونن و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شن. قبل از اجرا، 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 کلید عمومی است، ولی باز هم باید از صاحب درستش و مسیر تأییدشده دریافت بشه. این فرم عمداً کلید نمی‌گیره. در تمرین، کلیدهای عمومی رو روی همان میزبان از فایل‌های خصوصی تازه به دست می‌آریم؛ در کار واقعی، هویت صاحب کلید و مسئول بازیابی رو با روال محافظت‌شدهٔ تیم تأیید کن. مقدار ذخیره‌شده در تب، مجوز دسترسی نیست.

01

قدم بعدی

ابزارهای توزیع و 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 رو هم از باینری بررسی‌نشده بگیریم و با آن فایل بعدی رو تأیید کنیم، بررسی مستقل و معتبری نمی‌سازه.

از minor پشتیبانی‌شدهٔ ۱۰/۹ و مخزن مجاز RHEL یا رسمی Rocky/Alma استفاده کن. موجودبودن age در Fedora رو به مخزن پایهٔ RHEL تعمیم نده. این مسیر ابزار خصوصی upstream رو پس از تأیید استفاده می‌کنه؛ EPEL فعال نمی‌کنیم و SELinux یا نگهداری اعتبارنامه رو عوض نمی‌کنیم.

bash

همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا

cat /etc/os-release
uname -m
bash --version
rpm -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های مورد اعتماد معلومه. نبود پیش‌نیاز، کار رو قبل از دانلود یا ساخت کلید متوقف می‌کنه.

02

قدم بعدی

ابزارهای پایه رو با مدیر بستهٔ همین توزیع آماده کنیم

اگر ابزارهای پایه موجودن، نصب رو رد کن. در غیر این صورت تغییر مدیر بسته رو در زمان مناسب محیط آزمایش بررسی کن. خانوادهٔ DEB از apt استفاده می‌کنه، RHEL از مخزن مجاز خودش با dnf، و Arch و Manjaro از مخزن خودشان همراه به‌روزرسانی کاملِ برنامه‌ریزی‌شده.

SOPS بستهٔ DEB و RPM هم منتشر می‌کنه و Arch الان بستهٔ SOPS و age رو داره. اما همین مسیر مشخص، باینری upstream رو با بررسی پایین و فایل اجرایی خصوصیِ نسخه‌دار استفاده می‌کنه. فهرست checksum امضاشدهٔ SOPS برای artifactهای باینری تنظیم شده؛ فرض نکن همان امضا خودبه‌خود هر بستهٔ DEB/RPM رو هم تأیید می‌کنه. daemon، فایروال، حفاظت سیستم و سیاست نگهداری اعتبارنامه عوض نمی‌شن.

bash

همان نشست Bash با حساب عادی در محیط مدیریت آزمایشی جدا

sudo dnf install curl ca-certificates coreutils tar git util-linux
از کجا بفهمم درست انجام شده؟

ابزار پایه از مخزن رسمی همین توزیع موجوده؛ verifier معتبر همچنان پیش‌نیاز جداست.

03

قدم بعدی

یک پوشهٔ خصوصی تازه بیرون Git بسازیم

پنل پایین tracing پوسته رو خاموش می‌کنه، دسترسی فایل تازه رو خصوصی می‌گذاره و مسیر موجود یا symlink بی‌مقصد رو نمی‌پذیره. داخل پوشهٔ خصوصی، جای کلید، فایل رمز‌شده، تنظیمات خالی برای کنترل کشف کلید و ابزارها رو جدا می‌کنیم. هیچ مخزن Git ساخته نمی‌شه.

همین نشست Bash رو برای ادامه نگه دار. اگر مرحله‌ای خطا بده، ممکنه پوشهٔ ساخته‌شده باقی بمونه؛ آن رو بررسی کن و مسیر تازه‌ای انتخاب کن، نه اینکه فایل نامرتبط رو حذف کنی. کنارهم‌بودن identity بازیابی با بقیه فقط برای نشان‌دادن سازوکار تمرینه؛ در کار واقعی، نگهداری و بکاپ بازیابی باید مستقل باشه.

bash

همان نشست 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 دست نزدیم.

04

قدم بعدی

فقط artifact نسخهٔ بررسی‌شده رو بگیریم

معماری Linux رو از خود میزبان پیدا می‌کنیم و فایل عمومیِ نسخهٔ مشخص رو در پوشهٔ دانلود خصوصی می‌گیریم. معماری دیگر همین‌جا متوقف می‌شه. این فایل‌ها هنوز ورودیِ تأییدنشده هستن؛ قبل از دو مرحلهٔ بررسی بعدی، فایل اجرایی رو اجرا یا از آرشیو استخراج نکن.

آرشیو age مدرک Sigsum داره و SOPS یک فهرست checksum همراه بستهٔ امضا. HTTPS و یک checksum که از همان محل تأییدنشده گرفته شده، جای بررسی ناشر موردنظر رو نمی‌گیرن. نسخهٔ release، ابزار بررسی و نتیجهٔ تأیید رو با مدارک تمرین نگه دار.

bash

همان نشست 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 دانلود شدن؛ هنوز نصب یا اجرا نشدن.

همهٔ آموزش‌های آکادمی ↗