Uso de condiciones de políticas de IAM para control de acceso preciso - Amazon DynamoDB

Uso de condiciones de políticas de IAM para control de acceso preciso

Al conceder permisos en DynamoDB, puede especificar condiciones que determinan cómo se aplica una política de permisos.

Overview

En DynamoDBControl de acceso, existe la opción de especificar condiciones al conceder permisos mediante una política de IAM (consulte ). Por ejemplo, puede hacer lo siguiente:

  • Conceder permisos para que los usuarios puedan obtener acceso de solo lectura a determinados elementos y atributos de una tabla o un índice secundario.

  • Conceder permisos para que los usuarios puedan obtener acceso de solo escritura a determinados atributos de una tabla, según la identidad del usuario en cuestión.

En DynamoDB, puede utilizar las claves de condición para especificar las condiciones en una política de IAM, tal y como se muestra en el caso de uso en la siguiente sección.

nota

Algunos servicios de AWS también admiten las condiciones basados en etiquetas, pero DynamoDB no las admite.

Caso de uso de permisos

Además de controlar el acceso a acciones de la API de DynamoDB, puede controlar el acceso a elementos y atributos de datos individuales. Por ejemplo, puede hacer lo siguiente:

  • Conceder permisos en una tabla, pero restringir el acceso a elementos específicos de esa tabla según los valores de determinadas claves principales. Un ejemplo de ello sería una aplicación de una red social de juegos en la cual los datos de juegos guardados de todos los usuarios se almacenan en una única tabla, pero ningún usuario puede obtener acceso a los elementos de datos que no son de su propiedad, como se muestra en la siguiente ilustración:

  • Ocultar la información de tal forma que únicamente un subconjunto de atributos se encuentre visible para el usuario. Un ejemplo de ello sería una aplicación que muestra datos de vuelos en los aeropuertos cercanos a la ubicación donde se encuentra el usuario. Se muestran los nombres de las compañías aéreas, los horarios de llegada y salida y los números de los vuelos. Sin embargo, se ocultan otros atributos como el nombre de los pilotos o el número de pasajeros, como se muestra en la siguiente ilustración:

Para implementar este tipo de control de acceso preciso, hay que escribir una política de permisos de IAM que especifique las condiciones para obtener acceso a las credenciales de seguridad y los permisos asociados. A continuación, se aplica la política de IAM a los usuarios, los grupos o los roles creados mediante la consola de IAM. La política de IAM puede restringir el acceso a elementos individuales en una tabla, a los atributos de estos elementos o a ambas cosas al mismo tiempo.

Si lo desea, puede usar las identidades web federadas para controlar el acceso de los usuarios cuya autenticación se lleva a cabo mediante Login with Amazon, Facebook o Google. Para obtener más información, consulte Uso de identidades web federadas.

El componente Condition de IAM se utiliza para implementar una política de control de acceso precisa. Puede agregar un componente Condition a una política de permisos para permitir o denegar el acceso a los elementos y atributos de las tablas e índices de DynamoDB en función de sus requisitos empresariales concretos.

Por ejemplo, tomemos una aplicación de juegos para móviles que permite a los usuarios seleccionar un juego entre diversas opciones y jugar a él. La aplicación utiliza una tabla de DynamoDB denominada GameScores para llevar la cuenta de las puntuaciones altas y otros datos de los usuarios. Cada elemento de la tabla se identifica de forma exclusiva con un identificador de usuario y el nombre del juego que ha utilizado el usuario. La tabla GameScores tiene una clave principal compuesta de una clave de partición (UserId) y de una clave de ordenación (GameTitle). Cada usuario solo tiene acceso a los datos de juego asociados a su propio identificador de usuario. Para poder jugar, el usuario debe pertenecer a un rol de IAM denominado GameRole, que tiene adjunta una política de seguridad.

Para administrar los permisos de los usuarios en esta aplicación, podría escribir una política de permisos como la siguiente:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToOnlyItemsMatchingUserID", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${www.amazon.com:user_id}" ], "dynamodb:Attributes": [ "UserId", "GameTitle", "Wins", "Losses", "TopScore", "TopScoreDateTime" ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES" } } } ] }

Además de conceder permisos para acciones de DynamoDB concretas (componente Action) en la tabla GameScores (componente Resource), el componente Condition utiliza las claves de condición siguientes específicas de DynamoDB que limitan los permisos como se indica a continuación:

  • dynamodb:LeadingKeys: esta clave de condición permite a los usuarios obtener acceso solo a los elementos cuyo valor de clave de partición coincide con su ID de usuario. Este identificador, ${www.amazon.com:user_id}, es una variable de sustitución. Para obtener más información sobre las variables de sustitución, consulte Uso de identidades web federadas.

  • dynamodb:Attributes: esta clave de condición limita el acceso a los atributos concretos, de tal forma que solamente las acciones enumeradas en la política de permisos pueden devolver valores para estos atributos. Además, la cláusula StringEqualsIfExists garantiza que la aplicación proporcione siempre una lista de atributos específicos que admiten acciones e impide que aplicación pueda solicitar todos los atributos.

Al evaluar una política de IAM, el resultado siempre es true (verdadero, se permite el acceso) o false (falso, se deniega el acceso). Si cualquier parte del componente Condition es false, la política completa se evalúa en false y se deniega el acceso.

importante

Si utiliza dynamodb:Attributes, debe especificar los nombres de todos los atributos de clave principal y clave de índice de la tabla y también de todos los índices secundarios enumerados en la política. De lo contrario, DynamoDB no podrá utilizar estos atributos de clave para realizar la acción solicitada.

Los documentos de políticas de IAM solamente pueden contener los siguientes caracteres Unicode: tabulador horizontal (U+0009), salto de línea (U+000A), retorno de carro (U+000D) y caracteres comprendidos entre U+0020 y U+00FF.

Especificación de condiciones: uso de claves de condición

AWS proporciona un conjunto de claves de condición predefinidas (las claves de condición generales de AWS), para todos los servicios de AWS que admiten IAM para el control de acceso. Por ejemplo, puede usar la clave de condición aws:SourceIp para comprobar la dirección IP del solicitante antes de permitir que se lleve a cabo cualquier acción. Para obtener más información y una lista con las claves generales de AWS, consulte Claves disponibles para condiciones en la Guía del usuario de IAM.

En la siguiente tabla se muestran las claves de condición específicas del servicio DynamoDB que se aplican a DynamoDB.

Clave de condición de DynamoDB Descripción
dynamodb:LeadingKeys

Representa el primer atributo de clave de una tabla; es decir, la clave de partición. El nombre de la clave, LeadingKeys, es plural, aunque la clave se utiliza en acciones que afectan a un solo elemento. Además, debe usar el modificador ForAllValues cuando utilice LeadingKeys en una condición.

dynamodb:Select

Representa el parámetro Select de una solicitud Query o Scan. Select puede ser cualquiera de los valores siguientes:

  • ALL_ATTRIBUTES

  • ALL_PROJECTED_ATTRIBUTES

  • SPECIFIC_ATTRIBUTES

  • COUNT

dynamodb:Attributes

Representa una lista de nombres los atributos de una solicitud o de los atributos que se devuelven a partir de una solicitud. Los valores de Attributes reciben el mismo nombre y tienen el mismo significado que los parámetros de algunas acciones de la API de DynamoDB, como se muestra a continuación:

  • AttributesToGet

    Se usa en: BatchGetItem, GetItem, Query, Scan

  • AttributeUpdates

    Se usa en: UpdateItem

  • Expected

    Se usa en: DeleteItem, PutItem, UpdateItem

  • Item

    Se usa en: PutItem

  • ScanFilter

    Se usa en: Scan

dynamodb:ReturnValues

Representa el parámetro ReturnValues de una solicitud. ReturnValues puede ser cualquiera de los valores siguientes:

  • ALL_OLD

  • UPDATED_OLD

  • ALL_NEW

  • UPDATED_NEW

  • NONE

dynamodb:ReturnConsumedCapacity

Representa el parámetro ReturnConsumedCapacity de una solicitud. ReturnConsumedCapacity puede ser uno de los valores siguientes:

  • TOTAL

  • NONE

Limitación del acceso de los usuarios

Muchas políticas de permisos de IAM permiten a los usuarios obtener acceso únicamente los elementos de una tabla cuyo valor de clave de partición coincide con el identificador de usuario. Por ejemplo, la aplicación de juegos que hemos mencionado antes limita el acceso de este modo, de tal forma que cada usuario solo pueda obtener acceso a los datos de juego que están asociados a su propio identificador de usuario. Las variables de sustitución ${www.amazon.com:user_id}, ${graph.facebook.com:id} y ${accounts.google.com:sub} de IAM contienen identificadores de usuario de Login with Amazon, Facebook y Google. Para saber cómo una aplicación inicia sesión en uno de estos proveedores de identidad y obtiene estos identificadores, consulte Uso de identidades web federadas.

nota

Cada uno de los ejemplos de la sección siguiente establece en la cláusula Effect el valor Allow y especifica solamente las acciones, los recursos y los parámetros que se permiten. Únicamente se permite el acceso a aquello que se indica explícitamente en la política de IAM.

En algunos casos, se pueden modificar estas políticas de tal forma que se basen en la denegación (en cuyo caso, se establecería la cláusula Effect en Deny y se invertiría toda la lógica de la política). Sin embargo, recomendamos evitar el uso de políticas basadas en la denegación con DynamoDB, ya que son difíciles de escribir correctamente en comparación con las políticas basadas el permiso. Además, cualquier cambio futuro de la API de DynamoDB (o de las entradas a la API existente) podrían dejar sin efectividad una política basada en la denegación.

Ejemplos de políticas: uso de condiciones para control de acceso preciso

En esta sección se muestran varias políticas que permiten implementar el control de acceso preciso en las tablas y los índices de DynamoDB.

nota

Todos los ejemplos utilizan la región us-west-2 y contienen identificadores de cuenta ficticios.

1: Concesión de permisos que limitan el acceso a los elementos con un valor de clave de partición específico

La siguiente política concede permisos que permiten realizar un conjunto de acciones de DynamoDB en la tabla GamesScore. En ella, se utiliza la clave de condición dynamodb:LeadingKeys para que los usuarios únicamente puedan realizar acciones en los elementos cuyo valor de clave de partición UserID coincida con el identificador de usuario exclusivo de Login with Amazon correspondiente a la aplicación.

importante

La lista de acciones no incluye permisos para Scan, porque Scan devuelve todos los elementos, sean cuales sean sus claves principales.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "FullAccessToUserItems", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${www.amazon.com:user_id}" ] } } } ] }
nota

Cuando utiliza variables de políticas, debe especificar de forma explícita la versión 2012-10-17 en la política. La versión predeterminada del lenguaje de la política de acceso, 2008-10-17, no admite variables de políticas.

Para implementar el acceso de solo lectura, puede eliminar todas las acciones que permitan modificar los datos. En la siguiente política, solo se incluyen en la condición las acciones que proporcionan acceso de solo lectura.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadOnlyAccessToUserItems", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${www.amazon.com:user_id}" ] } } } ] }
importante

