2016-10-07 1 views
0

Я создал роль «IAM» роли IAM и назначил экземпляр EC2. И я создал ведро S3 с ковшом политикиНе удалось получить доступ к файлу S3 с ролью IAM из EC2

{ 
    "Version": "2012-10-17", 
    "Id": "Policy1475837721706", 
    "Statement": [ 
     { 
      "Sid": "Stmt1475837720370", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::770370070203:role/test" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::test-role-123/*" 
     } 
    ] 
} 

С EC2, я получил Accesskey и SecretKey от этого AWS article, отправив локон запрос на

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name> 

Используя отклик выше, я написал сценарий узла для запроса на ресурс в ковше

var AWS = require('aws-sdk'); 

var d = { 
    "Code" : "Success", 
    "LastUpdated" : "2016-10-07T12:28:09Z", 
    "Type" : "AWS-HMAC", 
    "AccessKeyId" : "ASIAIMJBHYLH6GWOWNMQ", 
    "SecretAccessKey" : "7V/k5nvFdhXOcT+nhYjGqHM4QmUWjNBUM1ERJQJs", 
    "Token" : "FQoDYXdzEO7//////////wEaDGG+SgxD4Es4Z1RBZCKzAz855JuKfm8s7LDcP5T9TGvDdJELsYTzPi47HJ9Q5oaK8OTb0Us0RjvpGW278Mb1gg1dNip1VD2N/GW5/1TFC6xhNpnnZ9+LNkJAwVVZg5raGM91k56X/VOA++/5WivSpO4jWg8fZDibivVyHuoMJJTkurFtEXrweDOCqpiabypTCc5jFtX8NfQuHubwl4C1jp2pMasVS1jwhjU72TA8Pn9EsIIvh8JXDC1dVfppwnslolAeJyOOAHdL1AQSs3nI6IvPCtKhBjtDaVuoiH/lHrnKrw6AeMHoTYQay4wOYRnE4ffngtksekZEULXvERWE4NCs3leXGMqrdzOr8xdZ9m0j3IkshqSS56fkq6E9JtLhSVGyy44ELrL7kYW/dpHE03V+dwQPXMhRafjsVsPD7sUnBfH/+4yyL0VDX1vlFRKbRi50i/Eqvxsb9bcSTsE0W5yWmOWR8reTTYWcWyQXGvxKVYVxLWZKVRfmNfx6IX2sqan7e7pjCtUrqXB1TBMpXdy8KSH9qoJtNAQTYBXws7oFLYY+F2esnNCma0bdNcCeAQ6t/6aPfUdpdLgv8BcGciZxayiqqd6/BQ==", 
    "Expiration" : "2016-10-07T18:51:57Z" 
}; 
AWS.config.accessKeyId = d.AccessKeyId; 
AWS.config.secretAccessKey = d.SecretAccessKey; 
var s3params = {Key: "test.json", Bucket:"test-role-123"}; 
AWS.config.region = 'ap-south-1'; 

var s3 = new AWS.S3(); 

s3.getSignedUrl('getObject', s3params, function(err, url) { 
    console.log(url); 
}); 

При запуске этого кода я получаю подписанный URL-адрес. Но это приводит к ошибке InvalidAccessKeyId. Я сомневался в неправильности политики байтов s3, поэтому попытался получить аналогичную политику с учетными данными пользователя IAM. Он полностью работает.

Любые советы и пожелания приветствуются.

+0

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

+0

@ Michael-sqlbot Это правильный способ сделать это. И как мы используем токен? –

+0

@ Michael-sqlbot спасибо. Это помогло мне. Но все еще не уверен, почему ключ доступа не работал. –

ответ

2

Есть три вещи, чтобы отметить:

  • Как полномочия предоставляются и доступны из экземпляра Amazon EC2
  • Как назначить разрешения для доступа к Amazon S3
  • Как Pre -Согласованные URL-адреса Функция

1. Как обеспечивается и доступ к учетных данных из экземпляра Amazon EC2

Когда экземпляр Amazon EC2 запускается с IAM роль, Instance Metadata автоматически обеспечивает временные учетные данные для доступа, состоящие из ключа доступа, секретный ключ и Токен. Эти полномочия поворачиваются примерно каждые шесть часов.

Любой код, который использует AWS SDK (например, Python, Java, PHP), знает, как автоматически получить эти учетные данные. Поэтому код, запущенный на экземпляре Amazon EC2, который был запущен с ролью IAM , не требует от вас получения или предоставления учетных данных доступа - он просто работает автоматически!

