پرش به مطلب اصلی

سیاست باکت (bucket policy)

سیاست باکت مشخص می‌کند چه کسی و با چه عملیاتی به باکت دسترسی دارد. این تنظیم روی bucket claim در namespace نوشته می‌شود — از کنسول یا با kubectl.

نکته

باکت تازه‌ساخته‌شده به‌تنهایی به کسی دسترسی نمی‌دهد. تا وقتی statementای در سیاست ننویسید (یا از Bucket access کلید نگیرید)، از طریق سیاست کسی به باکت نمی‌رسد.

توجه

اصلی با مقدار * یعنی دسترسی عمومی (بدون احراز هویت). اگر Allow برای * ذخیره کنید، آن عملیات برای همه در اینترنت باز می‌شود.

تنظیم از کنسول​

تب Policy و فرم Add statement در کنسول

  1. وارد workspace شوید و یک namespace را باز کنید.
  2. در ناوبری namespace، از گروه Object Storage روی Bucket claims بزنید.
  3. claim موردنظر را باز کنید.
  4. تب Policy را انتخاب کنید.
  5. روی Add statement بزنید و فیلدها را پر کنید:
    • Effect — Allow یا Deny
    • Principals — کاربر(های) مجاز؛ از لیست کاربران ساخته‌شده با Bucket access در همین namespace انتخاب کنید، یا * برای دسترسی عمومی
    • Applies to — کل باکت و همه آبجکت‌ها (پیش‌فرض)، یا محدود به پیشوند کلید (مثلاً reports/) و/یا خود باکت
    • Actions — عملیات مجاز، مثل s3:GetObject و s3:ListBucket
  6. روی Save بزنید.
نکته

برای دسترسی با کلید در همان namespace، معمولاً Bucket access کافی است. سیاست باکت برای دسترسی عمومی، یا وقتی می‌خواهید دسترسی را صریح روی خود باکت تعریف کنید، مناسب است.

حذف یا ویرایش statement​

در تب Policy می‌توانید هر statement را ویرایش یا حذف کنید. اگر آخرین statement حذف شود، سیاست باکت پاک می‌شود و دوباره کسی از طریق سیاست به باکت دسترسی ندارد.

تنظیم با kubectl​

فیلد spec.bucketPolicy را روی همان S3BucketClaim تنظیم کنید:

zsh
❯ 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.

محدود کردن به یک پیشوند​

!manifest.yaml×
tapsicloud › manifest.yaml
1apiVersion: oss.tapsicloud.com/v1alpha1
2kind: S3BucketClaim
3metadata:
4 name: app-data
5spec:
6 bucketPolicy:
7 statements:
8 - effect: Allow
9 principals: ["reader"]
10 actions: ["s3:GetObject", "s3:ListBucket"]
11 resources:
12 - prefix: "reports/"
✓ dry-runLn 12 · YAML

دسترسی عمومی فقط برای خواندن​

!manifest.yaml×
tapsicloud › manifest.yaml
1apiVersion: oss.tapsicloud.com/v1alpha1
2kind: S3BucketClaim
3metadata:
4 name: app-data
5spec:
6 bucketPolicy:
7 statements:
8 - effect: Allow
9 principals: ["*"]
10 actions: ["s3:GetObject"]
✓ dry-runLn 10 · YAML

محدود کردن به IP مشخص​

شرط IP در فرم statement کنسول نیست؛ باید با rawDocument (YAML / kubectl) نوشته شود. IP یا بازهٔ خود را جایگزین کنید:

!manifest.yaml×
tapsicloud › manifest.yaml
1apiVersion: oss.tapsicloud.com/v1alpha1
2kind: S3BucketClaim
3metadata:
4 name: app-data
5spec:
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 }
✓ dry-runLn 26 · YAML
نکته

نام باکت در Resource باید با نام claim یکی باشد. با rawDocument دیگر نمی‌توانید همان سیاست را از فرم statement کنسول ویرایش کنید — تغییر دوباره از YAML claim است.

فیلدهای هر statement​

فیلدمعنی ساده
effectAllow یا Deny
principalsنام کاربر(های) S3، یا * برای عمومی
actionsعملیات S3 مثل s3:GetObject، s3:PutObject، s3:ListBucket
resources (اختیاری)خالی = کل باکت و همه آبجکت‌ها؛ prefix = محدوده کلید؛ wholeBucket: true = خود باکت
توجه

نام principal اشتباه (مثلاً نام خود Bucket access به‌جای نام کاربر ساخته‌شده) ممکن است بدون خطا ذخیره شود، اما در عمل به کسی دسترسی نمی‌دهد. نام درست را از وضعیت access یا لیست principals در کنسول بردارید.

پاک کردن سیاست​

برای برداشتن کامل سیاست، bucketPolicy را حذف کنید یا روی claim مقدار آن را خالی کنید:

zsh
❯ kubectl -n <namespace> patch s3bucketclaim app-data --type=merge -p '{"spec":{"bucketPolicy":null}}'
نکته

CORS دسترسی نمی‌دهد؛ فقط نحوهٔ پاسخ مرورگر را تنظیم می‌کند. دسترسی واقعی از سیاست باکت یا Bucket access می‌آید.