IBMBluemixDesenvolvananuvememumclique!
Comeceseutrialgratuito
developerWorksBrasil
ItensTcnicos
Softwarelivre
Bibliotecatcnica
SeguranaTotalemumBancodeDadosPostgreSQL
Disponibilidadeparaoprimeiroataque
[Link],
vocarriscaexporinformaessensveissobresuaempresaou,piorainda,[Link]
artigo,aprendasobremedidasdeseguranaquevocpodetomarparaprotegerseubancodedadosPostgreSQL.
RobertBernieranalistadePostgreSQLBusinessIntelligencenaMedioSystems,queldernatecnologiaemergentedepesquisade
[Link],incluindotelefonescelulares,WallStreet,
centrosdepesquisacientfica,contratadosdadefesadosEUA,[Link]
defensordoPostgreSQLeescreveuparaSysAdmin,Hakin9,PHPSolutions,[Link],[Link],
PHPMagazine,LinuxWeeklyNewseoportaldaWebO'[Link]
mantmopglive,[Link]
dosincrveisrecursosdoPostgreSQL.
16/Dez/2009
Introduo
Existemmuitashistriasnaimprensasobrecrackersacessandobancosde
[Link]
[Link],acolheitadedadosumgrande
negcioerealizadoporespecialistasdedicadosquetrabalhamdentrode
[Link]
evitaratentativadeacessonoautorizadavocnopodemas,em
vezdisso,comovocpodereduziroefeitoquandoeleocorrer.
Esteartigoexploraosdesafiosdeprotegerseuservidordebanco
dedadosPostgreSQL(tambmconhecidocomoPostgres).O
PostgreSQLumpoderososistemadebancodedadosrelacional
[Link]
comreputaoparaconfiabilidade,integridadededadose
[Link]
operacionais,incluindoLinux,UNIX,[Link]
completamentecompatvelcomoACID,etemsuportecompleto
parachavesestrangeiras,junes,visualizaes,acionadorese
procedimentosarmazenados(emvriosidiomas).
Certifiquesedefazerodownloaddaslistasdecdigodeamostra
usadasnesteartigo.
Desenvolvaeimplemente
seuprximoaplicativona
plataformadeclouddo
IBMBluemix.
Comeceseu
trialgratuito
Definies
HackerUmhackerexplora,investigae
descobrepormeiodoentendimentoda
tecnologiaemumnvelraramente
[Link]
chamadodehackerporseuscolegas
umamedalhadehonranoporquevoc
fazalgumacoisaruim,masporqueseu
conhecimentonotemparalelo.
CrackerUmhackercomminteno,
comovandalismo,fraudeemcartode
crdito,roubodeidentidade,piratariaou
outrostiposdeatividadeilegal.
Oadministradorideal
NagrandetradiodoUNIX,[Link]
[Link]
demandatipicamenteesperadadoadministradordebancodedadosmdio(DBAaveragedatabase
administrator).
Resumidamente,oDBAdePostgreSQLidealtemoseguinteconhecimento:
ConhecedordateoriarelacionalefamiliarizadocomoSQL92,99e2003,respectivamente.
Conhececomolercdigodeorigem,preferencialmenteC,epodecompilarcdigodeorigemnoLinux.
PodeadministrarsistemaesesenteconfortvelcomosystemVUNIXouLinux.
Podemanter,senecessrio,osvriositensdehardwaretipicamenteencontradosemumalojadeTI.
EntendeacamadaTCPOS,podecriarumasubredeemumarede,ajustarfirewalls,etc.
MuitosDBAspossuemsomenteashabilidadesparaadministrar,monitorareajustaroprpriobancode
[Link],[Link]
quedominetodasessasdisciplinas,masteresseconhecimentopossibilitaaoDBAdoPostgreSQL
realizarmaisemmenostempodoqueseriapossveldeoutraforma.
Revisodosprivilgiosdeacesso
Conheceroqueumafunodebancodedadosfazfundamentalsevocirapreciarpossveisvetores
[Link],vocprecisacontrolaroacessoaosdadosconcedendoerevogandopermisses.
Funes,econcessodedireitoseprivilgios
Oquoseguraumafunocomumcomdireitoseprivilgiospadro?Acontadousuriopodeser
criadacomumdosseguintescomandos:
AinstruoSQLCREATE USER
AinstruoSQLCREATE ROLE
OutilitriodelinhadecomandosPostgrescreateuser
Essestrsmtodosdecriaodecontasdeusuriosecomportamdemaneiradiferente,eresultamem
direitoseprivilgiospadrodrasticamentediferentes.
Paraumafunocomum,ousuriotpicopode:
Acessarqualquerbancodedadosseoclusterdedadosusarapolticadeautenticaopadro
conformedescritoempg_hba.conf.
CriarobjetosnoesquemaPUBLICdequalquerbancodedadosqueousuriopuderacessar.
Criarobjetosdesesso(temporrios)emsessestemporrias,comoschemapg_temp_?
Alterarparmetrosdetempodeexecuo.
Criarfunesdefinidaspelousurio.
ExecutarfunesdefinidaspelousuriocriadasporoutrosusuriosnoesquemaPUBLIC(desdeque
elesinterajamsomentecomobjetosaosquaisousurioobteveprivilgiosconcedidosparaacessar).
importantesaberoqueousuriotempermissoparafazer,masigualmenteimportanteentenderas
[Link]:
Criarumbancodedadosouumesquema.
Criaroutrosusurios.
Acessarobjetoscriadosporoutrosusurios.
Efetuarlogin(aplicasesomenteinstruoCREATE ROLE).
Direitoseprivilgiosdesuperusurios
Apesardeumusuriocomumnopoderexecutarosdireitoseprivilgiosdefinidoscomorecursosde
superusurio,ousuriocomumaindapodecausarumpoucodesofrimentocomdireitoseprivilgios
padro.
Estaseodiscuteosvetoresdeataquequeousuriocomumpodemanipular.
Acessandoobjetos
UmaprticaextremamentecomumeinseguraocorrequandooPostgreSQLusadocomoobackend
[Link]
comandosquemanipulamosdadosusandooscomandosINSERT,UPDATE,[Link],aes
[Link],por
exemplo,[Link]
eacionadores,salvandodadosemtabelaslocalizadasnoesquemaPUBLIC,quepodementoser
colhidos.
Lembrese,umacontadeusuriocomprometidapodefazerqualquercoisaquedesejeaosobjetosque
possui.
Contornarestaameaafcil:nodeixequeacontadeusuriocomumpossuaoucrienada.ALista1
mostracomoassegurarumatabela.
[Link]
postgres=# SET SESSION AUTHORIZATION postgres;
SET
postgres=# CREATE ROLE user1 WITH LOGIN UNENCRYPTED PASSWORD '123';
CREATE ROLE
postgres=# CREATE SCHEMA user1 CREATE TABLE t1(i int);
CREATE SCHEMA
postgres=# INSERT INTO user1.t1 VALUES(1);
INSERT 0 1
postgres=# GRANT USAGE ON SCHEMA user1 TO user1;
GRANT
postgres=# SELECT I FROM user1.t1;
i
--2
(1 row)
postgres=# SET SESSION AUTHORIZATION user1;
SET
postgres=> SELECT I FROM user1.t1;
ERROR: permission denied for relation t1
postgres=> SET SESSION AUTHORIZATION postgres;
SET
postgres=# GRANT SELECT ON user1.t1 TO user1;
GRANT
postgres=# SET SESSION AUTHORIZATION user1;
SET
postgres=> SELECT I FROM user1.t1;
i
--2
(1 row)
ALista2demonstrainterdiodeacessoaoesquemaPUBLIC.
Lista2.Evitandoqueouser1dafunocriequaisquerentidades
postgres=> SET SESSION AUTHORIZATION postgres;
SET
postgres=# REVOKE ALL PRIVILEGES ON SCHEMA PUBLIC FROM user1;
REVOKE
postgres=# SET SESSION AUTHORIZATION user1;
SET
A mensagem de erro "ERRO:
permisso negada para user1 do esquema" significa que esta medida defensiva funciona:
postgres=> CREATE TABLE X();
ERROR: permission denied for schema user1
Acessandoobjetossobocontroledeoutrosusurios
Estevetordeataque,mostradonaLista3abaixo,assumequeousuriotemacessoaoesquema
PUBLICporexemplo,GRANT USAGE ON SCHEMA PUBLIC TO [Link]
suposies:
Todososusuriostem,porpadro,permissoparaseconectaraqualquerbancodedadosnocluster.
Clustersdeposturapermitemaosusuriosacapacidadedecriaremanipulartodasasentidadesno
esquemaPUBLIC.
[Link],aconta
dousurionopodefuncionaradequadamente(intrnsecoaocomportamentodoservidorPostgreSQL).
[Link]
postgres=> SELECT * FROM user1.t2;
ERRO: permisso negada para relao t2
postgres=> inserir nos valores de user1.t2 (10);
ERRO: permisso negada para relao t2
postgres=>
postgres=> \d
Lista de relaes
Esquema | Nome | Tipo | Proprietrio
--------+------+-------+---------user1 | t1 | tabela | postgres
user1 | t2 | tabela | postgres
(2 linhas)
postgres=> \d t?
Tabela "user1.t1"
Coluna | Tipo | Modificadores
--------+---------+----------i
| nmero inteiro |
Tabela "user1.t2"
Coluna | Tipo | Modificadores
--------+---------+----------i
| nmero inteiro |
Apesardenoserpossvelacessaratabela,ousurioaindapodereunirinformaessobreela.
ALista4mostraacontadeusuriouser1obtendoumalistadecontasdeusurioesuasrespectivas
propriedades,[Link].
[Link]
postgres=> select * from pg_user;
usename | usesysid | usecreatedb | usesuper | usecatupd | passwd | valuntil | useconfig
----------+----------+-------------+----------+-----------+----------+---------postgres | 10 | t | t | t | ******** | |
user1 | 18770 | f | f | f | ******** | |
(2 rows)
Todososusuriospossuemahabilidadepadrodeaprenderasdefinieseoesquemadocluster.
ALista5mostraumscriptquereneinformaessobreoesquemadedefiniointeirodoclusterpor
[Link],ou"raqueados",pelo
superusurio,mitigandoassimestaameaa.
[Link]
#!/bin/bash
psql mydatabase << _eof_
set search_path=public,information_schema,pg_catalog,pg_toast;
\t
\o [Link]
SELECT [Link]||'.'||[Link] as "Table Name"
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_roles r ON [Link] = [Link]
LEFT JOIN pg_catalog.pg_namespace n ON [Link] = [Link]
WHERE [Link] IN ('r','')
ORDER BY 1;
\q
_eof_
for i in $( cat [Link] ); do
psql -c "\d $i"
done
Criandoeacessandofunesdefinidaspelousurio
[Link]
dentrodocontextodobancodedados,comocriaodetabelas,ndices,inclusoouremoodedados,
[Link],socapazesdeafetaro
mundorealtambm,comoalistadecontedodeumdiretrio,criao,ouexclusodearquivos,
chamadadeprocessosdosistemaemesmocriaodeconexesdesoqueteparaoutroshosts.
Lista6.Incluindolinguagensproceduraisemumbancodedadoserestaurandoacessoaouser1
postgres=# create language plpgsql;
CREATE LANGUAGE
postgres=# create language plperlu;
CREATE LANGUAGE
postgres=# create language plperl;
CREATE LANGUAGE
postgres=> SET SESSION AUTHORIZATION postgres;
SET
postgres=# GRANT USAGE ON SCHEMA PUBLIC TO user1;
GRANT
[Link]
postgres=# select lanname as language, lanpltrusted as trusted from pg_language;
language | trusted
----------+--------internal | f
c
|f
sql
|t
plperlu | f
plperl | t
(5 rows)
Diferentementedastabelas,acontadeusuriononecessitadepermissesespeciaisaochamara
funodealgumaoutrapessoa,mesmoseelasforamcriadaspelosuperusurio.
[Link]
postgres=# SET SESSION AUTHORIZATION postgres;
SET
postgres=# CREATE OR REPLACE FUNCTION public.f1 (
postgres(# OUT x text
postgres(# ) AS
postgres-# $body$
postgres$# select 'hello from f1()'::text;
postgres$# $body$
postgres-# LANGUAGE SQL;
CREATE FUNCTION
postgres=# SET SESSION AUTHORIZATION user1;
SET
postgres=>
postgres=> SELECT * FROM f1();
x
----------------hello from f1()
(1 row)
[Link]
[Link],
[Link]
revogandooprivilgio.
[Link]
postgres=> SET SESSION AUTHORIZATION postgres;
SET
postgres=# CREATE OR REPLACE FUNCTION public.f2 (
postgres(# OUT x text
postgres(# ) AS
postgres-# $body$
postgres$# # emite contedo do diretrio-raiz em sada padro
postgres$# # observe o uso das aspas simples
postgres$# $a = `ls -l / 2>/dev/null`;
postgres$# $message = "\nAqui est a lista de diretrios\n".$a;
postgres$# return $message;
postgres$# $body$
postgres-# LANGUAGE PLPERLU;
CREATE FUNCTION
postgres=# SET SESSION AUTHORIZATION user1;
SET
postgres=> SELECT * FROM f2();
x
---------------------------------------------------------------------------Aqui est a lista de diretrios
total 120
drwxr-xr-x 2 root root 4096 Aug 29 07:03 bin
drwxr-xr-x 3 root root 4096 Oct 11 05:17 boot
drwxr-xr-x 3 root root 4096 Nov 26 2006 build
lrwxrwxrwx 1 root root 11 Aug 22 2006 cdrom -> media/cdrom
drwxr-xr-x 15 root root 14960 Oct 12 07:35 dev
drwxr-xr-x 118 root root 8192 Oct 12 07:36 etc
(1 row)
Lista10.Assegurandoouser1eogrupoPUBLIC
postgres=# SET SESSION AUTHORIZATION postgres;
SET
postgres=# REVOKE ALL ON FUNCTION f2() FROM user1, GROUP PUBLIC;
REVOKE
postgres=# SET SESSION AUTHORIZATION user1;
SET
postgres=> SELECT * FROM f2();
ERROR: permission denied for function f2
postgres=>
ALista11envolvereuniodeinteligncia.
[Link]
postgres=> SET SESSION AUTHORIZATION user1;
SET
postgres=> select prosrc as "function f3()" from pg_proc where proname='f3';
function f3()
--------------# emite o contedo do diretrio-raiz na sada padro
# observe o uso das aspas simples
$a = `ls -l / 2>/dev/null`;
$message = "\nAqui est a lista de diretrios\n".$a;
return $message;
(1 row)
Paraocultarocdigodeorigem:
Escrevaasuafunocomoummduloemseuambientedelinguagemnativa(C,Perl,Python,etc.)e
[Link]
PostgreSQLquechameomdulo.
Consideregravarocdigodeorigememumatabelaedinamicamentecriarsuafunoconformefor
necessrio.
Gravesuafunodefinidapelousurioemoutrobancodedadosnocluster,queentochamadapor
umacontadeusurioautorizadausandoomdulodblink.
Usandoosecuritydefiner
[Link],umusuriopode
acessarumatabelaque,sobcircunstnciasnormais,estindisponvel.
Porexemplo,comomostradonaLista12,umatabelacomduascolunascriadanoesquemaPostgres
[Link],user1,invocarumafunousandooparmetro
securitydefinereobterumvalorcombaseemumvalordeentrada.
[Link]
postgres=# SET SESSION AUTHORIZATION postgres;
SET
postgres=# CREATE TABLE postgres.t4(x serial,y numeric);
NOTICE: CREATE TABLE will create implicit sequence "t4_x_seq" for serial column "t4.x"
CREATE TABLE
postgres=# INSERT INTO postgres.t4(y) VALUES (random()::numeric(4,3));
INSERT 0 1
postgres=# INSERT INTO postgres.t4(y) VALUES (random()::numeric(4,3));
INSERT 0 1
postgres=# INSERT INTO postgres.t4(y) VALUES (random()::numeric(4,3));
INSERT 0 1
postgres=# INSERT INTO postgres.t4(y) VALUES (random()::numeric(4,3));
INSERT 0 1
postgres=# INSERT INTO postgres.t4(y) VALUES (random()::numeric(4,3));
INSERT 0 1
postgres=# CREATE OR REPLACE FUNCTION public.f4 (
postgres(# IN a int,
postgres(# OUT b numeric
postgres(# ) RETURNS SETOF numeric AS
postgres-# $body$
postgres$# select y from postgres.t4 where x=$1 limit 1;
postgres$# $body$
postgres-# LANGUAGE SQL SECURITY DEFINER;
CREATE FUNCTION
ALista13mostraqueacontadeusuriouser1agorapodeacessarasinformaesdesejadas.
[Link]
postgres=# SET SESSION AUTHORIZATION user1;
SET
postgres=> SELECT b as "my first record" FROM f4(1);
my first record
----------------0.379
(1 row)
postgres=> SELECT b as "my second record" FROM f4(2);
my second record
-----------------0.200
(1 row)
InvadindoasenhadoPostgreSQL
[Link]
[Link]
[Link]
possuempelomenosseiscaracteresesomudadasfrequentemente.
ContasesenhasdeusuriodoPostgreSQL
ApolticadeseguranadacontadeusuriodoPostgreSQLcentradanoscomandosSQLquecriame
administramacontadousurio:
CREATE ROLE
ALTER ROLE
DROP ROLE
AsseguintesinstruesSQLpertencemaoantigoestilodeadministraodecontadeusurio(apesar
devlido,vocdeveusaratcnicamaisnovadegerenciamentodeusurioscomofunes):
CREATE GROUP
ALTER GROUP
DROP GROUP
CREATE USER
ALTER USER
DROP USER
[Link]
[Link]
geraoearmazenamentodeseuhashMD5,[Link]
momentodologinaoexecutarhashecomparlacomoquejfoiarmazenadonoclusterdedados.
Abaixoestoalgumaschamadasdeexemploquecriameadministramasenha:
Umacontacriadasemumasenha:
CREATE ROLE user1 WITH LOGIN;
Umacontacriadacomumasenhadescriptografada:
CREATE ROLE roger WITH LOGIN UNENCRYPTED PASSWORD '123'
Umacontaalteradaeumasenhacriptografadadesignadaaela:
ALTER ROLE user1 WITH ENCRYPTED PASSWORD '123'
AexecuodeumaconsultaSQLpelosuperusurioemrelaotabeladecatlogospg_shadow
retornaonomedacontadousurioesuasenha.ALista14mostraocdigo.
[Link]
postgres=# select usename as useraccount,passwd as "password" from pg_shadow where
length(passwd)>1 order by usename;
useraccount | password
-------------+------------------------------------user1 | md5173ca5050c91b538b6bf1f685b262b35
roger | 123
(2 rows)
ALista15mostracomopossvelgerarohashMD5parauser1comasenha123.
Lista15.GerandoumasenhaMD5
postgres=# select 'md5'||md5('123user1') as "my own generated hash",
passwd as "stored hash for user1"
from pg_shadow where usename='user1';
my own generated hash | stored hash for user1
-------------------------------------+------------------------------------md5173ca5050c91b538b6bf1f685b262b35 | md5173ca5050c91b538b6bf1f685b262b35
(1 row)
Prontoparaoutrosusto?ExistemalgunspoucosmecanismosdentrodoPostgreSQLquepodemimpor
umapolticadesenhablindada.
Aspossveislimitaesdeseguranaincluem:
Osuperusurionopodeimporumnmeromnimodecaracteresaserusadoparaasenha.
Apesardehaverumparmetropadronasdefiniesdaconfiguraoparacomoasenhadevaser
armazenada(descriptografadaoucriptografadacomumhashMD5),ousurionopodeserforado
usarummtodosdearmazenamentoparticularpelosuperusurio.
Noexistenenhummecanismoqueimponhaumtempodevidacontadousurio.
Omecanismoquecontrolaotempodevidaefetivodasenhadacontadousuriosetornairrelevante
quandoomtododeconexonoPASSWORDouMD5noarquivodeconfiguraodeautenticao
declientedocluster,pg_hba.conf.
OsparmetrosdetempodeexecuodousurioquesoalteradospelainstruoALTER ROLEeque
foramconfiguradospelosuperusuriooupelasdefiniesdeconfiguraoestabelecidasporpadrono
[Link],podemseralteradospeloproprietriodacontadousuriovontade.
Renomearumacontadeusuriolimpasuasenhaseelafoicriptografada.
Nopossvelcontrolarquemfezasmudanasnascontasdeusurioouquandoessasmudanas
ocorreram.
UmaarquiteturaagressivacomediocuidadosadoscatlogosdosistemapodemrecompensaroDBA
vigilante.
Devidoaofascinantepotencialparadanos,aslimitaesdeseguranadascontasesenhasdeusurio
valemoutroartigoseparado.
Invadindoasenha
Imporumasenhaforteumametadigna,massimplesmentenohcomojulgarsuaforaatque
[Link],comoaseguir.
Forabruta
[Link],aumentandoemcomprimentomedida
[Link].
Ataquesdedicionrio
[Link],usadopeloutilitriodeinvaso,
[Link],combinaesdessaspalavrassogeradasetestadasemrelaoao
[Link]
queconsistaemumacombinaomnemnicadecadeiasecaracteresmaisseguradoqueum
comprimentoumpoucomaiscurtodecadeiasecaracteresescolhidosaleatoriamente.
Dependendodaforadasenhaedohardwareusado,ainvasopodeocorreremalgunspoucos
segundosatvriosmeses.
OsDBAsestointeressadosemidentificarsenhascommenosdeseiscaracteresdecomprimento.
[Link]
funcionabememLinuxsobWine.
Inserirwine [Link] --[Link]
mostradosabaixo:
Usage: MDCrack [options...] --test-hash|hash
MDCrack [options...] --bench[=PASS]
MDCrack [options...] --resume[=FILENAME]|--delete[=FILENAME]
MDCrack [options...] --help|--about
Achamadadelinhadecomandosmaissimpleswine [Link] --algorithm=MD5 -append=$USERNAME $MD5_HASH,emque$USERNAMEonomedousurioe$MD5_HASHohashMD5
natabeladecatlogospg_shadow.
MDCrackpodeexecutaremmododesesso,comoaseguir,assimpossvelpararumaoperaode
invasoecontinuarposteriormente.
[Link]
# iniciar sesso
wine [Link] --algorithm=MD5 --append=$USERNAME $MD5_HASH\
--session=[Link]
# continuar o uso do ltimo modo de sesso
wine [Link] --algorithm=MD5 --append=$USERNAME $MD5_HASH\
--resume=[Link]
Oconjuntodecaracterespadro
[Link]
comumprocessoimensoseasenhacandidatainclusseumcaracterequenofizessepartedo
[Link]
[Link],vocpodedesejarincluircaracteresdecontrolee
pontuao.
[Link]$CHARSETrepresentao
conjuntorealdecaracteresqueserusado:
wine [Link] --algorithm=MD5 --append=$USERNAME $MD5_HASH --charset=$CHARSET
[Link]
[Link]
determinarasenhacomaseguintechamada(dica:grepparaacadeiadecaracteresCollision
found).Estainvasolevaaproximadamente0,32segundos:
wine [Link] --algorithm=MD5 --append=user1 173ca5050c91b538b6bf1f685b262b35\
| grep "Collision found"
ALista17demonstraainvasodasenhanosistemacatalogpg_shadow.
[Link]
wine [Link] --algorithm=MD5 --append=user1 \
`psql -t -c "select substring(passwd,4) from pg_shadow where usename='user1';"` \
| grep "Collision found"
Modelosdeautenticao
Agoraquevocviuoquepodedarerrado,horadeexploraroquevocpodefazerparafazeras
[Link],sendoassim,somenteobsicoserabordadoaqui.
Soboguardachuva"autenticao",existemmuitossignificadosdecontroledeacessoparaocluster
Postgres:
SoquetesdedomnioUNIX
AutenticaodeservidorIdent
AutenticaodeservidorLDAP
PAM
Kerberos
SSL
SoquetesdedomnioUNIX
UmsoquetededomnioUNIXumcanaldecomunicaobidirecionalqueremontaumarquivode
[Link]
[Link].
[Link]
robert@wolf:~$ ls -la /tmp|grep PGSQL
srwxrwxrwx 1 robert robert 0 2007-10-15 12:47 .[Link].5432
-rw------- 1 robert robert 33 2007-10-15 12:47 .[Link]
[Link]
portaTCP/IPdiferentetambmalteraonomedosoquetedodomnio.
[Link]
dedomnio:
unix_socket_directory(oarquivoPATH)
unix_socket_group(ogrupodeusurios)
unix_socket_permissions(assumecomopadro0777)
OlocaldodosoquetededomniovariadeacordocomadistribuioLinux:
OcdigodeorigemPostgreSQLinstalaecolocaosoquetenodiretrio/tmp.
OBSDlocalizaosoquetenodiretrio/tmp.
OsderivativosRedHatlocalizamosoquetenodiretrio/tmp.
OsderivativosDebianlocalizamosoqueteem/var/run/postgresqlcompermissessomenteparao
postgresqlaccount.
[Link]
exemplo.
Umclustercriadonodiretrioinicialderobert(superusurio)com
[Link],porm,
aspermissesdesoquetededomniopermitemlogin,exceto
[Link],masrecusado
[Link],robertpodeefetuarloginatravs
deumsoquetededomnioapsefetuarsudoparanobody.
Sudo
sudoumcomandopoderosocommuitas
possveisconfiguraesquepermitem
aosusuriosexecutarprogramascomos
privilgiosdeseguranadeoutrousurio
(normalmenteosuperusurioouraiz).
SimilaraocomandodoWindowsrunas.
Esteexemplomostraaversatilidadedaspermissesdearquivos,mitigandoosdanoscausadosporum
crackerquesetornesuperusurio.
[Link]
robert@wolf:~$ initdb -A trust -U postgres ~/data
robert@wolf:~$ pg_ctl -D ~/data/ -l ~/[Link] \
-o "-c unix_socket_permissions=007 -c unix_socket_directory=/tmp" start
server starting
robert@wolf:~$ psql -h localhost -U postgres -c "select 'superuser:this works' as msg"
msg
---------------------superuser:this works
(1 row)
robert@wolf:~$ psql -h /tmp -U postgres -c "select 'superuser:this fails' as msg"
psql: no foi possvel conectar-se ao servidor: Permisso negada
O servidor est executando localmente e aceitando
conexes no soquete de domnio Unix "/tmp/.[Link].5432"?
robert@wolf:~$ sudo su nobody
[sudo] password for robert:
$ psql -h localhost -U postgres -c "select 'nobody:this works' as msg"
msg
------------------nobody:this works
(1 row)
$ psql -h /tmp -U postgres -c "select 'nobody:this still works' as msg"
msg
------------------------nobody:this still works
(1 row)
Ident
OservidorIdentrespondeaumasimplespergunta:Qualusurioiniciouaconexoquesaidasuaporta
XeseconectaminhaY?NocontextodeumservidorPostgreSQL,informadooDBMSdaIdentidade
[Link]
epermiteounegapermissoparaloginseguindoumconjuntoderegrasconfiguradopeloDBAnos
arquivosdeconfiguraoapropriados.
OmecanismodeautenticaodoservidorIdentdoPostgreSQLfuncionamapeandoascontasde
usuriodoPostgreSQLparaascontasdeusuriodoUNIXusandooservidorIdentdoprpriohost.
OsexemplosaseguirassumemquetodasascontadeusuriodoUNIXforammapeadasno
PostgreSQLparapoderefetuarloginemqualquerbancodedados,desdequeelesusemomesmo
[Link]
deusurionoservidorPostgreSQL,ouseumatentativaforfeitaparaefetuarloginusandooutronome
decontadeusuriodoPostgreSQL.
~SuponhaquevoctenhaseconectadopormeiodeSSHnohost:ssh -l robert wolf.
[Link]
robert@wolf:~$ psql -U robert robert
Bem-vindo ao psql 8.2.4, o terminal interativo do PostgreSQL.
Digite: \copyright para termos de distribuio
\h para ajuda com comandos SQL
\? para ajuda com comandos psql
\g ou terminar com ponto e vrgula para executar consulta
\q para encerrar
robert@wolf:~$ psql -U postgres robert
psql: FATAL: Autenticao Ident falhou para usurio "postgres"
-- Isto funciona, su para se tornar o postgres da conta do usurio UNIX
OPostgreSQLusadoisarquivosparaadministrarecontrolartodasassessesdeloginparausurios
queforamautenticadospeloservidorIdent:
pg_hba.conf
Controlaoacessoatravsderegistrosquesodefinidosemumanicalinha.
pg_Ident.conf
[Link],
oMETHODidentificadocomoIdentnoarquivopg_hba.conf.
[Link]
Exemplo 1:
Uma conexo LOCALHOST impe que a conta unix robert acesse o banco de dados
robertexclusivamente. No existe autenticao nos soquetes de domnio UNIX.
(pg_hba.conf)
# TYPE DATABASE
USER
CIDR-ADDRESS
METHOD
OPTION
host
all
all
[Link]/32
Ident
mymap
local all
all
trust
(pg_Ident.conf)
# MAPNAME
Ident-USERNAME
PG-USERNAME
mymap
robert
robert
Exemplo 2:
Uma conexo do soquete de domnio impe que a conta unix robert acesse qualquer banco
de dados como conta pg robert;
postgres de conta unix podem acessar qualquer banco de dados como usurio robert.
(pg_hba.conf)
# TYPE DATABASE
USER
CIDR-ADDRESS
METHOD
OPTION
local all
all
Ident
mymap
host
all
all
[Link]/32
trust
(pg_Ident.conf)
# MAPNAME
Ident-USERNAME
mymap
robert
mymap
postgres
PG-USERNAME
robert
robert
Exemplo 3:
Uma conexo do soquete de domnio impe que a conta unix pode se conectar a qualquer
banco de dados com seu homnimo de banco de dados postgres usando a
palavra-chave "sameuser".
pg_Ident.conf no necessariamente aqui.
Conexes do host local atravs de TCP-IP so rejeitadas.
(pg_hba.conf)
# TYPE DATABASE
local template0,template1
host
all
USER
all
all
CIDR-ADDRESS
[Link]/32
METHOD
Ident
reject
OPTION
sameuser
Ex4:
(todos os usurios podem se conectar com seus prprios nomes de usurio somente
aos bancos de dados postgres e robert)
(pg_hba.conf)
# TYPE DATABASE
local template0,template1
USER
all
CIDR-ADDRESS
METHOD
Ident
OPTION
sameuser
Lembresedasseguintesadvertncias:
Asmudanasdeconfiguraotomamefeitoassimquevocrecarregaosarquivos,comopg_ctlD
myclusterreload.
[Link]
mensagensdeconfiguraofalhasnolog.
Identfoiprojetadoeimplementadoquandoasprpriasmquinasforamconsideradasseguras.
Qualquerservidorremotoqueprocureautenticaodeveserconsideradosuspeito.
OservidorIdentusadosomenteparaautenticarconexesdehostlocal.
Criptografiadedados
Existemmuitasmaneiraspelasquaisvocpodeseexporinadvertidamenteaumcrackerdentrodeuma
intranet.
[Link],
[Link]:tcpdump -i eth0 -X -s 3000 host [Link] and port 5432.
Emumhostremoto,[Link],vocseconectaaoPostgreSQLdohostlocal,quejest
atendendonaporta5432:psql -h [Link] -p 5432 -U postgres [Link]
senhadasuacontadesuperusurio,postgres:ALTER USER postgres WITH ENCRYPTED PASSWORD
'my_new_password';.
[Link]
[Link].323806 IP wolf.56336 > [Link]: P 598:666(68) ack 470 win 3068
<nop,nop,timestamp 9740679 9589666>
0x0000: 4500 0078 4703 4000 4006 6d88 c0a8 0264 E..xG.@.@.m....d
0x0010: c0a8 0240 dc10 1538 6a4f 7ada 6a71 e77c ...@...[Link].|
0x0020: 8018 0bfc 1a9d 0000 0101 080a 0094 a187 ................
0x0030: 0092 53a2 5100 0000 4341 4c54 4552 2055 ..S.Q...CALTER.U
0x0040: 5345 5220 706f 7374 6772 6573 2057 4954 [Link]
0x0050: 4820 454e 4352 5950 5445 4420 5041 5353 [Link]
0x0060: 574f 5244 2027 6d79 5f6e 6577 5f70 6173 WORD.'my_new_pas
0x0070: 7377 6f72 6427 3b00
sword';.
TneisSSHusandoredirecionamentodeporta
OredirecionamentodeIPumatecnologiadetunelamentoqueredirecionapacotesdaInternetdeum
[Link],comopsql,pgadmin,emesmo
openoffice,seconectemaoservidorPostgresremotocomumaconexoSSH.
Considereasseguintesquestes:
OqueacontecesenoexistirnenhumclientepsqlnoservidorPostgreSQLremoto?
Oqueacontecesevocprecisarfazeruploadoudownloaddedadosentresuaestaodetrabalhoeo
hostremoto?
Oquevocfazquandoprecisausarosclientesdobancodedadosporqueelespodemexecutarcertas
tarefasqueoclientepsqltambmnopodefazer,ouquenopodefazerdejeitoalgum?
Comofazerotunelamentodesuaredeparaqueasuaequipepossaseconectarremotamenteaum
bancodedadosprotegidoporumfirewall?
Esteexemploconectaumcliente(hostlocal)aumhostremoto([Link]).Umaconexocom
[Link],naconexocomaporta10000,
redirecionadoparaoservidorPostgreSQLdohostremoto,queestatendendonaporta5432:ssh -L
10000:localhost:5432 [Link].
Incluirocomutador-gpermitequeoutroshostsobtenhamvantagemdasuaconexoredirecionada,o
queatornaumaredeprivadavirtual(VPN)instantneaparaconexesPostgres:ssh -g -L
10000:localhost:5432 [Link].
Algumasadvertnciassobretunelamento:
Oclienteeoservidordobancodedadostmaimpressodequeestosecomunicandocomseu
prpriohostlocal.
Lembresedeconfiguraroarquivopg_hba.confparadefiniraautenticaocorretaparaasconexesdo
hostlocalusandoTCP/IP.
Portasabaixode1024soexclusivamentecontroladaspeloraiz.
SessesdeSSHnecessitamdeumacontadeusurioexistentenoservidorPostgreSQL/SSH.
SessescriptografadasporSSL
[Link]
tambmpossuemosrecursosdorequisito.
possvelespecificaroservidorusandooutilitriodelinhadecomandospg_config,comoaseguir.
pg_config --configure
ParaprepararoservidorPostgreSQLparasessescriptografadas:
1. Crieumachavedeservidorautoassinada([Link])eumcertificado([Link])usandoa
ferramentadelinhadecomandosOpenSSLopenssl.
1. Crieachavedoservidor:openssl genrsa -des3 -out [Link] 1024.
2. Removaapassphraseopenssl rsa -in [Link] -out [Link].
3. Crieumcertificadoautoassinadoparaoservidor:openssl req -new -key [Link] -x509
-out [Link].
2. Instaleosdoisarquivos,[Link],nodiretriodoclusterdedados.
3. [Link]:ssl = on.
4. Reinicieoservidor.
[Link]
robert@wolf:~$ psql -h [Link] -U robert
Bem-vindo ao psql 8.2.4, o terminal interativo do PostgreSQL.
Digite: \copyright para termos de distribuio
\h para ajuda com comandos SQL
\? para ajuda com comandos psql
\g ou terminar com ponto e vrgula para executar consulta
\q para encerrar
ConexoSSL(cdigo:DHERSAAES256SHA,bits:256)
robert=#
[Link],
possvelcontrolarocomportamentodoservidoreditandooarquivodeautenticaopg_hba.[Link]
ladodocliente,possvelcontrolarocomportamentopadrodocliente(psql)paraousodeuma
sessocriptografadaounopormeiodadefiniodavariveldeambientePGSSLMODE.
Existemseismodos(doisnovosmodossoespecficosdaV8.4).
Modo
Descrio
disable TentarsomenteconexesSSLdescriptografadas.
allow
Primeirotentaumaconexodescriptografadae,senoobtiverxito,umatentativade
conexoSSLfeita.
prefer
OopostodeallowaprimeiratentativadeconexoSSLeasegundadescriptografada.
require
OclientetentasomenteumaconexoSSLcriptografada.
verify
ca
UmaconexoSSL,ecertificadodeclientevlidoassinadoporumCAconfivel.
Verify
full
UmaconexoSSL,certificadodeclientevlidoassinadoporumCAconfivel,eonome
dohostdoservidorcorrespondenteaonomedohostdocertificado.
Porexemplo:export PGSSLMODE=prefer.
CertificadosSSL
AutenticaoSSLquandooclienteeoservidortrocamcertificadosqueforamassinadosporum
[Link]
certificao(CA).Aconexorecusadapeloservidoroupeloclientequandonorecebeumcertificado
legtimodooutro.
Apesardehavermuitosdetalhes,aconfiguraodeumaautenticaonoPostgreSQLusando
certificadosSSLdireta:
1. [Link],ssl=on.
Aautenticaodoladodoservidorprecisaqueosseguintesarquivosestejamemseuclusterde
dados:
[Link]
[Link](quedeveserassinadoporumCA)
[Link](verificaaautenticaodocliente)
[Link](listaderevogaodecertificado,opcional)
[Link]
certificadosdisponveisparaasuadistribuioparticular,quevocpodeincluir.
[Link]
[Link],[Link]
[Link].
Aautenticaodoladodoclienteprecisaqueosseguintesarquivosestejamnodiretrioinicialdo
cliente,~/.postgresql:
[Link]
[Link]
[Link](verificaaautenticaodoservidor)
[Link](listaderevogaodecertificado,opcional)
[Link],arquivodocliente,[Link],contmumalistadecertificados
[Link],[Link],opcionaleusado
pararevogarcertificadosdoservidor.
Aobtenodecertificadosrequerqueambos,clienteeservidor,tenhamenviadopedidosde
certificado,[Link],[Link]
geradosuasprpriaschavesprivadas,comoaseguir.
openssl req -new -newkey rsa:1024 -nodes -keyout [Link] -out [Link]
openssl req -new -newkey rsa:1024 -nodes -keyout [Link] -out [Link]
[Link]
exemplo,possvelcolocarumtempodevidaneles,oupossvelgerloscomcertificadosauto
assinadoseeliminaranecessidadedeumCA.
2. [Link]:
[Link].
[Link].
[Link],
respectivamente.
3. [Link]
[Link].
[Link] -newca(criaranovaCA)
[Link] -newreq(criarumpedidodecertificadocomumachaveprivada)
[Link] -signreq(assinaropedidodecertificadopeloCAquevoccriou)
Paraospuristasdosoftwarelivre,sempreho[Link]
[Link]
-----BEGIN CERTIFICATE----MIIC9TCCAl6gAwIBAgIJAMuhpY+o4QR+MA0GCSqGSIb3DQEBBQUAMFsxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQxFDASBgNVBAMTC0NvbW1vbiBOYW1lMB4XDTA3MDIxMjEy
MjExNVoXDTA3MDMxNDEyMjExNVowWzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNv
bWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIG
A1UEAxMLQ29tbW9uIE5hbWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKA4
nX/eBKsPJI1DmtH2wdJE9uZf+IRMUWYrAEDL4F6NEuo2+BsIoOBKS/rrV77Itet9
kduJCQ6k/z2ouAVb4muXpJALDjJpYBXt9wqZf+2p1n9dqDw1rCWBjXIdhOcA3DDv
u0Ig1FUfm8GS97evxM5IJBECRnK/5JZroXCRSHcpAgMBAAGjgcAwgb0wHQYDVR0O
BBYEFElEWNUCV+61itXp86czrDe35vjrMIGNBgNVHSMEgYUwgYKAFElEWNUCV+61
itXp86czrDe35vjroV+kXTBbMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1T
dGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRQwEgYDVQQD
EwtDb21tb24gTmFtZYIJAMuhpY+o4QR+MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN
AQEFBQADgYEAaFzbUmXcWVzqaVeEpZkNwF/eVh110qIUUxXGdeKZGNXIyK67GCUY
SG/IFkZ/hrGLeqElLrdmU0mHd2Enq2IuvhxnsOVTTickjKospJvlHPYSumkXx0Xp
zey9PhjLh1chpxNGTATKb8ET8YZvBRrDHl/EMPIjLd62iSR/ugFe8go=
-----END CERTIFICATE-----
4. Supondoquevocgeroucertificadosautoassinados,[Link].
[Link]
cliente.
5. Monitoreasmensagensdelognareinicializaodoservidorparaconfirmarquetudoestconfigurado
corretamente.
[Link]
denomesssl_ciphers='NULL'[Link]
comcuidadoconfigurarssl_ciphersparaNULLefetivamentedesativaacriptografia.
Concluso
Nesteartigo,vocaprendeualgunsfundamentossobreaproteodoservidordoseubancodedados
[Link],masnopossvelabordarmuitostpicos
[Link],comum
poucodasuaajuda,possamosaprendermaissobreaseguranadoPostgreSQL.
Download
Descrio
Nome
Tamanho
Samplecode
ospostgresecuritylistings_src_code.zip
10KB
Recursos
Aprender
ProgramaGlobalde
EmpreendedorismodaIBM
Confiraotutorial"SeguranaTotalemumBancodeDadosPostgreSQL,"
quesebaseiaemumasriedeartigosdoautor.
Faapartedoprogramaque
buscaporempreendedoresque
ajudamamodificaramaneira
comoomundofunciona.
LeiaaDocumentaodoPostgreSQLV8.3.8.
DemosIBMBluemix
Consulte[Link]
NoWikipedia,saibamaissobresoquetesdedomnioUNIXprotocoloIdent,
umprotocolodaInternetqueajudaaidentificarousuriodeumaconexo
TCPparticulareautoridadedecertificao.
Obtenhatodaasasnotcias,FAQ,documentos,origememaisparaoProjeto
OpenSSL.
Obtenhavriascorreesparaosprogramastcpdumpelibpcap.
Saibamaissobreredirecionamentodeporta,outunelamento,para
redirecionartrfegoTCPsemseguranaatravsdoSSHSecureShell.
Paraouvirentrevistasediscussesinteressantesparadesenvolvedoresde
software,confiraospodcastsdodeveloperWorks.
Mantenhaseatualizadocomoseventosewebcaststcnicosdo
developerWorks.
SigaodeveloperWorksnoTwitter.
Confiraasprximasconferncias,tradeshows,webcastseoutrosEventos
futurosnomundotodoquesodeinteressedosdesenvolvedoresde
softwarelivredaIBM.
VisiteazonadesoftwarelivredodeveloperWorksparaobterinformaes
extensivassobreinstrues,ferramentaseatualizaesdeprojetopara
ajudnodesenvolvimentodetecnologiasdesoftwarelivreeemseuusocom
produtosdaIBM,assimcomonossosartigosetutoriaismaisconhecidos.
OMydeveloperWorksumexemplodeumacomunidadegeralbem
sucedidaqueabrangeumaamplavariedadedetpicos.
AssistaeaprendasobreaIBMetecnologiasdesoftwarelivreefunesde
produtocomasdemosgratuitasdodeveloperWorksOndemand.
Obterprodutosetecnologias
Inoveseuprximoprojetodedesenvolvimentodesoftwarelivrecomo
softwaredeavaliaoIBM,disponvelparadownloadouemDVD.
FaaodownloaddeversesdeavaliaodeprodutoIBMouexperimenteas
versesdeavaliaesdisponveisonlinenoIBMSOASandboxecoloque
suasmosemferramentasdedesenvolvimentodeaplicativoseprodutosde
middlewaredoDB2,Lotus,Rational,TivolieWebSphere.
Discutir
ParticipedosblogsdodeveloperWorkseenvolvasenacomunidadedo
developerWorks.
Confiraasriededemossobrea
plataformaPaaSdaIBM,
contedo100%emportugus
CursosEAD
CapacitesenastecnologiasIBM
semcusto