نکته‌ی مهم: 

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

نکته

امکان Public کردن باکت از طریق پنل وجود ندارد؛ اما همچنان می‌توانید باکت‌های Public قدیمی را در صورت نیاز Private کنید. در حال حاضر مدیریت کامل دسترسی‌ها از طریق Bucket Policy انجام می‌شود. توجه کنید که تغییر دسترسی باکت به تنهایی باعث private شدن آبجکت‌ها نمی‌شود و اگر آبجکت‌هایی به‌صورت public آپلود شده‌اند، باید آن‌ها را private کنید یا با استفاده از Bucket Policy، به‌صورت صریح (explicit deny) دسترسی آن‌ها را مسدود کنید.

در مثال زیر، به تمام کاربران احراز هویت‌شده (authenticated users) اجازه GetObject و PutObject داده شده است، اما به‌صورت صریح (explicit deny) دسترسی به یک مسیر خاص از آبجکت‌ها مسدود شده است:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowAuthenticatedUsersGetAndPut",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Condition": {
        "StringEquals": {
          "aws:PrincipalType": "AuthenticatedUser"
        }
      }
    },
    {
      "Sid": "ExplicitDenyPublicLegacyObjects",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::example-bucket/public/*"
    }
  ]
}

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

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

می‌توان با دستور 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
دسترسی به تنظیمات ACLs3:GetBucketAcl
s3:PutBucketAcl
s3:GetObjectAcl
s3:PutObjectAcl
دسترسی به تنظیمات چرخه‌ی حیات اشیاs3:GetLifecycleConfiguration
s3:PutLifecycleConfiguration
دسترسی به تنظیمات CORSs3: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 نیز اضافه کرد):

نوععملگر
stringStringEquals
StringNotEquals
StringEqualsIgnoreCase
StringNotEqualsIgnoreCase
StringLike قابلیت دریافت regx
StringNotLike
NumericNumericEquals
NumericNotEquals
NumericLessThan
NumericLessThanEquals
NumericGreaterThan
NumericGreaterThanEquals
DateDateEquals
DateNotEquals
DateLessThan
DateLessThanEquals
DateGreaterThan
DateGreaterThanEquals
BoolBool
BinaryBinaryEquals
Ip AddressIpAddress
NotIpAddress
NullNull

لیست مقادیری که می‌توانیم برای condition key استفاده کنیم:

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"
                	]
            	}
        	}
    	}
	]
}