Logotipo de Zephyrnet

Centralice la gobernanza casi en tiempo real a través de alertas en los almacenes de datos de Amazon Redshift para consultas confidenciales | Servicios web de Amazon

Fecha:

Desplazamiento al rojo de Amazon es un servicio de almacenamiento de datos a escala de petabytes completamente administrado en la nube que brinda información poderosa y segura sobre todos sus datos con la mejor relación precio-rendimiento. Con Amazon Redshift, puede analizar sus datos para obtener información holística sobre su empresa y sus clientes. En muchas organizaciones, uno o varios almacenes de datos de Amazon Redshift se ejecutan a diario con fines analíticos y de datos. Por lo tanto, con el tiempo, múltiples Lenguaje de definición de datos (DDL) or Lenguaje de control de datos (DCL) Las consultas, como CREATE, ALTER, DROP, GRANT o REVOKE SQL, se ejecutan en el almacén de datos de Amazon Redshift, que son de naturaleza confidencial porque podrían provocar la eliminación de tablas o la eliminación de datos, lo que provocaría interrupciones o interrupciones. El seguimiento de las consultas de los usuarios como parte de la gobernanza centralizada del almacén de datos ayuda a las partes interesadas a comprender los riesgos potenciales y a tomar medidas inmediatas para mitigarlos siguiendo el pilar de excelencia operativa del Lente de análisis de datos de AWS. Por lo tanto, para un mecanismo de gobierno sólido, es crucial alertar o notificar a los administradores de la base de datos y de seguridad sobre el tipo de consultas confidenciales que se ejecutan en el almacén de datos, de modo que se puedan tomar medidas correctivas rápidas si es necesario.

Para abordar esto, en esta publicación le mostramos cómo puede automatizar notificaciones casi en tiempo real en un Flojo canal cuando ciertas consultas se ejecutan en el almacén de datos. También creamos un tablero de mando simple usando una combinación de Amazon DynamoDB, Atenea amazónicay Amazon QuickSight.

Resumen de la solución

Un almacén de datos de Amazon Redshift registra información sobre las conexiones y las actividades de los usuarios que tienen lugar en las bases de datos, lo que ayuda a monitorear la base de datos con fines de seguridad y solución de problemas. Estos registros se pueden almacenar en Servicio de almacenamiento simple de Amazon (Amazon S3) baldes o Reloj en la nube de Amazon. Amazon Redshift registra información en los siguientes archivos de registro y esta solución se basa en el uso de un Registro de auditoría de Amazon Redshift a CloudWatch como destino:

  • Registro de conexión – Registra intentos de autenticación, conexiones y desconexiones
  • registro de usuario – Registra información sobre cambios en las definiciones de usuario de la base de datos
  • Registro de actividad del usuario – Registra cada consulta antes de que se ejecute en la base de datos

El siguiente diagrama ilustra la arquitectura de la solución.

Arquitectura de soluciones

El flujo de trabajo de la solución consta de los siguientes pasos:

  1. El registro de auditoría está habilitado en cada almacén de datos de Amazon Redshift para capturar el registro de actividad del usuario en CloudWatch.
  2. Los filtros de suscripción en CloudWatch capturan los comandos DDL y DCL requeridos proporcionando criterios de filtro.
  3. El filtro de suscripción desencadena una AWS Lambda función para la coincidencia de patrones.
  4. La función Lambda procesa los datos del evento y envía la notificación a través de un canal de Slack mediante un webhook.
  5. La función de Lambda almacena los datos en una tabla de DynamoDB sobre la que se construye un tablero simple usando Athena y QuickSight.

Requisitos previos

Antes de comenzar la implementación, asegúrese de que se cumplan los siguientes requisitos:

  • Tienes un Cuenta de AWS.
  • El proyecto Región de AWS utilizado para esta publicación es us-east-1. Sin embargo, esta solución es relevante en cualquier otra región donde estén disponibles los servicios de AWS necesarios.
  • Permisos para crear un espacio de trabajo en Slack.

Crear y configurar un clúster de Amazon Redshift

Para configurar su clúster, complete los siguientes pasos:

  1. Cree un almacén de datos de Amazon Redshift aprovisionado.

