Pertama , seperti yang telah dikatakan beberapa orang, menjaga kredensial terpisah dari naskah sangat penting. (Selain meningkatkan keamanan, ini juga berarti Anda dapat menggunakan kembali skrip yang sama untuk beberapa sistem dengan kredensial berbeda.)
Kedua , Anda harus mempertimbangkan tidak hanya keamanan kredensial, tetapi juga dampaknya jika / ketika kredensial tersebut dikompromikan. Anda seharusnya tidak hanya memiliki satu kata sandi untuk semua akses ke database, Anda harus memiliki kredensial berbeda dengan berbagai tingkat akses. Anda bisa, misalnya, memiliki satu pengguna DB yang memiliki kemampuan untuk melakukan pencarian dalam database - bahwa pengguna harus memiliki akses hanya baca. Pengguna lain mungkin memiliki izin untuk memasukkan catatan baru, tetapi tidak untuk menghapusnya. Yang ketiga mungkin memiliki izin untuk menghapus catatan.
Selain membatasi izin untuk setiap akun, Anda juga harus memiliki batasan tempat masing-masing akun dapat digunakan. Misalnya, akun yang digunakan oleh server web Anda tidak boleh terhubung dari alamat IP lain selain dari server web. Akun dengan izin root penuh ke basis data harus sangat terbatas dalam hal di mana ia dapat terhubung dan tidak boleh digunakan selain secara interaktif. Juga pertimbangkan untuk menggunakan prosedur tersimpan dalam database untuk membatasi dengan tepat apa yang dapat dilakukan oleh setiap akun.
Pembatasan ini perlu diterapkan pada sisi server DB sistem, sehingga bahkan jika sisi klien dikompromikan, pembatasan tidak dapat diubah darinya. (Dan, tentu saja, server DB perlu dilindungi dengan firewall dll selain konfigurasi DB ...)
Dalam kasus akun DB yang hanya diizinkan akses read-only terbatas, dan hanya dari alamat IP tertentu, Anda mungkin tidak memerlukan kredensial lebih lanjut dari itu, tergantung pada sensitivitas data dan keamanan host script. sedang dijalankan. Salah satu contoh dapat berupa formulir pencarian di situs web Anda, yang dapat dijalankan dengan pengguna yang hanya diizinkan untuk menggunakan prosedur tersimpan yang hanya mengekstraksi informasi yang akan disajikan pada halaman web. Dalam hal ini, menambahkan kata sandi tidak benar-benar memberikan keamanan tambahan, karena informasi itu sudah dimaksudkan untuk umum, dan pengguna tidak dapat mengakses data lain yang akan lebih sensitif.
Pastikan juga koneksi ke database dibuat menggunakan TLS, atau siapa pun yang mendengarkan di jaringan bisa mendapatkan kredensial Anda.
Ketiga , pertimbangkan kredensial apa yang digunakan. Kata sandi hanyalah satu bentuk, dan bukan yang paling aman. Anda bisa menggunakan beberapa bentuk pasangan kunci publik / pribadi, atau AD / PAM atau sejenisnya.
Keempat , pertimbangkan kondisi di mana skrip akan dijalankan:
Jika dijalankan secara interaktif, maka Anda harus memasukkan kata sandi, atau kata sandi ke kunci pribadi, atau kunci pribadi, atau masuk dengan tiket Kerberos yang valid, ketika Anda menjalankannya - dengan kata lain, skrip harus mendapatkan kredensial langsung dari Anda pada saat Anda menjalankannya, alih-alih membacanya dari beberapa file.
Jika dijalankan dari server web, pertimbangkan untuk menyiapkan kredensial pada saat Anda memulai server web. Contoh yang baik di sini adalah sertifikat SSL - sertifikat publik dan kunci privat, dan kunci privat memiliki kata sandi. Anda dapat menyimpan kunci privat di server web, tetapi Anda masih harus memasukkan kata sandi saat memulai Apache. Anda juga dapat memiliki kredensial pada beberapa jenis perangkat keras, seperti kartu fisik atau HSM, yang dapat dihapus atau dikunci setelah server dimulai. (Tentu saja, kelemahan dari metode ini adalah bahwa server tidak dapat memulai kembali sendiri jika terjadi sesuatu. Saya lebih suka ini dengan risiko sistem saya dikompromikan, tetapi jarak tempuh Anda mungkin bervariasi ...)
Jika skrip dijalankan dari cron, ini adalah bagian yang sulit. Anda tidak ingin memiliki kredensial tergeletak di mana saja pada sistem Anda di mana seseorang dapat mengaksesnya - tetapi Anda ingin memiliki kredibilitas itu di sekitar sehingga skrip Anda dapat mengaksesnya, bukan? Ya tidak benar. Pertimbangkan dengan tepat apa yang dilakukan skrip. Izin apa yang dibutuhkan pada database? Bisakah itu dibatasi sehingga tidak masalah jika orang yang salah terhubung dengan izin itu? Bisakah Anda menjalankan skrip secara langsung di server DB yang tidak dapat diakses orang lain, alih-alih dari server yang memang memiliki pengguna lain? Jika, untuk beberapa alasan yang tidak dapat saya pikirkan, Anda benar - benar harus menjalankan skrip pada server yang tidak aman dan harus dapat melakukan sesuatu yang berbahaya / destruktif ... sekarang adalah saat yang tepat untuk memikirkan kembali arsitektur Anda.
Kelima , jika Anda menghargai keamanan basis data Anda, Anda seharusnya tidak menjalankan skrip ini di server yang dapat diakses orang lain. Jika seseorang masuk pada sistem Anda, maka mereka akan memiliki kemungkinan untuk mendapatkan kredensial Anda. Misalnya, dalam hal server web dengan sertifikat SSL, setidaknya ada kemungkinan teoritis seseorang dapat memperoleh root dan mengakses area memori proses httpd dan mengekstrak kredensial. Paling tidak ada satu exploit dalam beberapa waktu terakhir di mana ini bisa dilakukan melalui SSL, bahkan tidak mengharuskan penyerang untuk login.
Juga pertimbangkan untuk menggunakan SELinux atau apparmor atau apa pun yang tersedia untuk sistem Anda untuk membatasi pengguna mana yang dapat melakukan apa. Mereka akan memungkinkan Anda untuk melarang pengguna bahkan mencoba untuk terhubung ke database, bahkan jika mereka berhasil mendapatkan akses ke kredensial.
Jika semua ini kedengarannya berlebihan bagi Anda , dan Anda tidak mampu atau tidak punya waktu untuk melakukannya - maka, menurut pendapat saya (arogan dan elitis), Anda tidak boleh menyimpan sesuatu yang penting atau sensitif dalam database Anda. Dan jika Anda tidak menyimpan sesuatu yang penting atau sensitif, maka tempat Anda menyimpan kredensial Anda juga tidak penting - dalam hal ini, mengapa menggunakan kata sandi sama sekali?
Terakhir , jika Anda benar-benar tidak dapat menghindari menyimpan semacam kredensial, Anda dapat membuat kredensial hanya-baca dan dimiliki oleh root dan root dapat memberikan kepemilikan secara sangat sementara ketika diminta untuk melakukannya dengan skrip (karena skrip Anda tidak boleh jalankan sebagai root kecuali benar-benar diperlukan, dan menghubungkan ke database tidak membuatnya perlu). Tapi itu masih bukan ide yang bagus.