Berechtigung für AWS-Übertragung auf SFTP-Server verweigert

Berechtigung für AWS-Übertragung auf SFTP-Server verweigert

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:GetObjectBerechtigung zur aws_transfer_userRichtlinie hinzugefügt habe. Ich hatte erwartet, s3:ListBucketdass das ausreicht, aber das war nicht der Fall. sftp> lsEs 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 .tfvarsDatei; 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.

verwandte Informationen