
Alta velocidad/Bajo costo CommonCrawl RegExp en Node.js
WARCannon fue construido para simplificar y abaratar el proceso de 'grep en internet'.
Con WARCannon, puedes:
WARCannon aprovecha un uso inteligente de las tecnologías de AWS para escalar horizontalmente a cualquier capacidad, minimizar costos mediante flotas spot y transferencia de datos en la misma región, extraer de S3 a velocidades increíbles (hasta 100Gbps por nodo), paralelizar en cientos de núcleos de CPU, reportar estado a través de DynamoDB y CloudFront, y almacenar resultados mediante S3.
En total, WARCannon puede procesar múltiples patrones de expresiones regulares en 400TB en unas pocas horas por alrededor de $30.
La forma más rápida y sencilla de empezar es usar AWS CloudShell. Simplemente pega esta línea:
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/master/cloudshell/deploy.sh)
Si quieres usar una rama que no sea master de WARCannon, simplemente escribe:
export GIT_BRANCH=branch_name
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/$GIT_BRANCH/cloudshell/deploy.sh)
Nota: El despliegue en CloudShell utiliza almacenamiento efímero, lo que significa que los patrones de expresiones regulares personalizados se perderán cuando se cierre CloudShell. Si vas a usar WARCannon con frecuencia, recomiendo usar la 'Instalación Local' a continuación.
WARCannon requiere que tengas instalado lo siguiente:
ProTip: Para mantener las cosas limpias y distintas de otras cosas que puedas tener en AWS, se RECOMIENDA ENCARECIDAMENTE que despliegues WARCannon en una cuenta nueva. Puedes crear una nueva cuenta fácilmente desde la consola de 'Organizations' en AWS. Con 'RECOMENDADO ENCARECIDAMENTE', quiero decir 'seriamente no instales esto junto a otras cosas'.
Primero, clona el repositorio y copia la configuración de ejemplo.
$ git clone [email protected]:c6fc/warcannon.git
$ cd warcannon
warcannon$ cp settings.json.sample settings.json
Edita settings.json a tu gusto:
Configuraciones obligatorias
nodeInstanceType: Un array de tipos de instancia para usar en procesamiento paralelo. Los tipos 'c' ofrecen la mejor relación calidad-precio para este propósito, y se puede usar cualquier tamaño. ["c5n.18xlarge"] es el valor recomendado para campañas reales.nodeCapacity: El número de nodos a solicitar durante el procesamiento paralelo. Los nodos resultantes serán una distribución arbitraria de los nodeInstanceTypes que especifiques.nodeParallelism: El número de WARCs simultáneos a procesar por vCPU. 2 es un buen número aquí. Si los nodos tienen RAM insuficiente para ejecutarse a este nivel de paralelismo (como se podría encontrar con instancias tipo 'c'), se ejecutarán al paralelismo seguro más alto en su lugar.nodeMaxDuration: La vida útil máxima de los nodos de cómputo en segundos. Los nodos se terminarán automáticamente después de este tiempo si el trabajo aún no ha finalizado. El valor predeterminado es 24 horas.Configuraciones opcionales (déjalas completamente fuera si no se usan)
sshKeyName: El nombre de una clave SSH de EC2 que ya existe en us-east-1.allowSSHFrom: Una máscara CIDR para permitir SSH desde. Típicamente será <yourpublicip>/32Para instalar, ejecuta esto:
$ npm install
$ npm link
$ warcannon deploy
Ejecutar una campaña en WARCannon utiliza un flujo de trabajo simple y fácil de seguir que se puede describir mejor en estos pocos pasos:
warcannon deploywarcannon testLocal -swarcannon testwarcannon list 2022warcannon populate 2022-21warcannon firewarcannon syncResultsContinúa leyendo para una comprensión más detallada de cada paso.
WARCannon se alimenta de Common Crawl a través del programa AWS Open Data. Common Crawl es único en que los datos recuperados por sus spiders no solo capturan texto de sitios web, sino también otro contenido basado en texto como JavaScript, TypeScript, HTML completo, CSS, etc. Al construir expresiones regulares adecuadas capaces de identificar componentes únicos, los investigadores pueden identificar sitios web por las tecnologías que utilizan, y hacerlo sin tocar nunca el sitio web ellos mismos. El problema es que esto requiere analizar cientos de terabytes de datos, lo cual es una tarea difícil sin importar los recursos que tengas a tu disposición. ¡Afortunadamente WARCannon tiene varias herramientas que puedes usar para lograrlo!
Grep en internet no es para los débiles de corazón, pero empezar con un colador efectivo es el primer paso. WARCannon lo apoya permitiendo la verificación local de expresiones regulares contra datos reales de Common Crawl. Primero, abre lambda_functions/warcannon/matches.js y modifica el objeto regex_patterns para incluir las expresiones regulares que deseas usar en formato name: pattern. Aquí hay un ejemplo del conjunto de búsqueda predeterminado:
exports.regex_patterns = {
"access_key_id": /(\'A|"A)(SIA|KIA|IDA|ROA)[JI][A-Z0-9]{14}[AQ][\'"]/g,
};
Las cadenas que coincidan con esta expresión se guardarán bajo la clave correspondiente en los resultados; access_key_id en este caso. ProTip: Usa RegExr con el formato 'JavaScript' para construir y probar expresiones regulares contra coincidencias conocidas.
También tienes la opción de capturar solo resultados de dominios especificados. Para hacerlo, simplemente completa el array domains con los FQDN que desees incluir. Se recomienda dejar esto vacío [] ya que casi nunca vale la pena (el esfuerzo de procesamiento ahorrado es muy pequeño), pero puede ser útil en algunos casos específicos.
exports.domains = ["example1.com", "example2.com"];
Una vez que matches.js esté poblado, ejecuta el siguiente comando:
warcannon$ warcannon testLocal -s
Opcionalmente, puedes agregar una ruta a un WARC en el bucket S3 commoncrawl si lo deseas, pero se usará un valor predeterminado hardcodeado en caso contrario.
WARCannon procesará el archivo WARC en flujo (o lo descargará por completo si omites -s) para encontrar tus coincidencias configuradas. WARCannon guardará los resultados en la carpeta ~/.warcannon/ cuando interrumpas con ctrl+c o cuando termine el procesamiento. Esto facilita probar coincidencias comunes muy rápidamente con un ancho de banda mínimo.
Además de todo lo demás, WARCannon intentará evaluar el costo total de cómputo de tus expresiones regulares cuando se ejecuten localmente. De esta manera, podrás saber si una expresión regular determinada impactará significativamente el rendimiento antes de ejecutar tu campaña.

A veces un simple patrón de expresión regular no es suficiente por sí solo, y necesitas algunos pasos adicionales para asegurarte de que estás devolviendo la información correcta. En este caso, simplemente agregar una función al objeto exports.custom_functions con el mismo nombre de clave te permite realizar cualquier procesamiento adicional que consideres adecuado.
exports.regex_patterns = {
"access_key_id": /(\'A|"A)(SIA|KIA|IDA|ROA)[JI][A-Z0-9]{14}[AQ][\'"]/g,
};
exports.custom_functions = {
"access_key_id": function(match) {
// Ignore matches with 'EXAMPLE' in the text, since this is common for documentation.
if (match.text(/EXAMPLE/) != null) {
// Returning a boolean 'false' discards the match.
return false
}
}
}
Nota: WARCannon está diseñado para procesar texto a velocidades estúpidas. Aunque ciertamente es posible realizar cualquier tipo de operación que desees, agregar funciones personalizadas de alta latencia, como llamadas de red, puede aumentar significativamente el tiempo de procesamiento y los costos. Las llamadas de red también podrían resultar en MUCHAS llamadas a un sitio web, lo que podría meterte en problemas. Sé inteligente sobre cómo usas estas funciones.
Los costos de AWS pueden causar ansiedad, especialmente cuando solo buscas investigar un poco. WARCannon está construido para permitir tanto ejecuciones únicas como campañas completas, para que puedas tener confianza en los resultados que obtendrás. Una vez que estés satisfecho con los resultados que obtienes con testLocal, puedes desplegar tus coincidencias actualizadas y ejecutar una prueba respaldada en la nube fácilmente:
warcannon$ warcannon deploy
warcannon$ warcannon test
Nuevamente, opcionalmente puedes incluir una ruta WARC si lo deseas, aunque no es necesario.
Esto ejecutará sincrónicamente una función Lambda con las expresiones regulares que has configurado y devolverá los resultados inmediatamente. Este proceso toma unos 2.5 minutos, así que no temas esperar mientras hace su magia.
WARCannon utiliza AWS Simple Queue Service para distribuir trabajo a los nodos de cómputo. Para asegurarte de que tus resultados no estén contaminados con ejecuciones anteriores, puedes indicarle a WARCannon que vacíe la cola:
warcannon$ warcannon emptyQueue
[+] Cleared [ 15 ] messages from the queue
Luego puedes verificar el estado de la cola:
warcannon$ warcannon status
Deployed: [ YES ]; SQS Status: [ EMPTY ]
Job Status: [ INACTIVE ]
Active job url: https://d201offlnmhkmd.cloudfront.net
Verifica lo siguiente antes de proceder:
Para crear los mensajes de cola que consumirán los nodos de cómputo, primero debes poblar SQS con datos de crawl. WARCannon tiene varios comandos para ayudar con esto, comenzando con la capacidad de mostrar los escaneos disponibles. En este caso, veamos los escaneos disponibles para el año 2021:
warcannon$ warcannon list 2021
CC-MAIN-2021-04
CC-MAIN-2021-10
Tenemos dos escaneos que coinciden con la cadena "2021" con los que trabajar. Ahora podemos instruir a WARCannon para poblar la cola basada en uno de estos escaneos. Esta vez, necesitamos proporcionar un parámetro que identifique de forma única uno de los escaneos. "2021-04" servirá. Podríamos elegir poblar solo un escaneo parcial especificando también un número de fragmentos y un tamaño de fragmento, pero omitiremos eso por ahora.
warcannon$ warcannon populate 2021-04
{Created 799 chunks of 100 from 79840 available segments"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
Durante el despliegue, WARCannon aprovisiona automáticamente una base de datos (warcannon_commoncrawl) y un grupo de trabajo (warcannon) en Athena que se pueden usar para consultar rápidamente información de CommonCrawl. Esto puede ser especialmente útil para poblar campañas dispersas basadas en ciertas consultas. Por ejemplo, la siguiente consulta buscará WARCs que contengan respuestas de 'example.com'
SELECT
warc_filename,
COUNT(url_path) as num
FROM
warcannon_commoncrawl.ccindex
WHERE
subset = 'warc' AND
url_host_registered_domain IN ('example.com') AND
crawl = 'CC-MAIN-2021-04'
GROUP BY warc_filename
ORDER BY num DESC
Puedes usar la consola de Athena para ajustar tus resultados, pero debes ejecutar la consulta desde la línea de comandos de WARCannon si tienes la intención de poblar un trabajo con ella:
warcannon queryAthena "SELECT warc_filename, COUNT(url_path) as num FROM warcannon_commoncrawl.ccindex WHERE subset = 'warc' AND url_host_registered_domain IN ('example.com') AND crawl = 'CC-MAIN-2021-04' GROUP BY warc_filename ORDER BY num DESC"
[+] Query Exec Id: 0319486e-1846-491c-badf-2e23ae213974 .. SUCCEEDED
WARCannon puede entonces usar los resultados de una consulta para poblar la cola, y lo hace basándose en la columna warc_filename del conjunto de resultados. Como tal, se recomienda que uses group by en esta columna o uses distinct() para evitar duplicados. WARCannon lanzará un error si este campo no está presente. Puebla la cola con resultados de Athena pasando el ID de Ejecución de Consulta al comando populateAthena.
warcannon populateAthena 0319486e-1846-491c-badf-2e23ae213974
{Created 26 chunks of 10 from 251 available segments"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
Nota: Si bien poblar un trabajo disperso para un solo dominio puede parecer una buena idea, a menudo no lo es. Las respuestas de un solo dominio tienden a estar muy distribuidas en un gran subconjunto de WARCs. Esto se puede ver claramente usando la consulta de ejemplo anterior para ver que de los ~150,000 registros en cada WARC, el mayor acierto único para sitios web de tamaño moderado puede ser de un solo dígito.
Con la cola poblada, estamos listos para disparar. WARCannon hará algunas comprobaciones de cordura para asegurarse de que todo esté en orden, luego te mostrará la configuración de la campaña y te dará una última oportunidad de abortar antes de finalizar la orden.
warcannon$ warcannon fire
[!] This will request [ 6 ] spot instances of type [ m5n.24xlarge, m5dn.24xlarge ]
lasting for [ 86400 ] seconds.
To change this, edit your settings in settings.json and run warcannon deploy
--> Ready to fire? [Yes]:
Dispara respondiendo con 'Yes'.
--> Ready to fire? [Yes]: Yes
{
"SpotFleetRequestId": "sfr-03dd32b8-51f7-4c8e-802b-a702fc3c8c95"
}
[+] Spot fleet request has been sent, and nodes should start coming online within ~5 minutes.
Monitor node status and progress at https://d201offlnmhkmd.cloudfront.net
La respuesta incluye un enlace a tu URL de estado única, donde puedes monitorear el progreso de tu campaña y el rendimiento de cada nodo.

Los resultados de WARCannon se almacenan en S3 en formato JSON, desglosados por cada nodo responsable de producir los resultados. Los resultados de Athena se almacenan en el mismo bucket bajo el prefijo /athena/. Puedes sincronizar los resultados de una campaña a la carpeta ~/.warcannon/ en tu máquina local usando el comando syncResults.
warcannon syncResults
sync: s3://warcannon-results-202...
sync: s3://warcannon-results-202...
sync: s3://warcannon-results-202...
...
Luego puedes vaciar los buckets de resultados con clearResults
warcannon clearResults
delete: s3://warcannon-results-202...
delete: s3://warcannon-results-202...
delete: s3://warcannon-results-202...
...
[+] Deleted [ 21 ] files from S3.
¿Tienes preguntas, necesitas ayuda, quieres contribuir o presumir de un éxito? ¡Ven a pasar el rato en Discord!