Подключение к передаче AWS для SFTP

У меня проблемы с подключением к AWS Transfer для SFTP. Я успешно настроил сервер и попытался подключиться с помощью WinSCP.

Я настроил роль IAM с помощью доверительных отношений следующим образом:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "transfer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Я связал это с политикой уменьшения объема, как описано в документации, используя домашний каталог homebucket и домашний каталог homedir

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListHomeDir",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketAcl"
            ],
            "Resource": "arn:aws:s3:::${transfer:HomeBucket}"
        },
        {
            "Sid": "AWSTransferRequirements",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectTagging",
                "s3:PutObjectTagging",
                "s3:PutObjectAcl",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
        }
    ]
}

Мне удалось пройти проверку подлинности с помощью ключа ssh, но когда дело дошло до чтения/записи файлов, я просто получал непрозрачные ошибки, такие как "Ошибка при поиске homedir" и ошибка "readdir". Все это очень пахнет как проблемы с моей политикой IAM, но я не смог понять это.

Ответ 1

У нас были похожие проблемы с получением политики по ограничению возможностей для работы с нашими пользователями в AWS Transfer. Решение, которое работало для нас, заключалось в создании двух разных типов политик.

  • Политику для прикрепления к роли, которая имеет общие права на все ведро.
  • Определите политику, применяемую к пользователю, который использует переменные службы передачи, такие как {transfer:UserName}.

Мы пришли к выводу, что, возможно, только дополнительная прикрепленная политика способна разрешить переменные службы передачи. Мы не уверены, правильно ли это, и является ли это лучшим решением, потому что это открывает возможный риск, когда вы отказываетесь от присоединения политики к области действия для создания своего рода "администратора". Так что я был бы рад получить информацию для дальнейшей блокировки немного.

Вот как это выглядит в моей консоли при просмотре данных пользователя передачи: Transfer user detail view with extra policy attached

Вот две наши политики, которые мы используем:
Общая политика для присоединения к роли IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-s3-bucket"
            ]
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3::: my-s3-bucket/*"
        }
    ]
}

Определите политику, применяемую для передачи пользователя

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::${transfer:HomeBucket}"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "${transfer:UserName}/*",
                        "${transfer:UserName}"
                    ]
                }
            }
        },
        {
            "Sid": "AWSTransferRequirements",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
        }
    ]
}

Ответ 2

У меня была похожая проблема, но с другим поведением ошибки. Мне удалось успешно войти в систему, но затем соединение было почти сразу закрыто. Я сделал следующие вещи:

  • Убедитесь, что роль IAM, которая разрешает доступ к сегменту, также содержит доступ к KMS, если ваш сегмент зашифрован.
  • Убедитесь, что доверительные отношения также являются частью этой роли.
  • Убедитесь, что у самого сервера есть роль Cloudwatch, а также доверительные отношения с Transfer.amazonaws.com! Это было решением для меня. Я не понимаю, зачем это нужно, но без доверительных отношений в роли Cloudwatch мое соединение закрывается.

Надеюсь, это поможет. Редактировать: Добавлена картинка для настроек роли CloudWatch: enter image description here

Политика сегмента для роли пользователя IAM может выглядеть следующим образом:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::<your bucket>"
        ]
    },
    {
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::<your bucket>/*"
        ]
    }
]

}

Наконец, также добавьте доверительные отношения, как показано выше для роли IAM пользователя.

Если вы можете подключиться к своему sftp, но затем получить ошибку readdir при попытке вывести список содержимого, например, с помощью команды "ls", то это признак того, что у вас нет разрешения на ведро. Если ваше соединение сразу закрывается, это может быть проблемой доверительных отношений или проблемой KMS.

Ответ 3

Согласно довольно загадочной документации, @limfinity была верна. Чтобы ограничить доступ, вам нужна общая комбинация ролей и политик, предоставляющая доступ для просмотра корзины. Эта роль применяется к создаваемому вами пользователю SFTP. Кроме того, вам нужна настраиваемая политика, которая предоставляет права CRUD только группе пользователей. Пользовательская политика также применяется к пользователю SFTP.

Со страницы 24 этого документа... https://docs.aws.amazon.com/transfer/latest/userguide/sftp.ug.pdf#page=28&zoom=100,0,776

Чтобы создать политику уменьшения объема, используйте следующие переменные политики в своей политике IAM:

Руководство пользователя AWS Transfer for SFTP Создание политики ограничения объема

• ${transfer:HomeBucket}
• ${transfer:HomeDirectory}
• ${transfer:HomeFolder}
• ${transfer:UserName}

Примечание. Переменные, перечисленные выше, нельзя использовать в качестве переменных политики в определении роли IAM. Вы создаете эти переменные в политике IAM и предоставляете их непосредственно при настройке вашего пользователя. Кроме того, вы не можете использовать переменную $ {aws: Username} в этой политике сокращения области действия. Эта переменная ссылается на имя пользователя IAM, а не на имя пользователя, требуемое AWS SFTP.

Ответ 4

Не могу комментировать, извините, если я пишу неправильно.

Осторожнее с политикой по умолчанию AWS!

Это решение сработало для меня в том смысле, что я смог использовать политики уменьшения объема для пользователей SFTP, как и ожидалось. Однако тут есть одна загвоздка:

{
            "Sid": "AWSTransferRequirements",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },

Этот раздел политики позволит пользователям SFTP, использующим эту политику, изменить каталог на корневой и перечислить все сегменты вашей учетной записи. У них не будет доступа для чтения или записи, но они могут обнаружить вещи, которые, вероятно, не нужны. Я могу подтвердить, что изменив вышеизложенное на:

{
            "Sid": "AWSTransferRequirements",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "${transfer:HomeBucket}"
        },

... появляется, чтобы запретить пользователям SFTP перечислять сегменты. Тем не менее, они по-прежнему могут cd в каталоги, если они знают, что существуют сегменты - опять же, у них нет "чтения/записи", но это все еще ненужный доступ. Я, вероятно, что-то упускаю, чтобы предотвратить это в моей политике

Надлежащее jailing кажется, является темой отставания: https://forums.aws.amazon.com/thread.jspa?threadID=297509&tstart=0