<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>2227-1899</journal-id>
<journal-title><![CDATA[Revista Cubana de Ciencias Informáticas]]></journal-title>
<abbrev-journal-title><![CDATA[Rev cuba cienc informat]]></abbrev-journal-title>
<issn>2227-1899</issn>
<publisher>
<publisher-name><![CDATA[Editorial Ediciones Futuro]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S2227-18992017000400002</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Control de acceso multidimensional en PostgreSQL]]></article-title>
<article-title xml:lang="en"><![CDATA[Multi Dimensional Access Control In PostgreSQL]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Clavadetscher]]></surname>
<given-names><![CDATA[Charles]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Instituto tecnológico federal Centro de investigaciones económicas ]]></institution>
<addr-line><![CDATA[ Zurich]]></addr-line>
<country>Suiza</country>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>12</month>
<year>2017</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>12</month>
<year>2017</year>
</pub-date>
<volume>11</volume>
<numero>4</numero>
<fpage>12</fpage>
<lpage>22</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_arttext&amp;pid=S2227-18992017000400002&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_abstract&amp;pid=S2227-18992017000400002&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_pdf&amp;pid=S2227-18992017000400002&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[Una base de datos tiene informaciones para apoyar todos los procesos productivos de una empresa, independentiemente de su estructura laboral. Así se encontrarán, p.ej. catálogos de venta, descripciones de productos, datos contables, listas de empleados, etc. Siendo claro que no todos los empleados de una empresa necesitan acceso a todas las informaciones se pone la cuestión de cómo gestionar este acceso de forma confiable. Este proceso de selección se llama autorización y es disponible en todos los sistemas de base de datos. En PostgreSQL el control de acceso se organiza mediante el empleo de roles. El sistema clásico de autorización es vertical, es decir que permite elegir cuáles tablas o columnas de una tabla son accesibles para un usuario. Desde la versión 9.5, PostgreSQL introdujo la posibilidad de un control de acceso horizontal. El control de acceso a nivel de filas (row level security) permite elegir en base a unos criterios configurables, cuáles filas son visibles y por lo tanto gestionables para un usuario. La combinación de técnicas de control vertical y horizontal permite obtener una granularidad en el acceso alcanzable en el pasado solo por medio de soluciones alternativas difíciles de gestionar y, por ende, inseguras.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[A database contains the information required to support all the business processes of a company, independently of its personnel structure. Therefore you will have, e.g. sales catalogues, product descriptions, accounting information, lists of employees, etc. Obviously not all employees are supposed to have access to all data, thus posing the question on how to manage their access to them in a secure way. This selection process is called authorization and is available in all database systems. In PostgreSQL, access control is organized around roles. The classic authorization system is vertical. This means that it allows to choose which tables or columns thereof are accessible to a user. Since version 9.5, PostgreSQL introduced the possibility of a horizontal access control. This type of access (row level security) allows to choose based on a configurable set of crieteria which rows are visible, and therefore modifiable, by a user. The combination of vertical and horizontal access control techniques enables a granularity in the configuration that, in the past, could only be achieved through workarounds difficult to maintain and, therefore, insecure.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[PostgreSQL]]></kwd>
<kwd lng="es"><![CDATA[bases de datos]]></kwd>
<kwd lng="es"><![CDATA[seguridad]]></kwd>
<kwd lng="es"><![CDATA[autorización]]></kwd>
<kwd lng="es"><![CDATA[control de acceso]]></kwd>
<kwd lng="es"><![CDATA[row level security]]></kwd>
<kwd lng="en"><![CDATA[PostgreSQL]]></kwd>
<kwd lng="en"><![CDATA[databases]]></kwd>
<kwd lng="en"><![CDATA[security]]></kwd>
<kwd lng="en"><![CDATA[authorization]]></kwd>
<kwd lng="en"><![CDATA[access control]]></kwd>
<kwd lng="en"><![CDATA[row level security]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><B>ART&Iacute;CULO  ORIGINAL</B></font></p>     <p>&nbsp;</p>     <p><strong><font size="4" face="Verdana, Arial, Helvetica, sans-serif">Control de acceso multidimensional en PostgreSQL</font></strong></p>     <p>&nbsp;</p>     <p><strong><font size="3"><em><font face="Verdana, Arial, Helvetica, sans-serif">Multi  Dimensional Access Control In PostgreSQL</font></em></font></strong></p>     <p>&nbsp;</p>     <p>&nbsp;</p>     <P><font size="2"><strong><font face="Verdana, Arial, Helvetica, sans-serif">Charles  Clavadetscher<strong><sup>1*</sup></strong></font></strong></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><sup>1</sup>Centro de investigaciones econ&oacute;micas, Instituto  tecnol&oacute;gico federal, Zurich, Suiza</font> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">    <br> </font></p>     ]]></body>
<body><![CDATA[<P><font face="Verdana, Arial, Helvetica, sans-serif"><span class="class"><font size="2">*Autor para la correspondencia: </font></span><font size="2">clavadetscher@kof.ethz.ch </font></font>     <p>&nbsp;</p>     <p>&nbsp;</p> <hr>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>RESUMEN</b> </font>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Una base  de datos tiene informaciones para apoyar todos los procesos productivos de una  empresa, independentiemente de su estructura laboral. As&iacute; se encontrar&aacute;n, p.ej.  cat&aacute;logos de venta, descripciones de productos, datos contables, listas de  empleados, etc. Siendo claro que no todos los empleados de una empresa  necesitan acceso a todas las informaciones se pone la cuesti&oacute;n de c&oacute;mo  gestionar este acceso de forma confiable. Este proceso de selecci&oacute;n se llama  autorizaci&oacute;n y es disponible en todos los sistemas de base de datos. En  PostgreSQL el control de acceso se organiza mediante el empleo de roles. El  sistema cl&aacute;sico de autorizaci&oacute;n es vertical, es decir que permite elegir cu&aacute;les  tablas o columnas de una tabla son accesibles para un usuario. Desde la versi&oacute;n  9.5, PostgreSQL introdujo la posibilidad de un control de acceso horizontal. El  control de acceso a nivel de filas (row level security) permite elegir en base  a unos criterios configurables, cu&aacute;les filas son visibles y por lo tanto  gestionables para un usuario. La combinaci&oacute;n de t&eacute;cnicas de control vertical y  horizontal permite obtener una granularidad en el acceso alcanzable en el  pasado solo por medio de soluciones alternativas dif&iacute;ciles de gestionar y, por  ende, inseguras.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><span lang=EN-GB>Palabras clave:</span></b></font> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">PostgreSQL,  bases de datos, seguridad, autorizaci&oacute;n, control de acceso, row level security</font></p> <hr>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><span lang=EN-GB>ABSTRACT</span></b> </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A database contains the information required to support all the business  processes of a company, independently of its personnel structure. Therefore you  will have, e.g. sales catalogues, product descriptions, accounting information,  lists of employees, etc. Obviously not all employees are supposed to have  access to all data, thus posing the question on how to manage their access to  them in a secure way. This selection process is called authorization and is  available in all database systems. In PostgreSQL, access control is organized  around roles. The classic authorization system is vertical. This means that it  allows to choose which tables or columns thereof are accessible to a user.  Since version 9.5, PostgreSQL introduced the possibility of a horizontal access  control. This type of access (row level security) allows to choose based on a  configurable set of crieteria which rows are visible, and therefore modifiable,  by a user. The combination of vertical and horizontal access control techniques  enables a granularity in the configuration that, in the past, could only be  achieved through workarounds difficult to maintain and, therefore, insecure.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><span lang=EN-GB>Key words: </span></b>PostgreSQL,  databases, security, authorization, access control, row level security</font></p> <hr>     <p>&nbsp;</p>     ]]></body>
<body><![CDATA[<p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>INTRODUCCI&Oacute;N</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La  necesidad de seleccionar filas de una tabla en base a unos criterios  predefinidos siempre ha existido. Las soluciones tradicionales consist&iacute;an en  crear vistas sobre la tabla y revocar y otorgar privilegios para cumplir con  los requisitos de acceso.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se  suponga que en la base de datos haya una tabla library.catalogue con la  estructura que se indica en la <a href="/img/revistas/rcci/v11n4/t0102417.jpg" target="_blank">tabla</a> correspondiente.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Adem&aacute;s,  existen unos grupos y usuarios que la utilizan.</font></p>     <p align="center"><img src="/img/revistas/rcci/v11n4/t0202417.jpg" alt="t02" width="499" height="182"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En  este ejemplo, que se utilizar&aacute; para seguir ilustrando las nuevas posibilidades  de seguridad en PostgreSQL, se presenta una situaci&oacute;n sumamente simplificada.  Una peque&ntilde;a empresa con tres empleados que se dedica a la compraventa de  libros. Uno de ellos, &Aacute;ngela act&uacute;a como gestora de la empresa, mientras que  Juan y Felipe est&aacute;n al frente de ventas en La Habana y en Santiago  respectivamente.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Por  razones de brevedad y con el fin de poner el enfoque sobre el tema espec&iacute;fico  se omiten aqu&iacute; los detalles sobre la creaci&oacute;n de la tabla, de los usuarios y de  los privilegios b&aacute;sicos para acceder a los objetos.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los  requisitos de control de acceso de esta peque&ntilde;a empresa son:</font></p> <ol>       <li>         ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los  miembros del grupo de gesti&oacute;n pueden ver y manipular todas las entradas de la  tabla.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los  miembros de los grupos de ventas en las regiones solo pueden ver las entradas  de su regi&oacute;n y solo cuando el producto est&aacute; disponible para la venta.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los  miembros de los grupos de ventas en las regiones solo pueden cambiar el campo  quantity de los productos en su regi&oacute;n.</font></p>   </li>     </ol>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los  primeros dos requisitos requieren un control sobre las filas retornadas por una  consulta sobre la tabla, en este contexto una selecci&oacute;n horizontal, mientras  que el tercero implica un control de acceso tanto horizontal como vertical.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En las versiones anteriores a 9.5 de PostgreSQL, se  pod&iacute;a cumplir con los requisitos utilizando vistas sobre la tabla. </font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">CREATE  VIEW library.v_catalogue AS    <br>   SELECT  * FROM library.catalogue    ]]></body>
<body><![CDATA[<br>   WHERE  pg_has_role(CURRENT_USER,responsible,&rsquo;USAGE&rsquo;)    <br>   AND quantity &gt; 0;</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La  funci&oacute;n pg_has_role se usa para averiguar si un usuario tiene un rol, es decir  en este contexto, si es miembro de un grupo y hereda sus privilegios (PostgreSQL Global  Development Group, 2015b). Para limitar el acceso de los  sitios de venta se necesita quitar todos los privilegios sobre la tabla de base  y otorgar los necesarios sobre la vista a los grupos respectivos.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">REVOKE ALL ON library.catalogue  FROM ventas_la_habana, ventas_santiago;    <br>   GRANT SELECT ON library.v_catalogue  TO ventas_la_habana, ventas_santiago; GRANT UPDATE (quantity) ON  library.v_catalogue TO ventas_la_habana, ventas_santiago;</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Cabe  notar que una vista es ejecutada en PostgreSQL con los privilegios del usuario  que la cre&oacute;. Por esta raz&oacute;n es posible que un usuario acceda a una tabla sobre  la que no tiene privilegios directos, por medio de una vista.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Finalmente,  el acceso del grupo de gestores puede definirse sobre la tabla de base. En este  caso tambi&eacute;n ser&iacute;a posible otorgar los privilegios sobra la vista. La ventaja  de otorgar los privilegios directamente sobre la tabla es que cambios  eventuales en la estructura de la tabla (p.ej. al a&ntilde;adir una nueva columna) son  visibles enseguida, cuando menos por los gestores. El resultado de una consulta  del tipo:</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">SELECT * FROM library.v_catalogue;</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">no  mostrar&iacute;a la nueva columna, porque cuando se cre&oacute; la vista la columna no exist&iacute;a.  Para esto se deber&iacute;a volver a crear la vista. Los gestores tienen que gozar de  todos los privilegios de lectura y escritura sobre la tabla de base.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">GRANT SELECT, INSERT, UPDATE, DELETE ON  library.catalogue TO gestion; </font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Esta  configuraci&oacute;n cumple todos los requisitos alistados arriba. En resumen fue  necesario:</font></p> <ul>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Crear una vista  para filtrar las filas retornadas.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Revocar  los privilegios al pseudo grupo PUBLIC (todos los usuarios) sobre la tabla de  base.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Otorgar  privilegios de lectura y de actualizaci&oacute;n sobre la vista para los puestos de  venta regionales.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Otorgar  los privilegios de lectura y escritura sobre la tabla de base para los  gestores.</font></p>   </li>     </ul>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En la siguiente secci&oacute;n se mostrar&aacute; c&oacute;mo es posible  conseguir los mismos objetivos con las nuevas t&eacute;cnicas de control de acceso a  nivel de fila. Tambi&eacute;n se mostrar&aacute;n las diferencias entre los enfoques para  realizar una evaluaci&oacute;n de los dos.</font></p>     <p><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Hacia  la seguridad horizontal</font></strong></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  implementar un sistema de seguridad a nivel de filas se requieren por lo menos  dos cosas:</font></p> <ol>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Una o  m&aacute;s normas (en ingl&eacute;s policy) que definen las modalidades del acceso.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Habilitar  la tabla para el uso de las normas.</font></p>   </li>     </ol>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Anatom&iacute;a de una  norma </font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">CREATE  POLICY name ON table_name    ]]></body>
<body><![CDATA[<br>   [  FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]    <br>   [  TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]    <br>   [  USING ( using_expression ) ]    <br>   [ WITH CHECK ( check_expression ) ]</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Desde  un punto de vista general una norma funciona como un filtro. Se definen:</font></p> <ul>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El nombre de la  norma.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La  tabla por la que esta norma es v&aacute;lida (ON).</font></p>   </li>       <li>         ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las  operaciones por las que esta norma es v&aacute;lida (FOR).</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los  usuarios (o grupos) sometidos a la norma (TO).</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las  reglas de acceso al leer filas (USING).</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las  reglas de acceso al insertar o modificar filas (WITH CHECK).</font></p>   </li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La  definici&oacute;n de una norma no es suficiente para que esa sea usada. Es necesario  habilitar la tabla para su uso. Eso se hace con el comando siguiente:    <br>   ALTER  TABLE tablename ENABLE ROW LEVEL SECURITY;</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  averiguar la configuraci&oacute;n de acceso de una tabla, se puede utilizar el comando  \dp en psql. En la secci&oacute;n sobre la implementaci&oacute;n del ejemplo se encuentran  m&aacute;s detalles sobre c&oacute;mo interpretrar la salida del comando.</font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Implementaci&oacute;n </font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  el ejemplo se necesitan dos normas. Una para los usuarios en ventas y otra para  los gestores. La primera norma se puede crear de la forma siguiente:</font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">CREATE  POLICY policy_ventas    <br>   ON  library.catalogue    <br>   FOR  ALL    <br>   TO  PUBLIC    <br>   USING  (pg_has_role(CURRENT_USER,responsible,&rsquo;USAGE&rsquo;)    <br>   AND quantity &gt; 0);</font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En  prosa este comando dice: Cuando un usuario cualquiera (TO PUBLIC) ejecuta un  comando cualquiera (FOR ALL) sobre la tabla library.catalogue (ON) solo retorna  filas de los grupos (responsible) en los que el usuario espec&iacute;fico que ejecuta  el comando (CURRENT_USER) es miembro y hereda sus privilegios. Adem&aacute;s solo  retorna filas cuyo valor en el campo quantity sea mayor que cero.</font></p>     ]]></body>
<body><![CDATA[<p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Es  importante no olvidar que para activar la norma es necesario habilitar la tabla  para su uso:</font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">ALTER  TABLE library.catalogue ENABLE ROW LEVEL SECURITY;</font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Esto  corresponde a la parte horizontal de los requisitos n&uacute;meros 2 y 3 que se  definieron previamente. Falta todav&iacute;a la parte vertical:</font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">GRANT SELECT ON library.catalogue  TO ventas_la_habana, ventas_santiago; GRANT UPDATE (quantity) ON  library.catalogue TO ventas_la_habana, ventas_santiago;    <br>   GRANT  SELECT, INSERT, UPDATE, DELETE ON library.catalogue TO gestion;</font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">De  esta forma el usuario Juan podr&aacute; ver solo las filas cuyo responsible es  ventas_la_habana (<a href="/img/revistas/rcci/v11n4/f0302417.jpg" target="_blank">Figura 3</a>).</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">You are now connected to database  &quot;library&quot; as user &quot;juan&quot;. juan@library=&gt; SELECT * FROM  library.catalogue ORDER BY item_id; </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Asimismo  podr&aacute; modificar el campo quantity de estas filas.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">juan@library=&gt;  UPDATE library.catalogue SET quantity = quantity - 1    <br>   WHERE  item_id = 1; UPDATE 1</font></p>     ]]></body>
<body><![CDATA[<p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">juan@library=&gt;  SELECT * FROM library.catalogue ORDER BY item_id;</font> <a href="/img/revistas/rcci/v11n4/f0402417.jpg" target="_blank"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Figura 4</font> </a></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Intentos  de modificar otros campos o el campo quantity de filas que no son visibles no  se ejecutan.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">juan@library=&gt;  UPDATE library.catalogue    <br>   SET  responsible = &rsquo;ventas_santiago&rsquo;    <br>   WHERE  item_id = 1;    <br>   ERROR:  permission denied for relation catalogue    <br>   juan@library=&gt;  UPDATE library.catalogue    <br>   SET  quantity = quantity - 1    <br>   WHERE item_id = 4;    <br>   UPDATE 0</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  mostrar que Juan realmente no ha modificado el campo quantity, cuya  responsabilidad es del grupo ventas_santiago, tenemos que anunciarnos a la base  de datos con un usuario que no est&aacute; sujeto a la seguridad a nivel de filas. Por  definici&oacute;n estos son el due&ntilde;o de la tabla y los superusuarios (PostgreSQL Global  Development Group, 2015a; Clavadetscher, 2015).</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">You  are now connected to database &quot;library&quot; as user &quot;charles&quot;.    <br>   charles@library=#  SELECT * FROM library.catalogue ORDER BY item_id;</font> <a href="/img/revistas/rcci/v11n4/f0502417.jpg" target="_blank"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Figura 5</font> </a></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Tambi&eacute;n  por definici&oacute;n, si una tabla est&aacute; sujeta a la seguridad a nivel de filas y no  existe una norma para el usuario que ejecuta un comando, se aplica una norma de  denegaci&oacute;n total, o sea que aunque este usuario tenga p.ej. privilegios de  lectura, la norma no retornar&aacute; ninguna fila.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El  usuario &Aacute;ngela est&aacute; sujeto a la norma policy_ventas y como no est&aacute; en ninguno  de los grupos presentes en responsible el intento de leer datos, aunque tenga  el privilegio necesario retornar&aacute; cero filas.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">You are now connected to database &quot;library&quot;  as user &quot;angela&quot;. angela@library=&gt; SELECT * FROM library.catalogue  ORDER BY item_id;</font></p>     <p><img src="/img/revistas/rcci/v11n4/f0602417.jpg" alt="f06" width="449" height="63"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para  cumplir con el requisito n&uacute;mero 1 necesitamos definir una norma para el grupo  gestion al que &Aacute;ngela pertenece:</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">CREATE  POLICY policy_gestion    <br>   ON  library.catalogue    ]]></body>
<body><![CDATA[<br>   FOR  ALL    <br>   TO  gestion    <br>   USING  (true);</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">De  esta forma miembros de este grupo tienen acceso a todas las filas de la tabla.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">You  are now connected to database &quot;library&quot; as user &quot;angela&quot;.  angela@library=&gt; SELECT * FROM library.catalogue ORDER BY item_id;</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Todas las reglas de acceso, tanto verticales como  horizontales, pueden visualizarse en un cliente (en este caso psql) con un  simple comando \dp. El resultado del comando est&aacute; dividido en 6 secciones, tres  identifican el objeto de base (Schema, Name y Type) y tres muestran en forma  compacta los privilegios definidos sobre el objeto: <a href="/img/revistas/rcci/v11n4/f0702417.jpg" target="_blank">Figura 7</a> </font></p>     <p><font size="2"><strong><font face="Verdana, Arial, Helvetica, sans-serif">Acces privileges</font></strong><font face="Verdana, Arial, Helvetica, sans-serif">: Son los privilegios verticales a nivel de tabla, privilegios que aparecen en esta secci&oacute;n son v&aacute;lidos para todas las columnas.</font></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Colum privileges</strong>: Son los privilegios verticales sobre columnas de la tabla.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Policies</strong>: Son los privilegios horizontales y definen  bajo cu&aacute;les condiciones se deben retornar  filas.</font> <a href="/img/revistas/rcci/v11n4/f0802417.jpg" target="_blank"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Figura 8</font></a> </p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Lo  primero que se ve es que a nivel de tabla el usuario charles tiene todos los  privilegios. El grupo gestion puede leer (r), a&ntilde;adir (a), modificar (w) y  borrar (d) filas de la tabla. Los privilegios cubren todos los campos.</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los dos grupos  de ventas, en cambio, pueden leer todos los campos de la tabla y solo modificar  el campo quantity, como se indica en la secci&oacute;n Column privileges. Las  indicaciones en Policies son las que se explicaron arriba y no requieren m&aacute;s  aclaraciones.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las Listas completas de todas las abreviaciones  usadas en la salida del comando se encuentran en la documentaci&oacute;n de PostgreSQL  (PostgreSQL Global Development Group, 2016), en varios libros de introducci&oacute;n general al  gestor de bases de datos (Eisentraut  and Helmle, 2011; Sch&ouml;nig, 2015; Riggs  et al., 2015; Ahmed  et al., 2015; Sch&ouml;nig, 2014) y en el compendio sobre autorizaci&oacute;n en  PostgreSQL (Clavadetscher, 2015). </font></p>     <p>&nbsp;</p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><B>CONCLUSIONES</B></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La  introducci&oacute;n de t&eacute;cnicas de seguridad a nivel de filas soluciona de forma  simple y elegante un problema que al crecer el n&uacute;mero de tablas en una base de  datos se agudiza fuertemente. Las principales ventajas en comparaci&oacute;n con el  modelo de soluci&oacute;n antiguo utilizando vistas como alternativa para el filtrado  de filas, se resumen en unos pocos puntos:</font></p> <ul>       <li>          <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Todo el control de  acceso a la tabla se define directamente sobre la tabla misma.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">No  se necesitan vistas u otros objetos adicionales con privilegios propios.</font></p>   </li>       <li>         ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La  implementaci&oacute;n en la base de datos de las normas es m&aacute;s eficiente.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El  mantenimiento del sistema es m&aacute;s sencillo, no se deben de gestionar diferentes  objetos con diferentes privilegios.</font></p>   </li>       <li>         <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Cambios en la tabla de base son visibles  inmediatamente.</font></p>   </li>     </ul>     <p>&nbsp;</p>     <p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><B>REFERENCIAS    BIBLIOGR&Aacute;FICAS</B></font>     <p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">Ibrar Ahmed, Asif Fayyaz, and Amjad Shahzad. <em>PostgreSQL Developer&rsquo;s Guide</em>. Packt Publishing, 1 edition, 2 2015. ISBN 9781783989027.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Charles Clavadetscher. <em>Autorizaci&oacute;n en PostgreSQL</em>. lulu.com, 1 edition, 2015. ISBN 9781326933241. http://www.lulu.com.</font></p>     ]]></body>
<body><![CDATA[<!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Paolo Corti, Thomas J. Kraft, Stephen V. Mather, and Bborie Park. <em>PostGIS Cookbook</em>. Packt Publishing, 1 edition, 2 2014. ISBN 9781849518666.    </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> Peter Eisentraut and Bernd Helmle. <em>PostgreSQL Administration</em>. O&rsquo;Really, 2 edition, 2011. ISBN 9783897216617.</font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Hannu Krosing, Jim Mlodgenski, and Kirk Roybal. <em>PostgreSQL Server Programming</em>. Packt Publishing, 1 edition, 6 2013. ISBN 9781849516983.    </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Regina Obe and Leo S. Hsu. <em>PostGIS In Action</em>. Packt Publishing, 2 edition, 2015. ISBN 9781617291395.    </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">PostgreSQL Global Development Group. <em>Row Security Policies</em>. 2015a. http://www.postgresql.org/docs/9.5/static/ddlrowsecurity.html.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">PostgreSQL Global Development Group. <em>System Information Functions</em>. 2015b. https://www.postgresql.org/docs/9.5/static/functions-info.html.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">PostgreSQL Global Development Group. <em>PostgreSQL 9.5 Documentation</em>. 2016. https://www.postgresql.org/files/documentation/pdf/9.5/postgresql-9.5-A4.pdf.</font></p>     ]]></body>
<body><![CDATA[<!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Simon Riggs, Hannu Krosing, Gianni Ciolli, and Gabriele Bartolini. <em>PostgreSQL 9 Administration Cookbook</em>. Packt Publishing, 2 edition, 4 2015. ISBN 9781849519069.    </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A. Rubinos and H. A. Nuevo. Seguridad en bases de datos. <em>Revista Cubana de Ciencias Inform&aacute;ticas</em>, 5(1), JanuaryMarch 2011.     </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Hans-J&uuml;rgen Sch&ouml;nig. <em>PostgreSQL Administration Essentials</em>. Packt Publishing, 1 edition, 10 2014. ISBN 9781783988983.    </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Hans-J&uuml;rgen Sch&ouml;nig. <em>Troubleshooting PostgreSQL</em>. Packt Publishing, 1 edition, 3 2015. ISBN 9781783555314.    </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Anthony R. Sotolongo Le&oacute;n and Yudisney Vazquez Ort&iacute;z. <em>PL/pgSQL y otros lenguajes procedurales en PostgreSQL</em>. lulu.com, 2 edition, 1 2017. ISBN 9781365689147. http://www.lulu.com.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Yudisney Vazquez Ort&iacute;z, Lisleydi Mier Pierre, and Anthony R. Sotolongo Le&oacute;n. Caracter&iacute;sticas no relacionales de postgresql: incremento del rendimiento en el uso de datos json. <em>Revista Cubana de Ciencias Inform&aacute;ticas</em>, 10(Especial Inform&aacute;tica 2016):70&ndash;81, January-March 2016.</font></p>     ]]></body>
<body><![CDATA[<p name="_ENREF_1">&nbsp;</p>     <p name="_ENREF_1">&nbsp;</p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Recibido: 09/02/2016    <br> Aceptado: 30/06/2017</font></p>      ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ahmed]]></surname>
<given-names><![CDATA[Ibrar]]></given-names>
</name>
<name>
<surname><![CDATA[Fayyaz]]></surname>
<given-names><![CDATA[Asif]]></given-names>
</name>
<name>
<surname><![CDATA[Shahzad]]></surname>
<given-names><![CDATA[Amjad]]></given-names>
</name>
</person-group>
<source><![CDATA[PostgreSQL Developer’s Guide.]]></source>
<year>2015</year>
<edition>1 edition</edition>
<publisher-name><![CDATA[Packt Publishing]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Clavadetscher]]></surname>
<given-names><![CDATA[Charles]]></given-names>
</name>
</person-group>
<source><![CDATA[Autorización en PostgreSQL.]]></source>
<year>2015</year>
<edition>1 edition</edition>
</nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Corti]]></surname>
<given-names><![CDATA[Paolo]]></given-names>
</name>
<name>
<surname><![CDATA[Kraft]]></surname>
<given-names><![CDATA[Thomas J.]]></given-names>
</name>
<name>
<surname><![CDATA[Mather]]></surname>
<given-names><![CDATA[Stephen V.]]></given-names>
</name>
<name>
<surname><![CDATA[Park]]></surname>
<given-names><![CDATA[Bborie]]></given-names>
</name>
</person-group>
<source><![CDATA[PostGIS Cookbook.]]></source>
<year>2014</year>
<edition>1 edition</edition>
<publisher-name><![CDATA[Packt Publishing]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Eisentraut]]></surname>
<given-names><![CDATA[Peter]]></given-names>
</name>
<name>
<surname><![CDATA[Helmle]]></surname>
<given-names><![CDATA[Bernd]]></given-names>
</name>
</person-group>
<source><![CDATA[PostgreSQL Administration.]]></source>
<year>2011</year>
<edition>2 edition</edition>
<publisher-name><![CDATA[O’Really]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B5">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Krosing]]></surname>
<given-names><![CDATA[Hannu]]></given-names>
</name>
<name>
<surname><![CDATA[Mlodgenski]]></surname>
<given-names><![CDATA[Jim]]></given-names>
</name>
<name>
<surname><![CDATA[Roybal]]></surname>
<given-names><![CDATA[Kirk]]></given-names>
</name>
</person-group>
<source><![CDATA[PostgreSQL Server Programming.]]></source>
<year>2013</year>
<edition>1 edition</edition>
<publisher-name><![CDATA[Packt Publishing]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B6">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Obe]]></surname>
<given-names><![CDATA[Regina]]></given-names>
</name>
<name>
<surname><![CDATA[Leo]]></surname>
<given-names><![CDATA[S]]></given-names>
</name>
</person-group>
<source><![CDATA[Hsu. PostGIS In Action.]]></source>
<year>2015</year>
<edition>2 edition</edition>
<publisher-name><![CDATA[Packt Publishing]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B7">
<nlm-citation citation-type="">
<collab>PostgreSQL Global Development Group.</collab>
<source><![CDATA[Row Security Policies.]]></source>
<year>2015</year>
</nlm-citation>
</ref>
<ref id="B8">
<nlm-citation citation-type="">
<collab>PostgreSQL Global Development Group.</collab>
<source><![CDATA[System Information Functions.]]></source>
<year>2015</year>
</nlm-citation>
</ref>
<ref id="B9">
<nlm-citation citation-type="">
<collab>PostgreSQL Global Development Group.</collab>
<source><![CDATA[PostgreSQL 9.5 Documentation.]]></source>
<year>2016</year>
</nlm-citation>
</ref>
<ref id="B10">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Riggs]]></surname>
<given-names><![CDATA[Simon]]></given-names>
</name>
<name>
<surname><![CDATA[Krosing]]></surname>
<given-names><![CDATA[Hannu]]></given-names>
</name>
<name>
<surname><![CDATA[Ciolli]]></surname>
<given-names><![CDATA[Gianni]]></given-names>
</name>
<name>
<surname><![CDATA[Bartolini]]></surname>
<given-names><![CDATA[Gabriele]]></given-names>
</name>
</person-group>
<source><![CDATA[PostgreSQL 9 Administration Cookbook.]]></source>
<year>2015</year>
<edition>2 edition</edition>
<publisher-name><![CDATA[Packt Publishing]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B11">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Rubinos]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
<name>
<surname><![CDATA[Nuevo]]></surname>
<given-names><![CDATA[H. A.]]></given-names>
</name>
</person-group>
<article-title xml:lang="es"><![CDATA[Seguridad en bases de datos.]]></article-title>
<source><![CDATA[]]></source>
<year>Janu</year>
<month>ar</month>
<day>yM</day>
<volume>5</volume>
<numero>1</numero>
<issue>1</issue>
</nlm-citation>
</ref>
<ref id="B12">
<nlm-citation citation-type="book">
<collab>Hans-Jürgen Schönig.</collab>
<source><![CDATA[PostgreSQL Administration Essentials.]]></source>
<year>2014</year>
<edition>1 edition</edition>
<publisher-name><![CDATA[Packt Publishing]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B13">
<nlm-citation citation-type="book">
<collab>Hans-Jürgen Schönig.</collab>
<source><![CDATA[Troubleshooting PostgreSQL.]]></source>
<year>2015</year>
<edition>1 edition</edition>
<publisher-name><![CDATA[Packt Publishing]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B14">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Sotolongo León]]></surname>
<given-names><![CDATA[Anthony R.]]></given-names>
</name>
<name>
<surname><![CDATA[Vazquez Ortíz]]></surname>
<given-names><![CDATA[Yudisney]]></given-names>
</name>
</person-group>
<source><![CDATA[PL/pgSQL y otros lenguajes procedurales en PostgreSQL.]]></source>
<year>2017</year>
<edition>2 edition</edition>
</nlm-citation>
</ref>
<ref id="B15">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Vazquez Ortíz]]></surname>
<given-names><![CDATA[Yudisney]]></given-names>
</name>
<name>
<surname><![CDATA[Mier Pierre]]></surname>
<given-names><![CDATA[Lisleydi]]></given-names>
</name>
<name>
<surname><![CDATA[Sotolongo León]]></surname>
<given-names><![CDATA[Anthony R.]]></given-names>
</name>
</person-group>
<article-title xml:lang="es"><![CDATA[Características no relacionales de postgresql: incremento del rendimiento en el uso de datos json.]]></article-title>
<source><![CDATA[]]></source>
<year>Janu</year>
<month>ar</month>
<day>y-</day>
<volume>10</volume>
<numero>Especial Informática 2016</numero>
<issue>Especial Informática 2016</issue>
<page-range>70-81</page-range></nlm-citation>
</ref>
</ref-list>
</back>
</article>
