【问题标题】:How can i use IAM in AWS to provide temporary security credentails我如何在 AWS 中使用 IAM 来提供临时安全凭证
【发布时间】:2014-02-26 07:01:32
【问题描述】:

IAM 有一个名为Simple Token Service (STS) 的服务组件。它允许您通过 SDK/API 创建临时访问以访问 AWS 资源,而无需创建专用凭证。这些 STS 令牌具有用户定义的生命周期,并且在此之后被销毁。人们使用此服务从移动设备(例如 Android/IOS 应用程序)访问内容。

但我不知道如何使用这项服务。

感谢任何帮助或支持。

谢谢

【问题讨论】:

    标签: amazon-ec2 amazon-iam


    【解决方案1】:

    STS 和 IAM 齐头并进,使用起来非常简单。由于您没有给出用例,请允许我在开始编码之前解释一些事情。

    注意:我用PHP编写代码,SDK版本是3。

    STS 的想法是创建一些tokens,它允许持有者在您(所有者或受让人)不损害您自己的凭据的情况下执行某些操作。您将使用哪种类型的 STS 取决于您想要做什么。 Possible actions are listed here.

    例如 1:通常,您使用 AssumeRole 进行跨账户访问或 联邦。假设您拥有多个帐户并需要访问 每个帐户中的资源。您可以在 每个帐户都可以访问这些资源。但是,管理所有这些 凭据并记住哪个可以访问哪个帐户可以 耗时的。相反,您可以创建一组长期 一个帐户中的凭据,然后使用临时安全凭据 通过担任这些帐户中的角色来访问所有其他帐户。

    E.g.2:通常,如果您想使用 MFA 来保护您,请使用 GetSessionToken 对特定 AWS API 的编程调用,例如 Amazon EC2 StopInstances。

    假设您有一个 IAM 用户,并且您想为该用户创建许多临时凭证,每个凭证的时间范围为 15 分钟。然后你将编写以下代码:

    $stsClient = \Aws\Laravel\AwsFacade::createClient('sts', array(
        'region' => 'us-east-1'
    ));
    
    $awsTempCreds = $stsClient->getSessionToken(array(
        'DurationSeconds' => 900
    ));
    

    注意事项:

    1. IAM 用户创建的凭证在您指定的持续时间内有效,从 900 秒(15 分钟)到最长 129600 秒(36 小时),默认为 43200 秒(12 小时);使用帐户凭据创建的凭据的范围从 900 秒(15 分钟)到最长 3600 秒(1 小时),默认为 1 小时。
    2. 在上面的示例中,我使用 AWS Facade 获得了 $stsClient,它是 Laravel 框架的一部分。如何通过传递凭据获取$stsClient 取决于您。阅读此installation guide,了解如何实例化您的$stsClient
    3. 由于STS 是一个全局资源,即它不需要您位于特定区域,因此您必须始终将区域设置为us-east-1。如果您的区域设置为其他任何内容,您将收到 should be scoped to a valid region, not 'us-west-1' 之类的错误。
    4. 您制作的临时凭证数量没有限制。
    5. 这些凭据将具有与派生它们的Account/IAM 相同的权限。

    以上代码为 AWS 账户或 IAM 用户返回一组临时凭证。凭据包括访问密钥 ID、秘密访问密钥和安全令牌,以及一些其他信息,例如到期时间。

    您现在可以将这些临时凭据提供给其他人。假设我把这个给了我碰巧使用Javascript API的朋友。他现在可以编写如下代码:

    <script>
    var accessKey = '<?php echo $credentials["AccessKeyId"] ?>';
    var accessToken = '<?php echo $credentials["SecretAccessKey"] ?>';
    var accessSessionToken = '<?php echo $credentials["SessionToken"] ?>';
    
    AWS.config.update({
        credentials: {
            accessKeyId: accessKey,
            secretAccessKey: accessToken,
            sessionToken: accessSessionToken
        },
        region: 'us-east-1'
    });
    
    var bucket = new AWS.S3();
    var file = fileChooser.files[0];
    var params = {Bucket: 'mybucket', Key: file.name, ContentType: file.type, Body: file};
    
    bucket.upload(params, function (err, data) {
        results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
    }).on('httpUploadProgress', function(evt) {
        console.log('Progress:', evt.loaded, '/', evt.total); 
    });
    </script>
    

    这个脚本有什么作用?

    1. 使用临时凭据创建新客户端。
    2. 使用Multipart Upload 将一个非常大的文件(超过100MB)上传到mybucket

    同样,只要您的临时凭证有权执行此操作,您就可以对任何 AWS 资源执行操作。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      STS 有点难以理解(需要实时阅读)。我将尝试(是的尝试!)尽可能简单地解释。如果您需要执行以下操作,该服务很有用:

      1. 您在 S3 上有一个存储桶。您说有 100 个用户要将文件上传到此存储桶。很明显,您不应该将您的 AWS 密钥/秘密分发给所有这些人。 STS 来了。您可以使用 STS 允许这些用户在“有限的时间”(例如 1 小时)内写入存储桶的“部分”(例如他们的 google-id 的文件夹)。您可以通过执行所需的设置(IAM、S3 策略和 STS-AssumeRoles)并向他们发送一个 URL(他们用来上传)来实现这一点。在这种情况下,您还可以使用 Web Identity Federation 通过 Google/FB/Amazon.com 对用户进行身份验证。所以没有后端代码,这个工作流程是可以实现的。 Web Identity Federation Playground 让您了解它是如何工作的。
      2. 您有一个 AWS 帐户并希望其他人(另一个 AWS 用户)帮助您管理此帐户。在这里,您再次授予其他用户对 AWS 资源的选定部分的限时访问权限,而无需共享密钥/秘密
      3. 假设您有一个 DynamoDB 设置,每个应用程序用户都有一行数据。在这里,您需要确保给定用户只能在他的数据行上写入,而不能在其他数据行上写入。你可以使用 STS 来设置这样的东西。

      这里有一个完整的例子: Web 身份联合与移动应用程序:文章和教程:亚马逊网络服务:http://aws.amazon.com/articles/4617974389850313

      更多阅读: 使用身份提供商为移动应用创建临时安全凭证 - AWS 安全令牌服务:http://docs.aws.amazon.com/STS/latest/UsingSTS/CreatingWIF.html

      【讨论】:

      • 你能解释一下这项服务的全部内容以及如何完成这些事情
      • 我想将此服务用于 ec2 s3 ebs vol 等 AWS 资源
      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
      • 我已经编辑了上面的帖子,以包括更详细的回复,因为其他人的反馈表明了这一点。也请求取消删除!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多