Para esta publicación, utilizamos tres almacenes de datos de Amazon Redshift: demo-cluster-ou1, demo-cluster-ou2y demo-cluster-ou3. En esta publicación, todos los almacenes de datos de Amazon Redshift son clústeres aprovisionados. Sin embargo, la misma solución se aplica para Amazon Redshift sin servidor.

  1. Para permitir registro de auditoría con CloudWatch como destino de entrega de registros, abra un clúster de Amazon Redshift y vaya a la Propiedades .
  2. En Editar menú, seleccione Editar registro de auditoría.

Registro de auditoría de edición de Redshift

  1. Seleccione "Permitir" bajo Configurar el registro de auditoría.
  2. Seleccione Vigilancia de la nube para Tipo de exportación de registro.
  3. Seleccione las tres opciones para registro de usuario, Registro de conexióny Registro de actividad del usuario.
  4. Elige Guardar los cambios.

  1. Crear un grupo de parámetros para los racimos con enable_user_activity_logging establecer como verdadero para cada uno de los clústeres.
  2. Modificar el clúster para adjuntar el nuevo grupo de parámetros al clúster de Amazon Redshift.

Para esta publicación, creamos tres grupos de parámetros personalizados: custom-param-grp-1, custom-param-grp-2y custom-param-grp-3 para tres racimos.

Tenga en cuenta que si habilita solo la función de registro de auditoría, pero no el parámetro asociado, la auditoría de la base de datos registra la información solo para el registro de conexión y el registro de usuario, pero no para el registro de actividad del usuario.

  1. En la consola de CloudWatch, elija Grupos de registros bajo Troncos en el panel de navegación.
  2. Busque /aws/redshift/cluster/demo.

Esto mostrará todos los grupos de registros creados para los clústeres de Amazon Redshift.

Crear una tabla de auditoría de DynamoDB

Para crear su tabla de auditoría, complete los siguientes pasos:

  1. En la consola DynamoDB, elija Mesas en el panel de navegación.
  2. Elige Crear una tabla.
  3. Nombre de la tabla, introduzca demo_redshift_audit_logs.
  4. Clave de partición, introduzca partKey con el tipo de datos como String.

  1. Mantenga la configuración de la tabla como predeterminada.
  2. Elige Crear una tabla.

Crear recursos de Slack

Los webhooks entrantes de Slack esperan un JSON solicitud con una cadena de mensaje correspondiente a un "text" llave. También admiten la personalización de mensajes, como agregar un nombre de usuario y un ícono, o anular el canal predeterminado del webhook. Para más información, ver Envío de mensajes mediante webhooks entrantes en el sitio web de Slack.

Los siguientes recursos se crean para esta publicación:

  • Un espacio de trabajo de Slack llamado demo_rc
  • Un canal llamado #blog-demo en el espacio de trabajo de Slack recién creado
  • Una nueva aplicación de Slack en el espacio de trabajo de Slack llamada demo_redshift_ntfn (utilizando la Desde cero opción)
  • Anote la URL del webhook entrante, que se utilizará en esta publicación para enviar las notificaciones.

Crear un rol y una política de IAM

En esta sección, creamos un Gestión de identidades y accesos de AWS (YO SOY) política que se adjuntará a un Rol de IAM. Luego, el rol se usa para otorgar acceso a una función de Lambda a una tabla de DynamoDB. La política también incluye permisos para permitir que la función Lambda escriba archivos de registro en Registros de Amazon CloudWatch.

  1. En la consola de IAM, elija Políticas internas en el panel de navegación.
  2. Elige Crear política.
  3. En Crear política sección, elija el JSON e ingrese la siguiente política de IAM. Asegúrese de reemplazar su ID de cuenta de AWS en la política (reemplace XXXXXXXX con su ID de cuenta de AWS).
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadWriteTable", "Effect": "Allow", "Action": [ "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem", "dynamodb:PutItem", "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:UpdateItem", "logs:PutLogEvents" ], "Resource": [ "arn:aws:dynamodb:us-east-1:XXXXXXXX:table/demo_redshift_audit_logs", "arn:aws:logs:*:XXXXXXXX:log-group:*:log-stream:*" ] }, { "Sid": "WriteLogStreamsAndGroups", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup" ], "Resource": "arn:aws:logs:*:XXXXXXXX:log-group:*" } ]
}

  1. Elige Siguiente: Etiquetas, A continuación, elija Siguiente: Revisión.
  2. Proporcione el nombre de la política demo_post_policy y elige Crear política.

