Protege la entrada de Twilio Voice con cifrado y redacción
Tiempo de lectura: 7 minutos
Protege la entrada de Twilio Voice con cifrado y redacción
¿Estás haciendo todo lo posible para proteger la información confidencial que te confían los agentes de llamada?
A medida que las organizaciones aprovechan más información confidencial, proteger esos datos es más importante que nunca. Twilio ofrece numerosas formas de proteger tus datos confidenciales, pero depende de ti implementar los recursos que Twilio proporciona de manera responsable.
En este artículo, aprende a cifrar y anonimizar los datos recopilados de Twilio Programmable Voice, usando <Gather> TwiML con Twilio Serverless Functions y Voice PCI Mode.
Lo que necesitarás
Para realizar este tutorial, necesitarás lo siguiente:
¿Qué estás creando?
Crearás una aplicación móvil de voz interactiva simple para manejar la autenticación de agentes de llamada. Se utilizará una función para solicitar al agente de llamada la siguiente información confidencial a través de <Gather> TwiML.
"Por favor ingresa tu PIN de 4 dígitos"
"Por favor ingresa los últimos 4 dígitos de tu número de tarjeta de pago"
Tan pronto como se reciba esta información del agente de llamada, se la cifrará. A partir de ese momento, los datos permanecerán cifrados hasta que lleguen a su destino.
En una implementación real, el destino probablemente sería tu servicio de actividad en segundo plano para el procesamiento. Sin embargo, aquí, otra función actuará como una “API ficticia” para demostrar cómo se realizaría el descifrado.
También habilitarás Voice PCI Mode para anonimizar la información recopilada en los registros de llamadas de Voice.
El antes
Antes de saltar a la solución, echa un vistazo a cómo se verían tus registros sin cifrado o anonimización.
Twilio Functions registrará cualquier error generado desde una función en tu Twilio Debugger. En esta situación de ejemplo, registrarás un error si no se introducen ciertos dígitos específicos. Puedes ver los parámetros de solicitud en texto sin formato en el error recibido por el Debugger.
Programmable Voice también registrará los dígitos recolectados en texto sin formato en el registro de llamadas de Voice:
Puedes encontrar esta información si tienes acceso a los registros de llamadas o al Debugger.
El después
Los datos visibles después de implementar esta solución son menos vulnerables. Al final, tu registro de funciones mostrará valores más seguros y cifrados:
Y tu registro de llamadas mostrará *REDACTED*:
Comenzar
Twilio Functions
Para seguir estas instrucciones, utiliza el Editor de funciones de la consola de Twilio.
Crea un servicio
Las funciones se crean y contienen dentro de Servicios:
Inicia sesión en la consola de Twilio y navega a la pestaña Functions.
Crea un Servicio haciendo clic en el botón Create Service (Crear servicio) y añade un nombre como encrypted-gather-sample.
Agrega una dependencia
En esta solución, la biblioteca de axios se utiliza para realizar una solicitud a tu servicio de actividad en segundo plano “imaginario” (la función decrypt-gather) para su procesamiento.
Agrega axios como una dependencia a tu Servicio.
Crea una variable de entorno
Esta solución requiere una clave secreta, que se utilizará para cifrar y descifrar los datos confidenciales.
Agrega una variable de entorno dentro de tu servicio que almacene tu clave.
Para fines de prueba, se puede utilizar la siguiente clave secreta de 32 bytes.
Crea la función de cifrado AES
Primero, crea una función para manejar el cifrado y descifrado de datos usando criptografía de clave simétrica.
Crypto de Node.js
Node.js ofrece un módulo de criptografía integrado llamado Crypto. Crypto proporciona varios métodos útiles, como createCipheriv() y createDecipheriv(), que nos permiten especificar qué tipo de algoritmo de cifrado de bloques emplear.
Cifrado de bloque de GCM
Advanced Encryption Standard, conocido como AES, es una técnica para proteger los datos utilizando algoritmos de cifrado. AES se puede lograr a través de una variedad de modos de operaciones.
En esta solución, usarás GCM, Galois/Counter Mode, un cifrado de bloque criptográfico de clave simétrica que se prefiere por su velocidad y fuerza.
Código
Crea una nueva función llamada AES con el siguiente código.
Esta función debe ajustarse a una visibilidad de "Privado", ya que solo se utilizará desde dentro de otra función en el mismo servicio.
Crea la función encrypted-gather
A continuación, crea la función que realizará las operaciones sensibles de <Gather>. Esta función se configurará como el webhook de voz de número de teléfono entrante en un paso posterior.
A partir de esta función, los dígitos ingresados por el agente de llamada se cifrarán tan pronto como se reciban y se enviarán en su estado cifrado a la función final, “destino”.
Código
Crea una nueva función llamada encrypted-gather con el siguiente código:
Esta función debe establecerse como "Protegida", ya que será llamada desde dentro de Twilio y puede ser asegurada con el encabezado X-Twilio-Signature.
¿Cómo se cifra?
En la parte superior, importas las funciones creadas en el paso anterior con la siguiente línea:
Entonces, defines tu secreto obteniéndolo de la variable de entorno:
Y, lo más importante, cualquier información confidencial se incluye con la función de cifrado. (En este caso, la información de <Gather> se pasa como el parámetro Digit y se puede acceder desde el objeto de evento.)
Esto maneja el cifrado de la información recopilada.
Crea la función decrypt-gather
Finalmente, vamos a crear una función para demostrar cómo descifrar los datos confidenciales.
En un entorno de producción, esto probablemente sería una solicitud a tu servicio de actividad en segundo plano que procesa la información del agente de llamada en función de las necesidades de tu negocio.
En esta solución, una tercera función actuará como el “servicio de actividad en segundo plano” que procesa estos datos. Esta función recibirá los dígitos cifrados y los descifrará para su posterior procesamiento.
Código
Crea una nueva función llamada decrypt-gather con el siguiente código:
La visibilidad de esta función será "Pública", ya que pretende ser un servicio externo.
¿Cómo se descifra?
En la parte superior, vuelves a importar las funciones de AES y defines secret_key como una variable.
Luego llamas a decrypt en la información que fue encriptada anteriormente:
Configuración adicional
Webhook de número de teléfono
Para simplificar, conecta esta función directamente a un número de teléfono.
Para configurar el número de teléfono:
Desde Twilio Console (Consola de Twilio), ve a la sección Phone Numbers (Números de teléfono)
Selecciona tu número de teléfono y, a continuación, desplázate hasta la sección Voice & Fax (Voz y fax)
Establece la función encrypted-gather como el webhook A call comes in (Una llamada ingresa) en Voice Configuration (Configuración de voz)
Guarda los cambios
Activar el modo PCI
¡Ya casi terminamos! Aseguraste las funciones, pero todavía hay un área más donde Twilio retiene los dígitos reunidos en texto sin formato: registros de llamadas de Voice.
A continuación, se muestra una captura de pantalla de la Consola de Twilio para una llamada entrante con la solución <Gather> cifrada implementada. A pesar de que Functions aseguró los datos, Voice no lo ha hecho.
Solo hay una manera de evitar que estos datos se muestren en el registro de llamadas, y eso es con el modo PCI. La habilitación del modo PCI en tu cuenta anonimizará todos los datos capturados de cualquier operación de <Gather>.
Si realmente quieres capturar información confidencial de forma segura…
Dirígete a la Configuración de Voice de Twilio en la Consola de Twilio. (En el panel de navegación izquierdo, haz clic en Voice > Settings > General [Voice > Configuración > General].)
Haz clic en el botón Enable PCI Mode (Habilitar el modo PCI).
Guarda los cambios.
Haz una llamada
Ahora es el momento de la verdad, es hora de realizar una llamada de prueba al número de teléfono.
A partir de aquí, hay dos caminos.
Si ingresas 1234 como los últimos 4 dígitos de tu “tarjeta de crédito” y 4321 como el PIN único, escucharás información de cuenta “ficticia” devuelta en la llamada. Este es un ejemplo de una respuesta de API exitosa.
Si ingresas otros dígitos, se comportará como si no fuera un usuario conocido y devolverá una respuesta 404. Este es un ejemplo de una solicitud fallida, que registrará un error en el Debugger de Twilio.
¿Cómo sé que funcionó?
Sigue el camino fallido y echa un vistazo a tu registro de errores en la Consola de Twilio.
Para la respuesta de error 404, encontrarás un error 82005 de Functions con los siguientes detalles:
Esto es bueno. Sin el cifrado, una respuesta fallida habría registrado esas variables en texto sin formato. Sin embargo, ahora los datos se registrarán en su forma más segura y encriptada.
También puedes comprobar tu registro de llamadas para confirmar que los dígitos muestran *REDACTED* allí también.
¿Es esto seguro?
Seguir este tutorial (incluidos los pasos opcionales del modo PCI) evitaría que los datos se registraran en texto sin formato en cualquier lugar del ecosistema de Twilio, y evitaría que cualquier persona en Twilio pudiera descifrar tus datos confidenciales, lo que haría que esto fuera una mejora con respecto al valor predeterminado.
Sin embargo, la clave secreta utilizada para el cifrado y descifrado se almacena como una variable de entorno en el servicio, lo que significa que los usuarios a quienes se les otorga acceso a Twilio Functions podrían extraer la clave y potencialmente realizar el esfuerzo de descifrar los valores.
Recomendación final
Si estás realizando modificaciones en el código de muestra proporcionado, ten en cuenta que en Functions se conservan las advertencias y errores de la consola dentro de los sistemas internos de Twilio y en Twilio Debugger durante algún tiempo.
No uses ninguno de los siguientes métodos de registro de consola con datos confidenciales y no cifrados:
Conclusión
En esta lección, aprendiste cómo proteger los datos recopilados de <Gather> TwiML con cifrado a través de una función sin servidor y anonimización a través del modo PCI de Voice.
Si deseas cobrar pagos de tus agentes de llamada, considera la función Twilio <Pay> totalmente compatible con PCI.
Para obtener más información sobre el cumplimiento de PCI en Twilio, consulta la documentación y la matriz de responsabilidad.
Los usuarios confían en ti para mantener privada su información confidencial. Asegúrate de respetar y conservar esa confianza haciendo todo lo posible para proteger los datos que procesas.
Bry Schinina es una desarrolladora y educadora que aprecia profundamente que las empresas no expongan información privada. Trabaja como líder y gerente técnica sénior de cuentas en Twilio, resolviendo problemas complejos y ayudando a las organizaciones a tener éxito con su plataforma de participación digital. Puedes comunicarte con ella en bschinina [@] twilio.com.
Publicaciones relacionadas
Recursos relacionados
Twilio Docs
Desde API hasta SDK y aplicaciones de muestra
Documentación de referencia de API, SDK, bibliotecas auxiliares, inicios rápidos y tutoriales para su idioma y plataforma.
Centro de Recursos
Los últimos libros electrónicos, informes de la industria y seminarios web
Aprenda de los expertos en participación del cliente para mejorar su propia comunicación.
Ahoy
Centro de la comunidad de desarrolladores de Twilio
Mejores prácticas, ejemplos de códigos e inspiración para crear comunicaciones y experiencias de participación digital.