【问题标题】:Access aws services without key & secret in php在 php 中访问没有密钥和秘密的 aws 服务
【发布时间】:2018-06-12 12:56:59
【问题描述】:

需要明确的是,我们已经创建了 EC2 策略,因此我的站点可以直接访问参数存储、S3、Amazon SES 等服务。

到目前为止,我的所有凭证都存储在 AWS Parameter Store 中,然后站点正在使用这些凭证,即 DB 凭证,diff。 API 密钥等。因此,只有硬编码的凭据是从 Parameter Store 获取参数的凭据。现在客户也想删除那些硬编码的凭据,这就是我们创建 EC2 策略的原因。

到目前为止,我们有如下代码来获取参数:

$config = array(
        'version' => 'latest',
        'region' => '*****',
        'credentials' => array(
            'key' => '*******',
            'secret' => '******',
        )
    );
$s3_instance = new \Aws\Ssm\SsmClient($config);

$result = $s3_instance->getParameters([
    'Names' => $credential_group,
    'WithDecryption' => true
]);
//converting S3 private data to array to read
$keys = $result->toArray();
var_dump($keys);

现在的问题是我必须在上面的代码中更改什么,所以它应该可以在不传递这些凭据的情况下工作。

注意:我正在使用 AWS PHP 库来执行上述操作。

更新

进一步阅读文档,https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html

使用环境变量中的凭据
如果您在实例化客户端对象时未向其提供凭据,SDK 会尝试在您的环境中查找凭据。 SDK 检查凭据的第一个地方是您的环境变量。开发工具包使用 getenv() 函数来查找 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_SESSION_TOKEN 环境变量。这些凭据称为环境凭据。

所以在那之后,我尝试了以下方法:

var_dump(getenv('AWS_ACCESS_KEY_ID'));

但它返回 bool(false)。那么我需要在环境凭据中手动设置它们吗?
我需要在上面的代码中更改哪些内容?

更新

基于此文档:https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_configuration.html#credentials

我做了以下更改(从数组中删除了凭据部分):

$config = array(
    'version' => 'latest',
    'region' => '*****'
);

然后系统抛出以下警告:

警告:include(Test_Role_Cognitoaccess_from_instanceRole.php):打开流失败

警告:include():无法打开“Test_Role_Cognitoaccess_from_instanceRole.php”以包含(include_path='.:/usr/share/pear:/usr/share/php')

警告:include(Test_Role_Cognitoaccess_from_instanceRole.php):打开流失败

警告:include():无法打开“Test_Role_Cognitoaccess_from_instanceRole.php”以包含(include_path='.:/usr/share/pear:/usr/share/php')

【问题讨论】:

    标签: php amazon-web-services amazon-ec2 aws-sdk


    【解决方案1】:

    正如您已经提到的,您将策略附加到 EC2 IAM 角色以访问其他 AWS 服务。

    您应该尝试创建一个默认凭据提供程序,这将自动从角色中选择密钥。

    $provider = CredentialProvider::chain(CredentialProvider::env(), CredentialProvider::ini(), CredentialProvider::instanceProfile(), CredentialProvider::ecsCredentials());
    

    【讨论】:

      【解决方案2】:

      当您将凭证直接传递给 SsmClient 并同时为 EC2 机器定义了一个角色时,您就会混淆 AWS。如果您已为 EC2 实例定义了权限,则只需执行以下操作:

      use Aws\Ssm\SsmClient;
            
       
      $client = new SsmClient(['version' => 'latest', 'region' => 'ap-southeast-2']);
      
      $result = $client->getParameters(['Names' => ['My-SECRATE-KEY'], 'WithDecryption' => true]);
      
      print_r($result);
      

      请记住,权限需要一些时间来传播,在此期间您会​​收到特定用户的权限错误。如果您等待并让更改生效,那么提到的代码将正常工作而不会出现任何错误。就我而言,我将 AmazonSSMReadOnlyAccess 附加到 EC2 角色和 EC2 实例。如果参数存储中的键/值未加密,则可以删除 'WithDecryption' => true 或将其更改为 false。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 2020-11-28
        • 2017-10-02
        • 1970-01-01
        相关资源
        最近更新 更多