问题描述
我已经使用GoLang Fyne
和RClone
创建了一个桌面应用程序。我将在S3上使用RClone的sync
和mount
功能,并且我不想将AWS access key
和Secret key
存储在我的桌面应用程序(最终用户桌面应用程序)中或本地配置文件。如何保护RClone,使其在我不将访问密钥ID和秘密密钥ID存储在用户计算机或桌面应用程序(硬编码)的情况下起作用? S3访问密钥和秘密密钥必须仅存储在我的服务器中。
我的方法:
- 桌面应用程序登录:修改后端登录api逻辑,以使其返回加密的AWS访问密钥和Secret。 AWS访问密钥和访问密码将在运行时在桌面应用程序中解密。
- 从我的登录API中返回AWS签名,并在RClone /桌面应用程序(https://github.com/rclone/rclone/blob/master/backend/s3/v2sign.go)中使用它,并使用该签名来调用s3 API(授权标头)。
- 无论如何,我是否可以生成无风险的AWS访问令牌和秘密密钥,它们只能访问AWS S3存储桶中的一个文件夹?
RClone S3连接代码:https://github.com/rclone/rclone/tree/master/backend/s3
解决方法
您似乎需要一些AWS凭证才能使用RClone。
您的应用程序可以生成临时凭据以提供给远程用户。我建议:
- 在空的IAM角色上调用STS
AssumeRole()
命令,但指定内联策略,以限制对所需S3存储桶和文件夹的访问 - 将返回的凭据传递给客户端
内联策略如下:
{
"Version": "2012-10-17","Statement": [
{
"Effect": "Allow","Action": [
"s3:PutObject","s3:GetObject"
],"Resource": "arn:aws:s3:::BUCKETNAME/FOLDERNAME/*"
},{
"Action": "s3:ListBucket","Effect": "Allow","Resource": "arn:aws:s3:::BUCKETNAME","Condition": {
"StringLike": {
"s3:prefix": "FOLDERNAME/*"
}
}
}
]
}
由AssumeRole()
返回的凭据在默认长度1小时内有效,但最多可以请求12小时。在这段时间之后,凭据将失效。