为什么即使在 Lake Formation 中的权限受到限制之后,我的 IAM 用户仍能访问数据目录资源?

上次更新时间:2021 年 3 月 25 日

我在 AWS Lake Formation 中限制了某个用户的表权限(例如,通过带有 ExcludedColumnNames 的 SELECT 设置)。但该用户仍然可以使用 Amazon Athena 查询表。

简短描述

Lake Formation 会默认向 IAMAllowedPrincipals 组授予 Super(超级)权限。此权限适用于所有现有的 AWS Glue 数据目录资源。如果启用了 Use only IAM access control(仅使用 IAM 访问控制),则 Lake Formation 还授予新资源的 Super(超级)权限。这意味着 AWS Identity and Access Management (IAM) 策略将会控制对数据目录资源和 Amazon Simple Storage Service (Amazon S3) 位置的访问权限。有关更多信息,请参阅关于升级到 Lake Formation 权限模式

要限制访问权限,请更改默认设置以确保对新的和现有的数据目录资源使用 Lake Formation 权限模式。

解决方法

要更新数据湖中所有新数据库和表的安全设置,请参阅更改数据目录设置

要仅更新某些新资源的安全设置,请创建该资源,然后仅更新该资源的权限。有关更多信息,请参阅保护现有的数据目录资源

默认安全设置中的更改仅适用于在更新安全设置后创建的资源。

要更改现有数据库的安全设置,请在每个数据库上执行以下操作,从而显式移除 IAMAllowedPrincipals 权限:

  1. 打开 AWS Lake Formation 控制台
  2. 在导航窗格中的 Data catalog(数据目录),选择 Databases(数据库)。
  3. 选中要更新的数据库旁边的圆圈。
  4. 选择 Actions(操作),然后选择 Edit(编辑)。
  5. Default permissions for newly created tables(新创建的表的默认权限)下,清除 Use only IAM access control for new tables in this database(仅对此数据库中的新表使用 IAM 访问控制)。
  6. 选择 Save(保存)。
  7. Databases(数据库)页面上,请确保已选中该数据库。选择 Actions(操作),然后选择 Revoke(撤销)。
  8. Revoke permissions(撤销权限)对话框的 IAM users and roles(IAM 用户和角色)列表中,向下滚动到 Group(组)标头,然后选择 IAMAllowedPrincipals
  9. Database permissions(数据库权限)下,务必选中 Super(超级),然后选择 Revoke(撤销)。

要更改现有表的安全设置,请在每个表上执行以下操作,从而显式移除 IAMAllowedPrincipals 权限:

  1. 打开 AWS Lake Formation 控制台
  2. 从导航窗格中,选择 Tables(表)。
  3. Tables(表)页中,选中要更新的表旁边的圆圈。
  4. 选择 Actions(操作),然后选择 Revoke(撤销)。
  5. Revoke permissions(撤销权限)对话框的 IAM users and roles(IAM 用户和角色)列表中,向下滚动到 Group(组)标头,然后选择 IAMAllowedPrincipals
  6. Table permissions(表权限)下,务必选中 Super(超级),然后选择 Revoke(撤销)

注意:确保数据库或表的 Amazon S3 路径已注册到 Lake Formation

在更改现有资源的安全设置后,向该 IAM 用户或角色授予表权限。您可以使用 Lake Formation 控制台或 AWS 命令行界面 (AWS CLI) 执行此操作。

注意:如果您在运行 AWS CLI 命令时遇到错误,请确保您运行的是最新版本的 AWS CLI

以下示例 CLI 命令将授予对特定列的 SELECT 权限:

仅授予对特定列的 SELECT 权限:

aws lakeformation grant-permissions --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:user/datalake_user1 --permissions "SELECT"  --resource '{ "TableWithColumns": {"DatabaseName":"retail", "Name":"inventory", "ColumnNames": ["prodcode","location","period","withdrawals"]}}'

排除列(允许在除 ExcludedColumnNames 下指定的列外的所有列上执行 SELECT):

aws lakeformation grant-permissions --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:user/datalake_user1 --permissions "SELECT"  --resource '{ "TableWithColumns": {"DatabaseName":"retail", "Name":"inventory", "ColumnWildcard": {"ExcludedColumnNames": ["location"]}}}'

要执行 Lake Formation 操作,委托人必须拥有 Lake Formation 和 IAM 权限。除此之外,要在 Athena 中查询表,用户还必须拥有运行 Athena 查询的权限。例如,要在 Lake Formation 管理权限时通过 Athena 查询表,用户必须具有以下 IAM 权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "minimumAWSGlueLakeFormationAthenapermissiontorunselectqueryontable",
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess",
                "glue:SearchTables",
                "glue:GetTables",
                "glue:GetPartitions",
                "glue:GetDatabases",
                "glue:GetTable",
                "glue:GetDatabase",
                "athena:GetNamespace",
                "athena:ListWorkGroups",
                "athena:GetCatalogs",
                "athena:GetNamespaces",
                "athena:GetExecutionEngine",
                "athena:GetExecutionEngines",
                "athena:GetTables",
                "athena:GetTable"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AthenaPermissionToRunQueryInAWorkergroup",
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:GetQueryResults",
                "athena:DeleteNamedQuery",
                "athena:GetNamedQuery",
                "athena:ListQueryExecutions",
                "athena:StopQueryExecution",
                "athena:GetQueryResultsStream",
                "athena:ListNamedQueries",
                "athena:CreateNamedQuery",
                "athena:GetQueryExecution",
                "athena:BatchGetNamedQuery",
                "athena:BatchGetQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:*:*:workgroup/*"
            ]
        },
        {
            "Sid": "allowS3PermissionToSaveAthenaQueryResults",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:CreateBucket",
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::aws-athena-query-results-*"
            ]
        }
    ]
}

这篇文章对您有帮助吗?


您是否需要账单或技术支持?