{"id":1953,"date":"2021-03-15T13:23:17","date_gmt":"2021-03-15T13:23:17","guid":{"rendered":"https:\/\/keepler.io\/2021\/03\/15\/gestionando-el-control-de-accesos-en-nuestro-data-lake-en-aws\/"},"modified":"2023-09-12T13:09:25","modified_gmt":"2023-09-12T13:09:25","slug":"gestionando-el-control-de-accesos-en-nuestro-data-lake-en-aws","status":"publish","type":"post","link":"https:\/\/keepler.io\/es\/2021\/03\/15\/gestionando-el-control-de-accesos-en-nuestro-data-lake-en-aws\/","title":{"rendered":"Gestionando el control de accesos en nuestro data lake en AWS"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">La necesidad de compartir datos entre m\u00faltiples fuentes y departamentos en las organizaciones lleva a la construcci\u00f3n de <\/span><b>data lakes<\/b><span style=\"font-weight: 400;\"> corporativos, los cuales son lugares donde se almacena de manera centralizada toda la informaci\u00f3n de las distintas fuentes de la compa\u00f1\u00eda con el fin poder ser consumidos por los distintos departamentos.<\/span><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38910\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2021\/03\/data-lakes-corporativos.png?resize=541%2C484&#038;ssl=1\" alt=\"\" width=\"541\" height=\"484\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Un aspecto muy importante para la gesti\u00f3n correcta del data lake es asegurar una correcta gobernanza poniendo foco en puntos como: la calidad de los datos, almac\u00e9n de metadatos o la <\/span><b>seguridad<\/b><span style=\"font-weight: 400;\"> y <\/span><b>control de acceso<\/b><span style=\"font-weight: 400;\"> a nuestros datos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Conscientes de la necesidad de garantizar un eficiente control de acceso a nuestros datos, AWS dispone de varios servicios a partir de los cuales se puede gestionar el control de acceso a los datos, y, en este post explicaremos c\u00f3mo controlar el acceso a los datos mediante <\/span><b>IAM<\/b><span style=\"font-weight: 400;\"> y <\/span><b>Lake Formation<\/b><span style=\"font-weight: 400;\">.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">IAM (Identity and Access Management) nos permite administrar las identidades y gestionar el acceso de las mismas a los recursos y servicios de la nube, mientras que Lake Formation es un servicio dise\u00f1ado para la creaci\u00f3n y gesti\u00f3n simple de data lakes. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Partiendo de un almacenamiento de objetos para persistir todos los datos de nuestro data lake, \u00e9ste podr\u00eda estructurarse en las siguientes capas:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\"><strong>Capa raw, capa de ingesta que almacenar\u00e1 los datos en bruto<\/strong><\/span><i><span style=\"font-weight: 400;\">:<\/span><\/i><span style=\"font-weight: 400;\"> No debe ser visualizable por el usuario, pero estar\u00e1 estructurada y no todos los elementos de procesamiento deber\u00edan poder procesar todas las entidades.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><strong>Capa Standard o cleaned:<\/strong><span style=\"font-weight: 400;\"> datos limpios y transformados listos para para su an\u00e1lisis, los datos pueden ser consumidos por parte de los usuarios y otros procesos.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><strong>Capa Enriquecida<\/strong><span style=\"font-weight: 400;\"><strong>,<\/strong> capa final de enriquecimiento y agregaci\u00f3n con el fin de aplicar cierta l\u00f3gica de negocio y disponibilizar an\u00e1lisis y visualizaci\u00f3n.<\/span><\/li>\n<\/ul>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38914\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2021\/03\/tipos-de-acceso-data-lake.png?resize=599%2C523&#038;ssl=1\" alt=\"\" width=\"599\" height=\"523\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Como se observa en la imagen se distinguen dos tipos de accesos:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><strong>Accesos de otros servicios para la transformaci\u00f3n de los datos<\/strong><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><strong>Accesos de herramientas de anal\u00edtica\/visualizaci\u00f3n para disponibilizar los datos a los usuarios.<\/strong><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">En ambos casos, es cr\u00edtico que los datos expuestos tanto a usuarios como para transformaci\u00f3n, sean \u00fanicamente los necesarios para evitar fugas de informaci\u00f3n que hagan perder confianza al data lake y no se considere una herramienta confiable.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Un punto muy importante a la hora de comenzar nuestro data lake es la estructuraci\u00f3n de la informaci\u00f3n en el almacenamiento de manera correcta (grupos de negocio, entidades funcionales, \u2026) y el correcto etiquetado. Ambas medidas nos permitir\u00e1n realizar diversos ejercicios de gesti\u00f3n de permisos, de una manera efectiva, as\u00ed como mejorar el gobierno del almacenamiento.<\/span><\/p>\n<h3><strong>IAM &#8211; Pol\u00edticas basadas en recursos y tags<\/strong><\/h3>\n<p><span style=\"font-weight: 400;\">Imaginemos m\u00faltiples equipos de desarrollo trabajando sobre una misma plataforma para disponibilizar los datos de su \u00e1rea o departamento. Los equipos de desarrollo y sus procesos de transformaci\u00f3n trabajan a bajo nivel sobre los objetos almacenados en S3 (Simple Storage Service) en la capa de ingesta (raw) y por tanto necesitan tener acceso \u00fanicamente a sus objetos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para este permisionado se pueden emplear dos features de IAM las cuales nos permitir\u00e1n restringir el acceso a los objetos de s3 en funci\u00f3n de reglas de negocio como podr\u00eda ser el departamento del desarrollador o proceso.<\/span><\/p>\n<p><b>Pol\u00edticas basadas en recursos<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Un almacenamiento de los objetos con una estructura funcionalmente correcta nos permitir\u00eda hacer un control de accesos a los objetos de manera \u00f3ptima y ajust\u00e1ndose a premisas funcionales.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Pongamos por ejemplo, los datos de usuarios provenientes del sistema origen web. Estos datos podr\u00edan almacenarse en la capa de ingesta bajo la siguiente estructura s3:\/\/raw-bucket\/web\/users, lo cual nos permitir\u00eda otorgar permisos jer\u00e1rquicamente a los usuarios\/procesos a todo los datos del sistema web, los datos de usuarios \u00fanicamente o incluso subconjuntos de datos dentro de la entidad de usuarios.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Un ejemplo de pol\u00edtica de accesos que podr\u00edamos asociar a un recurso o usuario\/grupo ser\u00eda la siguiente:<\/span><\/p>\n<pre><code class=\"language-json\">\n{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n           \"Sid\": \"WebUsersViewer\",\n           \"Effect\": \"Allow\",\n           \"Action\": \"s3:GetObject\",\n           \"Resource\": \"arn:aws:s3:::raw-bucket\/web\/users\/*\"\n        }\n    ]\n}\n\n<\/code><\/pre>\n<p>En la cual concedemos, partiendo de la base de que los objetos son privados, el acceso de lectura a todos los objetos almacenados en web\/users.<\/p>\n<p>Otra opci\u00f3n para asignar varios permisos sobre la misma estructura manteniendo las restricciones y evitando duplicar las pol\u00edticas ser\u00eda usar condicionales en la pol\u00edtica.<\/p>\n<pre><code class=\"language-json\">\n{\n\t\"Version\": \"2012-10-17\",\n\t\"Statement\": [\n\t\t{\n\t\t\t\"Sid\": \"WebViewer\",\n\t\t\t\"Effect\": \"Allow\",\n\t\t\t\"Action\": \"s3:GetObject\",\n\t\t\t\"Resource\": \"arn:aws:s3:::raw-bucket\",\n\t\t\t\"Condition\":{\"StringLike\":{\"s3:prefix\":\n\t\t\t\t[\n\t\t\t\t    \"web\/users\/*\",\n\t\t\t\t    \"web\/clients\/*\"\n\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n\n\n<\/code><\/pre>\n<p><strong>Pol\u00edticas basadas en <em>tags<\/em><\/strong><\/p>\n<p>Una opci\u00f3n que nos permite bajar de grano en el nivel de permisionado sobre los objetos de S3 son las pol\u00edticas basadas en tags. Si bien el tagear los objetos en S3 puede ser un proceso m\u00e1s complejo que la estructuraci\u00f3n de la informaci\u00f3n, este permisionado puede ser mucho m\u00e1s flexible y completo que las pol\u00edticas basadas en recursos.<\/p>\n<p>Como el caso anterior,<strong> requiere de un ejercicio de definici\u00f3n inicial de los procesos y est\u00e1ndares de etiquetado para garantizar un eficiente control de accesos.<\/strong> Un ejemplo de pol\u00edtica donde permitiremos a un usuario ver los objetos de usuarios y clientes pertenecientes a web ser\u00eda el siguiente:<\/p>\n<pre><code class=\"language-json\">\n{\n\t\"Version\": \"2012-10-17\",\n\t\"Statement\": [\n\t\t{\n\t\t\t\"Sid\": \"WebViewer\",\n\t\t\t\"Effect\": \"Allow\",\n\t\t\t\"Action\": \"s3:GetObject\",\n\t\t\t\"Resource\": \"arn:aws:s3:::raw-bucket\",\n\t\t\t\"Condition\": {\n\t\t\t\t\"ForAllValues:StringEquals\": {\n\t\t\t\t\t\"s3:ResourceTag\/entity\": [\"users\", \"clients\"]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}\n\n\n\n<\/code><\/pre>\n<p>Pero tambi\u00e9n nos permitir\u00e1 bajar el permisionado a nivel de objeto sin penalizar el particionado de nuestros datos manteniendo una estructura funcionalmente coherente.<\/p>\n<h3><strong>Lakeformation<\/strong><\/h3>\n<p>Con IAM podemos garantizar un control de accesos de grano fino a los propios objetos en S3, pero cuando tenemos la necesidad de restringir el acceso a los datos contenidos en nuestros ficheros necesitamos otro tipo de servicio. En este sentido, <strong>Lake Formation es un servicio ideal que nos permite de manera sencilla la creaci\u00f3n de un data lake, as\u00ed como la gesti\u00f3n y securizaci\u00f3n del mismo.<\/strong><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38924\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2021\/03\/lakeformation-creacion-gestion-securizacion.png?resize=713%2C568&#038;ssl=1\" alt=\"\" width=\"713\" height=\"568\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Centr\u00e1ndonos en el aspecto de la seguridad, partiremos de la premisa de que con nuestros datos almacenados en S3 con formatos admitidos, ya se han descubierto los datos y se han generado las correspondientes bases de datos, esquemas y tablas en el cat\u00e1logo de datos. Lake Formation nos permite gestionar los accesos a estos datos de una manera muy sencilla y eficiente.<\/p>\n<p>Para ello los permisos que se permiten otorgar son a nivel de:<\/p>\n<ul>\n<li><strong>Base de datos:<\/strong> permisos de creaci\u00f3n, actualizaci\u00f3n, consulta de detalles y eliminaci\u00f3n de la base de datos.<\/li>\n<li><strong>Tabla:<\/strong> permisos de actualizaci\u00f3n, consulta de detalles, eliminaci\u00f3n de la tabla, y a nivel de fila de inserci\u00f3n, eliminaci\u00f3n y consulta.<\/li>\n<li><strong>Columna:<\/strong> restringe el acceso a determinadas columnas de una tabla.<\/li>\n<\/ul>\n<p>Los permisos pueden ser conceder y revocar, y estos pueden asignarse a Usuarios\/Roles\/Grupos del servicio de IAM, usuarios del servicio de visualizaci\u00f3n de QuickSight as\u00ed como acceso federado mediante SAML o Active Directory con servicios de consulta como Athena. Para la gesti\u00f3n de los permisos se puede hacer uso del CLI de aws, la interfaz web de consola y el API.<\/p>\n<p>Como en ejemplos anteriores, disponemos de una tabla users ya en el cat\u00e1logo de datos, la cual est\u00e1 formada por las columnas nombre, logins y email. El grupo de usuarios de marketing deber\u00edan ver el campo email, mientras que el grupo de analytics no requiere de ver ese email.<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-38928\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2021\/03\/usuarios-roles-grupos-servicio-IAM.png?resize=599%2C384&#038;ssl=1\" alt=\"\" width=\"599\" height=\"384\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Imagen: Unsplash | Rawpixel<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La necesidad de compartir datos entre m\u00faltiples fuentes y departamentos en las organizaciones lleva a la construcci\u00f3n de data lakes corporativos, los cuales son lugares donde se almacena de manera centralizada toda la informaci\u00f3n de las distintas fuentes de la compa\u00f1\u00eda con el fin poder ser consumidos por los distintos departamentos. Un aspecto muy importante [&hellip;]<\/p>\n","protected":false},"author":134360170,"featured_media":1657,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","_crdt_document":"","content-type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[233],"tags":[236,255,277],"class_list":["post-1953","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seguridad","tag-aws","tag-cloud-es","tag-seguridad"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2021\/03\/gestion-control-accesos-datalake-aws.jpg?fit=1280%2C452&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p9CeZw-vv","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/1953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/users\/134360170"}],"replies":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/comments?post=1953"}],"version-history":[{"count":1,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/1953\/revisions"}],"predecessor-version":[{"id":2402,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/1953\/revisions\/2402"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media\/1657"}],"wp:attachment":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media?parent=1953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/categories?post=1953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/tags?post=1953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}