Mengontrol Akses User
Pada lingkungan multi-user, kita dapat mengatur keamanan dari akses database dan penggunaannya. Security dari database Oracle mengijinkan kita untuk:
- Mengontrol akses ke database
- Memberikan akses terhadap objek-objek tertentu di dalam database
- Mengkonfirmasi privilege yang diberikan dan diterima melalui data dictionary
- Menciptakan synonym untuk objek-objek database
Database security dapat diklasifikasikan ke dalam dua kategori, yaitu system security dan data security.
- System security
- Mencakup akses dan penggunaan database pada level sistem, seperti halnya username dan password, disk space yang dialokasikan untuk user, dan operasi-operasi sistem yang diperbolehkan untuk user.
- Data security
- Mencakup akses dan penggunaan objek-objek database serta aksi-aksi yang dapat dimiliki oleh user terhadap objek-objek database tersebut.
Ketika sebuah sistem basis data akan digunakan secara bersama-sama oleh banyak pengguna, hal terpenting yang perlu dipertimbangkan adalah bagaimana mekanisme akses para pengguna tersebut terhadap database. Oracle telah menyediakan fasilitas untuk menangani hal ini karena memang sistem basis data ini telah dirancang untuk multiple-user enviroment (lingkungan dimana sebuah database digunakan secara bersama-sama).
Pada bab ini kita akan mempelajari bagaimana mengatur privileges (hak akses user) sesuai kebutuhan sehingga setiap pengguna mengakses database sesuai dengan wewenangnya. Database Administrator (DBA) adalah pengguna dengan level tertinggi dengan kemampuan untuk memberikan hak akses terhadap database dan objek-objek yang ada di dalamnya.
16.1. Privileges
Privileges adalah hak untuk mengeksekusi perintah-perintah SQL tertentu. Privileges pada Oracle terbagi menjadi dua yaitu:
- System Privileges
- Merupakan hak pengguna untuk mengakses sistem basis data. Contoh system privileges adalah hak untuk login ke database, hak untuk menciptakan tabel dan sebagainya.
- Object Privileges
- Merupakan hak pengguna untuk mengakses objek-objek sistem basis data. Contoh object privileges adalah hak untuk menampilkan data dari tabel karyawan, hak untuk memodifikasi tabel departemen dan sebagainya.
16.1.1. System Privileges
Oracle Server menyediakan system privileges yang siap digunakan. Beberapa system privileges yang biasanya dimiliki oleh Database Administrator (DBA) dan User adalah sebagai berikut:
16.1.1.1. Privilege DBA
DBA (Database Administrator) pada umumnya memiliki system privileges yang dibutuhkan untuk manajemen suatu sistem basis data, antara lain:
- CREATE USER
- Menciptakan user.
- DROP USER
- Menghapus user.
- DROP ANY TABLE
- Menghapus table tertentu.
- BACKUP ANY TABLE
- Membackup table tertentu dengan utilitas export.
16.1.1.2. Menciptakan User
DBA dapat menciptakan user dengan mengalokasikan sejumlah system privileges kepada user tersebut. Privileges ini pada akhirnya akan menentukan apa yang dapat dilakukan oleh user tersebut pada level database. DBA menciptakan user dengan menggunakan perintah CREATE USER. Ketika diciptakan, user tidak memiliki privileges apapun.
Sintaks
CREATE USER user IDENTIFIED BY password;
dimana:
- user
- nama user yang akan diciptakan
- password
- menetapkan bahwa user harus log in menggunakan password ini
Contoh:
DBA menciptakan user Indra dengan password Armansyah (case-insensitive).
CONN system/manager;
CREATE USER indra IDENTIFIED BY armansyah;
Perintah diatas menciptakan user dan password yang dapat digunakan untuk login ke database. Meskipun user tersebut telah tercipta, namun masih belum dapat digunakan untuk login ke database, karena seperti sudah kita pelajari diatas, bahwa ketika user diciptkan, ia tidak memiliki system privileges apapun. Sedangkan untuk login ke database diperlukan system privileges yaitu CREATE SESSION. Untuk membuktikannya kita dapat mencoba login dengan user Indra menggunakan perintah:
conn indra/armansyah;
Maka kita akan mendapatkan pesan kesalahan (error message) sebagai berikut:
ERROR:
ORA-01045: user INDRA lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
Perhatikan pesan kesalahan yang muncul bahwa proses login gagal karena user Indra tidak memiliki system privilege CREATE SESSION, dan kita tidak lagi terkoneksi dengan database. Oleh karena itu kita harus login kembali menggunakan user System.
conn system/manager;
16.1.1.3. Mengubah Password
Setiap user memiliki password sejak awal diciptakan oleh DBA. Kita dapat mengubah password tersebut dengan menggunakan perintah ALTER USER.
Sintaks
ALTER USER user IDENTIFIED BY password;
dimana:
- user
- nama user
- password
- menentukan password baru
Catatan:
Meskipun perintah ini dapat digunakan untuk mengubah password, namun masih banyak opsi lain yang dapat dilakukan oleh perintah ini. Kita harus memiliki system privileges ALTER USER untuk dapat untuk mengubah opsi-opsi lainnya.
16.1.1.4. Hak User
User database juga memiliki system privileges yang diperlukan untuk dapat menggunakan sistem basis data sesuai dengan keperluannya, antara lain:
- CREATE SESSION
- Login ke database.
- CREATE TABLE
- Menciptakan tabel.
- CREATE SEQUENCE
- Menciptakan sequence.
- CREATE VIEW
- Menciptakan view.
- CREATE PROCEDURE
- Menciptakan procedure, function, atau package.
16.1.1.5. Memberikan System Privileges
System privileges diperlukan oleh user agar dapat bekerja di dalam database sesuai dengan kepentingannya. DBA dapat memberikan system privileges kepada user dengan menggunakan perintah GRANT. User yang telah diberikan system privileges dapat segera menggunakan privileges tersebut.
Sintaks
GRANT system_priv [, system_priv …]
TO {user [, user …]|role|PUBLIC}
[WITH ADMIN OPTION]
dimana:
- system_priv
- system privileges yang akan diberikan.
- user
- nama user penerima system privileges.
- role
- nama role penerima system privileges.
- PUBLIC
- memberikan system privileges kepada seluruh user.
- WITH ADMIN OPTION
- mengijinkan penerima system privileges (grantee) untuk memberikan system privilege yang diterimanya kepada user lain.
Contoh:
DBA memberikan system privileges kepada user Indra agar dapat login ke database.
CONN system/manager;
GRANT create session TO indra;
Kini user Indra telah dapat login ke database. Namun apakah user Indra telah dapat menciptakan tabel dan view? Jawabnya adalah belum karena untuk dapat menciptakan TABLE diperlukan system privileges CREATE TABLE, sedangkan untuk dapat menciptakan view, diperlukan system privileges CREATE VIEW. Padahal kita tahu bahwa user Indra baru memiliki satu system privileges yaitu CREATE SESSION. Kita dapat membuktikannya dengan mencoba menciptakan sebuah tabel sederhana.
CONN indra/armansyah;
CREATE TABLE test2 (kol1 varchar2(1));
Maka kita akan menemui pesan kesalahan (error message) sebagai berikut:
CREATE TABLE test
*
ERROR at line 1:
ORA-01031: insufficient privileges
Perhatikan kembali pesan kesalahan yang muncul bahwa user Indra tidak memiliki cukup privileges untuk menciptakan table. Untuk itu DBA perlu menambahkan system privileges yang diperlukan agar user Indra dapat menciptakan table dan view.
Contoh:
DBA memberikan beberapa system privileges tambahan kepada user Indra.
CONN system/manager;
GRANT create table, create view TO indra;
16.1.1.6. Mengkonfirmasi System Privileges
Untuk mengkonfirmasi system privileges apa saja yang telah dimiliki user tertentu, kita dapat menggunakan beberapa view dari data dictionary berikut ini:
- DBA_ROLES
- Roles yang terdapat pada sistem basis data.
- USER_SYS_PRIVS
- System privileges yang telah diberikan kepada user.
- ROLE_SYS_PRIVS
- System privileges yang telah diberikan kepada roles.
- TAB_SYS_PRIVS
- Table privileges yang telah diberikan kepada roles.
- USER_ROLE_PRIVS
- Roles yang telah diberikan kepada user.
- DBA_ROLE_PRIVS
- Roles yang telah diberikan kepada user atau roles.
- ROLE_ROLE_PRIVS
- Roles yang telah diberikan kepada roles.
- USER_TAB_PRIVS_MADE
- Object privileges yang telah dibuat oleh user.
- USER_TAB_PRIVS_RECD
- Object privileges yang telah diberikan kepada user.
- USER_COL_PRIVS_MADE
- Object privileges pada kolom tertentu yang telah dibuat oleh user.
- USER_COL_PRIVS_RECD
- Object privileges pada kolom tertentu yang telah diberikan kepada user.
Oracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world’s largest enterprise software company.
For more information about Oracle, please visit their Web site at http://www.oracle.com. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Contoh:
User Indra ingin mengetahui system privileges apa saja yang dimilikinya.
CONN indra/armansyah;
SELECT * FROM user_sys_privs;
Perhatikan bahwa saat ini user Indra telah memiliki system privileges CREATE SESSION, CREATE TABLE, dan CREATE VIEW. Perhatikan kolom ADM, kolom ini menunjukkan apakah user penerima system privileges diijinkan memberikan system privileges yang telah diterimanya kepada user lain. Kolom ini akan bernilai YES apabila pada saat memberikan system privileges kepada user Indra, DBA menambahkan klausa WITH ADMIN OPTION.
Contoh:
User Indra mencoba menciptakan tabel Test yang sebelumnya gagal dilakukan.
CONN indra/armansyah;
CREATE TABLE test2 (kol1 varchar2(1));
Maka akan muncul pesan kesalahan sebagai berikut:
CREATE TABLE test
*
ERROR at line 1:
ORA-01950: no privileges on tablespace ‘SYSTEM’
Mengapa perintah tersebut masih juga gagal? Bukankah user Indra telah memiliki system privileges CREATE TABLE? Memang benar user Indra telah memiliki system privileges tersebut namun coba kita perhatikan kembali bahwa pesan yang muncul berbeda dengan sebelumnya. Permasalahannya sekarang bukan lagi karena user Indra tidak memiliki system privileges CREATE TABLE, namun disebabkan karena user Indra tidak memiliki tempat (quota) untuk meletakkan tabel yang diciptakannya. Perlu kita ketahui bersama bahwa objek-objek database membutuhkan space (tempat penyimpanan).
Dalam database Oracle, setiap objek yang diciptakan oleh user diletakkan pada struktur logik yang dinamakan tablespace. Karena dalam menciptakan user Indra sebelumnya DBA tidak pernah menyebutkan pada tablespace mana objek-objek user Indra akan ditampatkan, maka secara tablespace default yang disediakan untuk user Indra adalah tablespace System.
Disarankan untuk tidak meletakkan objek-objek yang kita ciptakan pada tablespace System, melainkan pada tablespace Users (Oracle 8i) atau User_Data (Oracle 7), atau dapat juga diciptakan tablespace tersendiri. Namun untuk saat ini kita menggunakan tablespace yang telah disediakan Oracle saja.
Perlu diperhatikan juga bahwa setiap user membutuhkan temporary tablespace untuk penampungan sementara misalnya untuk melakukan proses pengurutan data. Tablespace temporary yang telah disediakan adalah Temp (Oracle versi 8 keatas) dan Temporary_Data (Oracle 7).
Kita dapat melihat tablespace apa saja yang tersedia dalam sistem basis data Oracle yang kita gukanan dengan perintah:
CONN system/manager;
SELECT tablespace_name FROM dba_tablespaces;
Contoh:
DBA memberikan quota 1 Megabyte pada tablespace User_Data kepada user Indra.
ALTER USER indra
DEFAULT TABLESPACE USER_DATA
TEMPORARY TABLESPACE TEMPORARY_DATA
QUOTA 1 M ON USER_DATA;
Berikut ini adalah perintah lengkap dalam menciptakan user dan memberikan system privileges.
CONN system/manager;
CREATE USER indra IDENTIFIED BY armansyah
DEFAULT TABLESPACE user_data
TEMPORARY TABLESPACE temporary_data
QUOTA 1 M ON user_data;
GRANT create session, create table, create view TO indra;
16.1.1.7. Menghapus User
DBA dapat menghapus user yang telah diciptakannya dengan menggunakan perintah DROP USER.
Sintaks
DROP USER user [CASCADE];
dimana:
- CASCADE
- perintah ini diperlukan apabila user yang akan dihapus telah memiliki objek misalnya table, view atau objek-objek lainnya.
Contoh:
DBA menghapus user Indra.
DROP USER indra CASCADE;
16.1.1.8. Mencabut System Privileges
Mungkin suatu saat kita perlu mencabut kembali system privileges yang telah kita berikan kepada user. Perintah untuk mencabut kembali system privileges yang telah diberikan adalah REVOKE.
Sintaks
REVOKE system_priv [, system_priv …]
FROM {user [, user …]|role|PUBLIC}
dimana:
- system_priv
- system privileges yang akan dicabut.
- user
- nama user penerima system privileges.
- role
- nama role penerima system privileges.
- PUBLIC
- mencabut system privileges dari seluruh user.
Contoh:
DBA mencabut system privileges yang telah diberikannya kepada user Indra.
CONN system/manager;
REVOKE create view FROM indra;
16.1.2. Object Privileges
Dalam lingkungan dimana sebuah database digunakan oleh banyak user secara bersama-sama, seringkali suatu objek database digunakan oleh banyak pengguna dengan kepentingan yang berbeda-beda.
Sebagai contoh, seorang karyawan bagian keuangan mungkin memiliki kepentingan terhadap gaji karyawan, namun karyawan bagian lain mungkin memerlukan data lain dari tabel karyawan misalkan alamat dan sebagainya.
- Table
- ALTER, DELETE, INDEX, INSERT, REFERENCES, SELECT, UPDATE
- View
- DELETE, INSERT, SELECT, UPDATE
- Sequence
- ALTER, SELECT
- Procedure
- EXECUTE
- Snapshot
- SELECT
16.1.2.1. Memberikan Object Privileges
Pada prinsipnya cara memberikan object privileges sama dengan cara memberikan system privileges kepada user. Perintah yang digunakan untuk memberikan object privileges adalah GRANT.
Sintaks
GRANT {object_priv (, object_priv …} | ALL} [(columns)]
ON object
TO {user [, user …]|role|PUBLIC}
[WITH GRANT OPTION]
dimana:
- object_priv
- object privileges yang akan diberikan.
- ALL
- memberikan seluruh object privileges.
- columns
- menentukan kolom dari tabel atau view yang diberi privileges
- ON object
- nama objek yang diberi privileges
- TO
- menentukan kepada siapa privileges diberikan
- PUBLIC
- memberikan object privileges kepada seluruh user
- WITH GRANT OPTION
- mengijinkan penerima privileges (grantee) untuk memberikan object privileges yang diterimanya kepada user lain
Contoh:
User Scott mengijinkan user Indra melihat seluruh data, dan memodifikasi data kolom salary pada tabel Employee miliknya.
CONN scott/tiger;
GRANT select, update (salary) ON employee TO indra;
Pada contoh diatas user Indra dapat melihat seluruh data pada tabel Employee milik user Scott. Bagaimana apabila user Scott mengiginkan agar user Indra hanya dapat melihat hanya kolom nama dan gaji saja? Jawabnya adalah dengan menggunakan view.
Contoh:
Pertama user Scott harus mencabut terlebih dahulu object privilege SELECT yang telah diberikannya kepada user Indra.
CONN scott/tiger;
REVOKE select ON employee FROM indra;
Setelah user Indra tidak dapat lagi melihat data tabel Employee user Scott, barulah sekarang user Scott memberikan system privileges baru agar user Indra hanya dapat melihat kolom last_name dan salary saja.
Pertama user Scott menciptakan view untuk mewakili kolom last_name dan salary pada tabel Employee.
CREATE OR REPLACE VIEW vemployee
AS
SELECT last_name, salary
FROM employee;
Kemudian user Scott memberikan object privileges SELECT terhadap view tersebut kepada user Indra.
GRANT select ON vemployee TO indra;
16.1.2.2. Mencabut Object Privileges
Sama halnya dengan system privileges, object privileges yang telah diberikan seorang user kepada user lain dapat dicabut kembali dengan menggunakan perintah REVOKE.
Sintaks
REVOKE {object_priv [, object_priv …] | ALL}
ON object
FROM {user [, user …]|role|PUBLIC}
[CASCADE CONSTRAINTS]
dimana:
- CASCADE CONSTRAINTS
- menghapus referential integrity constraint yang diciptakan untuk objek dari privilege REFERENCE.
Contoh:
User Scott mencabut kembali object privileges yang telah diberikan kepada user Indra.
REVOKE select ON vemployee FROM indra;
16.2. Roles
Roles merupakan mekanisme untuk mengelompokkan privileges. Mekanisme ini sangat memudahkan kita dalam mengatur hak akses pengguna apabila dalam suatu database terdapat beberapa kelompok user dengan privileges yang sama.
Sintaks
CREATE ROLE role;
Contoh:
Berikut ini adalah modifikasi contoh sebelumnya dalam memberikan system privileges. DBA menggunakan role dalam memberikan system privileges kepada user Indra.
CONN system/manager;
CREATE ROLE user_role;
GRANT create session, create table, create view TO user_role;
SELECT role FROM DBA_ROLE_PRIVS WHERE role = ‘USER_ROLE’;
GRANT user_role TO indra;User Indra login ke sistem basis data dan mencoba melihat system privileges apa saja yang dimilikinya.
CONN indra/armansyah;
SELECT * FROM user_sys_privs;
Perhatikan bahwa user Indra tidak dapat mengetahui privileges apa saja yang dimilikinya dengan melakukan query terhadap view User_Sys_Privs. Mengapa demikian? Hal ini dikarenakan DBA tidak memberikan system privileges dengan cara satu per satu seperti sebelumnya, melainkan menggunakan role. Agar dapat melihat system privileges apa saja yang dimilikinya, perintah yang harus diberikan oleh user Indra adalah:
select role_sys_privs.privilege
from user_role_privs, role_sys_privs
where user_role_privs.granted_role = role_sys_privs.role;
Keuntungan menggunakan metode role adalah sebagai berikut:
- Manajemen hak akses dari user menjadi lebih mudah karena dengan mengetahui role dari user maka kita dapat segera mengetahui level dari user tersebut apakah dba atau lainnya.
- Meningkatkan kecepatan penambahan atau pengurangan privileges terhadap user
- Mengurangi tingkat kesalahan pemberian privileges bagi user
Contoh:
DBA mengambil keputusan untuk mencabut system privileges CREATE VIEW dari seluruh user yang memiliki role User_Role.
CONN system/manager;
REVOKE create view FROM user_role;
16.3. Latihan
1. Buatlah sebuah script dengan nama CREATE_USER.SQL untuk keperluan menciptakan user baru, dengan catatan pada saat mengisikan password, karakter yang diketikkan tidak boleh terlihat.
SET VERIFY OFF
ACCEPT usernm PROMPT ‘Enter new username:’
ACCEPT passwd PROMPT ‘Enter password:’ HIDE
ACCEPT deftbl PROMPT ‘Default tablespace:’
ACCEPT tmptbl PROMPT ‘Temporary tablespace:’
ACCEPT quota PROMPT ‘Quota on default tablespace:’
ACCEPT usr_role PROMPT ‘Role:’
CREATE USER &usernm IDENTIFIED BY &passwd
DEFAULT TABLESPACE &deftbl
TEMPORARY TABLESPACE &tmptbl
QUOTA "a ON &deftbl;
GRANT &usr_role TO &usernm
/
SET VERIFY ON
2. Ciptakan user baru ALICE dengan menggunakan script CREATE_USER.SQL, dengan catatan password-nya sama dengan nama user-nya.
@CREATE_USER;
3. Berikanlah hak untuk create table, create sequence dan create view kepada ALICE.
GRANT create table, create sequence, create view
TO alice;
Silahkan melanjutkan membaca pembahasan Menciptakan Synonym
Catatan:
Untuk mempraktekkan artikel-artikel mengenai Oracle SQL & PL/SQL Anda dapat mendownload script table disini, lalu jalankan sesuai live demo (browser Anda harus mendukung Flash Player).
| Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi. Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma, Uranus dsb. |


































