{"id":4841,"date":"2018-03-19T08:41:48","date_gmt":"2018-03-19T15:41:48","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4841"},"modified":"2025-06-13T17:22:38","modified_gmt":"2025-06-14T00:22:38","slug":"auditing-couchbase-n1ql-statements","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/auditing-couchbase-n1ql-statements\/","title":{"rendered":"Auditor\u00eda de sentencias N1QL de Couchbase"},"content":{"rendered":"<p><a href=\"https:\/\/www.couchbase.com\/blog\/es\/announcing-couchbase-server-5-5\/\">Servidor Couchbase 5.5<\/a> incluye la capacidad de mantener un registro de todas las acciones N1QL realizadas por los usuarios. Esto es parte de la funcionalidad m\u00e1s general de Couchbase. <a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/security\/auditing.html\" target=\"_blank\" rel=\"noopener noreferrer\">auditor\u00eda<\/a> introducida en la versi\u00f3n 5.0. La auditor\u00eda s\u00f3lo est\u00e1 disponible en la edici\u00f3n Enterprise.<\/p>\n<p>La auditor\u00eda permite a los administradores del sistema saber qui\u00e9n accede a qu\u00e9 datos del sistema. Esto es importante cuando los datos almacenados son sensibles de alguna manera, como informaci\u00f3n sobre usuarios. Couchbase Server 5.5 soporta auditor\u00eda de sentencias N1QL, y permite al administrador especificar qu\u00e9 tipos de sentencias (SELECTs? INSERTs?) deber\u00edan ser auditadas.<\/p>\n<p>Es importante entender lo que Couchbase Server 5.5 no hace. En particular, no permite auditor\u00eda a nivel de registro. Si se ejecuta una sentencia UPDATE y modifica cinco registros, el registro de auditor\u00eda incluir\u00e1 la sentencia completa que se ejecut\u00f3, incluyendo cualquier par\u00e1metro pasado, y dir\u00e1 que se actualizaron cinco registros. No dir\u00e1 qu\u00e9 registros espec\u00edficos fueron actualizados, o cu\u00e1les eran sus valores antes o despu\u00e9s de la operaci\u00f3n. Fundamentalmente, la auditor\u00eda N1QL audita sentencias, no registros.<\/p>\n<p>Para configurar la auditor\u00eda, inicie sesi\u00f3n en la consola de administraci\u00f3n de Couchbase. Navega a la pesta\u00f1a Seguridad (en el lateral) y a la pesta\u00f1a Auditor\u00eda (en la parte superior de la pantalla). Ahora deber\u00eda ver una pantalla como esta:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-4843\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/audit-config-original-1024x616.png\" alt=\"\" width=\"900\" height=\"541\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-config-original-1024x616.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-config-original-300x181.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-config-original-768x462.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-config-original-1536x925.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-config-original-2048x1233.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-config-original-20x12.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-config-original-1320x795.png 1320w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Esta pesta\u00f1a le permite configurar la auditor\u00eda en general. La casilla de verificaci\u00f3n situada en la parte superior indica si debe realizarse alguna auditor\u00eda. \"Directorio de registro de destino\" muestra d\u00f3nde colocar los registros de auditor\u00eda. Los registros aparecen en un archivo llamado \"audit.log\" en el directorio de registro de destino. El siguiente conjunto de cuadros de texto controla la rotaci\u00f3n del registro por tama\u00f1o e intervalo de tiempo.<\/p>\n<p>A continuaci\u00f3n hay tres men\u00fas desplegables para distintos tipos de eventos, que le permiten controlar con precisi\u00f3n qu\u00e9 tipo de actividades deben registrarse. En general, audite s\u00f3lo lo que deba. El coste real de rendimiento de la auditor\u00eda depende de cu\u00e1nto se audite y del tipo de extractos que se auditen. Un diez por ciento de p\u00e9rdida de rendimiento debido a la auditor\u00eda es una estimaci\u00f3n razonable, pero deber\u00eda comprobar el efecto real antes de implantar un nuevo sistema.<\/p>\n<p>Por \u00faltimo, puede crear una lista blanca de usuarios en la casilla \"Ignorar eventos de estos usuarios\". Se trata de usuarios en los que se conf\u00eda tanto que no es necesario registrar sus acciones. Por ejemplo, puede tener un script automatizado que inserte nuevos datos. Usted conf\u00eda plenamente en este script. Crear un usuario en la lista blanca y hacer que el script utilice las credenciales de ese usuario puede ser \u00fatil para evitar generar demasiados registros de auditor\u00eda.<\/p>\n<p>Activa el desplegable \"Eventos N1QL\", para ver los tipos de eventos disponibles para N1QL.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-4844\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/audit-dropdown-screenshot-1024x555.png\" alt=\"\" width=\"900\" height=\"488\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-dropdown-screenshot-1024x555.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-dropdown-screenshot-300x163.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-dropdown-screenshot-768x416.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-dropdown-screenshot-1536x833.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-dropdown-screenshot-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-dropdown-screenshot-1320x715.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/audit-dropdown-screenshot.png 2048w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Existen dos tipos generales. El primero son los eventos correspondientes a los tipos de sentencia N1QL. Por ejemplo, puede elegir auditar todos los eventos INSERT, o todos los eventos DELETE. Por ejemplo, podr\u00eda ser razonable auditar todos los eventos que modifican datos (INSERT\/DELETE\/UPDATE\/UPSERT), pero ignorar las sentencias que s\u00f3lo recuperan datos (SELECT).<\/p>\n<p>En segundo lugar est\u00e1n los eventos correspondientes a las APIs expuestas por el motor de consulta. El motor de consulta N1QL pone a disposici\u00f3n una serie de APIs, normalmente para monitorizar el sistema. Cada uno de estos puntos finales API es un tipo de evento separado. Por ejemplo, hay uno para el endpoint \/admin\/stats, y otro para el endpoint \/admin\/ping. Usted tiene control separado sobre si auditar o no los accesos a estas APIs.<\/p>\n<h4>Consulta simple<\/h4>\n<p>Comenzaremos auditando una simple sentencia SELECT.<\/p>\n<p>Vaya a la p\u00e1gina \"Buckets\" de la consola de administraci\u00f3n y cree un bucket llamado \"test\" (sin comillas). La cuota de memoria de 100 MB est\u00e1 bien para nuestros prop\u00f3sitos. A continuaci\u00f3n, vaya a la consulta y crear un \u00edndice primario en el nuevo cubo, que nos permita ejecutar consultas N1QL en \u00e9l.<\/p>\n<p><code>crear \u00edndice primario en test<\/code><\/p>\n<p>Vuelve a la pantalla de configuraci\u00f3n de la auditor\u00eda y selecciona \"Auditar eventos y escribirlos en un registro\" en la parte superior, y la opci\u00f3n \"SELECT statement\" en \"Eventos N1QL\". A continuaci\u00f3n, pulse \"Guardar\" en la parte inferior de la pantalla.<\/p>\n<p>A continuaci\u00f3n, ejecute una consulta como \u00e9sta.<\/p>\n<p><code>curl https:\/\/localhost:8093\/query\/service -d \"statement=select * from test\" -u Administrador:contrase\u00f1a<\/code><\/p>\n<p>Y echemos un vistazo al registro de auditor\u00eda. El campo \"Target Log Directory\" de la pantalla de configuraci\u00f3n de la auditor\u00eda tiene el directorio donde se almacena el registro de auditor\u00eda. Utilizaremos el comando \"tail\" para mostrar los \u00faltimos registros del log de auditor\u00eda en este directorio. En sistemas Mac, este comando funciona:<\/p>\n<p><code>tail ~\/Library\/Application\\ Support\/Couchbase\/var\/lib\/couchbase\/logs\/audit.log<\/code><\/p>\n<p>Deber\u00eda ver varias l\u00edneas largas de texto JSON. Cada l\u00ednea es un registro de auditor\u00eda. La \u00faltima es el registro de la declaraci\u00f3n que enviamos. Reformateado, se ve as\u00ed:<\/p>\n<pre>{\r\n  \"timestamp\": \"2018-03-14T05:53:34.976-07:00\",\r\n  \"real_userid\": {\r\n    \"source\": \"local\",\r\n    \"user\": \"Administrator\"\r\n  },\r\n  \"requestId\": \"d0554df3-fd99-40f5-b911-b3e4f0faf050\",\r\n  \"statement\": \"select * from test\",\r\n  \"isAdHoc\": true,\r\n  \"userAgent\": \"curl\\\/7.43.0\",\r\n  \"node\": \"127.0.0.1:8091\",\r\n  \"status\": \"success\",\r\n  \"metrics\": {\r\n    \"elapsedTime\": \"822.147\\u00b5s\",\r\n    \"executionTime\": \"785.755\\u00b5s\",\r\n    \"resultCount\": 0,\r\n    \"resultSize\": 0\r\n  },\r\n  \"id\": 28672,\r\n  \"name\": \"SELECT statement\",\r\n  \"description\": \"A N1QL SELECT statement was executed\"\r\n}\r\n<\/pre>\n<p>Vayamos campo por campo:<\/p>\n<ul>\n<li>\"timestamp\" muestra la hora del nodo de consulta.<\/li>\n<li>\"real_userid\" muestra qu\u00e9 credencial de usuario se suministr\u00f3 con la solicitud. En este caso se trata del usuario \"Administrador\".<\/li>\n<li>\"requestId\" es el UUID que el motor de consultas genera para cada solicitud. Estos ID son \u00fanicos con una probabilidad muy alta.<\/li>\n<li>\"statement\" es la sentencia real que ejecutamos.<\/li>\n<li>\"isAdHoc\" es verdadero en este caso, mostrando que enviamos una sentencia real para su ejecuci\u00f3n, en lugar de ejecutar una sentencia preparada.<\/li>\n<li>\"userAgent\" es la cadena User-Agent de la petici\u00f3n original. Esto es \u00fatil para distinguir si la solicitud procede de un SDK, del int\u00e9rprete de comandos CBQ o del Query WorkBench.<\/li>\n<li>\"nodo\" es la direcci\u00f3n IP desde la que se recibi\u00f3 la solicitud.<\/li>\n<li>\"status\" muestra qu\u00e9 ha pasado con la solicitud. En este caso, ha tenido \u00e9xito.<\/li>\n<li>\"m\u00e9tricas\" es un conjunto de estad\u00edsticas sobre el resultado. Coincide con las m\u00e9tricas que se enviaron con el resultado de la solicitud original.<\/li>\n<li>\"id\" es el ID del tipo de evento. Los registros de auditor\u00eda de todas las consultas SELECT tienen el mismo id, 28672.<\/li>\n<li>\"nombre\" es el nombre corto del tipo de evento. Ser\u00e1 el mismo para todas las consultas SELECT.<\/li>\n<li>\"descripci\u00f3n\" es el nombre largo del tipo de evento. Esto tambi\u00e9n es igual para todas las consultas SELECT.<\/li>\n<\/ul>\n<p>Tenga en cuenta que el registro de auditor\u00eda s\u00f3lo proporciona un usuario, aunque el motor de consulta permite m\u00faltiples credenciales por solicitud. Esto es por dise\u00f1o. N1QL permit\u00eda m\u00faltiples credenciales para consultas cuando nuestras credenciales eran por contenedor, y m\u00faltiples credenciales eran por lo tanto necesarias para uniones de m\u00faltiples contenedores. Pero a partir de la versi\u00f3n 5.0, con RBAC, las credenciales m\u00faltiples ya no son necesarias. Las admitimos por compatibilidad con versiones anteriores, pero la forma correcta de gestionar estos casos es crear usuarios con credenciales para varios buckets y utilizar uno de esos usuarios para cada consulta. Si insiste en utilizar varias credenciales para una consulta auditada, la consulta se auditar\u00e1, pero habr\u00e1 un registro de auditor\u00eda distinto para cada credencial suministrada. Esto es un poco inc\u00f3modo, por lo que sugerimos encarecidamente actualizar el modelo de permisos para utilizar permisos RBAC en estos casos.<\/p>\n<h4>Preparar la declaraci\u00f3n<\/h4>\n<p>Consideremos ahora un caso m\u00e1s sofisticado, con una sentencia preparada. En primer lugar, vuelva a la pantalla de configuraci\u00f3n de la auditor\u00eda y active la auditor\u00eda de las sentencias SELECT y PREPARE. Recuerde pulsar \"Guardar\" en la parte inferior de la pantalla.<\/p>\n<p>Ahora, primero prepararemos una sentencia. Aqu\u00ed estamos preparando una sentencia SELECT, con el nombre \"ejemplo\". Observe que la sentencia tiene un par\u00e1metro sin nombre.<\/p>\n<p><code>curl https:\/\/localhost:8093\/query\/service -d \"statement=prepare example as select * from test where one=?\" -u Administrador:contrase\u00f1a<\/code><\/p>\n<p>A continuaci\u00f3n, ejecutaremos la sentencia, proporcionando un argumento para la sentencia. En este caso, la sentencia se ejecutar\u00e1, pero no devolver\u00e1 ning\u00fan resultado.<\/p>\n<p><code>curl https:\/\/localhost:8093\/query\/service -d 'prepared=\"ejemplo\"&amp;args=[\"bar\"]'<\/code><\/p>\n<p>Ahora echemos un vistazo de nuevo al registro de auditor\u00eda.<\/p>\n<p><code>tail ~\/Library\/Application\\ Support\/Couchbase\/var\/lib\/couchbase\/logs\/audit.log<\/code><\/p>\n<p>El registro mostrar\u00e1 dos eventos, uno para el PREPARE, y otro para el SELECT ejecutado desde la sentencia preparada:<\/p>\n<pre>{\r\n  \"timestamp\": \"2018-03-14T06:27:39.884-07:00\",\r\n  \"real_userid\": {\r\n    \"source\": \"local\",\r\n    \"user\": \"Administrator\"\r\n  },\r\n  \"requestId\": \"9f76b8c2-ed9f-42f8-bc5c-31fb3326a661\",\r\n  \"statement\": \"prepare example as select * from test where one=?\",\r\n  \"isAdHoc\": true,\r\n  \"userAgent\": \"curl\\\/7.43.0\",\r\n  \"node\": \"127.0.0.1:8091\",\r\n  \"status\": \"success\",\r\n  \"metrics\": {\r\n    \"elapsedTime\": \"6.591126ms\",\r\n    \"executionTime\": \"6.515079ms\",\r\n    \"resultCount\": 1,\r\n    \"resultSize\": 1279\r\n  },\r\n  \"id\": 28674,\r\n  \"name\": \"PREPARE statement\",\r\n  \"description\": \"A N1QL PREPARE statement was executed\"\r\n}\r\n{\r\n  \"timestamp\": \"2018-03-14T06:27:52.992-07:00\",\r\n  \"real_userid\": {\r\n    \"source\": \"internal\",\r\n    \"user\": \"unknown\"\r\n  },\r\n  \"requestId\": \"56c5278b-5842-45a9-8549-5c7f52f109a7\",\r\n  \"statement\": \"\",\r\n  \"positionalArgs\": [\r\n    \"\\\"bar\\\"\"\r\n  ],\r\n  \"isAdHoc\": false,\r\n  \"userAgent\": \"curl\\\/7.43.0\",\r\n  \"node\": \"127.0.0.1:8091\",\r\n  \"status\": \"success\",\r\n  \"metrics\": {\r\n    \"elapsedTime\": \"1.363373ms\",\r\n    \"executionTime\": \"1.334763ms\",\r\n    \"resultCount\": 0,\r\n    \"resultSize\": 0\r\n  },\r\n  \"id\": 28672,\r\n  \"name\": \"SELECT statement\",\r\n  \"description\": \"A N1QL SELECT statement was executed\"\r\n}\r\n<\/pre>\n<p>Los campos de los registros de auditor\u00eda son similares a los de la ejecuci\u00f3n anterior de una sentencia SELECT, pero cabe destacar dos campos:<\/p>\n<ul>\n<li>\"positionalArgs\" contiene el argumento suministrado con la consulta.<\/li>\n<li>\"isAdHoc\" es en este caso falso, porque el SELECT se ejecut\u00f3 desde una sentencia preparada que se envi\u00f3 anteriormente.<\/li>\n<\/ul>\n<h4>Solicitud API<\/h4>\n<p>A continuaci\u00f3n, vamos a intentar auditar una de las APIs del motor de consultas. Ve a la p\u00e1gina de configuraci\u00f3n de auditor\u00eda, y activa el tipo de evento \"\/admin\/ping API request\". No olvides guardar la configuraci\u00f3n al final de la p\u00e1gina.<\/p>\n<p>Ahora env\u00eda un ping:<\/p>\n<p><code>curl -v https:\/\/localhost:8093\/admin\/ping<\/code><\/p>\n<p>No esperes mucho, el \"{}\" de la parte inferior es todo el resultado:<\/p>\n<pre>*   Trying ::1...\r\n* Connected to localhost (::1) port 8093 (#0)\r\n&gt; GET \/admin\/ping HTTP\/1.1\r\n&gt; Host: localhost:8093\r\n&gt; User-Agent: curl\/7.43.0\r\n&gt; Accept: *\/*\r\n&gt; \r\n&lt; HTTP\/1.1 200 OK\r\n&lt; Date: Wed, 14 Mar 2018 13:54:24 GMT\r\n&lt; Content-Length: 2\r\n&lt; Content-Type: text\/plain; charset=utf-8\r\n&lt; \r\n* Connection #0 to host localhost left intact\r\n{}\r\n<\/pre>\n<p>A continuaci\u00f3n, echemos un vistazo al registro de auditor\u00eda (de nuevo, utilizando la ubicaci\u00f3n en Macs):<\/p>\n<p><code>tail ~\/Library\/Application\\ Support\/Couchbase\/var\/lib\/couchbase\/logs\/audit.log<\/code><\/p>\n<p>El mensaje de registro de auditor\u00eda resultante, formateado, tiene el siguiente aspecto:<\/p>\n<pre>{\r\n  \"timestamp\": \"2018-03-14T06:54:24.887-07:00\",\r\n  \"real_userid\": {\r\n    \"source\": \"internal\",\r\n    \"user\": \"unknown\"\r\n  },\r\n  \"httpMethod\": \"GET\",\r\n  \"httpResultCode\": 200,\r\n  \"errorMessage\": \"\",\r\n  \"id\": 28697,\r\n  \"name\": \"\/admin\/ping API request\",\r\n  \"description\": \"An HTTP request was made to the API at \/admin\/ping.\"\r\n}\r\n<\/pre>\n<p>Aqu\u00ed los campos \"timestamp\" y \"real_userid\" funcionan como antes, en el ejemplo SELECT. \"httpMethod\" es el tipo de petici\u00f3n HTTP. \"httpResultCode\" y \"errorMessage\" indican lo que ha ocurrido con la solicitud. \"Id\", \"name\" y \"description\" son espec\u00edficos del evento de auditor\u00eda; estos campos ser\u00e1n id\u00e9nticos para todos los registros de auditor\u00eda creados para eventos \/admin\/ping.<\/p>\n<h4>Filtrado hacia delante<\/h4>\n<p>(Este es un tema avanzado. No es necesario conocer el material de esta secci\u00f3n para utilizar la auditor\u00eda N1QL de forma efectiva. Pero una mirada bajo el cap\u00f3 puede ser de inter\u00e9s para los usuarios avanzados).<\/p>\n<p>La auditor\u00eda es controlada en cada servidor por un ejecutable llamado demonio de auditor\u00eda. El demonio de auditor\u00eda crea todos los registros en el log de auditor\u00eda. En 5.0, el demonio de auditor\u00eda era responsable de todo el filtrado de eventos; los clientes enviaban registros para todos los eventos auditables, y el demonio de auditor\u00eda creaba registros de auditor\u00eda en el registro, o no, dependiendo de la configuraci\u00f3n de filtrado. Desafortunadamente, esto ser\u00eda muy ineficiente cuando la auditor\u00eda est\u00e1 muy filtrada y los clientes est\u00e1n haciendo mucho trabajo potencialmente auditable. Un cliente como el motor de consultas podr\u00eda generar millones de registros s\u00f3lo para que el demonio de auditor\u00eda los desechara cuando llegaran.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4849\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/03\/cropped-audit-boxes.jpg\" alt=\"\" width=\"724\" height=\"526\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/cropped-audit-boxes.jpg 724w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/cropped-audit-boxes-300x218.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/cropped-audit-boxes-20x15.jpg 20w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><\/p>\n<p>Para aliviar este problema, en 5.5 Couchbase soporta el filtrado hacia adelante. El motor de consulta es consciente de la configuraci\u00f3n de auditor\u00eda actual, y env\u00eda s\u00f3lo los registros actualmente auditados al demonio de auditor\u00eda. Tambi\u00e9n env\u00eda un registro de auditor\u00eda especial para indicar que ha recibido la nueva configuraci\u00f3n y es consciente de ello.<\/p>\n<p>Este doble filtrado es la raz\u00f3n por la que puede ver dos tipos de registros de configuraci\u00f3n en el registro de auditor\u00eda. Un registro como este indica que el demonio de auditor\u00eda ha recibido una nueva configuraci\u00f3n:<\/p>\n<pre>{\"rotate_size\":20971520,\"log_path\":\"\/Users\/johanlarson\/Library\/Application Support\/Couchbase\/var\/lib\/couchbase\/logs\",\"rotate_interval\":86400,\r\n\"disabled_userids\":[],\"auditd_enabled\":true,\r\n\"disabled\":[20485,20488,20489,20490,20491,28673,28675,28676,28677,28678,28679,28680,28681,28682,\r\n 28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28697,28698,28699,\r\n28700,28701,28702,32770,32771,32772,32780],\r\n\"enabled:[20480,20482,20483,28672,28674,32768,32769,32773,32774,32775,32776,32777,32778,32779,32781,32782],\r\n\"real_userid\":{\"source\":\"ns_server\",\"user\":\"Administrator\"},\"sessionid\":\"8b3d16bffa8444ce596b64a78c0185f7\",\r\n\"remote\":{\"ip\":\"127.0.0.1\",\"port\":52153},\r\n\"timestamp\":\"2018-03-14T06:25:30.370-07:00\",\"id\":8240,\"name\":\"configured audit daemon\",\r\n\"description\":\"loaded configuration file for audit daemon\"}\r\n<\/pre>\n<p>Y un registro como \u00e9ste indica que el motor de consulta ha recibido una nueva configuraci\u00f3n:<\/p>\n<pre>{\"timestamp\":\"2018-03-14T06:25:30.427-07:00\",\r\n\"real_userid\":{\"source\":\"\",\"user\":\"\"},\"uuid\":\"26571424\",\"id\":28703,\r\n\"name\":\"N1QL configuration\",\"description\":\"States that N1QL is using audit configuration with specified uuid\"}\r\n<\/pre>\n<p>Observe el UUID que identifica la configuraci\u00f3n. Puede obtener este UUID de la configuraci\u00f3n, as\u00ed:<\/p>\n<p><code>curl https:\/\/localhost:8091\/pools\/default -u Administrador:contrase\u00f1a<\/code><\/p>\n<p>Busque el campo \"auditUid\".<\/p>\n<p>Puede obtener la configuraci\u00f3n de auditor\u00eda completa as\u00ed:<\/p>\n<p><code>curl https:\/\/localhost:8091\/settings\/audit -u Administrador:contrase\u00f1a<\/code><\/p>\n<pre>{\"disabled\":[20485,20488,20489,20490,20491,28673,28675,28676,28677,28678,\r\n28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,\r\n28690,28691,28692,28693,28694,28695,28698,28699,28700,28701,28702,\r\n32770,32771,32772,32780],\r\n\"uid\":\"18635804\",\"auditdEnabled\":true,\"disabledUsers\":[],\r\n\"logPath\":\"\/Users\/johanlarson\/Library\/Application Support\/Couchbase\/var\/lib\/couchbase\/logs\",\r\n\"rotateInterval\":86400,\"rotateSize\":20971520}\r\n<\/pre>\n<h4>Carga del registro de auditor\u00eda<\/h4>\n<p>Couchbase Server actualmente s\u00f3lo soporta un destino para los registros de auditor\u00eda: un archivo en el servidor. Pero a veces ser\u00eda \u00fatil obtener los registros de auditor\u00eda en la propia base de datos. Esto no es dif\u00edcil, ya que los registros de auditor\u00eda son JSON. Pero cargar el registro requiere el uso de una utilidad, cbimport.<\/p>\n<p>Suponiendo que tiene el registro de auditor\u00eda creado en la ubicaci\u00f3n est\u00e1ndar en un Mac, y que ha creado el cubo \"test\", este encantamiento carga el archivo audit.log en el cubo \"test\":<\/p>\n<p><code>\/Applications\/Couchbase\\ Server.app\/Contents\/Resources\/couchbase-core\/bin\/cbimport json -c https:\/\/localhost:8091 -u Administrator -p password -b test -g \"#UUID#\" -d file:\/\/\/Users\/johanlarson\/Library\/Application\\ Support\/Couchbase\/var\/lib\/couchbase\/logs\/audit.log -f lines<\/code><\/p>\n<p>Eso es bastante para tomarlo, y necesitar\u00edas variaciones ligeramente diferentes en otros sistemas, as\u00ed que vamos a ir paso a paso.<\/p>\n<ul>\n<li><strong>\/Applications\/Couchbase\\ Server.app\/Contents\/Resources\/couchbase-core\/bin\/cbimport<\/strong> es la ruta completa al comando cbimport en un Mac. Para otros sistemas, las utilidades se encuentran en otro lugar. V\u00e9ase <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.1\/cli\/cli-intro.html\">este documento<\/a>.<\/li>\n<li><strong>-c https:\/\/localhost:8091<\/strong> es la URL del servidor donde se ejecuta Couchbase<\/li>\n<li><strong>-u Administrador -p contrase\u00f1a<\/strong> es el nombre de usuario y la contrase\u00f1a del usuario con el que estamos cargando los datos (en este caso el administrador por defecto.)<\/li>\n<li><strong>-b prueba<\/strong> es el nombre del cubo en el que estamos cargando los datos.<\/li>\n<li><strong>-g \"#UUID#\"<\/strong> es el tipo de clave a generar para cada documento introducido en el bucket. En este caso, estamos utilizando un UUID, pero hay muchas otras opciones. Compruebe la <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/tools\/cbimport.html\">cbimport<\/a> para m\u00e1s informaci\u00f3n.<\/li>\n<li><strong>-d file:\/\/\/Users\/johanlarson\/Library\/Application\\ Support\/Couchbase\/var\/lib\/couchbase\/logs\/audit.log<\/strong> es una URL de archivo que apunta a la ubicaci\u00f3n del registro de auditor\u00eda. Tenga en cuenta las tres barras diagonales y la barra invertida para permitir un espacio en la ruta URL. Los registros, incluido el registro de auditor\u00eda, se colocan en directorios est\u00e1ndar que var\u00edan de un sistema a otro. V\u00e9ase <a href=\"https:\/\/docs.couchbase.com\/server\/current\/manage\/manage-logging\/manage-logging.html\">este documento<\/a> para m\u00e1s informaci\u00f3n.<\/li>\n<\/ul>\n<p>Una vez que los registros de auditor\u00eda est\u00e1n en el sistema, puede consultarlos como cualquier otro dato.Vaya al Query WorkBench para probarlo.<\/p>\n<p>Esta consulta muestra cu\u00e1ntos registros de auditor\u00eda tiene:<\/p>\n<p><code>select count(*) as num from test<\/code><\/p>\n<p>Y esta consulta desglosa el recuento por tipo de registro de auditor\u00eda:<\/p>\n<p><code>select nombre, count(*) as num from prueba group by nombre<\/code><\/p>\n<h4>Resumen<\/h4>\n<ul>\n<li>Las solicitudes al motor de consulta son auditables a partir de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/announcing-couchbase-server-5-5\/\">Servidor Couchbase 5.5<\/a> EE.<\/li>\n<li>En general, la auditor\u00eda admite el filtrado por tipo de evento y la creaci\u00f3n de listas blancas de usuarios.<\/li>\n<li>Las solicitudes se marcan como eventos seg\u00fan el tipo de consulta y el punto final de la API.<\/li>\n<li>Existe documentaci\u00f3n adicional sobre la auditor\u00eda de las sentencias N1QL <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/security\/n1ql-auditing.html\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>.<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">Descargar Couchbase Server 5.5<\/a> aqu\u00ed.<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Couchbase Server 5.5 includes the ability to keep a record of all N1QL actions taken by users. This is part of Couchbase&#8217;s more general audit functionality, introduced in 5.0. Auditing is only available in Enterprise edition. Auditing lets the administrators [&hellip;]<\/p>","protected":false},"author":8157,"featured_media":4846,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1812],"tags":[2258,2180,2182],"ppma_author":[9058],"class_list":["post-4841","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-n1ql-query","tag-5-5","tag-auditing","tag-devbuild"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Auditing Couchbase N1QL Statements - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Couchbase Server now supports auditing of N1QL statements and API accesses. This article shows how, including hands-on exercises.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/auditing-couchbase-n1ql-statements\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Auditing Couchbase N1QL Statements\" \/>\n<meta property=\"og:description\" content=\"Couchbase Server now supports auditing of N1QL statements and API accesses. This article shows how, including hands-on exercises.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/auditing-couchbase-n1ql-statements\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-19T15:41:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:22:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"804\" \/>\n\t<meta property=\"og:image:height\" content=\"603\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Johan Larson\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Johan Larson\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/\"},\"author\":{\"name\":\"Johan Larson\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/043ccbbfc54b95927c73f81ec7f6a0a1\"},\"headline\":\"Auditing Couchbase N1QL Statements\",\"datePublished\":\"2018-03-19T15:41:48+00:00\",\"dateModified\":\"2025-06-14T00:22:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/\"},\"wordCount\":2055,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg\",\"keywords\":[\"5.5\",\"auditing\",\"devbuild\"],\"articleSection\":[\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/\",\"name\":\"Auditing Couchbase N1QL Statements - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg\",\"datePublished\":\"2018-03-19T15:41:48+00:00\",\"dateModified\":\"2025-06-14T00:22:38+00:00\",\"description\":\"Couchbase Server now supports auditing of N1QL statements and API accesses. This article shows how, including hands-on exercises.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg\",\"width\":804,\"height\":603},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Auditing Couchbase N1QL Statements\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/043ccbbfc54b95927c73f81ec7f6a0a1\",\"name\":\"Johan Larson\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/93b175bb8728e12439dd573fc27b9d1a\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2ddf616344da1f84e85c42ba2bfc102e28380128c107cc21eeecc26edc737227?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2ddf616344da1f84e85c42ba2bfc102e28380128c107cc21eeecc26edc737227?s=96&d=mm&r=g\",\"caption\":\"Johan Larson\"},\"description\":\"Johan Larson is a Senior Software Engineer at Couchbase. Johan's work responsibility is building an SQL-based query language for JSON data in a distributed NoSQL system.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/johan-larson\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Auditing Couchbase N1QL Statements - The Couchbase Blog","description":"Couchbase Server now supports auditing of N1QL statements and API accesses. This article shows how, including hands-on exercises.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/auditing-couchbase-n1ql-statements\/","og_locale":"es_MX","og_type":"article","og_title":"Auditing Couchbase N1QL Statements","og_description":"Couchbase Server now supports auditing of N1QL statements and API accesses. This article shows how, including hands-on exercises.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/auditing-couchbase-n1ql-statements\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-03-19T15:41:48+00:00","article_modified_time":"2025-06-14T00:22:38+00:00","og_image":[{"width":804,"height":603,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg","type":"image\/jpeg"}],"author":"Johan Larson","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Johan Larson","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/"},"author":{"name":"Johan Larson","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/043ccbbfc54b95927c73f81ec7f6a0a1"},"headline":"Auditing Couchbase N1QL Statements","datePublished":"2018-03-19T15:41:48+00:00","dateModified":"2025-06-14T00:22:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/"},"wordCount":2055,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg","keywords":["5.5","auditing","devbuild"],"articleSection":["Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/","url":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/","name":"Auditing Couchbase N1QL Statements - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg","datePublished":"2018-03-19T15:41:48+00:00","dateModified":"2025-06-14T00:22:38+00:00","description":"Couchbase Server now supports auditing of N1QL statements and API accesses. This article shows how, including hands-on exercises.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/03\/0215-surveillance-jpg.jpg","width":804,"height":603},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/auditing-couchbase-n1ql-statements\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Auditing Couchbase N1QL Statements"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/043ccbbfc54b95927c73f81ec7f6a0a1","name":"Johan Larson","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/93b175bb8728e12439dd573fc27b9d1a","url":"https:\/\/secure.gravatar.com\/avatar\/2ddf616344da1f84e85c42ba2bfc102e28380128c107cc21eeecc26edc737227?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2ddf616344da1f84e85c42ba2bfc102e28380128c107cc21eeecc26edc737227?s=96&d=mm&r=g","caption":"Johan Larson"},"description":"Johan Larson es Ingeniero de Software Senior en Couchbase. La responsabilidad del trabajo de Johan es construir un lenguaje de consulta basado en SQL para datos JSON en un sistema NoSQL distribuido.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/johan-larson\/"}]}},"authors":[{"term_id":9058,"user_id":8157,"is_guest":0,"slug":"johan-larson","display_name":"Johan Larson","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/2ddf616344da1f84e85c42ba2bfc102e28380128c107cc21eeecc26edc737227?s=96&d=mm&r=g","first_name":"Johan","last_name":"Larson","user_url":"","author_category":"","description":"Johan Larson es Ingeniero de Software Senior en Couchbase. La responsabilidad del trabajo de Johan es construir un lenguaje de consulta basado en SQL para datos JSON en un sistema NoSQL distribuido."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/8157"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4841"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/4846"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4841"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}