Aplicar demo_post_policy a una función de Lambda, primero debe adjuntar la política a un rol de IAM.

  1. En la consola de IAM, elija Roles en el panel de navegación.
  2. Elige Crear rol.
  3. Seleccione Servicio de AWS Y luego seleccione lambda.
  4. Elige Siguiente.

  1. En Agregar permisos página, buscar demo_post_policy.
  2. Seleccione demo_post_policy de la lista de resultados de búsqueda devueltos, luego elija Siguiente.

  1. En Revisar página, ingrese demo_post_role para el rol y una descripción apropiada, luego seleccione Crear rol.

Crear una función Lambda

Creamos una función Lambda con Python 3.9. En el siguiente código, reemplace el slack_hook parámetro con el webhook de Slack que copió anteriormente:

import gzip
import base64
import json
import boto3
import uuid
import re
import urllib3 http = urllib3.PoolManager()
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("demo_redshift_audit_logs")
slack_hook = "https://hooks.slack.com/services/xxxxxxx" def exe_wrapper(data): cluster_name = (data['logStream']) for event in data['logEvents']: message = event['message'] reg = re.match(r"'(?P<ts>d{4}-dd-ddTdd:dd:ddZ).*?bdb=(?P<db>S*).*?buser=(?P<user>S*).*?LOG:s+(?P<query>.*?);?$", message) if reg is not None: filter = reg.groupdict() ts = filter['ts'] db = filter['db'] user = filter['user'] query = filter['query'] query_type = ' '.join((query.split(" "))[0 : 2]).upper() object = query.split(" ")[2] put_dynamodb(ts,cluster_name,db,user,query,query_type,object,message) slack_api(cluster_name,db,user,query,query_type,object) def put_dynamodb(timestamp,cluster,database,user,sql,query_type,object,event): table.put_item(Item = { 'partKey': str(uuid.uuid4()), 'redshiftCluster': cluster, 'sqlTimestamp' : timestamp, 'databaseName' : database, 'userName': user, 'sqlQuery': sql, 'queryType' : query_type, 'objectName': object, 'rawData': event }) def slack_api(cluster,database,user,sql,query_type,object): payload = { 'channel': '#blog-demo', 'username': 'demo_redshift_ntfn', 'blocks': [{ 'type': 'section', 'text': { 'type': 'mrkdwn', 'text': 'Detected *{}* commandn *Affected Object*: `{}`'.format(query_type, object) } }, { 'type': 'divider' }, { 'type': 'section', 'fields': [{ 'type': 'mrkdwn', 'text': ':desktop_computer: *Cluster Name:*n{}'.format(cluster) }, { 'type': 'mrkdwn', 'text': ':label: *Query Type:*n{}'.format(query_type) }, { 'type': 'mrkdwn', 'text': ':card_index_dividers: *Database Name:*n{}'.format(database) }, { 'type': 'mrkdwn', 'text': ':technologist: *User Name:*n{}'.format(user) } ] }, { 'type': 'section', 'text': { 'type': 'mrkdwn', 'text': ':page_facing_up: *SQL Query*n ```{}```'.format(sql) } } ] } encoded_msg = json.dumps(payload).encode('utf-8') resp = http.request('POST',slack_hook, body=encoded_msg) print(encoded_msg) def lambda_handler(event, context): print(f'Logging Event: {event}') print(f"Awslog: {event['awslogs']}") encoded_zipped_data = event['awslogs']['data'] print(f'data: {encoded_zipped_data}') print(f'type: {type(encoded_zipped_data)}') zipped_data = base64.b64decode(encoded_zipped_data) data = json.loads(gzip.decompress(zipped_data)) exe_wrapper(data)

Crea tu función con los siguientes pasos:

  1. En la consola Lambda, elija Crear función.
  2. Seleccione Autor desde cero y para Nombre de la función, introduzca demo_function.
  3. Runtime, elija Python 3.9.
  4. Rol de ejecución, seleccione Use un rol existente y elige demo_post_role como el rol de IAM.
  5. Elige Crear función.

  1. En Código , ingrese la función Lambda anterior y reemplace la URL del webhook de Slack.
  2. Elige Despliegue.

Crear un filtro de suscripción de CloudWatch

