sexta-feira, janeiro 18, 2013

MapServer e PostGIS: procedimentos para uma conexão segura

A conexão entre  o MapServer e o PostGIS é feita através de uma string de conexão, permitindo que qualquer pessoa que tenha acesso ao Mapfile possa ver os parâmetros de acesso ao Banco de Dados, imaginem isto nas mãos de uma pessoa mal intencionada. A mesma poderia realizar qualquer ação no BD, desde de alterar registros, ou até mesmo apagar todos os dados.

Para impedir que isso aconteça, pode ser criada uma role de acesso com permissão apenas de leitura, desta forma não haveria problema da string de conexão cair em mãos erradas.

Para criar a regra, temos que acessar o Banco de Dados da aplicação e digitar as seguintes instruções SQL:
-- Criando o usuário webgis:
CREATE USER webgis WITH PASSWORD '--123456--';
-- Removendo todos os privilégios 
-- deste usuário no esquema public:
REVOKE ALL PRIVILEGES ON SCHEMA public FROM webgis;
-- Dando permissão apenas de leitura (SELECT) 
-- no esquema public a este usuário:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO webgis;

OBS: em versões mais antigas do PostgreSQL não é possível definir uma role para todo o esquema, sendo necessário setar tabela por tabela as permissões do usuário criado.

Para que uma mesma string de conexão possa ser aproveitada em mais de uma camada, pode ser utilizado o recurso INCLUDE no mapfile que contém o(s) layer(s):

LAYER
  NAME 'rodovias'
  TYPE LINE
  STATUS DEFAULT
  CONNECTIONTYPE postgis
  #--- Include com os parâmetros da conexão ----
  INCLUDE 'conn.map'

  DATA 'geom FROM rodovias USING UNIQUE gid USING srid=29185'

    CLASS
      NAME 'Rodovias' 
        STYLE
          WIDTH 1.96 
          COLOR 255 0 0
        END
    END
END

e no conteúdo do arquivo conn.map, colocamos a string de conexão:
CONNECTION "dbname='atlas' host=localhost 
         port=5432 user='webgis' password='--123456--'"

Caso seja do interesse do desenvolvedor, a string de conexão também pode ser criptografada com o utilitário msencrypt, aumentando ainda mais a segurança:

Pelo Terminal, entre na pasta da aplicação e digite:
msencrypt -keygen mykey.txt
Em seguida criptografe a string de conexão:
msencrypt -key mykey.txt "dbname='atlas' host=localhost port=5432 user='webgis' password='--123456--'"

#--- Resultado mostrado no Terminal (string criptografada) ---
93E8501D65EA2F92A5C7E6E1412F834F8652B7727F6464087F97B0C6FB5CE23369F5DD2A301A94CB857E61D3EE2F68A03CE0DE2953F13F07DD77159274563E83D74942FB7861534C
No início do mapfile, é definido o objeto CONFIG MS_ENCRYPTION_KEY:
MAP
  NAME "Exemplo"
  EXTENT 258948 9180428 301662 9206961  
  SIZE 600 600
  UNITS meters
  # path até o arquivo mykey.txt, gerado anteriormente:
  CONFIG MS_ENCRYPTION_KEY "mykey.txt"
  .
  .
  .


Por último, abra o arquivo conn.map e substitua a string atual pela criptografada (sem quebras de linha):
CONNECTION "{
             93E8501D65EA2F92A5C7E6E1412F834F8652B7727F64640
             87F97B0C6FB5CE23369F5DD2A301A94CB857E61D3EE2F68
             A03CE0DE2953F13F07DD77159274563E83D74942FB7861534C
            }"

Mesmo (sendo pouco provável) que a string possa ser descriptografada, ainda assim o acesso ao Banco de Dados é realizado por uma role que só consegue realizar SELECT. Desta forma estamos garantindo um acesso "blindado" ao BD.

Nenhum comentário: