سیاست باکت (bucket policy)
سیاست باکت مشخص میکند چه کسی و با چه عملیاتی به باکت دسترسی دارد. این تنظیم روی bucket claim در namespace نوشته میشود — از کنسول یا با kubectl.
باکت تازهساختهشده بهتنهایی به کسی دسترسی نمیدهد. تا وقتی statementای در سیاست ننویسید (یا از Bucket access کلید نگیرید)، از طریق سیاست کسی به باکت نمیرسد.
اصلی با مقدار * یعنی دسترسی عمومی (بدون احراز هویت). اگر Allow برای * ذخیره کنید، آن عملیات برای همه در اینترنت باز میشود.
تنظیم از کنسول

- وارد workspace شوید و یک namespace را باز کنید.
- در ناوبری namespace، از گروه Object Storage روی Bucket claims بزنید.
- claim موردنظر را باز کنید.
- تب Policy را انتخاب کنید.
- روی Add statement بزنید و فیلدها را پر کنید:
- Effect —
AllowیاDeny - Principals — کاربر(های) مجاز؛ از لیست کاربران ساختهشده با Bucket access در همین namespace انتخاب کنید، یا
*برای دسترسی عمومی - Applies to — کل باکت و همه آبجکتها (پیشفرض)، یا محدود به پیشوند کلید (مثلاً
reports/) و/یا خود باکت - Actions — عملیات مجاز، مثل
s3:GetObjectوs3:ListBucket
- Effect —
- روی Save بزنید.
برای دسترسی با کلید در همان namespace، معمولاً Bucket access کافی است. سیاست باکت برای دسترسی عمومی، یا وقتی میخواهید دسترسی را صریح روی خود باکت تعریف کنید، مناسب است.
حذف یا ویرایش statement
در تب Policy میتوانید هر statement را ویرایش یا حذف کنید. اگر آخرین statement حذف شود، سیاست باکت پاک میشود و دوباره کسی از طریق سیاست به باکت دسترسی ندارد.
تنظیم با kubectl
فیلد spec.bucketPolicy را روی همان S3BucketClaim تنظیم کنید:
❯ kubectl -n <namespace> apply -f - <<EOF❯ apiVersion: oss.tapsicloud.com/v1alpha1❯ kind: S3BucketClaim❯ metadata:❯ name: app-data❯ spec:❯ bucketPolicy:❯ statements:❯ - effect: Allow❯ principals: ["reader"]❯ actions: ["s3:GetObject", "s3:ListBucket"]❯ EOF
<namespace> را با namespace خود جایگزین کنید. فرض بر این است که kubeconfig و context مربوط به workspace شما از قبل تنظیم شده است. مقدار reader باید نام کاربر S3 باشد (مثلاً همانی که در وضعیت Bucket access دیده میشود)، نه لزوماً نام خود access.
محدود کردن به یک پیشوند
1apiVersion: oss.tapsicloud.com/v1alpha12kind: S3BucketClaim3metadata:4 name: app-data5spec:6 bucketPolicy:7 statements:8 - effect: Allow9 principals: ["reader"]10 actions: ["s3:GetObject", "s3:ListBucket"]11 resources:12 - prefix: "reports/"
دسترسی عمومی فقط برای خواندن
1apiVersion: oss.tapsicloud.com/v1alpha12kind: S3BucketClaim3metadata:4 name: app-data5spec:6 bucketPolicy:7 statements:8 - effect: Allow9 principals: ["*"]10 actions: ["s3:GetObject"]
محدود کردن به IP مشخص
شرط IP در فرم statement کنسول نیست؛ باید با rawDocument (YAML / kubectl) نوشته شود. IP یا بازهٔ خود را جایگزین کنید:
1apiVersion: oss.tapsicloud.com/v1alpha12kind: S3BucketClaim3metadata:4 name: app-data5spec:6 bucketPolicy:7 rawDocument: |8 {9 "Version": "2012-10-17",10 "Statement": [11 {12 "Effect": "Allow",13 "Principal": "*",14 "Action": ["s3:GetObject", "s3:ListBucket"],15 "Resource": [16 "arn:aws:s3:::app-data",17 "arn:aws:s3:::app-data/*"18 ],19 "Condition": {20 "IpAddress": {21 "aws:SourceIp": ["203.0.113.10/32", "198.51.100.0/24"]22 }23 }24 }25 ]26 }
نام باکت در Resource باید با نام claim یکی باشد. با rawDocument دیگر نمیتوانید همان سیاست را از فرم statement کنسول ویرایش کنید — تغییر دوباره از YAML claim است.
فیلدهای هر statement
| فیلد | معنی ساده |
|---|---|
effect | Allow یا Deny |
principals | نام کاربر(های) S3، یا * برای عمومی |
actions | عملیات S3 مثل s3:GetObject، s3:PutObject، s3:ListBucket |
resources (اختیاری) | خالی = کل باکت و همه آبجکتها؛ prefix = محدوده کلید؛ wholeBucket: true = خود باکت |
نام principal اشتباه (مثلاً نام خود Bucket access بهجای نام کاربر ساختهشده) ممکن است بدون خطا ذخیره شود، اما در عمل به کسی دسترسی نمیدهد. نام درست را از وضعیت access یا لیست principals در کنسول بردارید.
پاک کردن سیاست
برای برداشتن کامل سیاست، bucketPolicy را حذف کنید یا روی claim مقدار آن را خالی کنید:
❯ kubectl -n <namespace> patch s3bucketclaim app-data --type=merge -p '{"spec":{"bucketPolicy":null}}'
CORS دسترسی نمیدهد؛ فقط نحوهٔ پاسخ مرورگر را تنظیم میکند. دسترسی واقعی از سیاست باکت یا Bucket access میآید.