Necesitamos crear el filtro de suscripción de CloudWatch en el useractivitylog grupo de registro creado por los clústeres de Amazon Redshift.

  1. En la consola de CloudWatch, vaya al grupo de registro /aws/redshift/cluster/demo-cluster-ou1/useractivitylog.
  2. En Filtros de suscripción pestaña, en la Crear menú, seleccione Crear filtro de suscripción de Lambda.

  1. Elige demo_function como la función Lambda.
  2. Formato de registro, escoger Otro.
  3. Proporcione el patrón de filtro de suscripción como ?create ?alter ?drop ?grant ?revoke.
  4. Proporcione el nombre del filtro como Sensitive Queries demo-cluster-ou1.
  5. Pruebe el filtro seleccionando el flujo de registro real. Si tiene alguna consulta con un patrón de coincidencia, puede ver algunos resultados. Para probar, use el siguiente patrón y elija Patrón de prueba.
'2023-04-02T04:18:43Z UTC [ db=dev user=awsuser pid=100 userid=100 xid=100 ]' LOG: alter table my_table alter column string type varchar(16); '2023-04-02T04:06:08Z UTC [ db=dev user=awsuser pid=100 userid=100 xid=200 ]' LOG: create user rs_user with password '***';

  1. Elige Iniciar la transmisión.

  1. Repita los mismos pasos para /aws/redshift/cluster/demo-cluster-ou2/useractivitylog y /aws/redshift/cluster/demo-cluster-ou3/useractivitylog dando nombres de filtro de suscripción únicos.
  2. Complete los pasos anteriores para crear un segundo filtro de suscripción para cada uno de los almacenes de datos de Amazon Redshift con el patrón de filtro ?CREATE ?ALTER ?DROP ?GRANT ?REVOKE, lo que garantiza que los comandos SQL en mayúsculas también se capturen a través de esta solución.

Prueba la solución

En esta sección, probamos la solución en los tres clústeres de Amazon Redshift que creamos en los pasos anteriores y verificamos las notificaciones de los comandos en el canal de Slack según los filtros de suscripción de CloudWatch, así como los datos que se ingieren en la tabla de DynamoDB. Usamos los siguientes comandos para probar la solución; sin embargo, esto no está restringido solo a estos comandos. Puede verificar con otros comandos DDL según los criterios de filtro en su clúster de Amazon Redshift.

create schema sales;
create schema marketing;
create table dev.public.demo_test_table_1 (id int, string varchar(10));
create table dev.public.demo_test_table_2 (empid int, empname varchar(100));
alter table dev.public.category alter column catdesc type varchar(65);
drop table dev.public.demo_test_table_1;
drop table dev.public.demo_test_table_2;

En el canal de Slack, los detalles de las notificaciones se ven como la siguiente captura de pantalla.

Para obtener los resultados en DynamoDB, complete los siguientes pasos:

  1. En la consola DynamoDB, elija Explorar elementos bajo Mesas en el panel de navegación.
  2. En Mesas panel, seleccione demo_redshift_audit_logs.
  3. Seleccione Escanear y Ejecutar para obtener los resultados en la tabla.

Federación de Athena sobre la tabla de DynamoDB

El proyecto Conector Athena DynamoDB permite que Athena se comunique con DynamoDB para que pueda consultar sus tablas con SQL. Como parte de los requisitos previos para esto, implemente el conector en su cuenta de AWS mediante la consola de Athena o el Repositorio de aplicaciones sin servidor de AWS. Para obtener más detalles, consulte Implementación de un conector de origen de datos or Uso del repositorio de aplicaciones sin servidor de AWS para implementar un conector de origen de datos. Para esta publicación, usamos la consola de Athena.

  1. En la consola de Athena, debajo Administración en el panel de navegación, elija Fuentes de datos.
  2. Elige Crear fuente de datos.

  1. Seleccione la fuente de datos como Amazon DynamoDB, A continuación, elija Siguiente.

  1. Nombre de fuente de datos, introduzca dynamo_db.
  2. función lambda, escoger Crear función Lambda para abrir una nueva ventana con la consola de Lambda.

  1. under Configuración de la aplicación, ingrese la siguiente informacion:
    • Nombre de la aplicación, introduzca AthenaDynamoDBConnector.
    • DerrameCubo, ingrese el nombre de un depósito S3.
    • AthenaNombre del catálogo, introduzca dynamo.
    • DeshabilitarSpillEncryption, introduzca false.
    • LambdaMemoria, introduzca 3008.
    • Tiempo de espera Lambda, introduzca 900.
    • DerramePrefijo, introduzca athena-spill-dynamo.

  1. Seleccione Reconozco que esta aplicación crea roles de IAM personalizados y elige Despliegue.
  2. Espere a que se implemente la función, luego regrese a la ventana de Athena y elija el icono de actualización junto a función lambda.
  3. Seleccione la función Lambda recién implementada y elija Siguiente.

  1. Revisa la información y elige Crear fuente de datos.
  2. Navegue de regreso al editor de consultas, luego elija dynamo_db para Fuente de datos y default para Base de datos.
  3. Ejecute la siguiente consulta en el editor para verificar los datos de muestra:
