Cyberduck 또는 filezilla를 사용하여 서버에 로그인할 수 있지만 홈 디렉터리를 읽을 수 없습니다. s3 버킷이 "mybucket"
존재합니다. 사이버 덕에서 나는 본다
"Cannot readdir on root. Please contact your web hosting service provider for assistance." and in Filezilla "Error: Reading directory .: permission denied"
비록 서버에 연결할 수는 있지만.
내가 뭔가를 놓치고 있는 걸까?정책의 사용자 권한아래에 ?
이것들은 내권한
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::MYBUCKET"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::MYBUCKET/*"
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "transfer:*",
"Resource": "*"
}
]
}
이것들은 내신뢰 관계:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
답변1
사용자 역할은 다음과 같아야 합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListingOfUserFolder",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::BUCKET_NAME"
]
},
{
"Sid": "HomeDirObjectAccess",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObjectVersion",
"s3:DeleteObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::BUCKET_NAME/*"
}
]
}
사용자의 신뢰 관계:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
사용자의 홈 디렉터리는 /BUCKET_NAME이어야 합니다.
답변2
s3:GetObject
정책 에 대한 권한을 구체적으로 추가하기 전까지는 이와 관련된 문제가 있었습니다 aws_transfer_user
. 나는 s3:ListBucket
충분할 것으로 예상했지만 그렇지 않았습니다. sftp> ls
GetObject를 갖기 전까지는 실패할 것입니다.
이에 대한 Terraform은 다음과 같습니다.
resource "aws_transfer_user" "example-ftp-user" {
count = length(var.uploader_users)
user_name = var.uploader_users[count.index].username
server_id = aws_transfer_server.example-transfer.id
role = aws_iam_role.sftp_content_incoming.arn
home_directory_type = "LOGICAL"
home_directory_mappings {
entry = "/"
target = "/my-bucket/$${Transfer:UserName}"
}
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSftpUserAccessToS3",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObjectVersion",
"s3:DeleteObject",
"s3:GetObjectVersion",
"s3:GetBucketLocation"
],
"Resource": [
"${aws_s3_bucket.bucket.arn}/${var.uploader_users[count.index].username}",
"${aws_s3_bucket.bucket.arn}/${var.uploader_users[count.index].username}/*"
]
}
]
}
POLICY
}
그리고 파일에 사용자를 정의합니다 .tfvars
. 예:
uploader_users = [
{
username = "firstuser"
public_key = "ssh-rsa ...."
},
{
username = "seconduser"
public_key = "ssh-rsa ..."
},
{
username = "thirduser"
public_key = "ssh-rsa ..."
}
]
이것이 누군가에게 도움이 되기를 바랍니다. 마침내 이 작업을 수행하기 전에 많은 수정 작업이 필요했으며 다른 정책과의 상호 작용이 궁극적으로 작동할지 100% 확신할 수 없습니다. 하지만 적용한 후에는 "권한 거부" 메시지가 표시되지 않고 연결하여 버킷 콘텐츠를 나열할 수 있는 순간이었습니다.