نکتهی مهم:
توجه داشته باشید که در صورت تنظیم پالیسی به حالت عمومی، دادههای شما از طریق اینترنت قابل دسترسی خواهند بود.
در این مستند با پالیسیهایی که میتوانید روی سرویس استوریج ستون اعمال کنید آشنا میشوید.
مشاهدهی تنظیمات موجود
میتوان با دستور get-bucket-policy قاعدهی دسترسی یا policy که برای یک سبد تعریف شده را دریافت کرد. (برای آشنایی بیشتر با ابزار aws به راهنمای کار با cli مراجعه کنید.)
aws --endpoint http://KISE_ENDPOINT/ s3api get-bucket-policy --bucket
BUCKET_NAME_HERE
قاعدهی دسترسی در فرمت json تعریف میشود که در رابطه با آن در ادامه توضیح خواهیم داد. به صورت پیشفرض هیچ قاعدهی دسترسی برای سبدها تنظیم نشده است.
در صورتی که در هریک از مواردی که میخواهید پیکربندی کنید به شناسهی فضای کاری (Workspace ID) و یا شناسهی کاربر (User ID) نیاز داشتید به این صورت میتوانید آن را دریافت کنید:
شناسهی فضای كاری: برای دریافت شناسهی فضای کاری وارد قسمت پروفایل کاربری شوید. در بخش فضاهای کاری میتوانید شناسهی مربوط به فضای کاری مورد نظر خود را پیدا کنید.
شناسهی کاربر: برای دریافت شناسهی کاربر وارد سرویس IAM شوید. در بخش کاربرها ابتدا کاربر مورد نظر را جستجو کنید. با کلیک روی نام کاربر میتوانید شناسهی مربوط به آن را در صفحهی باز شده ببینید.
تغییر تنظیمات
میتوان با دستور put-bucket-policy برای یک سبد یک قاعدهی دسترسی یا policy تعریف کرد.
نکته: تنظیم قاعدهی جدید، قواعد قبلی را از بین میبرد. بنابراین قبل از استفاده از دستور put-bucket-policy با استفاده از دستور get-bucket-policy، قواعد موجود را دریافت کرده و در صورت نیاز قواعد موجود را در فایل جدید وارد کنید.
aws --endpoint http://KISE_ENDPOINT/ s3api put-bucket-policy --bucket
BUCKET_NAME_HERE --policy file://PATH_TO_POLICY_JSON
تنظیمات قواعد دسترسی در قالب یک فایل json و به عنوان ورودی به دستور بالا داده میشوند. در ادامه چند مثال از قواعد پرکاربرد را مرور میکنیم.
ساختار پالیسی
ساختار کلی یک باکت پالیسی به این شکل است:
{
"Version" : "2008-10-17" | "2012-10-17",
اختیاری. نسخه تنظیمات باکت پالیسی که میتواند یکی از دو مقدار بالا باشد.
"id": "string",
اختیاری. شناسه پالیسی
"Statement": [ <statement>, <statement>, ... ]
قواعد مربوط به دسترسی. ساختار هر statement در ادامه توضیح داده شده است.
}
ساختار قاعده یا Statement
{
"Sid": "string",
اختیاری. شناسه این عبارت
"Effect": "Allow" | "Deny",
مجاز یا غیر مجاز بودن عملیات تعریف شده در این قاعده
"Principal"|"NotPrincipal": "*" | <principal map>,
در این قسمت مشخص میکنیم که چه کسانی مشمول این عبارت میشوند (Principal) یا چه کسانی استثناء هستند و مشمول این قاعده نمیشوند (NotPrincial).
مقدار آن یا * به معنی همه است یا با ساختار princial map که در پایین میآید مشخص میشود.
توجه: کاربرانی که میتوانند این قسمت تعریف شوند محدود به کاربران فضای کاری شما نیستند. به عنوان مثال * یعنی تمام کاربران در تمام فضاهای کاری.
"Action": "*" | [<action>, <action>, ... ],
عملیاتی که در این قاعده تعریف میشوند. مقدار میتواند * به معنی همه باشد یا یک یا چند عملیات ذکر شود که لیست عملیاتی که میتوان در این قسمت استفاده کرد در ادامه میآید.
"Resource"|"NotResource": "*" | <resource> | [<resource>, <resource>, ...],
این قسمت تعیین میکند که چه مجموعهای از آبجکتها مشمول این قاعده یا از آن مستثنی هستند.
مقدار آن یا * به معنی همه است یا با ساختار resource که در پایین میآید مشخص میشود.
"Condition": "*" | { <condition map> }
اختیاری. در این قسمت میتوانیم شرایطی را تعیین کنیم که تنها تحت آن شرایط این قاعده فعال باشد. ساختار condition map و شرایطی که میتوان استفاده کرد در ادامه توضیح داده خواهد شد.
}
ساختار principal map
{
"AWS": "*" | <user> | [<user>, <user>, ...]
ساختار user در پایین توضیح داده شده است.
}
ساختار user میتواند به این صورت باشد برای مشخص کردن یک کاربر از یک فضای کاری:
"arn:aws:iam:::user/WORKSPACE_ID:USER_ID"
شناسه فضای کاری مورد نظر بهجای WORKSPACE_ID و شناسه کاربر مورد نظر در آن فضای کاری بهجای USER_ID قرار میگیرد.
همچنین میتوان برای مشخص کردن تمام کاربران یک فضای کاری از این ساختار استفاده کرد:
"arn:aws:iam:::user/WORKSPACE_ID"
لیست عملیات قابل استفاده در قواعد
در قواعد دسترسی ستون میتوان از این عملیات استفاده کرد:
- دسترسی مربوط به اشیا:
s3:GetObject
s3:PutObject
s3:DeleteObject
s3:GetObjectVersion
s3:DeleteObjectVersion
- دسترسی لیست کردن اشیای باکت:
s3:ListBucket
- دسترسی به تنظیمات قواعد دسترسی:
s3:GetBucketPolicy
s3:PutBucketPolicy
s3:DeleteBucketPolicy
- دسترسی به تنظیمات ACL:
s3:GetBucketAcl
s3:PutBucketAcl
s3:GetObjectAcl
s3:PutObjectAcl
- دسترسی به تنظیمات چرخهی حیات اشیا:
s3:GetLifecycleConfiguration
s3:PutLifecycleConfiguration
- دسترسی به تنظیمات CORS:
s3:GetBucketCORS
s3:PutBucketCORS
- سایر:
s3:AbortMultipartUpload
s3:CreateBucket
s3:DeleteBucket
s3:DeleteBucketWebsite
s3:DeleteReplicationConfiguration
s3:GetAccelerateConfiguration
s3:GetBucketLocation
s3:GetBucketLogging
s3:GetBucketNotification
s3:GetBucketRequestPayment
s3:GetBucketTagging
s3:GetBucketWebsite
s3:GetObjectTorrent
s3:GetObjectVersionAcl
s3:GetObjectVersionTorrent
s3:GetReplicationConfiguration
s3:ListAllMyBuckets
s3:ListBucketMultipartUploads
s3:ListMultipartUploadParts
s3:PutAccelerateConfiguration
s3:PutBucketLogging
s3:PutBucketNotification
s3:PutBucketRequestPayment
s3:PutBucketTagging
s3:PutBucketVersioning
s3:PutBucketWebsite
s3:PutObjectVersionAcl
s3:PutReplicationConfiguration
s3:RestoreObject
ساختار resource
برای تعریف کردن قسمتی از یک باکت باید با این عبارت شروع کنیم:
arn:aws:s3:::
و در ادامه میتوانیم اسم باکت و prefix مورد نظر را قرار دهیم:
arn:aws:s3:::BUCKET_NAME/PREFIX/*
در هر قسمت از عبارت بالا میتوانیم عبارت را قطع کرده و از * استفاده کنیم که به معنای هر مقداری است که در ادامه عبارت میآید. به عنوان مثال عبارات زیر قابل قبول هستند:
*
arn:aws:s3:::*
arn:aws:s3:::BUCKET_NAME/*
ساختار condition map
{
"condition type": {
"condition key": [<condition value>, <condition value>, … ],
"condition key": [<condition value>, <condition value>, … ],
...
}
}
مقادیر زیر برای condition type قابل استفاده است (غیر از قسمت Null به بقیه مقادیر میتوان پسوند IfExists نیز اضافه کرد):
- string:
StringEquals
StringNotEquals
StringEqualsIgnoreCase
StringNotEqualsIgnoreCase
StringLike
قابلیت دریافت regx
StringNotLike
- Numeric
NumericEquals
NumericNotEquals
NumericLessThan
NumericLessThanEquals
NumericGreaterThan
NumericGreaterThanEquals
- Date
DateEquals
DateNotEquals
DateLessThan
DateLessThanEquals
DateGreaterThan
DateGreaterThanEquals
- Bool
Bool
- Binary
BinaryEquals
- Ip Address
IpAddress
NotIpAddress
- Null
Null
لیست مقادیری که میتوانیم برای condition key استفاده کنیم:
aws:CurrentTime
aws:EpochTime
aws:PrincipalType
aws:Referer
aws:SourceIp
aws:UserAgent
aws:username
ضمنا میتوان از این مقادیر در قسمت condition value نیز استفاده کرد. به این صورت که باید آن داخل {} قرار داد و قبل از آن علامت $ قرار گیرد. به عنوان مثال:
"${aws:username}"
مثال از قسمت condition:
"Condition": {
"NotIpAddress": {
"aws:SourceIp": ["10.0.2.90"]
}
}
نمونه پالیسیهای پرکاربرد
دسترسی عمومی خواندن برای تمام اشیای داخل باکت
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::*"
}
]
}
دسترسی عمومی خواندن برای تمام اشیای داخل یک پوشه خاص
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKET_NAME/PATH/*"
}
]
}
افزودن چند قاعده
مثال زیر دسترسی خواندن را برای تمام سبد غیر از یک پوشهی خاص باز میکند. (آبجکتهای داخل پوشهی مورد نظر برای هیچ کاربری قابل خواندن نخواهد بود.)
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "*"
},
{
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKET_NAME/PATH/*"
}
]
}
دسترسی کامل به یک کاربر خاص
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:::user/WORKSPACE_ID:USER_ID"
},
"Action": "*",
"Resource": "arn:aws:s3:::*"
}
]
}
دسترسی کامل به کاربران یک ورکسپیس خاص
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:::user/WORKSPACE_ID"
},
"Action": "*",
"Resource": "*"
}
]
}
دسترسی خواندن اشیا و لیست اشیا به یک کاربر خاص
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:::user/WORKSPACE_ID:USER_ID"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": "*"
}
]
}
دسترسی چند عملیات خاص به چند کاربر مشخص
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam:::user/WORKSPACE_ID:USER_ID_1",
"arn:aws:iam:::user/WORKSPACE_ID:USER_ID_2"
]
},
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "*"
}
]
}
دسترسی به یک ip خاص
اگر میخواهید به یک ip خاص دسترسیهای متفاوتی بدهید مثلا به دلایل امنیتی فقط به ipهای cdn دسترسی بدهید این قابلیت به شما کمک میکند.
به عتوان مثال، دستور زیر باعث میشود هیچ کاربری نتواند روی objectهای درون باکتهای مشخصشده عملیاتی را اجرا کند مگر اینکه درخواستها از بازهی ipهای مشخصشده ارسال شده باشند.
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::test2",
"arn:aws:s3:::test2/*"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"10.0.2.90"
]
}
}
}
]
}