SELECT partkey, redshiftcluster, databasename, objectname, username, querytype, sqltimestamp, sqlquery, rawdata
FROM dynamo_db.default.demo_redshift_audit_logs limit 10;

Visualice los datos en QuickSight

En esta sección, creamos un panel de gobierno simple en QuickSight usando Athena en modo de consulta directa para consultar el conjunto de registros, que se almacena de forma persistente en una tabla de DynamoDB.

  1. Regístrese en QuickSight en la consola QuickSight.
  2. Seleccione Atenea amazónica como un recurso
  3. Elige lambda y seleccione la función Lambda creada para la federación de DynamoDB.

  1. Crea un nuevo conjunto de datos en QuickSight con Athena como fuente.
  2. Proporcione el nombre de la fuente de datos como demo_blog.
  3. Elige dynamo_db para Catálogo, default para Base de datosy demo_redshift_audit_logs para Mesa.
  4. Elige Editar / Vista previa de datos.

  1. Elige Cordón existentes sqlTimestamp columna y elija Fecha.

  1. En el cuadro de diálogo que aparece, ingrese el formato de datos yyyy-MM-dd'T'HH:mm:ssZZ.
  2. Elige Validar y Actualizar.

  1. Elige PUBLICAR Y VISUALIZAR.
  2. Elige Ficha interactiva y elige CREAR.

Esto lo llevará a la página de visualización para crear el análisis en QuickSight.

  1. Cree un panel de gobierno con el tipo de visualización adecuado.

Para obtener más detalles sobre cómo diseñar y realizar los esfuerzos de seguimiento y evaluación, refierase a Vídeos de aprendizaje de Amazon QuickSight en la comunidad QuickSight para el nivel básico a avanzado de autoría. La siguiente captura de pantalla es una visualización de muestra creada en estos datos.

Limpiar

Limpie sus recursos con los siguientes pasos:

  1. Eliminar todos los clústeres de Amazon Redshift.
  2. Eliminar la función Lambda.
  3. Elimine los grupos de registro de CloudWatch para Amazon Redshift y Lambda.
  4. Elimine la fuente de datos de Athena para DynamoDB.
  5. Eliminar la tabla de DynamoDB.

Conclusión

Amazon Redshift es un almacén de datos potente y completamente administrado que puede ofrecer un rendimiento significativamente mayor y un menor costo en la nube. En esta publicación, discutimos un patrón para implementar un mecanismo de gobierno para identificar y notificar consultas confidenciales de DDL/DCL en un almacén de datos de Amazon Redshift, y creamos un tablero rápido para permitir que el DBA y el equipo de seguridad tomen medidas oportunas y rápidas según sea necesario. Además, puede ampliar esta solución para incluir comandos DDL utilizados para Uso compartido de datos de Amazon Redshift a través de clústeres.

Excelencia operacional es una parte fundamental del gobierno de datos general en la creación de una arquitectura de datos moderna, ya que es un gran habilitador para impulsar el negocio de nuestros clientes. Idealmente, cualquier implementación de gobierno de datos es una combinación de personas, procesos y tecnología que las organizaciones utilizan para garantizar la calidad y seguridad de sus datos a lo largo de su ciclo de vida. Utilice estas instrucciones para configurar su mecanismo de notificación automatizado a medida que se detectan consultas confidenciales, así como para crear un panel rápido en QuickSight para realizar un seguimiento de las actividades a lo largo del tiempo.


Acerca de los autores

Rajdip Chaudhuri es Arquitecto de Soluciones Sénior en Amazon Web Services y se especializa en datos y análisis. Le gusta trabajar con los clientes y socios de AWS en los requisitos de análisis y datos. En su tiempo libre le gusta el fútbol y el cine.

Dhiraj Thakur es un arquitecto de soluciones con Amazon Web Services. Trabaja con los clientes y socios de AWS para proporcionar orientación sobre la adopción, la migración y la estrategia de la nube empresarial. Es un apasionado de la tecnología y disfruta construyendo y experimentando en el espacio analítico y AI / ML.

punto_img

Información más reciente

punto_img