DBMS_RLS: Fine-grained Access Control


Tanggal 26 Desember 2007 kemarin, aku tepat mengakhiri masa kerjaku selama 1 tahun 2 bulan di tempat kerja pertamaku. Sebagai seorang yang baru pertama kali kerja, aku mendapatkan banyak pengalaman yang menarik. Aku merasakan bagaimana lingkungan kerja yang ideal dalam bayanganku ternyata pada praktek-nya tidak sesuai. Aku melihat banyak orang yang berpendidikan, memiliki gelar S1 dan S2, lulus dari universitas ternama, bahkan dari luar negeri, tetapi bertindak tanpa pertimbangan matang (pemikirin scientific) dan landasan teori yang dapat dipertanggungjawabkan, tak beda jauh dengan anak-anak SMU. Aku melihat bagaimana sebuah masalah yang sederhana menjadi kompleks karena dikerjakan begitu saja. Tapi aku juga melihat bagaimana solusi sederhana bisa menjawab permasalahan yang kompleks.

Kembali ke topik, package DBMS_RLS menyediakan fungsi-fungsi untuk mengatur security policies. Salah satunya, ia menyediakan access control yang memanfaatkan dynamic predicate.

Dynamic predicate diperoleh saat sebuah statement DML dan SELECT dikerjakan. Misalnya, query berikut ini:

SELECT * FROM EMP;

akan diterjemahkan menjadi:

SELECT * FROM EMP WHERE p1;

dimana P1 adalah predicate yang dihasilkan oleh sebuah function yang didaftarkan melalui DBMS_RLS.ADD_POLICY.

Sebagai latihan, aku akan membuat tabel dan isi-nya sebagai berikut:

CREATE TABLE PROJEK (
  NO_PROJEK CHAR(20),
  NAMA_PROJEK NVARCHAR2(200),
  TINGKAT_KEAMANAN NUMBER(1)
);

INSERT INTO PROJEK VALUES (
  'PJ-1', 'Loan Origination System', 1);

INSERT INTO PROJEK VALUES (
  'PJ-1A', 'LOS For Another Bank', 1);

INSERT INTO PROJEK VALUES (
  'PJ-2', 'Middleware Improvement', 2);

INSERT INTO PROJEK VALUES (
  'PJ-3', 'Top Secret', 3);

Setelah itu, aku membuat sebuah fungsi sederhana yang akan menghasilkan predicate, seperti:

CREATE OR REPLACE FUNCTION simple_predicate (
  schm IN VARCHAR2, name IN VARCHAR2)
RETURN VARCHAR2 AS
BEGIN
  RETURN "tingkat_keamanan = 1";
END;
/

Berikutnya, aku mendaftarkan fungsi di atas melalui ADD_POLICY setelah login sebagai SYSDBA:

begin
  dbms_rls.add_policy(
    object_schema => 'SCOTT',
    object_name => 'PROJEK',
    policy_name => 'POLICY_TINGKAT_KEAMANAN',
    function_schema => 'SCOTT',
    policy_function => 'SIMPLE_PREDICATE',
    statement_types => 'SELECT',
    sec_relevant_cols => 'no_projek, nama_projek, tingkat_keamanan');
end;
/

Sekarang, setiap kali siapa saja men-query tabel, seperti dengan SQL berikut:

select * from projek;

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: