Uso de condiciones de las 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.
Información general
En DynamoDBIdentity and Access Management en Amazon DynamoDB, 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 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 la federación de identidades web.
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 la federación de identidades web. -
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áusulaStringEqualsIfExists
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, |
dynamodb:Select |
Representa el parámetro
|
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
|
dynamodb:ReturnValues |
Representa el parámetro
|
dynamodb:ReturnConsumedCapacity |
Representa el parámetro
|
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 la federación de identidades web.
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 el 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.
En el siguiente vídeo se explica el control de acceso detallado en DynamoDB utilizando condiciones de políticas de IAM.
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
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 serSPECIFIC_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 serNONE
,UPDATED_OLD
oUPDATED_NEW
. Esto es obligatorio porque la acciónUpdateItem
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 restringirReturnValues
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
oReturnValues
) 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 aceptanReturnValues
, puede eliminarReturnValues
de la condición. Además, puede cambiarStringEqualsIfExists
porStringEquals
, porque el parámetroSelect
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 queUpdateItem
no utiliza el parámetroSelect
, puede eliminarSelect
de la condición. Además, debe cambiarStringEqualsIfExists
porStringEquals
, porque el parámetroReturnValues
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 deStringEquals
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óndynamodb:ReturnValues
. La clave de condición restringe el valor deReturnValues
en la solicitud porque solo permite especificarNONE
,UPDATED_OLD
oUPDATED_NEW
y no incluyeALL_OLD
niALL_NEW
. -
Las acciones
PutItem
yDeleteItem
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 la 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 modificarattribute-A
oattribute-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 enTopScoreDateTimeIndex
, 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ámetroSelect
enSPECIFIC_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 establecerReturnValues
enALL_OLD
niALL_NEW
ni puede llevar a cabo operaciones de escritura condicionales basadas en otros atributos que no sean estos.