Si utiliza dynamodb:Attributes, debe especificar los nombres de todos los atributos de clave principal y clave de índice de la tabla y también de todos los índices secundarios enumerados en la política. De lo contrario, DynamoDB no podrá utilizar estos atributos de clave para realizar la acción solicitada.

2: Concesión de permisos que limitan el acceso a determinados atributos de una tabla

La siguiente política de permisos únicamente permite obtener acceso a dos atributos concretos de una tabla; para ello, se agrega la clave de condición dynamodb:Attributes. Estos atributos se pueden leer, escribir o evaluar en una escritura condicional o un filtro de examen.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "LimitAccessToSpecificAttributes", "Effect": "Allow", "Action": [ "dynamodb:UpdateItem", "dynamodb:GetItem", "dynamodb:Query", "dynamodb:BatchGetItem", "dynamodb:Scan" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "UserId", "TopScore" ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES", "dynamodb:ReturnValues": [ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }
nota

La política adopta un enfoque de lista blanca que permite obtener acceso a los atributos que se nombran explícitamente. Puede escribir una política equivalente que deniegue el acceso a los demás atributos. No recomendados esta estrategia de lista de denegación. Loa usuarios pueden determinar los nombres de estos atributos denegados por medio del principio de mínimo privilegio que se explica en Wikipedia en la dirección http://en.wikipedia.org/wiki/Principle_of_least_privilege y aplicar un enfoque de lista de permisos para enumerar todos los valores permitidos, en lugar de especificar los atributos denegados.

Esta política no permite PutItem, DeleteItem ni BatchWriteItem. Estas acciones siempre sustituyen el elemento anterior en su totalidad y esto permitiría a los usuarios eliminar valores de atributos anteriores a los que no se les permite obtener acceso.

La cláusula StringEqualsIfExists de la política de permisos se asegura de que se cumpla lo siguiente:

  • Si el usuario especifica el parámetro Select, entonces su valor debe ser SPECIFIC_ATTRIBUTES. Este requisito se impide que la acción del API devuelva cualquier atributo que no esté permitido; por ejemplo, desde una proyección de índice.

  • Si el usuario especifica el parámetro ReturnValues, entonces su valor debe ser NONE, UPDATED_OLD o UPDATED_NEW. Esto es obligatorio porque la acción UpdateItem lleva a cabo, además, operaciones de lectura implícitas para comprobar si un elemento existe antes de sustituirlo y para que los valores de atributos anteriores se puedan devolver en caso de que se soliciten. Al restringir ReturnValues de este modo, nos aseguramos de que los usuarios solamente puedan leer o escribir los atributos permitidos.

  • La cláusula StringEqualsIfExists se asegura de que solamente se pueda utilizar uno de estos parámetros (Select o ReturnValues) en cada solicitud, en el contexto de las acciones permitidas.

A continuación se muestran algunas variaciones de esta política:

  • Para permitir exclusivamente acciones de lectura, puede eliminar UpdateItem de la lista de acciones permitidas. Dado que ninguna de las acciones restantes aceptan ReturnValues, puede eliminar ReturnValues de la condición. Además, puede cambiar StringEqualsIfExists por StringEquals, porque el parámetro Select siempre tiene un valor (ALL_ATTRIBUTES, a no ser que se especifique otra cosa).

  • Para permitir exclusivamente acciones de escritura, puede eliminar todo excepto UpdateItem de la lista de acciones permitidas. Dado que UpdateItem no utiliza el parámetro Select, puede eliminar Select de la condición. Además, debe cambiar StringEqualsIfExists por StringEquals, porque el parámetro ReturnValues siempre tiene un valor (NONE, a no ser que se especifique otra cosa).

  • Para permitir todos los atributos cuyo nombre coincida con un patrón, utilice StringLike en lugar de StringEquals y use un carácter comodín (*) que halle coincidencias de patrones con varios caracteres.

3: Concesión de permisos para evitar actualizaciones en determinados atributos

La siguiente política de permisos limita el acceso del usuario de forma que únicamente pueda actualizar los atributos concretos que se identifican mediante la clave de condición dynamodb:Attributes. La condición StringNotLike impide que una aplicación actualice los atributos especificados con la clave de condición dynamodb:Attributes.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PreventUpdatesOnCertainAttributes", "Effect": "Allow", "Action": [ "dynamodb:UpdateItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores", "Condition": { "ForAllValues:StringNotLike": { "dynamodb:Attributes": [ "FreeGamesAvailable", "BossLevelUnlocked" ] }, "StringEquals": { "dynamodb:ReturnValues": [ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }

Tenga en cuenta lo siguiente:

  • La acción UpdateItem, al igual que otras acciones de escritura, requiere acceso de lectura a los elementos para que pueda devolver valores antes y después de la actualización. En la política, se limita la acción para obtener acceso exclusivamente a los atributos que está permitido actualizar especificando la clave de condición dynamodb:ReturnValues. La clave de condición restringe el valor de ReturnValues en la solicitud porque solo permite especificar NONE, UPDATED_OLD o UPDATED_NEW y no incluye ALL_OLD ni ALL_NEW.

  • Las acciones PutItem y DeleteItem sustituyen un elemento completo y, por consiguiente, permiten que las aplicaciones modifiquen cualquier atributo. Así pues, para limitar una aplicación de modo que únicamente pueda actualizar determinados atributos, no debe conceder permisos para estos API.

4: Concesión de permisos para consultar únicamente los atributos proyectados de un índice

La siguiente política de permisos permite realizar consultas en un índice secundario (TopScoreDateTimeIndex) utilizando la clave de condición dynamodb:Attributes. Además, limita las consultas de tal forma que solo se puedan solicitar determinados atributos que se han proyectado en el índice.

Para exigir a la aplicación que especifique una lista de atributos en la consulta, la política especifica también la clave de condición dynamodb:Select de modo que requiere que el parámetro Select de la acción Query de DynamoDB sea SPECIFIC_ATTRIBUTES. La lista de atributos se limita a unos elementos concretos que se obtienen utilizando la clave de condición dynamodb:Attributes.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "QueryOnlyProjectedIndexAttributes", "Effect": "Allow", "Action": [ "dynamodb:Query" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "TopScoreDateTime", "GameTitle", "Wins", "Losses", "Attempts" ] }, "StringEquals": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES" } } } ] }

