在弹性 beantalk 部署之间维护 OAuth 密钥
Mantaining OAuth keys between elastic beanstalk deployment
我在 AWS Elastic Beanstalk 环境中有一个 laravel 应用程序 运行。我使用 Laravel Passport 来处理身份验证。
每次我 运行 eb deploy
键都会被删除,因为它不是版本控制文件的一部分(包含在 .gitignore 中)。因此,我必须在 EC2 实例中手动 运行 php artisan passport:keys
来生成密钥。但这将使所有用户需要重新登录,因为旧令牌现在无效,因为它是一个新的密钥对。
为我的配置提供一致的 oauth-public 和 oauth-private 密钥的最佳做法是什么?
我正在考虑将密钥包含到存储库中,但我认为不推荐这样做。
另一种方法是我生成一次密钥,然后将其上传到S3。然后有一个 post-部署脚本来检索 S3。
有没有更好的方法?
我昨天用 S3 设法解决了这个问题。
- 创建私有 S3 存储库,用于存储敏感文件(oauth-private.key 等)
- 在您的 .ebextensions 目录中,您必须创建一个 .config 文件,在其中定义
Resource
(请参阅 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-files - authentication
部分)- 如下所示:
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Auth:
type: "s3"
buckets: ["<BUCKET-NAME>"]
roleName:
"Fn::GetOptionSetting":
Namespace: "aws:autoscaling:launchconfiguration"
OptionName: "IamInstanceProfile"
DefaultValue: "aws-elasticbeanstalk-ec2-role"
- 假设 A) 您的 S3 存储桶称为
<BUCKET-NAME>
并且 B) 您的 ElasticBeanstalk 环境中的 IAM 实例配置文件称为 aws-elasticbeanstalk-ec2-role
- 现在您必须将文件添加到实例上的某个位置,您可以在其中访问它,您也可以自由选择位置。在您的
.config
文件中插入以下内容:
files:
"/etc/keys/oauth-private.key":
mode: "000755"
owner: webapp
group: webapp
authentication: "S3Auth" # Notice, this is the same as specified in the Resources section
source: "https://<BUCKET-NAME>.s3-<REGION>.amazonaws.com/<PATH-TO-THE-FILE-IN-THE-BUCKET>"
- 现在要让它工作,您仍然需要授予对 IAM 实例配置文件 (aws-elasticbeanstalk-ec2-role) 的访问权限,因此您需要编辑存储桶的 ACL,如下所示:
{
"Version": "2012-10-17",
"Id": "BeanstalkS3Copy",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ID>:role/aws-elasticbeanstalk-ec2-role"
},
"Action": [
"s3:ListBucketVersions",
"s3:ListBucket",
"s3:GetObjectVersion",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<BUCKET-NAME>/*"
]
}
]
}
您可以转到 IAM 控制面板 > 角色 > aws-elasticbeanstalk-ec2-role 找到 IAM 实例配置文件的 ARN,然后复制角色 ARN
在您的 Laravel 应用程序中,您必须使用 Passport::loadKeysFrom('/etc/keys')
我在 AWS Elastic Beanstalk 环境中有一个 laravel 应用程序 运行。我使用 Laravel Passport 来处理身份验证。
每次我 运行 eb deploy
键都会被删除,因为它不是版本控制文件的一部分(包含在 .gitignore 中)。因此,我必须在 EC2 实例中手动 运行 php artisan passport:keys
来生成密钥。但这将使所有用户需要重新登录,因为旧令牌现在无效,因为它是一个新的密钥对。
为我的配置提供一致的 oauth-public 和 oauth-private 密钥的最佳做法是什么?
我正在考虑将密钥包含到存储库中,但我认为不推荐这样做。
另一种方法是我生成一次密钥,然后将其上传到S3。然后有一个 post-部署脚本来检索 S3。
有没有更好的方法?
我昨天用 S3 设法解决了这个问题。
- 创建私有 S3 存储库,用于存储敏感文件(oauth-private.key 等)
- 在您的 .ebextensions 目录中,您必须创建一个 .config 文件,在其中定义
Resource
(请参阅 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-files -authentication
部分)- 如下所示:
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Auth:
type: "s3"
buckets: ["<BUCKET-NAME>"]
roleName:
"Fn::GetOptionSetting":
Namespace: "aws:autoscaling:launchconfiguration"
OptionName: "IamInstanceProfile"
DefaultValue: "aws-elasticbeanstalk-ec2-role"
- 假设 A) 您的 S3 存储桶称为
<BUCKET-NAME>
并且 B) 您的 ElasticBeanstalk 环境中的 IAM 实例配置文件称为aws-elasticbeanstalk-ec2-role
- 现在您必须将文件添加到实例上的某个位置,您可以在其中访问它,您也可以自由选择位置。在您的
.config
文件中插入以下内容:
files:
"/etc/keys/oauth-private.key":
mode: "000755"
owner: webapp
group: webapp
authentication: "S3Auth" # Notice, this is the same as specified in the Resources section
source: "https://<BUCKET-NAME>.s3-<REGION>.amazonaws.com/<PATH-TO-THE-FILE-IN-THE-BUCKET>"
- 现在要让它工作,您仍然需要授予对 IAM 实例配置文件 (aws-elasticbeanstalk-ec2-role) 的访问权限,因此您需要编辑存储桶的 ACL,如下所示:
{
"Version": "2012-10-17",
"Id": "BeanstalkS3Copy",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ID>:role/aws-elasticbeanstalk-ec2-role"
},
"Action": [
"s3:ListBucketVersions",
"s3:ListBucket",
"s3:GetObjectVersion",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<BUCKET-NAME>/*"
]
}
]
}
您可以转到 IAM 控制面板 > 角色 > aws-elasticbeanstalk-ec2-role 找到 IAM 实例配置文件的 ARN,然后复制角色 ARN
在您的 Laravel 应用程序中,您必须使用
Passport::loadKeysFrom('/etc/keys')