Top.Mail.Ru

Хранилище

Настроить ACL и Policy для S3 хранилища с помощью AWS CLI или S3cmd

ACL или Access Control List — список управления доступом, который определяет, кто или что может получать доступ к файлам или бакету и, какие именно операции разрешено или запрещено выполнять субъекту.

Обратите внимание: за настройку и управление ACL отвечает владелец хранилища.

Для управления нашими S3 хранилищами можно использовать команды из документации AWS CLI и S3cmd.

ACL на объектах позволяет широко регулировать круг действий:

Действия AWS CLI

Действия S3cmd

Описание

--public-read

--acl-public

Выставить публичный ACL на объект

--private

--acl-private

Выставить приватный ACL на объект

--grant-full-control

--acl-grant=full-control

Предоставить полный доступ к управлению и регулированию бакета

--grant-read

--acl-grant=read

Позволить листить объекты в бакете

--grant-read-acp

--acl-grant=read_acp

Позволить читать ACL

--grant-write

--acl-grant=write

Позволить записывать, перезаписывать и удалять объекты

--grant-write-acp

--acl-grant=write_acp

Позволить писать ACL

Для детальной настройки прав доступа к файлам и бакетам, используйте политику доступа.

Политика доступа позволяет создавать правила для регулирования не только определённых действий, но и доступов к директориям в бакете для отдельных юзеров/групп/источников.

Для создания политик доступа, используйте формат JSON.

Максимальный размер запроса — 20 КБ.

В JSON файле указываются допустимые действия с файлами или бакетами. Для направленного управления запросами действия дополняются условиями (conditions).

Обратите внимание. Все необходимые действия, условия, типы ресурсов описаны в официальной документации.

Ниже перечислены примеры использования ACL и policy.

AWS CLI

Пример выставления публичного ACL (--acl public-read) на конкретный объект (cat.jpg) в бакете (my_bucket):

aws s3api put-object-acl --bucket my_bucket --key cat.jpg --acl public-read --endpoint-url=https://s-dt2.cloud.edgecore.ru

где:

  • my_bucket — название бакета, к которому следует применить ACL.

  • cat.jpg — название файла, который будет открыт для скачивания.

  • s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.

После применения этой команды объект cat.jpg будет доступен любому по ссылке https://s-dt2.cloud.edgecore.ru/my_bucket/cat.jpg.


S3cmd

Пример выставления публичного ACL (--acl public) на конкретный объект (cat.jpg) в бакете (my_bucket):

s3cmd setacl s3://my_bucket/cat.jpg --acl-public

где:

  • my_bucket — название бакета, к которому следует применить acl.

  • cat.jpg — название файла, который будет открыт для скачивания.

После применения этой команды объект cat.jpg будет доступен любому по ссылке https://s-dt2.cloud.edgecore.ru/my_bucket/cat.jpg.

AWS CLI