La siguiente política de permisos es similar, pero la consulta debe solicitar todos los atributos que se han proyectado en el índice.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "QueryAllIndexAttributes", "Effect": "Allow", "Action": [ "dynamodb:Query" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition": { "StringEquals": { "dynamodb:Select": "ALL_PROJECTED_ATTRIBUTES" } } } ] }

5: Concesión de permisos para limitar el acceso a determinados atributos y valores de clave de partición

La política de permisos siguiente permite realizar acciones de DynamoDB concretas (que se han especificado en el componente Action) en una tabla y un índice de tabla (que se han especificado en el componente Resource). La política utiliza la clave de condición dynamodb:LeadingKeys para restringir los permisos de tal forma que únicamente incluyan los elementos cuyo valor de clave de partición coincida con el identificador de Facebook del usuario.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "LimitAccessToCertainAttributesAndKeyValues", "Effect": "Allow", "Action": [ "dynamodb:UpdateItem", "dynamodb:GetItem", "dynamodb:Query", "dynamodb:BatchGetItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores", "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${graph.facebook.com:id}" ], "dynamodb:Attributes": [ "attribute-A", "attribute-B" ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES", "dynamodb:ReturnValues": [ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }

Tenga en cuenta lo siguiente:

  • Las acciones de escritura permitidas por la política (UpdateItem) solo pueden modificar attribute-A o attribute-B.

  • Dado que la política permite UpdateItem, una aplicación puede insertar nuevos elementos y los atributos ocultos serán null en los nuevos elementos. Si estos atributos se proyectan en TopScoreDateTimeIndex, la política incluirá la ventaja agregada de impedir las consultas que generen operaciones de recuperación (fetch) en la tabla.

  • Las aplicaciones no pueden leer ningún atributo que no figure en dynamodb:Attributes. Con esta política en vigor, una aplicación debe establecer el parámetro Select en SPECIFIC_ATTRIBUTES en las solicitudes de lectura y solamente se pueden solicitar los atributos que pertenecen a la lista blanca. En las solicitudes de escritura, la aplicación no puede establecer ReturnValues en ALL_OLD ni ALL_NEW ni puede llevar a cabo operaciones de escritura condicionales basadas en otros atributos que no sean estos.

Temas relacionados