Sebagian besar aplikasi web saat ini memerlukan setidaknya beberapa strategi keamanan dasar. Misalnya, situs yang menawarkan konten yang dilindungi kata sandi, situs dengan backend administrator saja, blog dan majalah pribadi, situs e-commerce, intranet perusahaan, dan sebagainya.
Pendekatan desain yang paling umum untuk membangun aplikasi Web jenis ini adalah dengan mengintegrasikan kebijakan keamanan ke dalam logika bisnis aplikasi Web, di mana aplikasi menentukan apakah pengguna memiliki izin untuk mengakses data tertentu dalam database. Dalam skenario ini, peran database hanyalah menyimpan data dan menyajikannya berdasarkan permintaan. Dengan kata lain, jika aplikasi web memerintahkan database untuk memberikan informasi spesifik, database akan mengeksekusi perintah tersebut secara langsung tanpa memeriksa izin pengguna.
Dalam artikel ini, Anda akan mempelajari cara memanfaatkan fitur keamanan bawaan Oracle untuk menerapkan aturan keamanan aplikasi di tingkat database guna meningkatkan keamanan aplikasi Anda secara keseluruhan. Sebagai manfaat tambahan, mengamankan akses data secara langsung di database tidak hanya meningkatkan keamanan aplikasi namun juga membantu mengurangi kompleksitas.
Bagaimana dengankebutuhan keamanan sisi database
untuk mengontrol akses data dari aplikasi web? Dalam kebanyakan kasus, tidak ada masalah; ini adalah solusi yang baik, terutama jika data yang terlibat tidak bersifat misi penting atau sangat rahasia. Metode ini digunakan di banyak buku dan sumber online. Faktanya, salah satu buku PHP/MySQL yang populer secara eksplisit melarang pembuatan lebih dari satu akun pengguna database per aplikasi karena "pengguna tambahan atau izin yang rumit mungkin memerlukan lebih banyak pemeriksaan sebelum melanjutkan." Ini benar; namun, ada beberapa hal yang mungkin ingin Anda pertimbangkan sebelum menyerah pada gagasan mengintegrasikan keamanan ke dalam logika database Anda. Mari kita lihat contoh berikut.
Katakanlah Anda membuat sistem pengelolaan konten (CMS). Basis data digunakan untuk menyimpan konten yang dipublikasikan di situs web. Sebagian besar data bersifat publik, memungkinkan pengguna web anonim untuk membacanya; hanya editor yang diperbolehkan mengubah data. Gunakan satu akun database untuk mengakses dan mengubah catatan dalam database, dan mengontrol keamanan dengan kode PHP dengan melindungi akses kata sandi ke halaman khusus administrator.
Jika sisi publik dari aplikasi web mengalami serangan seperti injeksi SQL pada formulir pencarian publik (yaitu formulir yang kodenya tidak cukup ketat), penyusup mungkin dapat mengeksekusi pernyataan SQL sewenang-wenang pada objek database yang akun publik memiliki akses ke. Tentu saja, dalam hal ini, mengeksekusi pernyataan SELECT tidak menimbulkan masalah besar karena datanya bersifat publik. Namun karena hak publik dan administratif menggunakan akun database yang sama, penyusup juga dapat menjalankan pernyataan UPDATE dan DELETE, atau bahkan menghapus tabel dari database.
Bagaimana kita dapat mencegah hal ini terjadi? Metode paling sederhana adalah dengan sepenuhnya membatasi izin akun database publik untuk mengubah data. Mari kita lihat bagaimana Oracle mengatasi masalah ini.
Ikhtisar Dasar Keamanan Oracle
Oracle Database memberi pengembang Web banyak cara untuk mengontrol akses ke data, mulai dari mengelola akses ke objek database tertentu seperti tabel, tampilan, dan prosedur hingga mengontrol akses ke data dalam baris atau kolom individual. Tentu saja, diskusi tentang setiap fitur atau opsi keamanan yang tersedia pada Oracle berada di luar cakupan artikel ini. Di sini, kita tidak akan membahas terlalu banyak detail, tetapi hanya aspek paling dasar dari keamanan akses data Oracle:
· Otentikasi dan akun pengguna · Izin ·
Otentikasi peran dan akun pengguna. Seperti database lainnya, setiap pengguna (akun database) yang meminta akses ke Oracle harus diautentikasi. Validasi dapat dilakukan oleh database, sistem operasi, atau layanan jaringan. Selain otentikasi dasar (otentikasi kata sandi), Oracle juga mendukung mekanisme otentikasi yang kuat seperti Kerberos, CyberSafe, RADIUS, dan sebagainya.
Peran. Peran Oracle adalah sekumpulan izin bernama. Meskipun Anda dapat memberikan izin akun pengguna secara langsung, penggunaan peran dapat menyederhanakan pengelolaan pengguna, terutama saat Anda perlu mengelola pengguna dalam jumlah besar. Sangat efisien untuk membuat peran kecil yang dapat dikelola dan kemudian memberi pengguna satu atau lebih peran berdasarkan tingkat keamanan mereka. Belum lagi betapa mudahnya mengubah izin—cukup ubah peran yang dikaitkan dengan peran tersebut, daripada mengubah setiap akun pengguna.
Untuk menyederhanakan pekerjaan awal dalam membuat pengguna baru, Oracle hadir dengan tiga peran yang telah ditentukan sebelumnya:
· Peran CONNECT - Peran ini memungkinkan pengguna untuk terhubung ke database dan melakukan operasi dasar, seperti membuat tabel sendiri. Secara default, peran ini tidak dapat mengakses tabel pengguna lain.
·Peran RESOURCE - Peran RESOURCE mirip dengan peran CONNECT, tetapi memungkinkan pengguna untuk memiliki lebih banyak izin sistem, seperti membuat pemicu atau prosedur tersimpan.
·Peran DBA—memungkinkan pengguna memiliki semua hak istimewa sistem.
Otorisasi dan Izin yang Digunakan
Pada bagian ini, kita membahas cara menggunakan otorisasi dan izin Oracle untuk meningkatkan keamanan contoh CMS sederhana yang dibahas di awal artikel ini. Diasumsikan bahwa konten yang diberikan kepada pengguna aplikasi disimpan dalam tabel WEB_CONTENT.
Pertama, buat tabelnya. Mulai Oracle Database Special Edition dan masuk sebagai administrator sistem. Lepaskan sampel pengguna HR jika belum dirilis. Ikuti instruksi dalam Panduan Memulai yang disertakan dengan instalasi Edisi Khusus. Perhatikan bahwa secara default, pengguna HR diberi peran RESOURCE. Di sini, berikan peran DBA kepada pengguna sehingga akun tersebut dapat digunakan untuk mengelola aspek database aplikasi CMS. Tentu saja akun pengguna HR tidak akan digunakan untuk akses online, hanya untuk administrasi database.
Anda sekarang dapat membuat tabel baru menggunakan Object Browser atau dengan menjalankan jendela Perintah SQL. Berikut kode untuk membuat tabelnya:
CREATE TABLE WEB_CONTENT (
page_id NOMOR KUNCI UTAMA,
halaman_konten VARCHAR2(255)
);
Karena tabel dibuat menggunakan akun pengguna HR, tabel tersebut dimiliki oleh akun HR dan berada dalam skema HR, dan pengguna lain tidak dapat mengakses tabel hingga mereka secara eksplisit diberikan izin untuk mengakses tabel. Jika tidak percaya, Anda dapat membuat pengguna baru dan mencoba menggunakan pengguna ini untuk mengakses tabel WEB_CONTENT.
Sekarang, buat dua pengguna baru, CMS_USER dan CMS_EDITOR. Terakhir, CMS_USER akan diberikan izin read-only pada tabel WEB_CONTENT, dan pengguna ini akan digunakan sebagai akun database yang menyajikan konten sebagai pengguna Web anonim. Akun CMS_EDITOR akan memiliki lebih banyak izin pada tabel dan akan digunakan sebagai akun editor CMS (akun yang diperlukan untuk mengubah dan memelihara data dalam tabel).
Pengguna baru dapat dibuat menggunakan antarmuka grafis XE atau dengan menjalankan perintah berikut:
CREATE USER cms_user IDENTIFIED BY cms_user;
BUAT PENGGUNA cms_editor DIIDENTIFIKASI OLEH cms_editor;
(Untuk mempermudah, kata sandi di sini sesuai dengan nama pengguna.)
Agar kedua akun dapat masuk ke database, kita perlu memberi mereka peran CONNECT. Untuk melakukannya, pilih kotak centang CONNECT di bawah Informasi Pengguna di bagian Administrasi/Pengguna Basis Data pada antarmuka grafis XE, atau jalankan perintah berikut:
GRANT CONNECT to cms_user;
GRANT CONNECT ke cms_editor
Sekarang, jika Anda mencoba masuk sebagai pengguna CMS_USER atau CMS_EDITOR dan mencoba membaca data dari tabel WEB_CONTENT (pilih * dari hr.web_content;), Anda akan menemukan kesalahan berikut:
ORA-00942: tabel atau tampilan tidak
ada Untuk mengakses data atau hanya melihat tabel, Anda perlu memberikan izin hanya baca pada akun CMS_USER dan CMS_EDITOR pada tabel WEB_CONTENT:
GRANT SELECT pada hr.web_content ke cms_user;
GRANT SELECT pada hr.web_content ke cms_editor;
Kode di atas memungkinkan kedua akun ini untuk melakukan pernyataan SELECT pada tabel WEB_CONTENT. Jika Anda mencoba menjalankan pernyataan lain, Anda akan menemui kesalahan. Misalnya, memasukkan baris:
INSERT INTO hr.web_content (page_id,page_content) VALUES (1,'hello world');
akan menghasilkan pesan kesalahan
ORA-01031: hak istimewa tidak mencukupi.
Untuk mengizinkan CMS_EDITOR mengubah konten tabel ini, izin berikut harus diberikan:
GRANT INSERT,UPDATE,DELETE pada hr.web_content ke cms_editor;
Mulai sekarang, akun CMS_EDITOR dapat menjalankan pernyataan INSERT, UPDATE dan DELETE pada tabel WEB_CONTENT.
Lihat betapa mudahnya! Terlihat bahwa pengelolaan izin melalui peran merupakan metode yang lebih efektif. Jika database Oracle yang digunakan bukan XE, Anda dapat melakukan operasi berikut:
Buat peran:
CREATE ROLE reader;
BUAT penulis PERAN;
Berikan izin peran:
GRANT SELECT ON web_content TO reader;
GRANT INSERT,UPDATE,DELETE ON web_content TO writer
Berikan peran pengguna:
GRANT reader TO cms_user;
GRANT reader TO cms_editor; (mereka juga perlu membaca)
GRANT writer TO cms_editor;
Perhatikan bahwa jika Anda mengubah definisi peran READER, perubahan ini akan memengaruhi semua akun pengguna dengan peran tersebut. Jika izin diberikan langsung kepada pengguna, setiap akun pengguna harus diperbarui satu per satu.
Setelah menyelesaikan langkah-langkah di atas, Anda dapat mengkonfigurasi aplikasi PHP Anda untuk menggunakan akun CMS_USER untuk semua koneksi database yang diminta oleh pengguna Web anonim dan akun CMS_EDITOR untuk koneksi yang dimulai oleh halaman administratif yang dilindungi kata sandi. Sekarang, meskipun formulir web publik disusupi, dampaknya terhadap database akan minimal karena akun CMS_USER hanya memiliki izin baca-saja.
Kesimpulan
Pada artikel ini, kami hanya memperkenalkan secara singkat beberapa fitur paling dasar dari keamanan akses data Oracle. Selain itu, Oracle memiliki banyak fitur lain yang meningkatkan keamanan aplikasi Web Anda—termasuk Virtual Private Database (VPD) dan keamanan tag.