Skip to content

2019_04 Actualización a PostgreSQL posterior a 10.2

Vladimir Támara Patiño edited this page Sep 3, 2020 · 1 revision

Desde PostgreSQL 10.3 se sugiere evitar el uso de public en el search_path como medida de seguridad que se explica en https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058%3A_Protect_Your_Search_Path

Por eso las copias de respaldo por omisión ejecutan:

SELECT pg_catalog.set_config('search_path', '', false);

Esto lo hicieron para mitigar que en instalaciones multiusuario un usuario con permiso de escritura en el esquema public cree allí funciones propias de PostgreSQL que puedan ser troyanos ejecutados por otros usuarios (incluyendo administradores).

Puede verse la ruta de búsqueda de objetos con:

 show search_path ;

Rails 5.2.3 con PostgreSQL no está siguiendo esta recomendación y suele establecer search_path en '$user, public'.

Sin embargo una aplicación rails que ejecute set search_path='' requerirá que se posteriormente se use explicitamente public. Tal es el caso de sip y otros motores sobre este en los que la semilla consta de volcados SQL que establecen search_path en '', así que de interrumpirse `db/seed.rb después de haber cargado los volcados:

(byebug) r=Sip::Grupo.connection.execute('show search_path')
#<PG::Result:0x00000487d11bf960 status=PGRES_TUPLES_OK ntuples=1 nfields=1 cmd_tuples=0>                                                                       
(byebug) r[0]
{"search_path"=>""}

Por lo mismo tras ejecutar rails db:seed' el entorno donde operá queda con search_pathen '' y no operan partes que requieran public ensearch_pathtales comodb:migrate`. Por eso no está operando:

bin/rails db:drop db:create db:setup db:migrate

(pues db:setup implicitamente ejecuta db:seed) Pero si opera:

bin/rails db:drop db:create db:setup
bin/rails db:migrate

En sip y motores y aplicaciones desarrollados por Pasos de Jesús, procuraremos no asumir que public está en search_path y emplear de forma explícita public. al llamar objetos que están en ese esquema y emplear pg_catalog de manera explícita para funciones del sistema.

Típicamente deben hacerse cambios en:

  • bin/gc.sh para separar db:setup y/o db:seed de db:migrate
  • db/seed.rb o test/dummy/db/seed.rb para cambiar usuario por public.usuario
  • Cambiar uso de tablas sin esquema para agregar public por ejemplo en db/cambia-basicas.sql y db/datos-basicas.sql
  • Buscar usos de SQL en la aplicación. Ha resultado útil:
find . -exec grep -e DELETE -e CREATE -e FROM -e INSERT -l {} ';'
Clone this wiki locally