1. PostgreSQL 보안 인증 수단

  trust, ident, password, GSSAPI, SSPI, LDAP, PAM 등등


2. 보안 인증 방법

    pg_hba.conf : 인증 제어 (host-based authentication)

    (설정이 변경되면 sighup 시그널을 보내서 적용)

    psql -U postgres -c "SELECT pg_reload_conf();"

   service postgresql reload

   /etc/init.d/postgresql reload

   kill -HUP process_id

    

   1) 항목 내용

      host_type database user [IP-address| address] [IP-mask] auth-method  [auth-options]

     - host_type 종류 

      Local : sock connection  사용

      Host : remote에서 ip address 사용하여 접속 (SSL 사용 또는 사용하지 않거나)

      Hostssl : SSL로 암호화된 연결

      Hostnossl : 암호화 되지 않은 연결

     - database user : all 또는 데이터베이스 이름

     - 사용예

       Local    all    all                      trust    -- socket으로 접속

  Host    all    all        127.0.0.1/32     trust    -- local loopback ip로 접속

  Host    all    all        ::1/128          trust

  Host    all    all        92.168.0.53/32    reject  -- 해당 ip 접속 거부

  Host    all    all        92.168.0.1/24     trust


3. Listen address 설정

   postgresql-conf 설정에 접속할 client에 대한 listen_addresses 설정

   psql   -c   "ALTER SYSTEM SET listen_addresses = '';"

   /etc/init.d/postgresql  restart

   psql -h localhost -c 'SELECT 1';


4. public에서 권한 revoke

   REVOKE ALL PRIVILEGES ON SCHEMA PUBLIC FROM public;


5. Role 부여로 보안설정

   CREATE ROLE web_app LOGIN NOINHERIT;

   CREATE ROLE public_user NOLOGIN;

   GRANT SELECT ON car_portal_app.advertisement_picture,    

   car_portal_app.advertisement_rating , car_portal_app.advertisement TO public_user;

   GRANT public_user TO web_app;

   GRANT USAGE ON SCHEMA car_portal_app TO web_app, public_user;


6. Postgresql Security level

  1) database base level

    CREATE DATABASE test;

    REVOKE ALL ON DATABASE test FROM public;

    GRANT CONNECT ON DATABASE car_portal TO web_app;


  2) schema base level

     GRANT USAGE ON SCHEMA test TO u1, u2;


  3) table base level

     GRANT ALL ON <table name> to <role>;


  4) column base level

      GRANT SELECT (f1) ON test1 TO test1_role; 

      GRANT USAGE ON SCHEMA public TO test_role;

      SET ROLE test_role;

      SELECT f1 FROM public.test1;

  

  5) row base level 

     9.5 버전부터 지원예정


7. encrypting data

  CREATE ROLE <role_name> WITH LOGIN PASWWORD 'role_password';

   SELECT usename, passwd FROM pg_shadow WHERE usename IN ('a');

  \password  -- password 변경


  2) 데이터 암호화

    CREATE EXTENSION pgcrypto;

    - one 방향 암호화 (md5, hash..) 

    INSERT INTO account VALUES (1, crypt ('my password', gen_salt('md5'))), (2, crypt ('my password', gen_salt('md5')));  -- md5 알고리즘으로 자동 생성 salt로 암호문 생성

    SELECT crypt('my password', gen_salt('bf',16));  -- blowfish 알고리즘으로 생성

   

    - 양방향 암호화 (encrypt, decrypt)

      \df encrypt

      \df decrypt

     SELECT encrypt ('Hello World', 'my key', 'aes');   -- aes 암호화

     SELECT decrypt ('\\xe3d6d1ddea318dbf88e34421fd095727', 'my key' , 'aes');

     SELECT convert_from('\\x48656c6c6f20576f726c64', 'utf-8');

     

    gpg --gen-key

    gpg --list-secret-key

    gpg -a --export 2ccerwe > /var/lib/postgresql/9.4/main/public.key

    gpg -a --export-secret-key  34234 > /var/lib/postgresql/9.4/main/secret.key

    chown postgres:postgres /var/lib/postgresql/9.4/main/public.key

   chown postgres:postgres /var/lib/postgresql/9.4/main/secret.key


   CREATE OR REPLACE FUNCTION encrypt (text) RETURNS bytea AS

   $$

   BEGIN

       RETURN pgp_pub_encrypt($1, dearmor(pg_read_file('public.key')));

   END;

   $$ Language plpgsql;


    CREATE OR REPLACE FUNCTION decrypt (bytea) RETURNS text AS

    $$

    BEGIN

       RETURN  pgp_pub_decrypt($1, dearmor(pg_read_file('secret.key')));

    END;

    $$ Language plpgsql;

   SELECT decrypt(encrypt('hello'));


'RDB > PostreSQL' 카테고리의 다른 글

PostgreSQL 테이블 파티션  (0) 2016.03.25
postgresql 실행계획  (0) 2016.03.25
postgresql index  (0) 2016.03.17
PostgreSQL objects  (0) 2016.03.16
postgresql replication  (0) 2015.12.14

+ Recent posts