Mengurus Rahsia dan Pemboleh Ubah Persekitaran dalam Aplikasi CFML
Panduan mengurus rahsia dalam aplikasi CFML: simpan kata laluan di luar repo, gunakan fail .env, pemboleh ubah persekitaran dan SecretProvider dalam Lucee.

Kandungan
- Mengurus Rahsia dan Pemboleh Ubah Persekitaran dalam Aplikasi CFML
- Kenapa Rahsia Tidak Boleh Masuk Repo
- Pilihan Menyimpan Rahsia
- Fail .env di Luar Webroot
- Pemboleh Ubah Persekitaran Sistem
- SecretProvider dalam Lucee
- Hak Fail yang Betul
- Bila Rahsia Terdedah: Putaran
- Jadual Perbandingan Pilihan
- Senarai Semak Sebelum Deploy
- Soalan Lazim (FAQ)
- Sumber
Mengurus Rahsia dan Pemboleh Ubah Persekitaran dalam Aplikasi CFML
Rahsia aplikasi ialah apa-apa nilai yang mesti dirahsiakan: kata laluan pangkalan data, kunci API, token akses dan kunci penyulitan. Prinsip asasnya ialah rahsia tidak boleh masuk ke dalam repositori kod, tidak boleh ditulis dalam fail konfigurasi yang dikongsi, dan mesti boleh diputar dengan cepat apabila terdedah. Artikel ini membincangkan pilihan menyimpan rahsia dalam CFML, daripada fail .env sehinggalah SecretProvider terbina dalam Lucee, bersama senarai semak sebelum deploy.
Kenapa Rahsia Tidak Boleh Masuk Repo
Apabila kata laluan ditaip terus ke dalam kod, ia tersebar ke mana-mana kod itu pergi: sejarah git, sandaran, mesin setiap pembangun, dan mana-mana cawangan. Sekali ia masuk ke git, memadamkannya tidak menghapuskan jejaknya kerana sejarah commit kekal, dan satu carian mudah di GitHub boleh mendedahkan ratusan kunci yang tertinggal. Cheat Sheet Pengurusan Rahsia OWASP mengingatkan bahawa rahsia yang ditulis secara teks biasa dalam kod dan fail konfigurasi adalah punca utama kebocoran. Peraturannya mudah: kod merujuk kepada rahsia, tetapi tidak pernah mengandunginya.
Pilihan Menyimpan Rahsia
Ada tiga pendekatan utama yang sesuai untuk aplikasi Lucee. Pertama, fail .env yang disimpan di luar webroot dengan kebenaran fail yang ketat. Kedua, pemboleh ubah persekitaran sistem yang ditetapkan oleh platform hosting atau perkhidmatan kontena. Ketiga, SecretProvider dalam Lucee, yang menyimpan rahsia dalam penyedia tersusun dan mengaksesnya melalui satu fungsi. Setiap satu ada tempatnya, dan selalunya anda akan menggabungkan dua atau lebih daripadanya mengikut persekitaran.
Fail .env di Luar Webroot
Fail .env ialah fail teks mudah yang menyimpan pasangan kunci dan nilai, satu setiap baris. Kuncinya ialah meletakkannya di luar webroot supaya ia tidak boleh dimuat turun melalui URL, dan menetapkan kebenaran fail supaya hanya pengguna pelayan boleh membacanya. Lucee menyediakan fileRead() untuk membaca kandungan fail, dan anda boleh menghuraikannya menjadi struktur:
// Baca fail .env di luar webroot, contohnya /opt/aplikasi/.env
var raw = fileRead("/opt/aplikasi/.env");
var env = {};
for (var line in listToArray(raw, chr(10))) {
line = trim(line);
if (line == "" || left(line, 1) == "#") continue; // langkau kosong dan komen
var eq = find("=", line);
if (eq > 1) env[trim(left(line, eq - 1))] = trim(mid(line, eq + 1, len(line) - eq));
}
var dbPassword = env["DB_PASSWORD"];
Pada Linux, tetapkan kebenaran fail kepada 600 dengan arahan chmod 600 .env, supaya hanya pemilik fail boleh membacanya. Jangan sekali-kali meletakkan .env di dalam folder webroot, kerana salah konfigurasi pelayan yang kecil sahaja boleh mendedahkannya kepada umum. Untuk aplikasi yang dihoskan pada hosting kongsi, baca panduan hosting kongsi CFML untuk memahami batasan meletakkan fail di luar webroot.
Pemboleh Ubah Persekitaran Sistem
Pemboleh ubah persekitaran ialah cara paling bersih untuk menyuntik rahsia tanpa menyentuh kod atau fail, terutamanya dalam bekas Docker atau platform cloud. Lucee menyediakan GetSystemPropOrEnvVar(), yang membaca nilai daripada pemboleh ubah persekitaran atau sifat sistem JVM:
var dbPassword = GetSystemPropOrEnvVar("DB_PASSWORD");
if (isNull(dbPassword)) {
throw(message = "DB_PASSWORD tidak ditetapkan dalam persekitaran");
}
Membuat aplikasi gagal dengan jelas apabila rahsia tiada adalah lebih baik daripada terus berjalan dengan nilai kosong yang akan menghasilkan ralat samar di kemudian hari. Pemboleh ubah persekitaran juga memudahkan putaran, kerana anda menukar nilai pada lapisan platform tanpa mengubah kod sama sekali. Ia juga menjadi pilihan paling sesuai apabila aplikasi anda berjalan di dalam bekas, kerana setiap bekas boleh disuntik dengan nilai berbeza tanpa membina imej baharu.
SecretProvider dalam Lucee
Lucee menyediakan sistem pengurusan rahsia terbina dalam yang dipanggil SecretProvider. Ia membolehkan anda mengkonfigurasi penyedia rahsia dalam fail konfigurasi Lucee, masing-masing dengan nama, kelas dan sifat tersuai, dan mengakses nilai melalui fungsi SecretProviderGet(). Penyedia yang disokong termasuk pemboleh ubah persekitaran, sifat sistem, fail JSON dan perkhidmatan seperti AWS Secrets Manager. Nilai yang dipulangkan adalah rujukan malas, iaitu nilai sebenar hanya diselesaikan apabila digunakan:
// Baca nilai rahsia daripada penyedia yang dikonfigurasi
var apiKey = SecretProviderGet("api-key");
var dbPassword = SecretProviderGet("db-password", "my-provider");
Satu kelebihan utama ialah pemisahan yang jelas antara tempat rahsia disimpan dan cara ia digunakan. Kod anda tidak peduli sama ada nilai datang daripada pemboleh ubah persekitaran atau AWS Secrets Manager, jadi anda boleh menukar penyedia tanpa menyentuh logik aplikasi. Ini juga menjadikan putaran lebih mudah kerana nilai baharu diambil semula apabila rujukan diselesaikan.
Hak Fail yang Betul
Rahsia dalam fail hanya selamat sekuat kebenaran failnya. Gunakan 600 untuk fail yang dibaca oleh satu pengguna, dan pastikan direktori induk tidak boleh dibaca oleh pengguna lain dengan 700. Untuk kunci SSH atau sijil, kebenaran yang terlalu longgar boleh menyebabkan alat enggan menggunakannya, dan itu adalah petanda baik. Sentiasa semak siapa pemilik fail dan siapa yang menjalankan proses Lucee, kerana proses itu perlu boleh membaca nilai tanpa mendedahkannya kepada seluruh sistem. Satu kesilapan lazim ialah menyalin fail .env bersama kod semasa deploy dan meletakkannya di webroot, jadi sahkan lokasi dan kebenarannya pada setiap persekitaran, bukan hanya pada mesin pembangun.
Bila Rahsia Terdedah: Putaran
Apabila rahsia terdedah, anggap ia sudah kompromi dan putarkannya segera. Putaran bermaksud menjana nilai baharu, mengemas kini semua tempat yang menggunakannya, dan membatalkan nilai lama. Urutannya penting: jana nilai baharu dahulu, kemas kini konfigurasi, mulakan semula aplikasi jika perlu, kemudian sahkan nilai lama tidak lagi berfungsi. Cheat Sheet Pengurusan Rahsia OWASP menegaskan bahawa putaran kunci secara manual itu sukar dan mudah tersilap, jadi automatikkan proses ini apabila boleh. Satu strategi yang baik ialah menyokong dua nilai secara serentak semasa peralihan, supaya putaran tidak menyebabkan tempoh henti, dan pastikan nilai lama dibatalkan sebaik sahaja peralihan selesai supaya ia tidak kekal sebagai pintu belakang.
Jadual Perbandingan Pilihan
Jadual berikut membantu anda memilih pendekatan yang sesuai untuk situasi anda:
| Pilihan | Kelebihan | Kelemahan |
|---|---|---|
| Fail .env (luar webroot) | Mudah, senang difahami | Perlu pengurusan kebenaran fail sendiri |
| Pemboleh ubah persekitaran | Bersih, sesuai untuk Docker | Perlu kawalan ke atas platform |
| SecretProvider Lucee | Terpusat, sokong AWS dan JSON | Perlu konfigurasi penyedia dahulu |
Untuk kata laluan pangkalan data khususnya, mana-mana pendekatan di atas lebih baik daripada menulisnya terus dalam atribut datasource, seperti yang dibincangkan dalam panduan konfigurasi datasource.
Senarai Semak Sebelum Deploy
Sebelum menghantar kod ke pelayan pengeluaran, semak perkara berikut:
- Tiada rahsia ditulis secara teks biasa dalam kod atau fail konfigurasi yang dikesan git.
- Fail .env berada di luar webroot dengan kebenaran 600.
- Fail .env disenaraikan dalam .gitignore dan tidak pernah dikomit dalam sejarah.
- Aplikasi gagal dengan jelas apabila rahsia yang diperlukan tiada.
- Proses putaran didokumenkan dan boleh dijalankan tanpa tempoh henti.
- Akses kepada nilai rahsia dihadkan kepada komponen yang memerlukannya sahaja.
Menyusun rahsia dengan betul juga memudahkan proses deploy yang selamat dan boleh diulang, seperti yang diterangkan dalam panduan deploy tanpa henti CFML. Ingat juga bahawa kunci penyulitan dan rahsia 2FA termasuk dalam kategori yang sama, jadi layan semuanya dengan tahap perlindungan yang sama seperti yang digariskan dalam panduan pengesahan pengguna CFML.
Soalan Lazim (FAQ)
Apakah rahsia aplikasi dalam CFML?
Rahsia ialah nilai yang mesti dirahsiakan seperti kata laluan pangkalan data, kunci API dan kunci penyulitan. Prinsipnya ialah kod merujuk kepada rahsia tetapi tidak pernah menyimpannya secara teks biasa.
Bagaimana saya membaca fail .env dalam Lucee?
Gunakan fileRead() untuk membaca kandungan fail, kemudian huraikannya menjadi struktur pasangan kunci dan nilai seperti contoh di atas. Simpan fail di luar webroot dengan kebenaran 600.
Apakah fungsi Lucee untuk membaca pemboleh ubah persekitaran?
Gunakan GetSystemPropOrEnvVar(), yang membaca nilai daripada pemboleh ubah persekitaran atau sifat sistem JVM mengikut nama kunci.
Apakah itu SecretProvider dalam Lucee?
SecretProvider ialah sistem pengurusan rahsia terbina dalam Lucee yang menyimpan rahsia dalam penyedia tersusun dan mengaksesnya melalui SecretProviderGet(). Ia menyokong pemboleh ubah persekitaran, fail JSON dan AWS Secrets Manager.
Apa yang perlu saya buat apabila rahsia terdedah?
Putarkannya segera: jana nilai baharu, kemas kini semua tempat yang menggunakannya, dan batalkan nilai lama. Sokong dua nilai secara serentak semasa peralihan untuk mengelakkan tempoh henti.