Итак, в приведенном выше примере кода вы могли бы удалить любые строки, которые специально ссылаются на учетные данные. Ваша задача состоит в том, чтобы гарантировать, что роль IAM имеет достаточные разрешения для операций, которые вы хотите выполнить.

Это также относится к AWS Command-Line Interface (CLI), что на самом деле является просто программой Python, которая обеспечивает доступ к командной строке для вызовов AWS API. Так как он использует AWS SDK для Python, он автоматически получает учетные данные из метаданных экземпляра и не требует учетных данных при использовании из экземпляра Amazon EC2, который был запущен с ролью IAM.

2. Как назначить разрешения для доступа к Amazon S3

Объекты в Amazon S3 являются частными по умолчанию.Есть три способа назначить разрешения на доступ к объектам:

  • объектов списков ACL (списки управления доступом): Эти права на самих
  • ковшовые Политика объектов: Это набор правил, применяемых к (например, конкретный путь в ковше)
  • Политики IAM, которые применяются к пользователям, группам или ролям IAM. Эти разрешения применяются конкретно к веществу в целом, но могут также указывать разрешения, связанные с подмножеством ведра. этим организациям

Поскольку вы желаете, чтобы предоставить доступ к объектам Amazon S3 для конкретного IAM пользователя, то лучше назначить разрешения через IAM политики прикрепленных к этому пользователю, а не быть частью Bucket политики ,

Таким образом, вы должны:

  • Удалите Bucket политики
  • Создание Инлайн политики в IAM и прикрепить его к нужному IAM пользователя. Политика затем применяет к этому пользователю и не требует Principal

Вот пример политики:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "Stmt1", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:GetObject" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::MY-BUCKET/*" 
      ] 
     } 
    ] 
} 

Я рекомендовал Инлайн политику, потому что эта политика применяется только один пользователь. Если вы назначаете разрешения для многих пользователей, рекомендуется назначить эту политику группе IAM, а затем пользователи, назначенные этой группе, наследуют разрешения. Кроме того, создайте политику IAM, а затем добавьте эту политику всем соответствующим пользователям.

3. Как Pre-Signed адрес функционирует

Amazon S3 Pre-Signed URL-адрес является средством предоставления временного доступа к объектам Amazon S3. Сгенерированный URL включает:

  • Ключа доступа из IAM пользователя, который имеет разрешения на доступ к объекту
  • времени истечения
  • подписи создана с помощью а имеет операцию, которая уполномочивает URL

Ключевой момент для реализации связан с разрешениями, используемыми при создании предварительно подписанного URL. Как упоминалось в документации Amazon S3 Share an Object with Others:

Любой имеющий действующие учетные данные безопасности может создать предварительно подписанный URL-адрес.Однако, чтобы успешно получить доступ к объекту, предварительно подписанный URL-адрес должен быть создан кем-то, у кого есть разрешение на выполнение операции, на которой основан предварительно подписанный URL.

Это означает, что учетные данные, используемые при создании предварительно подписанного URL-адреса, также являются учетными данными, которые используются как часть предварительно подписанного URL-адреса. Объект, связанный с этими учетными данными, конечно, нуждается в разрешении на доступ к объекту - предварительно подписанный URL-адрес является просто средством предоставления доступа к объекту на временный период.

Это также означает, что в случае вашего примера вам не нужно создавать определенную роль для предоставления доступа к объектам (объектам) в Amazon S3. Вместо этого вы можете использовать более разрешающую роль IAM с вашим экземпляром Amazon EC2 (например, тот, который также может загружать объекты на S3), но когда он генерирует предварительно подписанный URL, он предоставляет только временный доступ к объекту (а не другому разрешения, такие как разрешение на загрузку).

Если программное обеспечение, запущенное на вашем экземпляре Amazon EC2, взаимодействует только с AWS, чтобы создать подписанные URL-адреса, то ваша роль, которая имеет только разрешения GetObject, прекрасна. Однако, если ваш экземпляр хочет сделать больше, создайте роль, которая предоставляет экземпляру соответствующие разрешения (включая GetObject доступ к S3) и генерирует подписанные URL-адреса, используя эту роль.

Если вы хотите попрактиковаться в создании подписанных URL-адресов, последние версии AWS Command-Line Interface (CLI) содержат команду aws s3 presign s3://path, которая может генерировать предварительно подписанные URL-адреса. Попробуйте с различными настройками --profile посмотреть, как это работает с разными пользователями IAM.

+0

большое спасибо. Это действительно дало хорошее представление об использовании этого. –

Смежные вопросы