Data Management (DMS) menyediakan bahasa domain-spesifik (DSL) untuk menentukan aturan keamanan dalam alur kerja pengembangan database. Aturan DSL digunakan untuk mengontrol pernyataan SQL yang dapat diajukan, cara perutean persetujuan, serta kapan operasi diblokir atau ditandai sebagai berisiko.
Cara kerja
Aturan keamanan berupa pernyataan IF-THEN atau IF-THEN-ELSE. Ketika suatu kondisi terpenuhi, DMS menjalankan aksi yang sesuai.
Struktur dasar:
if <kondisi>
then <aksi>
end
Struktur diperluas dengan beberapa cabang:
if <kondisi 1>
then <aksi 1>
elseif <kondisi 2>
then <aksi 2>
[else <aksi 3>]
end
Setiap aturan harus berisi tepat satu klausa if. Aturan tersebut dapat memiliki nol atau lebih cabang elseif dan nol atau satu klausa else. Jika tidak ada cabang yang cocok dan tidak terdapat klausa else, DMS tidak menjalankan aksi apa pun.
Komponen DSL
Aturan keamanan terdiri dari tiga blok penyusun: klausa kondisional, klausa aksi, dan fungsi yang telah ditentukan sebelumnya.
Klausa kondisional
Klausa kondisional dievaluasi menjadi true atau false. Klausa ini dibangun dari satu atau beberapa elemen berikut:
-
Factors — variabel sistem yang telah ditentukan sebelumnya dan merepresentasikan konteks pada saat evaluasi (misalnya, jenis pernyataan SQL, jumlah baris yang terpengaruh)
-
Operators — simbol yang membandingkan atau menguji nilai
-
Connectors —
ANDdanOR, yang menggabungkan beberapa ekspresi
AND memiliki prioritas lebih tinggi daripada OR. Keduanya memiliki prioritas lebih rendah daripada operator. Gunakan tanda kurung untuk mengubah urutan evaluasi bawaan.
Contoh: Pada 1 <= 0 or 1 == 1, DMS mengevaluasi 1 <= 0 dan 1 == 1 secara terpisah, lalu menerapkan OR. Untuk membuat prioritas eksplisit: (1 <= 0) == true.
Operator
Operator menghubungkan factors dan konstanta dalam ekspresi kondisional. Operator berikut didukung:
| Operator | Deskripsi | Contoh |
|---|---|---|
== |
Sama dengan | 1 == 1 |
!= |
Tidak sama dengan | 1 != 2 |
> |
Lebih besar dari | @fac.insert_rows > 1000 |
>= |
Lebih besar dari atau sama dengan | @fac.insert_rows >= 1000 |
< |
Lebih kecil dari | @fac.insert_rows < 100 |
<= |
Lebih kecil dari atau sama dengan | @fac.insert_rows <= 100 |
in |
Termasuk dalam array | 'a' in ['a', 'b', 'c'] |
not in |
Tidak termasuk dalam array | 'a' not in ['a', 'b', 'c'] |
matchs |
Sesuai dengan ekspresi reguler | 'idx_aa' matchs 'idx_\\w+' |
not matchs |
Tidak sesuai dengan ekspresi reguler | 'idx_aa' not matchs 'idx_\\w+' |
isBlank |
Nilai kosong | '' isBlank |
isNotBlank |
Nilai tidak kosong | '' isNotBlank |
Pelarian backslash dalam ekspresi reguler: Untuk menyertakan backslash literal (\) dalam pola regex, tambahkan backslash lain sebagai pelarian. Misalnya, tulis idx_\\w+ untuk mencocokkan idx_\w+.
Factors
Factors adalah variabel yang telah ditentukan sebelumnya dan menyediakan konteks pada saat evaluasi aturan keamanan—seperti jenis pernyataan SQL, jumlah baris yang terpengaruh, atau apakah target merupakan database logis. Gunakan factors dalam klausa kondisional untuk menulis aturan berdasarkan metadata operasi aktual.
Nama factor menggunakan format @fac.<display-name>. DMS menyediakan factors berbeda untuk berbagai checkpoint di setiap modul.
| Factor | Deskripsi |
|---|---|
@fac.env_type |
Jenis lingkungan. Contoh nilai: DEV, PRODUCT. Lihat Ubah jenis lingkungan untuk instans. |
@fac.sql_type |
Jenis pernyataan SQL. Contoh nilai: UPDATE, INSERT. |
@fac.detail_type |
Jenis tiket perubahan data. Lihat nilai valid di bawah ini. |
@fac.is_logic |
Apakah database target merupakan database logis. |
@fac.extra_info |
Informasi tiket lainnya. Saat ini tidak digunakan. |
@fac.is_ignore_affect_rows |
Apakah validasi jumlah baris dilewati. |
@fac.insert_rows |
Jumlah baris yang akan dimasukkan. |
@fac.update_delete_rows |
Jumlah baris yang akan diperbarui atau dihapus. |
@fac.max_alter_table_size |
Ukuran ruang tabel terbesar yang berisi tabel yang akan dimodifikasi. |
@fac.is_has_security_column |
Apakah pernyataan SQL melibatkan bidang sensitif. |
@fac.security_column_list |
Bidang sensitif yang terlibat dalam pernyataan SQL. |
@fac.risk_level |
Tingkat risiko operasi. |
@fac.risk_reason |
Alasan penetapan tingkat risiko. |
@fac.ref_schema_names |
Daftar nama database yang dipilih dalam tiket. |
Nilai valid untuk `@fac.detail_type`:
| Nilai | Jenis tiket |
|---|---|
COMMON |
Normal Data Modify |
CHUNK_DML |
Lockless Change |
PROCEDURE |
Programmable Object |
CRON_CLEAR_DATA |
History Data Clean |
BIG_FILE |
Large Data Import |
Contoh: Periksa apakah pernyataan SQL merupakan pernyataan DML:
@fac.sql_type == 'DML'
Klausa aksi
Aksi mendefinisikan respons DMS ketika suatu kondisi terpenuhi. Nama aksi menggunakan format @act.<display-name>. DMS menyediakan aksi berbeda untuk berbagai checkpoint di setiap modul.
| Tindakan | Deskripsi |
|---|---|
@act.allow_submit |
Mengharuskan pengajuan pernyataan SQL untuk dieksekusi dalam tiket. |
@act.allow_execute_direct |
Mengizinkan eksekusi pernyataan SQL di SQL Console. |
@act.forbid_execute |
Memblokir eksekusi pernyataan SQL. |
@act.mark_risk |
Menandai operasi dengan tingkat risiko dan pesan kustom. Contoh: @act.mark_risk 'middle' 'Medium risk: online environment' |
@act.do_not_approve |
Menentukan ID templat persetujuan. Lihat Konfigurasikan proses persetujuan. |
@act.choose_approve_template |
|
@act.choose_approve_template_with_reason |
Fungsi yang telah ditentukan sebelumnya
Fungsi yang telah ditentukan sebelumnya dapat digunakan baik dalam klausa kondisional maupun klausa aksi. Nama fungsi menggunakan format @fun.<display-name>.
| Fungsi | Input | Output | Deskripsi |
|---|---|---|---|
@fun.concat |
Beberapa string | String | Menggabungkan beberapa string menjadi satu. |
@fun.char_length |
Sebuah string | Integer | Mengembalikan panjang string. |
@fun.is_char_lower |
Sebuah string | Boolean | Mengembalikan true jika semua huruf berupa huruf kecil. |
@fun.is_char_upper |
Sebuah string | Boolean | Mengembalikan true jika semua huruf berupa huruf kapital. |
@fun.array_size |
Sebuah array | Integer | Mengembalikan jumlah elemen dalam array. |
@fun.add |
Beberapa nilai numerik | Numerik | Menjumlahkan beberapa nilai. |
@fun.sub |
Dua nilai numerik | Numerik | Mengurangkan nilai kedua dari nilai pertama. |
@fun.between |
Tiga nilai: target, batas bawah, batas atas | Boolean | Mengembalikan true jika target berada dalam rentang tertutup [batas bawah, batas atas]. Mendukung tipe NUMERIC, DATE, dan TIME. |
@fun.current_datetime |
Tidak ada | String | Mengembalikan tanggal dan waktu saat ini dalam format yyyy-MM-dd HH:mm:ss. |
@fun.current_date |
Tidak ada | String | Mengembalikan tanggal saat ini dalam format yyyy-MM-dd. |
@fun.current_time |
Tidak ada | String | Mengembalikan waktu saat ini dalam format HH:mm:ss. |
@fun.is_contain_str |
Dua string | Boolean | Mengembalikan true jika string pertama berisi string kedua. |
@fun.listEqualIgnoreOrder |
Dua daftar string | Boolean | Mengembalikan true jika kedua daftar berisi string yang sama, tanpa memperhatikan urutan atau kapitalisasi. |
Beberapa contoh terpilih:
Penggabungan string:
@fun.concat('d', 'm', 's')
// Output: 'dms'@fun.concat('[Development standards] Enter a comment for the [', @fac.column_name, '] field.')
// Output: pesan pengingat dengan nama bidang disisipkan
Memeriksa apakah nilai numerik berada dalam rentang tertentu:
@fun.between(@fac.export_rows, 2001, 100000)
// Mengembalikan true jika jumlah baris yang diekspor berada di antara 2.001 dan 100.000@fun.between(@fun.current_datetime(), '2019-10-31 00:00:00', '2019-11-04 00:00:00')
// Mengembalikan true jika tanggal dan waktu saat ini berada dalam jendela yang ditentukan
Memeriksa kesamaan daftar:
@fun.listEqualIgnoreOrder(@fac.perm_type, ['QUERY'])
// Mengembalikan true jika hanya izin kueri yang diminta@fun.listEqualIgnoreOrder(@fac.perm_type, ['CORRECT', 'EXPORT'])
// Mengembalikan true jika izin perubahan dan ekspor keduanya diminta
Contoh
Batasi jumlah pernyataan SQL per tiket
Blokir pengajuan jika tiket berisi lebih dari 1.000 pernyataan SQL:
if
@fac.sql_count > 1000
then
@act.reject_execute 'Jumlah pernyataan SQL dalam satu tiket tidak boleh melebihi 1.000.'
end
Jika jumlah melebihi 1.000, DMS menolak tiket dan menampilkan pesan tersebut.
Izinkan hanya pernyataan DML
Izinkan pengajuan hanya jika semua pernyataan SQL merupakan operasi DML:
if
@fac.sql_type in ['UPDATE', 'DELETE', 'INSERT', 'INSERT_SELECT']
then
@act.allow_submit
end