隐藏或加密AWS Data管道中的凭据信息

时间:2018-04-06 09:42:23

标签: amazon-data-pipeline aws-kms

我正在创建一个AWS数据管道,用于将数据从mysql复制到S3。我编写了一个shell脚本,它接受凭证作为参数并创建管道,以便我的凭据不会在脚本中公开。 在bash shell脚本下面使用来创建管道。

unique_id="$(date +'%s')"    
profile="${4}"    
startDate="${1}"    
echo "{\"values\":{\"myS3CopyStartDate\":\"$startDate\",\"myRdsUsername\":\"$2\",\"myRdsPassword\":\"$3\"}}" > mysqlToS3values.json    
sqlpipelineId=`aws datapipeline create-pipeline --name mysqlToS3 --unique-id  mysqlToS3_$unique_id --profile $profile --query '{ID:pipelineId}' --output text`    
validationErrors=`aws datapipeline put-pipeline-definition --pipeline-id $sqlpipelineId --pipeline-definition file://mysqlToS3.json --parameter-objects file://mysqlToS3Parameters.json --parameter-values-uri file://mysqlToS3values.json --query 'validationErrors' --profile $profile` 
aws datapipeline activate-pipeline --pipeline-id $sqlpipelineId --profile $profile    

然而,当我使用
通过aws cli获取管道定义时 aws datapipeline get-pipeline-definition --pipeline-id 27163782 , 我在json输出中以纯文本形式获取我的凭据。

 { "parameters": [...], "objects": [...], "values": { "myS3CopyStartDate": "2018-04-05T10:00:00", "myRdsPassword": "sbc", "myRdsUsername": "ksnck" } }

有没有办法 加密或隐藏 凭据信息?

3 个答案:

答案 0 :(得分:0)

我认为没有办法屏蔽管道定义中的数据。

我使用的策略是将我的秘密存储在S3中(使用特定的KMS密钥加密并使用适当的IAM / bucket permisions)。然后,在我的datapipeline步骤中,我使用AWS CLI从S3读取秘密并将其传递给mysql命令或其他任何内容。

因此,我没有像myRdsPassword这样的管道参数,而是: "myRdsPasswordFile": "s3://mybucket/secrets/rdspassword"

然后在我的步骤中,我用以下内容阅读: PWD=$(aws s3 cp ${myRdsPasswordFile} -)

您也可以使用类似的工作流程从AWS Parameter Store而不是S3中检索密码。

答案 1 :(得分:0)

数据管道中实际上内置了一种方法:

您在字段前面加上*,它将对字段进行加密并像密码表单字段一样将其隐藏。

如果您使用的是参数,则在对象字段和相应的参数字段上都加*,就像这样(注意-有三个*带有参数化设置;下面的示例是只是一个示例-缺少必填字段只是为了简化和说明如何通过参数处理加密):

  ...{
    "*password": "#{*myDbPassword}",
    "name": "DBName",
    "id": "DB",
  },
],
  "parameters": [
    {
      "id": "*myDbPassword",
      "description": "Database password",
      "type": "String"
    }...

查看以下更多内容:

https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-pipeline-characters.html

答案 2 :(得分:0)

您可以将RDS凭证存储在AWS Secret Manager中。然后,您可以使用cloudformation模板在数据管道中从SecretManager检索凭证,如下所述:

Mappings:
  RegionToDatabaseConfig:
    us-west-2:
      CredentialsSecretKey: us-west-2-SECRET_NAME
      # ...
    us-east-1:
      CredentialsSecretKey: us-east-1-SECRET_NAME
      # ...
    eu-west-1:
      CredentialsSecretKey: eu-west-1-SECRET_NAME
      # ...

Resources:
  OurProjectDataPipeline:
    Type: AWS::DataPipeline::Pipeline
    Properties:
      # ...
      PipelineObjects:
        # ...
        # RDS resources
        - Id: PostgresqlDatabase
          Name: Source database to sync data from
          Fields:
            - Key: type
              StringValue: RdsDatabase
            - Key: username
              StringValue:
                !Join
                  - ''
                  - - '{{resolve:secretsmanager:'
                    - !FindInMap
                      - RegionToDatabaseConfig
                      - {Ref: 'AWS::Region'}
                      - CredentialsSecretKey
                    - ':SecretString:username}}'
            - Key: "*password"
              StringValue:
                !Join
                  - ''
                  - - '{{resolve:secretsmanager:'
                    - !FindInMap
                      - RegionToDatabaseConfig
                      - {Ref: 'AWS::Region'}
                      - CredentialsSecretKey
                    - ':SecretString:password}}'
            - Key: jdbcProperties
              StringValue: 'allowMultiQueries=true'
            - Key: rdsInstanceId
              StringValue:
                !FindInMap
                  - RegionToDatabaseConfig
                  - {Ref: 'AWS::Region'}
                  - RDSInstanceId