SFTP 서버의 AWS 전송에 대한 권한이 거부되었습니다.

SFTP 서버의 AWS 전송에 대한 권한이 거부되었습니다.

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> lsGetObject를 갖기 전까지는 실패할 것입니다.

이에 대한 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% 확신할 수 없습니다. 하지만 적용한 후에는 "권한 거부" 메시지가 표시되지 않고 연결하여 버킷 콘텐츠를 나열할 수 있는 순간이었습니다.

관련 정보