نکته‌ی مهم: 

توجه داشته باشید که در صورت تنظیم پالیسی به حالت عمومی، داده‌های شما از طریق اینترنت قابل دسترسی خواهند بود.

در این مستند با پالیسی‌هایی که می‌توانید روی سرویس استوریج ستون اعمال کنید آشنا می‌شوید.

مشاهده‌ی تنظیمات موجود

می‌توان با دستور 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"
                	]
            	}
        	}
    	}
	]
}