Políticas de IAM para Amazon Redshift Spectrum - Amazon Redshift

Políticas de IAM para Amazon Redshift Spectrum

De manera predeterminada, Amazon Redshift Spectrum utiliza el AWS Glue Data Catalog en las regiones de AWS que admiten AWS Glue. En otras regiones de AWS, Redshift Spectrum utiliza el catálogo de datos de Athena. El clúster necesita autorización para acceder al catálogo de datos externo de AWS Glue o Athena, y a los archivos de datos de Amazon S3. Puede proporcionar esa autorización referenciando un rol de AWS Identity and Access Management (IAM) que esté asociado a su clúster. Si utiliza un metastore de Apache Hive para administrar su catálogo de datos, no necesita proporcionar acceso a Athena.

Puede encadenar roles para que el clúster pueda asumir otros roles no asociados al clúster. Para obtener más información, consulte Encadenamiento de roles de IAM en Amazon Redshift Spectrum.

El catálogo de datos de AWS Glue al que obtiene acceso podría estar cifrado para aumentar la seguridad. Si el catálogo de AWS Glue está cifrado, necesita la clave de AWS KMS para que AWS Glue acceda al catálogo de AWS Glue. Para obtener más información, consulte Cifrado de su catálogo de datos de AWS Glue en la Guía para desarrolladores de AWS Glue.

Permisos de Amazon S3

Como mínimo, el clúster necesita obtener acceso de tipo GET y LIST a su bucket de Amazon S3. Si el bucket no está en la misma cuenta de AWS que el clúster, el bucket también debe conceder permiso al clúster para acceder a los datos. Para obtener más información, consulte Autorización a Amazon Redshift para obtener acceso a otros servicios de AWS en su nombre.

nota

El bucket de Amazon S3 no puede usar una política de bucket que restrinja el acceso solo desde puntos de enlace de la VPC específicos.

La siguiente política concede acceso de tipo GET y LIST a cualquier bucket de Amazon S3. La política otorga acceso a los buckets de Amazon S3 para Redshift Spectrum, además de operaciones COPY.

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

La siguiente política concede acceso de tipo GET y LIST a un bucket de Amazon S3 denominado DOC-EXAMPLE-BUCKET.

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

Permisos entre cuentas de Amazon S3

Para conceder a Redshift Spectrum permiso para acceder a los datos de un bucket de Amazon S3 que pertenece a otra cuenta de AWS, agregue la siguiente política al bucket de Amazon S3. Para obtener más información, consulte Concesión de permisos de bucket entre cuentas.

