Ich kann mich mit Cyberduck oder Filezilla bei meinem Server anmelden, kann aber mein Home-Verzeichnis nicht lesen. S3-Bucket "mybucket"
existiert. In Cyberduck sehe ich
"Cannot readdir on root. Please contact your web hosting service provider for assistance." and in Filezilla "Error: Reading directory .: permission denied"
obwohl ich eine Verbindung zum Server herstellen kann.
Verpasse ich etwasBenutzerberechtigung in den Richtlinienunten ?
Das sind meineBerechtigungen
{
"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": "*"
}
]
}
Das sind meineVertrauensbeziehungen:
{
"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"
}
]
}
Antwort1
Die Benutzerrolle sollte sein:
{
"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/*"
}
]
}
Vertrauensverhältnis des Nutzers:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Das Home-Verzeichnis für Ihren Benutzer sollte /BUCKET_NAME sein.
Antwort2
Ich hatte damit Probleme, bis ich speziell die s3:GetObject
Berechtigung zur aws_transfer_user
Richtlinie hinzugefügt habe. Ich hatte erwartet, s3:ListBucket
dass das ausreicht, aber das war nicht der Fall. sftp> ls
Es würde fehlschlagen, bis ich GetObject hatte.
Hier ist das Terraform dafür:
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
}
Und ich definiere Benutzer in einer .tfvars
Datei; zB:
uploader_users = [
{
username = "firstuser"
public_key = "ssh-rsa ...."
},
{
username = "seconduser"
public_key = "ssh-rsa ..."
},
{
username = "thirduser"
public_key = "ssh-rsa ..."
}
]
Ich hoffe, das hilft jemandem. Ich musste viel herumtüfteln, bis ich es endlich zum Laufen gebracht habe, und ich bin mir nicht 100 % sicher, ob die Interaktionen mit anderen Richtlinien letztendlich eine Rolle spielen könnten. Aber nachdem ich dies angewendet hatte, war der Moment gekommen, in dem ich mich verbinden und Bucket-Inhalte auflisten konnte, ohne die Meldung „Zugriff verweigert“ zu erhalten.