Políticas do IAM do Amazon Redshift Spectrum - Amazon Redshift

Políticas do IAM do Amazon Redshift Spectrum

Por padrão, o Amazon Redshift Spectrum usa o AWS Glue Data Catalog em regiões da AWS compatíveis com o AWS Glue. Em outras regiões da AWS, o Redshift Spectrum usa o catálogo de dados do Athena. Seu cluster precisa de autorização para acessar o catálogo de dados externos no AWS Glue ou no Athena e os arquivos de dados no Amazon S3. Essa autorização é fornecida por meio de referência à função do AWS Identity and Access Management (IAM) que é associada ao cluster. Se você usa uma metastore do Apache Hive para gerenciar o catálogo de dados, não precisa conceder acesso ao Athena.

Você pode encadear funções para que seu cluster possa assumir outras funções não anexadas ao cluster. Para obter mais informações, consulte Encadeamento de funções do IAM no Amazon Redshift Spectrum.

O catálogo do AWS Glue que você acessa pode ser criptografado para aumentar a segurança. Se o catálogo do AWS Glue estiver criptografado, será necessária a chave do AWS KMS para que o AWS Glue acesse o catálogo de dados do AWS Glue. Para obter informações, consulte Criptografia de seu catálogo de dados do AWS Glue no Guia do desenvolvedor do AWS Glue.

Permissões do Amazon S3

No mínimo, seu cluster precisa dos acessos GET e LIST para o bucket do Amazon S3. Se o bucket não estiver na mesma conta da AWS que o cluster, o bucket também deverá conceder autorização para que o cluster acesse os dados. Para obter mais informações, consulte Autorização para o Amazon Redshift acessar outros serviços da AWS em seu nome.

nota

O bucket do Amazon S3 não pode usar uma política de bucket que restrinja o acesso somente a partir de endpoints da VPC específicos.

A política a seguir concede os acessos GET e LIST a um bucket do Amazon S3. A política permite o acesso aos buckets do Amazon S3 para o Redshift Spectrum, bem como às operações COPY.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "*" }] }

A política a seguir concede os acessos GET e LIST ao bucket do Amazon S3 denominado myBucket.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*" }] }

Permissões entre contas do Amazon S3