{ "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 o restringir el acceso a través de Redshift Spectrum

Para conceder acceso a un bucket de Amazon S3 únicamente con Redshift Spectrum, incluya una condición que le permita acceder al agente de usuario AWS Redshift/Spectrum. La siguiente política permite acceder a los buckets de Amazon S3 únicamente a Redshift Spectrum. Se excluye cualquier otro tipo de acceso, como operaciones COPY.

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

De manera similar, puede querer crear un rol de IAM que otorgue acceso para operaciones COPY, pero que excluya el acceso de Redshift Spectrum. Para ello, incluya una condición que deniegue el acceso al agente de usuario AWS Redshift/Spectrum. La siguiente política permite acceder a un bucket de Amazon S3 con la excepción de Redshift Spectrum.

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

Políticas para conceder los permisos mínimos

La siguiente política otorga los permisos mínimos necesarios para utilizar Redshift Spectrum con Amazon S3, AWS Glue, y 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": [ "*" ] } ] }

Si utiliza Athena con el catálogo de datos en lugar de AWS Glue, la política necesitará tener acceso pleno a Athena. La siguiente política concede acceso a los recursos de Athena. Si la base de datos externa está en un metastore de Hive, no es necesario que tenga acceso a Athena.

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

Encadenamiento de roles de IAM en Amazon Redshift Spectrum

Cuando adjunta un rol a su clúster, este puede asumir ese rol y, de esa manera, obtener acceso a Amazon S3, Athena y AWS Glue en su nombre. Si un rol que está asociado al clúster no tiene acceso a los recursos necesarios, puede encadenar otro rol, que posiblemente pertenezca a otra cuenta. El clúster asumirá de forma temporal el rol encadenado para obtener acceso a los datos. También puede conceder acceso entre cuentas mediante el encadenamiento de roles. Puede encadenar un máximo de 10 roles. Cada uno de los roles de la cadena asume el rol siguiente, hasta que el clúster asume el rol situado al final de la cadena.

Para encadenar roles, debe establecer una relación de confianza entre ellos. Un rol que asume otro rol debe tener una política de permisos que le permita asumir el rol especificado. A su vez, el rol que transfiere los permisos debe tener una política de confianza que le permita transferir sus permisos a otro rol. Para obtener más información, consulte Encadenamiento de roles de IAM en Amazon Redshift.

Ejecute el comando CREATE EXTERNAL SCHEMA para encadenar funciones incluyendo una lista de ARN de funciones separados por comas.

nota

La lista de roles encadenados no debe incluir espacios.

En el siguiente ejemplo, MyRedshiftRole está asociado al clúster. MyRedshiftRole adopta la función AcmeData, que pertenece a la cuenta 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';

Control del acceso al catálogo de datos de AWS Glue

Su usa AWS Glue para el catálogo de datos, puede aplicar un control de acceso más preciso al catálogo de datos de AWS Glue con su política de IAM. Por ejemplo, es posible que desee exponer solo unas pocas bases de datos y tablas a un rol de IAM específico.

En las siguientes secciones se describen las políticas de IAM para diferentes niveles de acceso a los datos almacenados en el catálogo de datos de AWS Glue.

Política para operaciones de bases de datos

Si desea otorgar a los usuarios permisos para ver y crear una base de datos, necesitarán derechos de acceso a la base de datos y el catálogo de datos de AWS Glue.

La siguiente consulta de ejemplo crea una base de datos.

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

La siguiente política de IAM concede los permisos mínimos necesarios para la creación de una base de datos.

{ "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" ] } ] }

La siguiente consulta de ejemplo enumera las bases de datos actuales.

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

La siguiente política de IAM concede los permisos mínimos necesarios para enumerar las bases de datos actuales.

{ "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 operaciones de tablas

Si desea otorgar a los usuarios permisos para ver, crear, eliminar, modificar, o realizar otras acciones en tablas, estos usuarios necesitarán varios tipos de acceso. Necesitan acceso a las tablas, las bases de datos a las que pertenecen y el catálogo.

La siguiente consulta de ejemplo crea una tabla 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/';

La siguiente política de IAM concede los permisos mínimos necesarios para crear una tabla 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" ] } ] }

En el siguiente ejemplo, se consulta cada lista de las tablas externas actuales.

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';

La siguiente política de IAM concede los permisos mínimos necesarios para enumerar las tablas externas actuales.

{ "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" ] } ] }

La siguiente consulta de ejemplo modifica una tabla existente.

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

La siguiente política de IAM concede los permisos mínimos necesarios para modificar una tabla 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" ] } ] }

La siguiente consulta de ejemplo elimina una tabla existente.

DROP TABLE example_db.example_tbl0;

La siguiente política de IAM concede los permisos mínimos necesarios para eliminar una tabla 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 operaciones de partición

Si desea otorgar a los usuarios permisos para realizar operaciones en el nivel de partición (ver, crear, eliminar, modificar, etc.), estos usuarios necesitarán permisos para las tablas a las que pertenecen las particiones. También necesitarán permisos para las bases de datos relacionadas y el catálogo de datos de AWS Glue.

La siguiente consulta de ejemplo crea una partición.

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/';

La siguiente política de IAM concede los permisos mínimos necesarios para crear una partición.

{ "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" ] } ] }

La siguiente consulta de ejemplo enumera las particiones actuales.

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

La siguiente política de IAM concede los permisos mínimos necesarios para enumerar las particiones actuales.

{ "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" ] } ] }

La siguiente consulta de ejemplo modifica una partición existente.

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

La siguiente política de IAM concede los permisos mínimos necesarios para modificar una partición 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" ] } ] }

La siguiente consulta de ejemplo elimina una partición existente.

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

La siguiente política de IAM concede los permisos mínimos necesarios para eliminar una partición 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" ] } ] }