Пример политики доступа, которая разрешает доступ к объектам на скачивание ("Action": "s3:GetObject") для всех ("Principal": "*") в бакете (my_bucket/*").

Важно. Такая политика доступа позволяет получать файлы по прямой ссылке, но не позволяет листить файлы в бакете.

1. Создайте JSON файл с такой политикой:

{ 
"Statement": [ 
 {
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*"
 }
             ]
}

Важно: в строке "Resource" вместо my_bucket вставьте название бакета, файлы которого должны быть публичными.

2. Примените политику доступа на выбранный бакет:

aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket

где:

  • policy.json — путь до JSON-файла с политикой.

  • s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.

  • my_bucket — название бакета, к которому следует применить политику.


S3cmd

Пример политики доступа, которая разрешает доступ к объектам на скачивание ("Action": "s3:GetObject") для всех ("Principal": "*") в бакете (my_bucket/*").

Важно. Такая политика доступа позволяет получать файлы по прямой ссылке, но не позволяет листить файлы в бакете.

1. Создайте JSON файл с такой политикой:

{ 
"Statement": [ 
 {
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*"
 }
             ]
}

Важно: в строке "Resource" вместо my_bucket вставьте название бакета, файлы которого должны быть публичными.

2. Примените политику доступа на выбранный бакет:

s3cmd setpolicy policy_name.json s3://my_bucket/

где:

  • policy.json — путь до JSON-файла с политикой.

  • my_bucket — название бакета, к которому следует применить политику.

AWS CLI

Пример политики доступа, которая запрещает всем пользователям доступ к операции ("s3:GetObject") в директории бакета (my_bucket/secret/*"), но разрешает доступ к бакету (my_bucket/*").

1. Создайте JSON файл с такой политикой:

{
"Statement": [
 { 
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*" 
 },
 { 
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/secret/*" 
 }
                     ]
}

Важно:

  • В первом блоке в строке "Resource" вместо my_bucket/* укажите путь до бакета, к которому нужно разрешить доступ. 

  • Во втором блоке в строке "Resource" замените my_bucket/secret/* на путь до директории, которую вы хотите скрыть. 

2. Примените политику доступа на выбранный бакет:

aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket 

где:

  • policy.json — путь до JSON-файла с политикой.

  • s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.

  • my_bucket — название бакета, к которому следует применить политику.


S3cmd

Пример политики доступа, которая запрещает всем пользователям доступ к операции ("s3:GetObject") в директории бакета (my_bucket/secret/*"), но разрешает доступ к бакету (my_bucket/*").

1. Создайте JSON файл с такой политикой:

{
"Statement": [
 { 
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*" 
 },
 { 
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/secret/*" 
 }
                     ]
}

Важно:

  • В первом блоке в строке "Resource" вместо my_bucket/* укажите путь до бакета, к которому нужно разрешить доступ.

  • Во втором блоке в строке "Resource" замените my_bucket/secret/* на путь до директории, которую вы хотите скрыть.

2. Примените политику доступа на выбранный бакет:

s3cmd setpolicy policy_name.json s3://my_bucket/

где:

  • policy.json — путь до JSON-файла с политикой.

  • my_bucket — название бакета, к которому следует применить политику.

AWS CLI

Пример политики доступа, которая разрешает запросы к хранилищу с указанного IP ("IpAddress": {"aws:SourceIp": "10.0.0.0/24", "11.0.0.0/24"}).

1. Создайте JSON файл с такой политикой:

{
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "10.0.0.0/24",
                        "11.0.0.0/24"
                    ]
                }
            }
        }
    ]
}

Важно: в строке "Condition" замените IP-адреса 10.0.0.0/24 и 11.0.0.0/24 на желаемые.

2. Примените политику доступа на выбранный бакет:

aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket 

где:

  • policy.json — путь до JSON-файла с политикой.

  • s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.

  • my_bucket — название бакета, к которому следует применить политику.


S3cmd

Пример политики доступа, которая разрешает запросы к хранилищу с указанных IP ("IpAddress": {"aws:SourceIp": "10.0.0.0/24", "11.0.0.0/24"}).

1. Создайте JSON файл с такой политикой:

{
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "10.0.0.0/24",
                        "11.0.0.0/24"
                    ]
                }
            }
        }
    ]
}

Важно: в строке "Condition" замените IP-адреса 10.0.0.0/24 и 11.0.0.0/24 на желаемые.

2. Примените политику доступа на выбранный бакет:

s3cmd setpolicy policy_name.json s3://my_bucket/

где:

  • policy.json — путь до JSON-файла с политикой.

  • my_bucket — название бакета, к которому следует применить политику.

AWS CLI

Пример политики доступа, которая разрешает только запросы с сайтов, указанных в политике доступа ("StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}).

1. Создайте JSON файл с такой политикой:

{
"Statement":
 [
  {
"Sid":"Allow get requests originating from www.example.com and example.com.",
"Effect":"Allow",
"Principal":"*",
"Action":["s3:GetObject","s3:GetObjectVersion"],
"Resource":"arn:aws:s3:::/*",
"Condition":
     {
"StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
     }
   }
 ]
}

Важно: в строке "StringLike" замените http://www.example.com/ и http://example.com/ на желаемые сайты, с которых нужно разрешить доступ к бакету.

2. Примените политику доступа на выбранный бакет:

aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket 

где:

  • policy.json — путь до JSON-файла с политикой.

  • s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.

  • my_bucket — название бакета, к которому следует применить политику.


S3cmd

Пример политики доступа, которая разрешает только запросы с сайтов, указанных в политике доступа ("StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}).

1. Создайте JSON файл с такой политикой:

{
"Statement":
 [
  {
"Sid":"Allow get requests originating from www.example.com and example.com.",
"Effect":"Allow",
"Principal":"*",
"Action":["s3:GetObject","s3:GetObjectVersion"],
"Resource":"arn:aws:s3:::*",
"Condition":
     {
"StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
     }
   }
 ]
}

Важно: в строке "StringLike" замените http://www.example.com/ и http://example.com/ на желаемые сайты, с которых нужно разрешить доступ к бакету.

2. Примените политику доступа на выбранный бакет:

s3cmd setpolicy policy_name.json s3://my_bucket/

где:

  • policy.json — путь до JSON-файла с политикой.

  • my_bucket — название бакета, к которому следует применить политику.

AWS CLI

Пример команды, которая позволяет любым анонимным пользователям листить файлы в бакете, но не дает им возможности читать/записывать эти файлы.

aws s3api put-bucket-acl --bucket my_bucket --acl public-read --endpoint-url=https://s-dt2.cloud.edgecore.ru

где:

  • policy.json — путь до JSON-файла с политикой.

  • my_bucket — название бакета, к которому следует применить политику.

  • s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.


S3cmd

Пример команды, которая позволяет любым анонимным пользователям листить файлы в бакете, но не даёт им возможность читать/записывать эти файлы.

s3cmd setacl s3://my_bucket/ --acl-grant=read

где:

  • my_bucket — название бакета, к которому следует применить ACL.

AWS CLI

Пример политики, которая разрешает доступ пользователю-хранилищу к бакету.

В S3-хранилище EdgeЦентр пользователем является отдельное хранилище, созданное в вашем или стороннем аккаунте.

Например, вы можете дать доступ пользователю-хранилищу с названием 1234-storage к вашему бакету my_bucket в хранилище 1000-my-storage.

1. Определите название пользователя-хранилища, которому необходим доступ к вашему бакету. Название можно найти в разделе Детали.

Настроить ACL и Policy для S3 хранилища с помощью AWS CLI или S3cmd

2. Создайте JSON файл с такой политикой:

{ 
"Statement":[ 
  { 
"Effect":"Allow", 
"Principal": {"AWS":["arn:aws:iam:::user/1234-storage"]}, 
"Action":["s3:GetObject","s3:ListBucket"], 
"Resource":["arn:aws:s3:::my_bucket/*", "arn:aws:s3:::my_bucket"] 
  } 
            ] 
}

Важно:

  • В строке "Principal" измените название пользователя 1234-storage на название пользователя-хранилища, которому хотите дать доступ к бакету. Вы получили его на шаге №1.

  • В строке "Resource" вместо my_bucket вставьте название бакета, к которому нужно разрешить доступ.

3. Примените политику на выбранный бакет:

aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket

где:

  • policy.json — путь до JSON-файла с политикой.

  • s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.

  • my_bucket — название бакета, к которому следует применить политику.

Теперь, войдя в хранилище 1234-storage, можно просматривать содержимое бакета my_bucket в другом хранилище 1000-my-storage.

4. Чтобы проверить доступ, введите команду:

aws s3 ls s3://my_bucket --endpoint-url=https://s-dt2.cloud.edgecore.ru

Вместо my_bucket вставьте название вашего бакета.

Если данные в политике верны, вы увидите содержимое бакета. Если в политике допущена ошибка, вы получите ошибку “An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Unknown”.


S3cmd

Пример политики, которая разрешает доступ пользователю-хранилищу к бакету.

В S3-хранилище EdgeЦентр пользователем является отдельное хранилище, созданное в вашем или стороннем аккаунте.

Например, вы можете дать доступ пользователю-хранилищу с названием 1234-storage к вашему бакету my_bucket в хранилище 1000-my-storage.

1. Определите название пользователя-хранилища, которому необходим доступ к вашему бакету. Название можно найти в разделе Детали.

 

S3 ACL и Policy. Настроить ACL и Policy для хранилища с помощью S3cmd

 

2. Создайте JSON файл с такой политикой:

{  
"Statement":[ 
  { 
"Effect":"Allow", 
"Principal": {"AWS":["arn:aws:iam:::user/1234-storage"]}, 
"Action":["s3:GetObject","s3:ListBucket"], 
"Resource":["arn:aws:s3:::my_bucket/*", "arn:aws:s3:::my_bucket"] 
  } 
            ] 
}

Важно:

  • В строке "Principal" измените название пользователя 1234-storage на название пользователя-хранилища, которому хотите дать доступ к бакету. Вы получили его на шаге №1.

  • В строке "Resource" вместо my_bucket вставьте название бакета, к которому нужно разрешить доступ.

3. Примените политику на выбранный бакет:

s3cmd setpolicy policy_name.json s3://my_bucket/

где:

  • policy.json — путь до JSON-файла с политикой.

  • my_bucket — название бакета, к которому следует применить политику.

Теперь, войдя в хранилище 1234-storage, можно просматривать содержимое бакета my_bucket в другом хранилище 1000-my-storage.

4. Чтобы проверить доступ, введите команду:

s3cmd ls s3://my_bucket

Вместо my_bucket вставьте название вашего бакета.

Если данные в политике верны, вы увидите содержимое бакета. Если в политике допущена ошибка, вы получите ошибку “ERROR: Access to bucket 'my_bucket' was denied ERROR: S3 error: 403 (AccessDenied)”.

Мы используем cookie, чтобы сайт стал лучше для вас.