{"id":4136,"date":"2017-10-23T11:39:31","date_gmt":"2017-10-23T18:39:31","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4136"},"modified":"2025-06-13T23:43:19","modified_gmt":"2025-06-14T06:43:19","slug":"using-role-based-access-control-in-n1ql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/using-role-based-access-control-in-n1ql\/","title":{"rendered":"Uso do controle de acesso baseado em fun\u00e7\u00e3o no N1QL"},"content":{"rendered":"<p>No Couchbase 4.5, os dados eram protegidos bucket por bucket. Cada bucket tinha uma senha e, para acessar um bucket por meio de uma consulta N1QL, o usu\u00e1rio precisava incluir a senha do bucket na consulta. Os buckets sem senha eram poss\u00edveis, mas n\u00e3o eram recomendados para uso em produ\u00e7\u00e3o.<\/p>\n<p>Esse esquema oferecia prote\u00e7\u00e3o b\u00e1sica, mas era muito grosseiro: um usu\u00e1rio podia fazer tudo com um compartimento ou nada. Al\u00e9m disso, as consultas que acessavam muitos compartimentos exigiam a inser\u00e7\u00e3o de uma senha para cada compartimento, o que era inconveniente, principalmente se as senhas fossem alteradas.<\/p>\n<p>Para permitir que nossos usu\u00e1rios evitem esses problemas, introduzimos o controle de acesso baseado em fun\u00e7\u00e3o (RBAC) no Couchbase Server 5.0. O acesso aos dados agora \u00e9 controlado por meio de fun\u00e7\u00f5es refinadas em buckets, e cada usu\u00e1rio pode receber fun\u00e7\u00f5es que se ajustam ao que ele realmente deve fazer no banco de dados.<\/p>\n<p>Neste artigo, apresentarei a voc\u00ea as principais funcionalidades oferecidas pelo RBAC no Couchbase Server 5.0. Exerc\u00edcios pr\u00e1ticos permitir\u00e3o que voc\u00ea experimente os novos recursos por conta pr\u00f3pria.<\/p>\n<h2>Configura\u00e7\u00e3o<\/h2>\n<p>Para os exerc\u00edcios pr\u00e1ticos, voc\u00ea precisar\u00e1 instalar o Couchbase Server 5.0, Enterprise Edition. Durante a instala\u00e7\u00e3o, configure-o para ter um administrador chamado \"Administrator\" com a senha \"password\". Obviamente, essa n\u00e3o \u00e9 uma pr\u00e1tica recomendada em um ambiente de produ\u00e7\u00e3o.<\/p>\n<p>Fa\u00e7a login no console de administra\u00e7\u00e3o (em https:\/\/localhost:8091) e v\u00e1 para a tela Buckets. Crie dois buckets, \"testbucket1\" e \"testbucket2\", cada um com uma cota de mem\u00f3ria de 100 MB para evitar o esgotamento da mem\u00f3ria.<\/p>\n<p>Em seguida, v\u00e1 para a tela Query (Consulta) e crie \u00edndices prim\u00e1rios nos dois buckets que acabou de criar. Os \u00edndices prim\u00e1rios permitem que voc\u00ea execute consultas nos buckets.<\/p>\n<pre class=\"\">CREATE PRIMARY INDEX ON testbucket1\r\nCREATE PRIMARY INDEX ON testbucket2<\/pre>\n<p>Voc\u00ea pode acessar a tela \u00cdndices para verificar se os \u00edndices foram realmente criados. Ambos ter\u00e3o o nome \"#primary\".<\/p>\n<h2>Principais fun\u00e7\u00f5es<\/h2>\n<p><span style=\"font-weight: 400\">H\u00e1 quatro fun\u00e7\u00f5es principais que controlam quem pode executar quais consultas N1QL. As fun\u00e7\u00f5es query_select, query_insert, query_update e query_delete permitem que voc\u00ea execute consultas N1QL do tipo correspondente. H\u00e1 tamb\u00e9m tr\u00eas fun\u00e7\u00f5es mais especializadas (query_manage_index, query_system_catalog e query_external_access) que ser\u00e3o abordadas na pr\u00f3xima se\u00e7\u00e3o, Fun\u00e7\u00f5es adicionais importantes.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Mas h\u00e1 mais do que isso. Essas fun\u00e7\u00f5es s\u00e3o parametrizadas pelo bucket ao qual se aplicam. Um usu\u00e1rio n\u00e3o pode ter apenas a fun\u00e7\u00e3o query_select; precisamos saber em qual bucket a fun\u00e7\u00e3o est\u00e1, como query_select[testbucket1], que permite que o usu\u00e1rio execute uma consulta SELECT no testbucket1. Tamb\u00e9m \u00e9 poss\u00edvel ter essa fun\u00e7\u00e3o em todos os buckets, indicado por query_select[*].<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para tentar fazer isso, acesse o console do Couchbase e, na tela Seguran\u00e7a, crie um novo usu\u00e1rio user1 com a senha \"password\" e a fun\u00e7\u00e3o query_select[testbucket1].<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4137\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/new-user-0-260x300.png\" alt=\"\" width=\"260\" height=\"300\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/new-user-0-260x300.png 260w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/new-user-0-300x346.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/new-user-0-17x20.png 17w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/new-user-0.png 538w\" sizes=\"auto, (max-width: 260px) 100vw, 260px\" \/><\/p>\n<p>A fun\u00e7\u00e3o pode ser encontrada em \"Query Roles\" (Fun\u00e7\u00f5es de consulta) no menu de cria\u00e7\u00e3o de usu\u00e1rios.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4138\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/new-user-1-262x300.png\" alt=\"\" width=\"262\" height=\"300\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/new-user-1-262x300.png 262w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/new-user-1-300x344.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/new-user-1-17x20.png 17w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/new-user-1.png 524w\" sizes=\"auto, (max-width: 262px) 100vw, 262px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Em seguida, fa\u00e7a o mesmo para \"user2\", mas d\u00ea a esse usu\u00e1rio query_select[testbucket2].<\/span><\/p>\n<p><span style=\"font-weight: 400\">Agora vamos tentar executar uma consulta nesses buckets usando as fun\u00e7\u00f5es. Usarei a ferramenta de shell CBQ que vem com o Couchbase.<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ -s \"select * from testbucket1\"<\/pre>\n<p><span style=\"font-weight: 400\">Isso nos leva a essa resposta:<\/span><\/p>\n<pre class=\"\">{\r\n\"requestID\": \"d838da35-24a3-415e-b9e1-69ac02a9820b\",\r\n\"signature\": {\"*\":\"*\"},\r\n\"results\": [\r\n],\r\n\"errors\": [{\"code\":13014,\"msg\":\"User does not have credentials to run SELECT queries on the testbucket1 bucket. Add role query_select on testbucket1 to allow the query to run.\"}],\r\n\"status\": \"stopped\",\r\n\"metrics\": {\"elapsedTime\": \"4.214692ms\",\"executionTime\": \"4.190101ms\",\"resultCount\": 0,\"resultSize\": 0,\"errorCount\": 1}\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Observe que o erro nos diz claramente qual \u00e9 a fun\u00e7\u00e3o que est\u00e1 faltando. Vamos tentar novamente com o usu\u00e1rio1, que tem a fun\u00e7\u00e3o correta:<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ -s \"select * from testbucket1\" -u user1 -p password<\/pre>\n<p><span style=\"font-weight: 400\">Isso funcionou:<\/span><\/p>\n<pre class=\"\">{\r\n\"requestID\": \"caeba7de-d9eb-4e2f-8f67-d6e795fb1dbd\",\r\n\"signature\": {\"*\":\"*\"},\r\n\"results\": [\r\n],\r\n\"status\": \"success\",\r\n\"metrics\": {\"elapsedTime\": \"11.501861ms\",\"executionTime\": \"11.471201ms\",\"resultCount\": 0,\"resultSize\": 0}\r\n}<\/pre>\n<p>Tente voc\u00ea mesmo fazer a consulta com o usu\u00e1rio2, que tem a fun\u00e7\u00e3o correta, mas no bucket errado. A solicita\u00e7\u00e3o falhar\u00e1.<\/p>\n<p>Agora, vamos tentar uma consulta mais complexa que toque em dois compartimentos. Comece executando esta consulta:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ \r\n    -s \"INSERT INTO testbucket2 (KEY source.c_id, VALUE source.customer) \r\n        SELECT * FROM testbucket1 source WHERE source.new = true\"<\/pre>\n<p>O sistema nos informa que precisa da fun\u00e7\u00e3o query_insert[testbucket2]:<\/p>\n<pre class=\"\">\"errors\": [{\"code\":13014,\"msg\":\"User does not have credentials to run INSERT queries \r\n     on the testbucket2 bucket. Add role query_insert on testbucket2 to allow the query to run.\"}],<\/pre>\n<p>Crie um novo usu\u00e1rio \"user3\" com a fun\u00e7\u00e3o necess\u00e1ria e tente novamente:<\/p>\n<pre class=\"\">\"errors\": [{\"code\":13014,\"msg\":\"User does not have credentials to run SELECT queries \r\n     on the testbucket1 bucket. Add role query_select on testbucket1 to allow the query to run.\"}],<\/pre>\n<p>Ainda estamos recebendo um erro, mas \u00e9 um erro diferente do anterior. A consulta que estamos tentando executar tem duas partes: ela seleciona no testbucket1 e insere no testbucket2. Fornecemos credenciais suficientes para a inser\u00e7\u00e3o, mas n\u00e3o para a sele\u00e7\u00e3o. V\u00e1 para o console, adicione query_select[testbucket2] ao user3 e tente novamente. Dessa vez, a consulta funciona.<\/p>\n<pre class=\"\">{\r\n\"requestID\": \"3c313c29-8b67-4e63-92b0-763586345f59\",\r\n\"signature\": null,\r\n\"results\": [\r\n],\r\n\"status\": \"success\",\r\n\"metrics\": {\"elapsedTime\": \"11.451689ms\",\"executionTime\": \"11.415157ms\",\"resultCount\": 0,\"resultSize\": 0}\r\n}<\/pre>\n<p>Vamos tentar mais uma vez. Adicione uma cl\u00e1usula RETURNING \u00e0 consulta e tente execut\u00e1-la:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"INSERT INTO testbucket2 (KEY source.c_id, VALUE source.customer)\r\n       SELECT * FROM testbucket1 source WHERE source.new = true RETURNING meta().id id\" \r\n    -u user3 -p password<\/pre>\n<p>Isso falha:<\/p>\n<pre class=\"\">\"errors\": [{\"code\":13014,\"msg\":\"User does not have credentials to run SELECT queries \r\n     on the testbucket2 bucket. Add role query_select on testbucket2 to allow the query to run.\"}],<\/pre>\n<p>O que est\u00e1 acontecendo aqui \u00e9 que a cl\u00e1usula RETURNING est\u00e1 sendo tratada como um SELECT no bucket em que inserimos (testbucket2), ocorrendo logo ap\u00f3s a inser\u00e7\u00e3o. O usu\u00e1rio n\u00e3o tem a fun\u00e7\u00e3o query_select[testbucket2] e, portanto, est\u00e1 sendo recusado.<\/p>\n<p>Adicione a fun\u00e7\u00e3o query_select[testbucket2] ao user3 e execute novamente a consulta. Agora ela funcionar\u00e1.<\/p>\n<h2>Fun\u00e7\u00f5es adicionais importantes<\/h2>\n<p>H\u00e1 mais tr\u00eas fun\u00e7\u00f5es que voc\u00ea deve conhecer ao trabalhar com o N1QL.<\/p>\n<p><strong>gerenciar \u00edndice de consulta<\/strong><br \/>\nPrimeiro, vamos tentar criar um \u00edndice:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"CREATE INDEX test_idx ON testbucket1(price)\"<\/pre>\n<p>Isso gera um erro:<\/p>\n<pre class=\"\">\"errors\": [{\"code\":13014,\"msg\":\"User does not have credentials to run index operations. \r\n     Add role query_manage_index on testbucket1 to allow the query to run.\"}],\r\n\"status\": \"stopped\",<\/pre>\n<p>A fun\u00e7\u00e3o Query Manage Index (Gerenciar \u00edndice de consulta) em um bucket \u00e9 necess\u00e1ria para criar, excluir ou construir \u00edndices nesse bucket.<\/p>\n<p>Crie um novo usu\u00e1rio \"user4\" com a fun\u00e7\u00e3o query_manage_index[testbucket1]. Experimente o <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/createindex.html\">cria\u00e7\u00e3o de \u00edndices<\/a> novamente. A consulta agora funcionar\u00e1.<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"CREATE INDEX test_idx ON testbucket1(price)\" \r\n    -u user4 -p password<\/pre>\n<p><strong>cat\u00e1logo_do_sistema de consulta<\/strong><br \/>\nNas vers\u00f5es anteriores do Couchbase, as tabelas do sistema eram totalmente acess\u00edveis a qualquer pessoa. Agora, elas s\u00e3o mais restritas de v\u00e1rias maneiras que ser\u00e3o descritas posteriormente neste documento, mas h\u00e1 uma fun\u00e7\u00e3o \u00fatil, query_system_catalog, que permite o acesso \u00e0s tabelas do sistema. Isso \u00e9 particularmente \u00fatil para a equipe que precisa depurar problemas com consultas ou com o sistema, mas n\u00e3o deve receber privil\u00e9gios totais de administrador.<\/p>\n<p>Se consultarmos system:keyspaces como administrador, veremos os dois compartimentos que criamos no sistema:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"SELECT * FROM system:keyspaces\" -u Administrator -p password<\/pre>\n<pre class=\"\">{\r\n\"requestID\": \"46ee066e-25f6-4bef-a70a-553f4c224c39\",\r\n\"signature\": {\"*\":\"*\"},\r\n\"results\": [\r\n{\"keyspaces\":{\"datastore_id\":\"https:\/\/127.0.0.1:8091\",\"id\":\"testbucket2\",\"name\":\"testbucket2\",\"namespace_id\":\"default\"}},\r\n{\"keyspaces\":{\"datastore_id\":\"https:\/\/127.0.0.1:8091\",\"id\":\"testbucket1\",\"name\":\"testbucket1\",\"namespace_id\":\"default\"}}\r\n],\r\n\"status\": \"success\",\r\n\"metrics\": {\"elapsedTime\": \"16.562026ms\",\"executionTime\": \"16.52656ms\",\"resultCount\": 2,\"resultSize\": 238}\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">Mas se executarmos a mesma consulta sem credenciais, os resultados ser\u00e3o filtrados:<\/span><\/p>\n<pre class=\"\">{\r\n\"requestID\": \"932e6b73-3058-4877-8da1-1715b16e53f5\",\r\n\"signature\": {\"*\":\"*\"},\r\n\"results\": [\r\n],\r\n\"warnings\": [{\"code\":11011,\"msg\":\"One or more documents were excluded from the system:keyspaces bucket because of insufficient user permissions.\"}],\r\n\"status\": \"success\",\r\n\"metrics\": {\"elapsedTime\": \"20.563024ms\",\"executionTime\": \"20.532213ms\",\"resultCount\": 0,\"resultSize\": 0,\"warningCount\": 1}\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">Crie um novo usu\u00e1rio \"user5\" com a fun\u00e7\u00e3o query_system_catalog e execute novamente a consulta. Voc\u00ea ver\u00e1 os mesmos resultados de quando executamos a consulta como Administrador.<\/span><\/p>\n<p><strong>Acesso externo \u00e0 consulta<\/strong><\/p>\n<p><span style=\"font-weight: 400\">A nova fun\u00e7\u00e3o CURL() possibilita a consulta de servi\u00e7os REST a partir do N1QL. Para usar a fun\u00e7\u00e3o, precisamos fazer algumas configura\u00e7\u00f5es e executar a consulta usando a nova fun\u00e7\u00e3o query_external_access. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Vamos tentar a consulta primeiro:<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/query\/service \r\n    -s 'SELECT CURL(\"https:\/\/maps.googleapis.com\/maps\/api\/geocode\/json\", \r\n        {\"data\":\"address=Half+Moon+Bay\", \"get\":true}) GEO'<\/pre>\n<p><span style=\"font-weight: 400\">A consulta \u00e9 recusada porque as permiss\u00f5es apropriadas n\u00e3o foram fornecidas:<\/span><\/p>\n<pre>\"errors\": [{\"code\":13014,\"msg\":\"User does not have credentials to run queries using \r\n     the CURL() function. Add role query_external_access to allow the query to run.\"}]<\/pre>\n<p><span style=\"font-weight: 400\">Crie um usu\u00e1rio \"user6\" com a fun\u00e7\u00e3o query_external_access e execute novamente a consulta usando esse usu\u00e1rio. Desta vez, a consulta se recusa a ser executada porque n\u00e3o ativamos o CURL(); por motivos de seguran\u00e7a, ele \u00e9 desativado por padr\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Crie um arquivo \"curl_whitelist.json\" com o seguinte conte\u00fado:<\/span><\/p>\n<pre>{\"all_access\":true}<\/pre>\n<p><span style=\"font-weight: 400\">Coloque-o no diret\u00f3rio do couchbase. Em um Mac, o local exato \u00e9 \"\/Applications\/Couchbase Server.app\/Contents\/Resources\/couchbase-core\/var\/lib\/couchbase\/n1qlcerts\/curl_whitelist.json\". Em outros sistemas, o local \u00e9 <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/admin\/Misc\/install-location.html\"><span style=\"font-weight: 400\">ligeiramente diferente<\/span><\/a><span style=\"font-weight: 400\">. Tente a consulta novamente, que deve ser executada corretamente, baixando dados como este:<\/span><\/p>\n<pre class=\"\">\"address_components\" : [\r\n {\r\n \"long_name\" : \"Half Moon Bay\",\r\n \"short_name\" : \"Half Moon Bay\",\r\n \"types\" : [ \"locality\", \"political\" ]\r\n },\r\n {\r\n \"long_name\" : \"San Mateo County\",\r\n \"short_name\" : \"San Mateo County\",\r\n \"types\" : [ \"administrative_area_level_2\", \"political\" ]\r\n },\r\n {\r\n \"long_name\" : \"California\",\r\n \"short_name\" : \"CA\",\r\n \"types\" : [ \"administrative_area_level_1\", \"political\" ]\r\n },\r\n {\r\n \"long_name\" : \"United States\",\r\n \"short_name\" : \"US\",\r\n \"types\" : [ \"country\", \"political\" ]\r\n }<\/pre>\n<p>A lista completa das fun\u00e7\u00f5es N1QL \u00e9 a seguinte:<\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Fun\u00e7\u00e3o<\/b><\/td>\n<td><b>Permiss\u00f5es<\/b><\/td>\n<td><b>Sintaxe GRANT<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">Sele\u00e7\u00e3o de consulta<\/span><\/td>\n<td><span style=\"font-weight: 400\">Declara\u00e7\u00f5es SELECT<\/span><\/td>\n<td><span style=\"font-weight: 400\">GRANT select ON testbucket TO myuser<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">Inser\u00e7\u00e3o de consulta<\/span><\/td>\n<td><span style=\"font-weight: 400\">Declara\u00e7\u00f5es INSERT<\/span><\/td>\n<td><span style=\"font-weight: 400\">GRANT insert ON testbucket TO myuser<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">Atualiza\u00e7\u00e3o da consulta<\/span><\/td>\n<td><span style=\"font-weight: 400\">Declara\u00e7\u00f5es de atualiza\u00e7\u00e3o<\/span><\/td>\n<td><span style=\"font-weight: 400\">GRANT update ON testbucket TO myuser<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">Consulta Excluir<\/span><\/td>\n<td><span style=\"font-weight: 400\">Declara\u00e7\u00f5es DELETE<\/span><\/td>\n<td><span style=\"font-weight: 400\">GRANT delete ON testbucket to myuser<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">Consultar o cat\u00e1logo do sistema<\/span><\/td>\n<td><span style=\"font-weight: 400\">Acesso aos espa\u00e7os de chave do sistema<\/span><\/td>\n<td><span style=\"font-weight: 400\">GRANT query_system_catalog TO myuser<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">Consulta Gerenciar \u00edndice<\/span><\/td>\n<td><span style=\"font-weight: 400\">Opera\u00e7\u00f5es de \u00edndice<\/span><\/td>\n<td><span style=\"font-weight: 400\">GRANT query_manage_index ON testbucket TO myuser<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">Consulta de acesso externo<\/span><\/td>\n<td><span style=\"font-weight: 400\">Fun\u00e7\u00e3o CURL()<\/span><\/td>\n<td><span style=\"font-weight: 400\">GRANT query_external_access TO myuser<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>EXPLICAR e PREPARAR<\/h2>\n<p>\u00c9 claro que podemos fazer outras coisas com as consultas al\u00e9m de apenas execut\u00e1-las. Podemos usar o EXPLAIN para entender como o mecanismo de consulta calcula uma consulta. E podemos usar o PREPARE para configurar uma consulta para execu\u00e7\u00e3o repetida.<\/p>\n<p>No Couchbase 5.0, as permiss\u00f5es para EXPLAIN e PREPARE s\u00e3o simples. Elas s\u00e3o as mesmas que as permiss\u00f5es necess\u00e1rias para a declara\u00e7\u00e3o subjacente. Isso \u00e9 tudo o que h\u00e1 para fazer.<\/p>\n<p>Para testar isso, vamos tentar EXPLORAR uma instru\u00e7\u00e3o SELECT simples, a mesma que usamos na se\u00e7\u00e3o anterior \"Fun\u00e7\u00f5es prim\u00e1rias\":<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"explain select * from testbucket1\"<\/pre>\n<p>Em resposta, recebemos uma mensagem de erro solicitando uma fun\u00e7\u00e3o espec\u00edfica:<\/p>\n<pre>\"errors\": [{\"code\":13014,\"msg\":\"User does not have credentials to run SELECT queries \r\n    on the testbucket1 bucket. Add role query_select on testbucket1 to allow the query to run.\"}],<\/pre>\n<p><span style=\"font-weight: 400\">Vamos fornecer um usu\u00e1rio com essa fun\u00e7\u00e3o:<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ -s \"explain select * from testbucket1\" -u user1 -p password<\/pre>\n<p><span style=\"font-weight: 400\">Sucesso, assim como vimos para a pr\u00f3pria declara\u00e7\u00e3o em \"Fun\u00e7\u00f5es prim\u00e1rias\".<\/span><\/p>\n<p><span style=\"font-weight: 400\">Agora vamos tentar PREPARAR a segunda declara\u00e7\u00e3o de \"Primary Roles\":<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ \r\n    -s \"PREPARE INSERT INTO testbucket2 (KEY source.c_id, VALUE source.customer) \r\n        SELECT * FROM testbucket1 source WHERE source.new = true\"<\/pre>\n<p><span style=\"font-weight: 400\">Recebemos a mesma mensagem de erro que recebemos originalmente para a declara\u00e7\u00e3o em si:<\/span><\/p>\n<pre>\"errors\": [{\"code\":13014,\"msg\":\"User does not have credentials to run INSERT queries on the \r\n     testbucket2 bucket. Add role query_insert on testbucket2 to allow the query to run.\"}],<\/pre>\n<p><span style=\"font-weight: 400\">E se adicionarmos um usu\u00e1rio com credenciais para SELECT e INSERT, o PREPARE ser\u00e1 bem-sucedido:<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ \r\n    -s \"PREPARE INSERT INTO testbucket2 (KEY source.c_id, VALUE source.customer) \r\n        SELECT * FROM testbucket1 source WHERE source.new = true\" \r\n    -u user3 \r\n    -p password<\/pre>\n<h2>CONCESS\u00c3O e REVOGA\u00c7\u00c3O<\/h2>\n<p><span style=\"font-weight: 400\">Na vers\u00e3o 5.0, o N1QL inclui comandos para conceder fun\u00e7\u00f5es aos usu\u00e1rios (GRANT) e para retir\u00e1-las (REVOKE). Esses comandos exigem permiss\u00e3o de administrador para serem executados.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Antes de experimentar essas declara\u00e7\u00f5es, vamos analisar quais usu\u00e1rios est\u00e3o configurados e quais fun\u00e7\u00f5es eles t\u00eam. Veja o que voc\u00ea deve ver na tela Security (Seguran\u00e7a) do console do Couchbase.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4139\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/user-permissions-300x161.png\" alt=\"\" width=\"300\" height=\"161\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/user-permissions-300x161.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/user-permissions-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/user-permissions.png 628w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Podemos conceder uma nova fun\u00e7\u00e3o cluster_admin ao usu\u00e1rio1 da seguinte forma:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"grant cluster_admin to user1\" -u Administrator -p password<\/pre>\n<p>Isso ser\u00e1 bem-sucedido e, logo em seguida, o console do Couchbase ser\u00e1 atualizado para refletir a nova atribui\u00e7\u00e3o de fun\u00e7\u00e3o.<\/p>\n<p>Tamb\u00e9m podemos atribuir fun\u00e7\u00f5es parametrizadas, como esta:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ \r\n    -s \"grant query_insert on testbucket2 to user2\" \r\n    -u Administrator \r\n    -p password<\/pre>\n<p>Podemos desfazer a concess\u00e3o inicial por meio de um REVOKE:<\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ -s \"revoke cluster_admin from user1\" -u Administrator -p password<\/pre>\n<p><span style=\"font-weight: 400\">Todos esses par\u00e2metros podem receber listas de argumentos:<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ \r\n    -s \"grant query_insert, query_delete on testbucket1, testbucket2 to user5, user6\" \r\n    -u Administrator \r\n    -p password<\/pre>\n<p><span style=\"font-weight: 400\">E, por fim, o prefixo query_ \u00e9 opcional para query_insert, query_update, query_delete e query_select, tornando parte da sintaxe mais familiar:<\/span><\/p>\n<pre>cbq -e \u00a0https:\/\/localhost:8093\/ -s \"grant insert,delete on testbucket1 to user4\" \r\n    -u Administrator -p password<\/pre>\n<h2>Compara\u00e7\u00e3o com a Oracle<\/h2>\n<p>O controle de acesso baseado em fun\u00e7\u00e3o no Couchbase 5.0 foi projetado para ser familiar aos profissionais que j\u00e1 usaram o controle de acesso em outros sistemas de banco de dados atuais. A esta altura, voc\u00ea j\u00e1 deve ter reconhecido conceitos familiares, como as permiss\u00f5es de inser\u00e7\u00e3o\/sele\u00e7\u00e3o\/atualiza\u00e7\u00e3o\/exclus\u00e3o aplic\u00e1veis a buckets, que s\u00e3o como tabelas. Al\u00e9m disso, a no\u00e7\u00e3o de usu\u00e1rios administradores com permiss\u00f5es amplas deve ser familiar. O controle de acesso baseado em fun\u00e7\u00e3o no Couchbase 5.0 foi projetado para ser familiar aos profissionais que usaram o controle de acesso em outros sistemas de banco de dados atuais. A esta altura, voc\u00ea j\u00e1 deve ter reconhecido conceitos familiares, como as permiss\u00f5es de inser\u00e7\u00e3o\/sele\u00e7\u00e3o\/atualiza\u00e7\u00e3o\/exclus\u00e3o aplic\u00e1veis aos buckets, que s\u00e3o como tabelas. Al\u00e9m disso, a no\u00e7\u00e3o de usu\u00e1rios administradores com permiss\u00f5es amplas deve ser familiar.<\/p>\n<p>Por exemplo, essa consulta GRANT funcionar\u00e1 tanto no Couchbase quanto no Oracle:<\/p>\n<pre class=\"\">GRANT select, insert ON default TO jlarson, pedwards<\/pre>\n<p>Uma diferen\u00e7a conceitual entre o Couchbase e outros sistemas, como o Oracle, \u00e9 que temos um modelo bin\u00e1rio de privil\u00e9gio: usu\u00e1rios e fun\u00e7\u00f5es. Eles normalmente t\u00eam um modelo trin\u00e1rio, com usu\u00e1rios, fun\u00e7\u00f5es e privil\u00e9gios. Dessa forma, conceder permiss\u00f5es aos usu\u00e1rios no Oracle \u00e9 conceder privil\u00e9gios em objetos aos usu\u00e1rios. No Couchbase, trata-se de conceder fun\u00e7\u00f5es parametrizadas aos usu\u00e1rios.<\/p>\n<p>As fun\u00e7\u00f5es s\u00e3o est\u00e1ticas na vers\u00e3o 5.0. N\u00e3o h\u00e1 declara\u00e7\u00f5es equivalentes a CREATE\/DROP\/ALTER ROLE.<\/p>\n<p>As permiss\u00f5es do Couchbase est\u00e3o no sistema como um todo ou nos buckets. N\u00e3o temos no\u00e7\u00e3o de permiss\u00f5es em tabelas, colunas ou cole\u00e7\u00f5es.<\/p>\n<p>No Couchbase, GRANT e REVOKE s\u00f3 s\u00e3o poss\u00edveis para usu\u00e1rios administradores. N\u00e3o existe uma OP\u00c7\u00c3O DE ADMIN ou uma OP\u00c7\u00c3O DE GRANT. Para alterar as permiss\u00f5es, voc\u00ea precisa ser um administrador.<\/p>\n<p>Por fim, n\u00e3o temos equivalente a SET ROLE. SET ROLE \u00e9 um comando em n\u00edvel de sess\u00e3o, o que n\u00e3o faz sentido no Couchbase porque n\u00e3o temos sess\u00f5es, apenas solicita\u00e7\u00f5es RESTful individuais.<\/p>\n<h2>Novos espa\u00e7os-chave do sistema<\/h2>\n<p>O Couchbase 5.0 apresenta tr\u00eas novos espa\u00e7os de chave do sistema relacionados aos usu\u00e1rios. O primeiro deles \u00e9 system:user_info. Esse espa\u00e7o de chave lista os usu\u00e1rios configurados no sistema, incluindo suas fun\u00e7\u00f5es. Vamos tentar uma consulta:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from system:user_info\" -u Administrator -p password<\/pre>\n<p>Isso nos d\u00e1 sete entradas como esta, uma para cada usu\u00e1rio que configuramos, mais o Administrador configurado:<\/p>\n<pre class=\"\">{\"user_info\":{\"domain\":\"local\",\"id\":\"user4\",\"name\":\"User4\",\"roles\":[{\"bucket_name\":\"testbucket1\",\"role\":\"query_manage_index\"},{\"bucket_name\":\"testbucket1\",\"role\":\"insert\"},{\"bucket_name\":\"testbucket1\",\"role\":\"delete\"}]}},\r\n{\"user_info\":{\"domain\":\"local\",\"id\":\"user2\",\"name\":\"User 2\",\"roles\":[{\"bucket_name\":\"testbucket2\",\"role\":\"select\"},{\"bucket_name\":\"testbucket2\",\"role\":\"insert\"}]}},\r\n{\"user_info\":{\"domain\":\"local\",\"id\":\"user5\",\"name\":\"User5\",\"roles\":[{\"bucket_name\":\"testbucket2\",\"role\":\"insert\"},{\"bucket_name\":\"testbucket1\",\"role\":\"insert\"},{\"bucket_name\":\"testbucket2\",\"role\":\"delete\"},{\"bucket_name\":\"testbucket1\",\"role\":\"delete\"},{\"role\":\"query_system_catalog\"}]}},<\/pre>\n<p>O espa\u00e7o-chave system:applicable_roles \u00e9 semelhante, mas divide cada fun\u00e7\u00e3o de usu\u00e1rio em uma entrada separada, produzindo uma vis\u00e3o mais relacional dos dados:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ \r\n    -s \"select * from system:applicable_roles where grantee = 'user3'\" \r\n    -u Administrator \r\n    -p password<\/pre>\n<pre class=\"\">\"results\": [\r\n{\"applicable_roles\":{\"bucket_name\":\"testbucket2\",\"grantee\":\"user3\",\"role\":\"select\"}},\r\n{\"applicable_roles\":{\"bucket_name\":\"testbucket1\",\"grantee\":\"user3\",\"role\":\"select\"}},\r\n{\"applicable_roles\":{\"bucket_name\":\"testbucket2\",\"grantee\":\"user3\",\"role\":\"insert\"}}\r\n],<\/pre>\n<p>Por fim, o espa\u00e7o-chave system:my_user_info mostra a parte do system:my_user_info correspondente ao usu\u00e1rio cujas credenciais s\u00e3o passadas com a consulta.<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from system:my_user_info\" -u user3 -p password<\/pre>\n<pre class=\"\">\"results\": [\r\n{\"my_user_info\":{\"domain\":\"local\",\"id\":\"user3\",\"name\":\"User 3\",\r\n   \"roles\":[{\"bucket_name\":\"testbucket2\",\"role\":\"select\"},{\"bucket_name\":\"testbucket1\",\"role\":\"select\"},{\"bucket_name\":\"testbucket2\",\"role\":\"insert\"}]}}\r\n],<\/pre>\n<h2>Acesso aos espa\u00e7os-chave do sistema<\/h2>\n<p>De acordo com uma filosofia geral de opera\u00e7\u00e3o segura, os espa\u00e7os de chave do sistema (buckets) s\u00e3o protegidos na vers\u00e3o 5.0. O grau de restri\u00e7\u00e3o varia de acordo com os dados presentes em cada espa\u00e7o de chave.<\/p>\n<p>Tr\u00eas espa\u00e7os de chaves n\u00e3o t\u00eam nada que possa ser valioso para um invasor:<\/p>\n<ul>\n<li>sistema:armazenamentos de dados<\/li>\n<li>sistema:namespaces<\/li>\n<li>sistema: duplo<\/li>\n<\/ul>\n<p>Dessa forma, esses espa\u00e7os de chaves n\u00e3o s\u00e3o protegidos. N\u00e3o s\u00e3o necess\u00e1rias credenciais para acess\u00e1-los.<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/query\/service -s \"select * from system:datastores\"<\/pre>\n<pre class=\"\">\"results\": [\r\n{\"datastores\":{\"id\":\"https:\/\/127.0.0.1:8091\",\"url\":\"https:\/\/127.0.0.1:8091\"}}\r\n],<\/pre>\n<p>No outro extremo da seguran\u00e7a est\u00e3o system:user_info e system:applicable_roles, que cont\u00eam a lista de usu\u00e1rios e suas fun\u00e7\u00f5es. Elas podem ser acessadas apenas por usu\u00e1rios Admin e Read Only Admin. A tabela system:my_user_info \u00e9 semelhante, mas mostra apenas as informa\u00e7\u00f5es relevantes para o usu\u00e1rio cujas credenciais s\u00e3o apresentadas com a consulta. J\u00e1 exploramos essas tabelas acima.<\/p>\n<p>Os pr\u00f3ximos quatro espa\u00e7os de chave do sistema cont\u00eam uma variedade de informa\u00e7\u00f5es de tempo de execu\u00e7\u00e3o e configura\u00e7\u00e3o.<\/p>\n<ul>\n<li>Sistema: prepara\u00e7\u00f5es<\/li>\n<li>Sistema:completed_requests<\/li>\n<li>Sistema:active_requests<\/li>\n<li>Sistema: n\u00f3s<\/li>\n<\/ul>\n<p>Como as informa\u00e7\u00f5es nelas contidas n\u00e3o s\u00e3o t\u00e3o confidenciais quanto as informa\u00e7\u00f5es do usu\u00e1rio, elas podem ser visualizadas mais amplamente. Eles podem ser acessados pela maioria dos administradores, mesmo os menores: Admin, Read Only Admin, Cluster Admin, Query System Catalog, Replication Admin, Bucket Admin (qualquer bucket) ou Views Admin (qualquer bucket).<\/p>\n<p>Vamos tentar olhar para system:prepareds como user5, o usu\u00e1rio que criamos com a permiss\u00e3o Query System Catalog, acima.<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from system:prepareds\" -u user5 -p password<\/pre>\n<p>Isso nos mostra uma declara\u00e7\u00e3o preparada que criamos anteriormente.<\/p>\n<p>O espa\u00e7o de chave system:keyspaces mostra a lista de buckets configurados no sistema. Essas informa\u00e7\u00f5es s\u00e3o um tanto sens\u00edveis, pois fornecem ao invasor informa\u00e7\u00f5es sobre a finalidade do uso do sistema. Dessa forma, os usu\u00e1rios com fun\u00e7\u00f5es de alto n\u00edvel (Admin, Read Only Admin, Cluster Admin) veem tudo o que est\u00e1 nesse espa\u00e7o de chave. Os usu\u00e1rios com a fun\u00e7\u00e3o Query System Catalog tamb\u00e9m veem tudo, pois essa fun\u00e7\u00e3o \u00e9 destinada \u00e0 depura\u00e7\u00e3o de problemas de consulta. Para outros usu\u00e1rios, a visualiza\u00e7\u00e3o \u00e9 filtrada; o usu\u00e1rio v\u00ea apenas os espa\u00e7os-chave para os quais tem permiss\u00e3o query_select.<\/p>\n<p><span style=\"font-weight: 400\">Por exemplo, uma consulta a system:keyspaces sem credenciais ser\u00e1 bem-sucedida, mas n\u00e3o mostrar\u00e1 nenhuma entrada:<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ -s \"select * from system:keyspaces\"<\/pre>\n<pre>\"results\": [\r\n\r\n],<\/pre>\n<p><span style=\"font-weight: 400\">Adicione credenciais para o usu\u00e1rio5, que tem a fun\u00e7\u00e3o Query System Catalog, e todas as entradas s\u00e3o mostradas:<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ -s \"select * from system:keyspaces\" -u user5 -p password<\/pre>\n<pre class=\"\">\"results\": [\r\n{\"keyspaces\":{\"datastore_id\":\"https:\/\/127.0.0.1:8091\",\"id\":\"testbucket1\",\"name\":\"testbucket1\",\"namespace_id\":\"default\"}},\r\n{\"keyspaces\":{\"datastore_id\":\"https:\/\/127.0.0.1:8091\",\"id\":\"testbucket2\",\"name\":\"testbucket2\",\"namespace_id\":\"default\"}}\r\n],<\/pre>\n<p><span style=\"font-weight: 400\">Use as credenciais para user1, que tem apenas query_select[testbucket1], e voc\u00ea ver\u00e1 apenas a entrada para testbucket1.<\/span><\/p>\n<pre>cbq -e https:\/\/localhost:8093\/ -s \"select * from system:keyspaces\" -u user1 -p password<\/pre>\n<pre class=\"\">\"results\": [\r\n{\"keyspaces\":{\"datastore_id\":\"https:\/\/127.0.0.1:8091\",\"id\":\"testbucket1\",\"name\":\"testbucket1\",\"namespace_id\":\"default\"}}\r\n],<\/pre>\n<p><span style=\"font-weight: 400\">O espa\u00e7o de chave system:indexes \u00e9 tratado de forma muito semelhante a system:keyspaces: as fun\u00e7\u00f5es de alto n\u00edvel permitem acesso completo, enquanto a fun\u00e7\u00e3o query_select permite acesso filtrado. A diferen\u00e7a real \u00e9 que a fun\u00e7\u00e3o query_manage_index permite acesso filtrado, como query_select.<\/span><\/p>\n<h2>Prote\u00e7\u00e3o para APIs de administra\u00e7\u00e3o<\/h2>\n<p>O mecanismo de consulta N1QL tem APIs RESTful correspondentes a tr\u00eas dos espa\u00e7os-chave do sistema: system:prepareds, system:completed_requests e system:active_requests. Elas costumavam ser abertas no Couchbase 4.6, mas agora est\u00e3o protegidas. Eles exigem as mesmas credenciais que os espa\u00e7os de chave.<\/p>\n<pre class=\"\">curl https:\/\/localhost:8093\/admin\/prepareds<\/pre>\n<pre class=\"\">{\"caller\":\"auth:268\",\r\n \"code\":13014,\"key\":\"datastore.couchbase.insufficient_credentiasl\",\r\n \"message\":\"User does not have credentials to run queries accessing the system tables. \r\n     Add role query_system_catalog to allow the query to run.\"}<\/pre>\n<p>Se tentarmos novamente com o usu\u00e1rio 5, que tem a fun\u00e7\u00e3o necess\u00e1ria, isso funcionar\u00e1.<\/p>\n<pre class=\"\">curl https:\/\/localhost:8093\/admin\/prepareds -u user5:password<\/pre>\n<h2>Acesso a buckets migrados sem senha<\/h2>\n<p>Ao migrar da vers\u00e3o 4.6 para a 5.0, \u00e9 \u00fatil preservar os padr\u00f5es de permiss\u00f5es existentes, para permitir que os aplicativos legados continuem funcionando como antes. Isso \u00e9 um pouco complicado nesse caso, porque na vers\u00e3o 4.6 o acesso era controlado por meio de senhas nos pr\u00f3prios buckets, enquanto na vers\u00e3o 5.0 o controle de acesso \u00e9 baseado em usu\u00e1rios com v\u00e1rias fun\u00e7\u00f5es.<\/p>\n<p>Para preservar os padr\u00f5es de acesso legados, durante o processo de atualiza\u00e7\u00e3o, criamos usu\u00e1rios com nomes e senhas correspondentes ao bucket original. Isso permite que os aplicativos existentes continuem fazendo o que estavam fazendo, mesmo no caso de acesso sem nenhuma senha.<\/p>\n<p>Para ver isso em a\u00e7\u00e3o, ser\u00e1 necess\u00e1rio algum trabalho. Fique confort\u00e1vel.<\/p>\n<p>Comece instalando o Couchbase 4.6. Em seguida, crie dois buckets, \"openbucket\" sem senha e \"closedbucket\" com a senha \"password\".<\/p>\n<p>V\u00e1 para a guia Query (Consulta) e adicione \u00edndices prim\u00e1rios para ambos os buckets para permitir a execu\u00e7\u00e3o de consultas N1QL.<\/p>\n<pre class=\"\">create primary index on openbucket\r\ncreate primary index on closedbucket<\/pre>\n<p>Verifique se o openbucket pode ser consultado sem uma senha:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from openbucket\"<\/pre>\n<p>Mas a consulta ao closedbucket sem uma senha falha:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from closedbucket\"<\/pre>\n<p>Mas o closedbucket pode ser consultado com uma senha:<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from closedbucket\" -u closedbucket -p password<\/pre>\n<p>Esse \u00e9 o padr\u00e3o de acesso que queremos preservar quando atualizarmos para a vers\u00e3o 5.0. Agora, desligue o Couchbase e fa\u00e7a a atualiza\u00e7\u00e3o para a vers\u00e3o 5.0, preservando os dados subjacentes que acabamos de criar. Em seguida, v\u00e1 para a tela Seguran\u00e7a do console do Couchbase. L\u00e1, voc\u00ea ver\u00e1 dois novos usu\u00e1rios criados pelo processo de atualiza\u00e7\u00e3o.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4140\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/10\/created-users-300x63.png\" alt=\"\" width=\"300\" height=\"63\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/created-users-300x63.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/created-users-20x4.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/created-users.png 735w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>O usu\u00e1rio \"closedbucket\" tem o mesmo nome que o bucket \"closedbucket\" e a senha que foi atribu\u00edda ao bucket na vers\u00e3o 4.6. Ele nos permite preservar o acesso legado ao closedbucket. O usu\u00e1rio \"openbucket\" faz o mesmo, mas para o openbucket.<\/p>\n<p>Vamos verificar se o padr\u00e3o de acesso anterior ainda funciona.<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from openbucket\"<\/pre>\n<p>O Openbucket ainda pode ser acessado sem uma senha.<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from closedbucket\"<\/pre>\n<p>O acesso ao Closedbucket falha sem uma senha.<\/p>\n<pre class=\"\">cbq -e https:\/\/localhost:8093\/ -s \"select * from closedbucket\" -u closedbucket -p password<\/pre>\n<p>Mas o acesso ao closedbucket \u00e9 bem-sucedido com uma senha.<\/p>\n<p>Viva! As coisas funcionam como antes. V\u00e1 preparar uma guloseima para voc\u00ea.<\/p>\n<h2>Resumo<\/h2>\n<ul>\n<li>O controle de acesso no Couchbase 4.6 usava senhas para os buckets. No 5.0, ele usa fun\u00e7\u00f5es atribu\u00eddas aos usu\u00e1rios.<\/li>\n<li>As principais fun\u00e7\u00f5es usadas para controlar o acesso de um usu\u00e1rio ao N1QL s\u00e3o query_select\/query_insert\/query_update\/query_delete. Todas elas s\u00e3o parametrizadas por bucket.<\/li>\n<li>Fun\u00e7\u00f5es importantes mais especializadas incluem query_manage_index, query_system_catalog e query_external_access.<\/li>\n<li>Explicar ou preparar uma consulta requer as mesmas fun\u00e7\u00f5es que a execu\u00e7\u00e3o da mesma.<br \/>\nH\u00e1 novos comandos que permitem que voc\u00ea CONCEDA e REVOGUE fun\u00e7\u00f5es.<\/li>\n<li>O sistema de fun\u00e7\u00f5es deve ser familiar aos usu\u00e1rios familiarizados com outros grandes bancos de dados. A principal diferen\u00e7a \u00e9 que o Couchbase n\u00e3o tem no\u00e7\u00e3o de permiss\u00f5es fora das fun\u00e7\u00f5es.<\/li>\n<li>H\u00e1 novos espa\u00e7os-chave do sistema para consultar os usu\u00e1rios e as fun\u00e7\u00f5es atribu\u00eddas a eles.<br \/>\nOs espa\u00e7os de chave do sistema s\u00e3o controlados para fins de seguran\u00e7a. O comportamento varia de espa\u00e7o de chave para espa\u00e7o de chave, dependendo da sensibilidade dos dados contidos nele.<\/li>\n<li>Os padr\u00f5es de acesso existentes, mesmo para buckets sem senha, ainda devem funcionar ap\u00f3s a migra\u00e7\u00e3o da vers\u00e3o 4.6 para a 5.0.<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>In Couchbase 4.5, data was secured bucket by bucket. Each bucket had a password, and in order to access a bucket through a N1QL query, the user had to include the bucket password with the query. Passwordless buckets were possible, [&hellip;]<\/p>","protected":false},"author":8157,"featured_media":4141,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1813,1812],"tags":[1903],"ppma_author":[9058],"class_list":["post-4136","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security","category-n1ql-query","tag-rbac"],"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>Role-Based Access Control (RBAC) Use in N1QL | Couchbase<\/title>\n<meta name=\"description\" content=\"Walk through the main functionality of role-based access control (RBAC) in Couchbase. These exercises will let you try out the new features for yourself.\" \/>\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\/pt\/using-role-based-access-control-in-n1ql\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Role-Based Access Control in N1QL\" \/>\n<meta property=\"og:description\" content=\"Walk through the main functionality of role-based access control (RBAC) in Couchbase. These exercises will let you try out the new features for yourself.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/using-role-based-access-control-in-n1ql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-10-23T18:39:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:43:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1365\" \/>\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=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/\"},\"author\":{\"name\":\"Johan Larson\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/043ccbbfc54b95927c73f81ec7f6a0a1\"},\"headline\":\"Using Role-Based Access Control in N1QL\",\"datePublished\":\"2017-10-23T18:39:31+00:00\",\"dateModified\":\"2025-06-14T06:43:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/\"},\"wordCount\":2838,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg\",\"keywords\":[\"RBAC\"],\"articleSection\":[\"Security\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/\",\"name\":\"Role-Based Access Control (RBAC) Use in N1QL | Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg\",\"datePublished\":\"2017-10-23T18:39:31+00:00\",\"dateModified\":\"2025-06-14T06:43:19+00:00\",\"description\":\"Walk through the main functionality of role-based access control (RBAC) in Couchbase. These exercises will let you try out the new features for yourself.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg\",\"width\":2048,\"height\":1365},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Role-Based Access Control in N1QL\"}]},{\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/author\/johan-larson\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Role-Based Access Control (RBAC) Use in N1QL | Couchbase","description":"Walk through the main functionality of role-based access control (RBAC) in Couchbase. These exercises will let you try out the new features for yourself.","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\/pt\/using-role-based-access-control-in-n1ql\/","og_locale":"pt_BR","og_type":"article","og_title":"Using Role-Based Access Control in N1QL","og_description":"Walk through the main functionality of role-based access control (RBAC) in Couchbase. These exercises will let you try out the new features for yourself.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/using-role-based-access-control-in-n1ql\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-10-23T18:39:31+00:00","article_modified_time":"2025-06-14T06:43:19+00:00","og_image":[{"width":2048,"height":1365,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg","type":"image\/jpeg"}],"author":"Johan Larson","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Johan Larson","Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/"},"author":{"name":"Johan Larson","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/043ccbbfc54b95927c73f81ec7f6a0a1"},"headline":"Using Role-Based Access Control in N1QL","datePublished":"2017-10-23T18:39:31+00:00","dateModified":"2025-06-14T06:43:19+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/"},"wordCount":2838,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg","keywords":["RBAC"],"articleSection":["Security","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/","url":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/","name":"Role-Based Access Control (RBAC) Use in N1QL | Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg","datePublished":"2017-10-23T18:39:31+00:00","dateModified":"2025-06-14T06:43:19+00:00","description":"Walk through the main functionality of role-based access control (RBAC) in Couchbase. These exercises will let you try out the new features for yourself.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/10\/Chain-link_and_barbed_wire.jpg","width":2048,"height":1365},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using Role-Based Access Control in N1QL"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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":"pt-BR","@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 \u00e9 engenheiro de software s\u00eanior da Couchbase. A responsabilidade do trabalho de Johan \u00e9 criar uma linguagem de consulta baseada em SQL para dados JSON em um sistema NoSQL distribu\u00eddo.","url":"https:\/\/www.couchbase.com\/blog\/pt\/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 \u00e9 engenheiro de software s\u00eanior da Couchbase. A responsabilidade do trabalho de Johan \u00e9 criar uma linguagem de consulta baseada em SQL para dados JSON em um sistema NoSQL distribu\u00eddo."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/8157"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4136"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4136\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/4141"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4136"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=4136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}