我正在创建一个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" } }
有没有办法 加密或隐藏 凭据信息?
答案 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