独自のAWSS3バケットを持つ複数のオフィスがあります。あるオフィスのユーザーは、別のオフィスのS3バケットにアクセスできません。
したがって、すべてのオフィスには、S3 Bucket
とがありますIAM user
。各IAMユーザーには、1つのバケットに対する権限のみがあります。オフィスが頻繁に拡大することはないため、IAMユーザーの作成とアクセス許可の割り当てはを介して手動で行われますAWS Console
。
ブラウザ(Javascript)は、サーバー(PHP API)にファイルをアップロードするための一時的な資格情報を要求しますAWS S3
。PHP APIフェッチAccess key ID
およびSecret access key
データベースから(オフィスに基づくログイン)。次に、を使用してAWS PHP SDK
、メソッドを呼び出しStsClient
、使用getSessionToken()
して一時的な認証情報を取得し、それをJavascriptに渡します。
PHPコード
use Aws\Sts\StsClient;
$credentials = new Aws\Credentials\Credentials($resultset['awssecret'], $resultset['awspass']);
$stsoptions = [
'region' => 'ap-south-1',
'version' => '2011-06-15',
'signature_version' => 'v4',
'credentials' => $credentials,
];
$stsClient = new StsClient($stsoptions);
$response = $stsClient->getSessionToken();
現在、IAMユーザーはそれぞれのバケットへのフルアクセス権を持っています。一時的な資格情報へのアクセスを特定の承認のみに制限したい。ファイルの削除やすべてのファイルの一覧表示ではなく、アップロードの権限のみのように。
StsClient
バケットへのアクセス許可を制限できる場所に追加のパラメーターを渡すことはできますか?
編集1
ユーザーには、ポリシーを通じてアクセス許可が割り当てられます。以下は、ポリシーに追加された権限です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:ListBucketByTags",
"s3:GetBucketTagging",
"s3:DeleteObjectVersion",
"s3:GetObjectVersionTagging",
"s3:ListBucketVersions",
"s3:GetBucketLogging",
"s3:RestoreObject",
"s3:ListBucket",
"s3:GetAccelerateConfiguration",
"s3:GetObjectAcl",
"s3:AbortMultipartUpload",
"s3:GetObjectVersionAcl",
"s3:GetObjectTagging",
"s3:GetMetricsConfiguration",
"s3:PutObjectTagging",
"s3:DeleteObject",
"s3:PutBucketVersioning",
"s3:GetIpConfiguration",
"s3:DeleteObjectTagging",
"s3:ListBucketMultipartUploads",
"s3:GetBucketWebsite",
"s3:PutObjectVersionTagging",
"s3:DeleteObjectVersionTagging",
"s3:GetBucketVersioning",
"s3:GetBucketAcl",
"s3:GetReplicationConfiguration",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:GetObject",
"s3:GetBucketCORS",
"s3:GetAnalyticsConfiguration",
"s3:GetObjectVersionForReplication",
"s3:GetBucketLocation",
"s3:ReplicateDelete",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::aws:s3:::mybucket",
"arn:aws:s3:::*/*"
]
}
]
}
AcceptedAnswerによって提案された回答に基づく私の解決策。
回答の提案に基づいて、許可を追加しました
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "*"
}
今私のPHPコードは
$policy = '{
"Id": "Policy1534086947311",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1534086676951",
"Action": [
"s3:PutObject",
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::mybucket"
}
}
]
}';
$awsrole = [
'Policy' => $policy,
'RoleArn' => 'arn:aws:s3:::mybucket',
'RoleSessionName' => 'credApi' // just a random value
];
$response = $stsClient->assumeRole($awsrole);
より厳密にスコープされた権限を持つIAMロールを作成し、IAMユーザー認証情報を使用してAssumeRoleを呼び出し、一時的な認証情報を取得します。IAMロールは、関連するバケットにs3:PutObject *のみを許可します。IAMユーザーには、ロールを引き受けるためのアクセス許可が必要です。
または、関連するS3バケット内のオブジェクトにアップロードするための事前署名されたURLをサーバーに生成させるだけです。クライアントは、他のS3操作にURLを使用できなくなります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加