Para conceder ao Redshift Spectrum permissão para acessar dados em um bucket do Amazon S3 que pertence a outra conta da AWS, adicione a política a seguir ao bucket do Amazon S3. Para obter mais informações, consulte Conceder permissões de bucket entre contas.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::redshift-account:role/spectrumrole" }, "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::bucketname", "arn:aws:s3:::bucketname/*" ] } ] }

Políticas para conceder ou restringir acesso ao Redshift Spectrum

Para conceder acesso somente a um bucket do Amazon S3 usando o Redshift Spectrum, inclua uma condição que permita o acesso ao agente de usuário AWS Redshift/Spectrum. A política a seguir permite o acesso somente aos buckets do Amazon S3 para o Redshift Spectrum. Ela exclui outros acessos, como às operações COPY.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*", "Condition": {"StringEquals": {"aws:UserAgent": "AWS Redshift/Spectrum"}} }] }

Da mesma forma, pode ser necessário criar uma função do IAM que permite o acesso às operações COPY, mas exclui o acesso do Redshift Spectrum. Para fazer isso, inclua uma condição que negue o acesso ao agente de usuário AWS Redshift/Spectrum. A política a seguir permite o acesso a um bucket do Amazon S3 excluindo o acesso do Redshift Spectrum.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*", "Condition": {"StringNotEquals": {"aws:UserAgent": "AWS Redshift/Spectrum"}} }] }

Políticas para conceder permissões mínimas

A política a seguir concede as permissões mínimas necessárias para usar o Redshift Spectrum com o Amazon S3, o AWS Glue e o Athena.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::bucketname", "arn:aws:s3:::bucketname/folder1/folder2/*" ] }, { "Effect": "Allow", "Action": [ "glue:CreateDatabase", "glue:DeleteDatabase", "glue:GetDatabase", "glue:GetDatabases", "glue:UpdateDatabase", "glue:CreateTable", "glue:DeleteTable", "glue:BatchDeleteTable", "glue:UpdateTable", "glue:GetTable", "glue:GetTables", "glue:BatchCreatePartition", "glue:CreatePartition", "glue:DeletePartition", "glue:BatchDeletePartition", "glue:UpdatePartition", "glue:GetPartition", "glue:GetPartitions", "glue:BatchGetPartition" ], "Resource": [ "*" ] } ] }

Se você utilizar o Athena para o catálogo de dados em vez do AWS Glue, a política exigirá acesso total ao Athena. A política a seguir concede acesso aos recursos do Athena. Se seu banco de dados externo for uma metastore do Hive, você não precisará de acesso ao Athena.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["athena:*"], "Resource": ["*"] }] }

Encadeamento de funções do IAM no Amazon Redshift Spectrum

Ao anexar uma função ao cluster, seu cluster poderá assumir essa função para acessar o Amazon S3, o Athena e o AWS Glue em seu nome. Se uma função anexada ao cluster não tiver acesso aos recursos necessários, você poderá encadear outra função, possivelmente pertencente a outra conta. O cluster assumirá a função encadeada temporariamente para acessar os dados. Você também pode conceder acesso entre contas com o encadeamento de funções. Você pode encadear um máximo de 10 funções. Cada função em cadeia assume a próxima função na cadeia, até que o cluster assuma a função no final da cadeia.

Para encadear funções, você estabelece uma relação de confiança entre as funções. Uma função que assume uma outra função deve ter uma política de permissões que permita que ela assuma a função especificada. Por sua vez, a função que passa permissões deve ter uma política de confiança que permita que ela passe suas permissões para outra função. Para obter mais informações, consulte Encadeamento de funções do IAM no Amazon Redshift.

Quando você executa o comando do CREATE EXTERNAL SCHEMA, pode encadear funções incluindo uma lista separada por vírgulas de ARNs de funções.

nota

A lista de funções encadeadas não deve incluir espaços.

No exemplo a seguir, MyRedshiftRole está anexada ao cluster. MyRedshiftRole assume a função AcmeData, que pertence à conta 111122223333.

create external schema acme from data catalog database 'acmedb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole,arn:aws:iam::111122223333:role/AcmeData';

Controlar o acesso ao Catálogo de dados do AWS Glue

Se usar o AWS Glue em seu catálogo de dados, você poderá aplicar um controle de acesso refinado ao catálogo de dados do AWS Glue com sua política do IAM. Por exemplo, você pode querer expor apenas alguns bancos de dados e tabelas para uma função específica do IAM.

As seções a seguir descrevem as políticas do IAM para vários níveis de acesso aos dados armazenados no AWS Glue Data Catalog.

Política para operações de banco de dados

Se quiser conceder aos usuários permissões para exibir e criar um banco de dados, eles precisarão de direitos de acesso ao banco de dados e ao AWS Glue Data Catalog.

A consulta de exemplo a seguir cria um banco de dados.

CREATE EXTERNAL SCHEMA example_db FROM DATA CATALOG DATABASE 'example_db' region 'us-west-2' IAM_ROLE 'arn:aws:iam::redshift-account:role/spectrumrole' CREATE EXTERNAL DATABASE IF NOT EXISTS

A seguinte política do IAM fornece as permissões mínimas necessárias para criar um banco de dados.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:catalog" ] } ] }

A consulta de exemplo a seguir lista os bancos de dados atuais.

SELECT * FROM SVV_EXTERNAL_DATABASES WHERE databasename = 'example_db1' or databasename = 'example_db2';

A seguinte política do IAM fornece as permissões mínimas necessárias para listar os bancos de dados atuais.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabases" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:database/example_db1", "arn:aws:glue:us-west-2:redshift-account:database/example_db2", "arn:aws:glue:us-west-2:redshift-account:catalog" ] } ] }

Política para operações de tabela

Para conceder aos usuários permissões para exibir, criar, descartar, alterar ou executar outras ações em tabelas, eles precisarão de vários tipos de acesso. Eles precisam de acesso às próprias tabelas, aos bancos de dados ao qual elas pertencem e ao catálogo.

A consulta de exemplo a seguir cria uma tabela externa.

CREATE EXTERNAL TABLE example_db.example_tbl0( col0 INT, col1 VARCHAR(255) ) PARTITIONED BY (part INT) STORED AS TEXTFILE LOCATION 's3://test/s3/location/';

A seguinte política do IAM fornece as permissões mínimas necessárias para criar uma tabela externa.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:CreateTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

O exemplo a seguir consulta cada lista das tabelas externas atuais.

SELECT * FROM svv_external_tables WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';
SELECT * FROM svv_external_columns WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';
SELECT parameters FROM svv_external_tables WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';

A seguinte política do IAM fornece as permissões mínimas necessárias para listar as tabelas externas atuais.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl1" ] } ] }

A consulta de exemplo a seguir altera uma tabela existente.

ALTER TABLE example_db.example_tbl0 SET TABLE PROPERTIES ('numRows' = '100');

A seguinte política do IAM fornece as permissões mínimas necessárias para alterar uma tabela existente.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTable", "glue:UpdateTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

A consulta de exemplo a seguir descarta uma tabela existente.

DROP TABLE example_db.example_tbl0;

A seguinte política do IAM fornece as permissões mínimas necessárias para descartar uma tabela existente.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:DeleteTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

Política para operações de partição

Se quiser conceder aos usuários permissões para executar operações no nível da partição (exibir, criar, soltar, alterar e assim por diante), eles precisarão de permissões para as tabelas às quais as partições pertencem. Eles também precisarão de permissões para os bancos de dados relacionados e o catálogo de dados do AWS Glue.

A consulta de exemplo a seguir cria uma partição.

ALTER TABLE example_db.example_tbl0 ADD PARTITION (part=0) LOCATION 's3://test/s3/location/part=0/'; ALTER TABLE example_db.example_t ADD PARTITION (part=1) LOCATION 's3://test/s3/location/part=1/';

A seguinte política do IAM fornece as permissões mínimas necessárias para criar uma partição.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTable", "glue:BatchCreatePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

A consulta de exemplo a seguir lista as partições atuais.

SELECT * FROM svv_external_partitions WHERE schemname = 'example_db' AND tablename = 'example_tbl0'

A seguinte política do IAM fornece as permissões mínimas necessárias para listar as partições atuais.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetPartitions", "glue:GetTables", "glue:GetTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

A consulta de exemplo a seguir altera uma partição existente.

ALTER TABLE example_db.example_tbl0 PARTITION(part='0') SET LOCATION 's3://test/s3/new/location/part=0/';

A seguinte política do IAM fornece as permissões mínimas necessárias para alterar uma partição existente.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetPartition", "glue:UpdatePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

A consulta de exemplo a seguir descarta uma partição existente.

ALTER TABLE example_db.example_tbl0 DROP PARTITION(part='0');

A seguinte política do IAM fornece as permissões mínimas necessárias para destacar uma partição existente.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:DeletePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }