WIUNIX ACADEMY
آموزش MinIO پس از بایگانی؛ آزمایشگاه خصوصی S3 از کد ثابت
صفحهٔ 3 از 4؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من6 مقدار قابلتغییر
قدم بعدی
هویت را یکبار بسازید و پیش از نوشتن versioning را فعال کنید
فقط یکبار روی آزمایشگاه خالی اجرا کنید. برنامه دو باکت خصوصی، یک کاربر تازه و policy محدود میسازد. پیش از نوشتن داده، root نسخهبندی academy-objects را فعال میکند. خصوصیبودن پیشفرض باکت به معنی policy عمومی و ناشناس نیست.
داخل کانتینر آزمایشگاهی · ترمینال
set -eu
cd '/srv/academy-minio/minio-7aac2a2c5b7c882e68c1ce017d8256be2feea27f'
GOTOOLCHAIN=local CGO_ENABLED=0 GOMAXPROCS=2 GOPATH='/srv/academy-minio/gopath' '/srv/academy-minio/go/bin/go' build -p 2 -trimpath -o '/srv/academy-minio/bin/provision' '/srv/academy-minio/provision.go'
'/srv/academy-minio/bin/provision'
'/srv/academy-minio/bin/mc' --config-dir '/srv/academy-minio/root-client' version enable 'lab/academy-objects'
'/srv/academy-minio/bin/mc' --config-dir '/srv/academy-minio/root-client' version info 'lab/academy-objects'
هویت محدود ایجاد شده و version info برای academy-objects وضعیت enabled دارد.
قدم بعدی
نوشتن، نسخهها و منع دسترسی را واقعاً بسنجید
دو محتوای ساختگی در probe بنویسید، مقدار جاری را بخوانید و نسخهها را با root ببینید. هویت اپلیکیشن باید در دیدن academy-objects-outside و حذف object خودش خطا بگیرد. این خطاها نتیجهٔ درست آزموناند؛ برای سبزشدن همهٔ دستورها مجوز حذف یا مدیریت اضافه نکنید.
داخل کانتینر آزمایشگاهی · ترمینال
set -eu
cd '/srv/academy-minio'
printf 'academy version one
' > run/object.txt
bin/mc --config-dir app-client cp run/object.txt 'lab/academy-objects/probe'
printf 'academy version two
' > run/object.txt
bin/mc --config-dir app-client cp run/object.txt 'lab/academy-objects/probe'
bin/mc --config-dir app-client cat 'lab/academy-objects/probe'
bin/mc --config-dir root-client ls --versions 'lab/academy-objects/probe'
if bin/mc --config-dir app-client ls 'lab/academy-objects-outside'; then exit 1; fi
if bin/mc --config-dir app-client rm 'lab/academy-objects/probe'; then exit 1; fi
printf '%s
' 'Expected: version two, two versions, outside listing and deletion denied'
محتوای جاری version two است، دو نسخه وجود دارد و فهرست باکت دیگر و حذف object رد میشود.
قدم بعدی
نسخهٔ قدیمی را بدون جایگزینی فایل جاری بخوانید
root با اختیار مستقل بازیابی، دقیقاً دو نسخه را فهرست میکند و بایت نسخهٔ اول را با version ID در فایل خصوصی تازه مینویسد. محتوا باید version one باشد. این آزمون بازیابی یک نسخهٔ تاریخی است و بازیابی همهٔ نسخهها یا undelete خودکار نیست. برای دیدن تاریخچه، object جاری را بازنویسی نکنید.
داخل کانتینر آزمایشگاهی · ترمینال
set -eu
python3 - <<'PY'
import subprocess,json,hashlib,os
from pathlib import Path
r=Path('/srv/academy-minio')
base=[str(r/'bin/mc'),'--config-dir',str(r/'root-client')]
target='lab/academy-objects/probe'
p=subprocess.run(base+['ls','--json','--versions',target],capture_output=True,text=True,check=True)
rows=[json.loads(line) for line in p.stdout.splitlines() if line]
versions=[x for x in rows if x.get('key')=='probe' and x.get('versionId')]
assert len(versions)==2, 'Expect exactly two versions in this new lab'
old=min(versions,key=lambda x:x['versionOrdinal'])['versionId']
p=subprocess.run(base+['cat','--version-id',old,target],capture_output=True,check=True)
assert p.stdout==b'academy version one\n', 'Historical bytes differ'
path=r/'backup'/'historical-probe'
fd=os.open(path,os.O_WRONLY|os.O_CREAT|os.O_EXCL|os.O_NOFOLLOW,0o600)
with os.fdopen(fd,'wb') as f:f.write(p.stdout)
print('Historical version retrieved separately; SHA256',hashlib.sha256(p.stdout).hexdigest())
PY
نسخهٔ اول در فایل0600 تازه بازیابی شده و نسخهٔ دوم همچنان جاری است.
قدم بعدی
از یک object جاری خروجی بگیرید و بازگرداندن آن را بسنجید
از probe جاری به نام محلیِ استفادهنشده خروجی بگیرید، آن را با کلید object تازه برگردانید و دوباره در فایل بازیابی جداگانه دانلود کنید. مقصد موجود پذیرفته نمیشود و بایتها مقایسه میشوند. این رفتوبرگشتِ یک object در همین آزمایشگاه است؛ بکاپ خارج میزبان یا بازیابی همهٔ نسخهها، IAM و فراداده نیست.
داخل کانتینر آزمایشگاهی · ترمینال
set -eu
cd '/srv/academy-minio'
# Current-object export, not a complete version/IAM/retention backup.
test ! -e 'backup/probe'
test ! -L 'backup/probe'
test ! -e 'restored/probe'
test ! -L 'restored/probe'
bin/mc --config-dir root-client cp 'lab/academy-objects/probe' 'backup/probe'
bin/mc --config-dir root-client cp 'backup/probe' 'lab/academy-objects/restored-probe'
bin/mc --config-dir app-client cp 'lab/academy-objects/restored-probe' 'restored/probe'
cmp 'backup/probe' 'restored/probe'
sha256sum 'backup/probe' 'restored/probe'
cmp موفق است، دو SHA256 برابرند و object اصلی همچنان وجود دارد.
نسخهبندی، retention و parity مسئلههای متفاوتی دارند
نسخهبندی، نسخههای قبلی را نگه میدارد اما مانع حذف آنها توسط هویت دارای مجوز نمیشود. حذف معمولی میتواند delete marker بسازد و حذف یک نسخهٔ مشخص ممکن است داده را برای همیشه از بین ببرد. اپلیکیشن این نمونه عمداً مجوز delete و GetObjectVersion ندارد؛ دسترسی root به تاریخچه اختیار بازیابی جداگانه است.
Object Lock، حالتهای governance و compliance، legal hold و حذف lifecycle به طرح روشن نگهداری داده و آزمون کلاینت نیاز دارند. این قابلیتها در دستورهای این صفحه فعال یا تأیید نشدهاند. تبدیل باکت پس از ورود داده یا دورزدن retention را راهکار عادی بازیابی فرض نکنید.
یک فرایند روی فایلسیستم کانتینر نه HA با erasure coding است و نه بکاپ. طراحی واقعی باید دامنهٔ خرابی، فضای آزاد، healing، پایش دیسک، بازیابی کلید KMS در صورت استفاده، تاریخچه و فرادادهٔ object و خروجی محافظتشدهٔ IAM و تنظیمات را پوشش دهد. replication میتواند اشتباه را هم منتقل کند؛ بازیابی مستقل خارج سایت را با RPO و RTO اندازهگیریشده تمرین کنید.
در طراحی پراکسی، امضای S3 را حفظ کنید
در این آزمایشگاه reverse proxy نصب نمیشود. برای سرویس عملیاتیِ دارای مسیر نگهداری معتبر، endpoint API و کنسول را جدا طراحی کنید و دسترسی مدیریت کنسول را مستقل محدود کنید. HTTP Host امضاشده، همراه پورت غیراستاندارد، و path و query امضاشده باید حفظ شوند. تغییر prefix، عوضکردن Host، decode و encode دوباره یا redirect دلخواه میتواند SigV4 را نامعتبر کند. نامی که کلاینت با آن امضا میکند باید برای همان کلاینت قابلدسترسی باشد.
لینک presigned تا پایان اعتبار یک مجوز قابلاستفاده است؛ آن را فرادادهٔ بیخطر فرض نکنید و در لاگ یا اشتراک عمومی نگذارید. TLS باید SAN و زنجیرهٔ endpoint واقعی را تأیید کند و ساعتها هماهنگ باشند. محدودیت حجم، timeout و streaming پراکسی را با multipart و range در SDK واقعی بسنجید. عنوان S3 بهتنهایی سازگاری همهٔ عملیات AWS، retention یا امکانات کنسول را تضمین نمیکند.
برای رفع خطای امضا، بررسی TLS را خاموش نکنید، باکت را عمومی نکنید و endpoint را به پورت کنسول تغییر ندهید. زنجیرهٔ Host و path و query و endpoint کلاینت را بدون نمایش Authorization، query امضاشده یا کلید ثبت کنید. این مرزها از source بررسی شدهاند؛ آزمون پراکسی عمومی، ACME یا ورود مرورگری به کنسول ادعا نمیشود.