MySQL adalah sistem database relasional lintas platform berjaringan penuh dan sistem manajemen database terdistribusi dengan arsitektur klien/server. MySQL adalah sistem database relasional lintas platform berjaringan penuh dan sistem manajemen database terdistribusi dengan arsitektur klien/server. Ia memiliki keunggulan fungsi yang kuat, penggunaan yang mudah, manajemen yang mudah, kecepatan berjalan yang cepat, keamanan dan keandalan yang kuat. Pengguna dapat menggunakan banyak bahasa untuk menulis program untuk mengakses database MySQL, terutama bila dikombinasikan dengan PHP, itu adalah a kombinasi emas dan banyak digunakan.
Karena MySQL adalah database multi-platform, konfigurasi defaultnya harus dianggap dapat diterapkan dalam berbagai situasi, sehingga penguatan keamanan lebih lanjut harus dilakukan di lingkungan penggunaan kita sendiri. Sebagai administrator sistem MySQL, kami bertanggung jawab untuk menjaga keamanan data dan integritas sistem database MySQL.
Konfigurasi keamanan database MySQL harus dimulai dari dua aspek, keamanan sistem internal dan keamanan jaringan eksternal. Selain itu, kami juga akan memperkenalkan secara singkat beberapa masalah dan tips yang perlu diperhatikan saat pemrograman.
Keamanan internal sistem
Pertama, mari kita perkenalkan secara singkat struktur direktori database MySQL. Setelah MySQL terinstal, direktori data dan database akan diinisialisasi setelah menjalankan skrip mysql_db_install. Jika kita menggunakan paket kode sumber MySQL untuk menginstal, dan direktori instalasinya adalah /usr/local/mysql, maka direktori data umumnya adalah /usr/local/mysql/var. Sistem basis data terdiri dari serangkaian basis data, yang masing-masing berisi serangkaian tabel basis data. MySQL menggunakan nama database untuk membuat direktori database di direktori data. Setiap tabel database menggunakan nama tabel database sebagai nama file, dan tiga file dengan ekstensi MYD, MYI, dan frm ditempatkan di direktori database.
Tabel otorisasi MySQL menyediakan kontrol izin yang fleksibel untuk akses database, tetapi jika pengguna lokal memiliki izin membaca ke file perpustakaan, penyerang hanya perlu mengemas dan menyalin direktori database, dan kemudian menyalinnya ke direktori datanya sendiri database. Oleh karena itu, keamanan host tempat MySQL berada adalah masalah yang paling penting. Jika host tidak aman dan dikendalikan oleh penyerang, maka keamanan MySQL tidak dapat didiskusikan. Yang kedua adalah keamanan direktori data dan file data, yaitu masalah pengaturan izin.
Dilihat dari beberapa rilis biner lama situs utama MySQL, atribut direktori data di versi 3.21.xx adalah 775, yang sangat berbahaya. Setiap pengguna lokal dapat membaca direktori data, sehingga file database sangat tidak aman. Atribut direktori data di versi 3.22.xx adalah 770. Atribut ini juga agak berbahaya. Pengguna lokal di grup yang sama dapat membaca dan menulis, sehingga file data tidak aman. Atribut direktori data di versi 3.23.xx adalah 700, yang lebih baik. Hanya pengguna yang memulai database yang dapat membaca dan menulis file database, sehingga menjamin keamanan file data lokal.
Jika pengguna yang memulai database MySQL adalah mysql, maka direktori dan file berikut ini aman. Harap perhatikan direktori data dan atribut berikut:
cangkang>ls -l /usr/local/mysql
jumlah 40
drwxrwxr-x 2 root root 4096 27 Feb 20:07 bin
drwxrwxr-x 3 root root 4096 27 Feb 20:07 termasuk
drwxrwxr-x 2 root root 4096 27 Feb 20:07 info
drwxrwxr-x 3 root root 4096 27 Februari 20:07 lib
drwxrwxr-x 2 root root 4096 27 Feb 20:07 libexec
drwxrwxr-x 3 root root 4096 27 Feb 20:07 kawan
drwxrwxr-x 6 root root 4096 27 Feb 20:07 tes mysql
drwxrwxr-x 3 root root 4096 27 Feb 20:07 bagikan
drwxrwxr-x 7 root root 4096 27 Feb 20:07 sql-bench
drwx------ 4 mysql mysql 4096 27 Februari 20:07 var
cangkang>ls -l /usr/local/mysql/var
jumlah 8
drwx------ 2 mysql mysql 4096 27 Februari 20:08 mysql
drwx------ 2 mysql mysql 4096 27 Februari 20:08 tes
cangkang>ls -l /usr/local/mysql/var/mysql
jumlah 104
-rw------- 1 mysql mysql 0 27 Februari 20:08 kolom_priv.MYD
-rw------- 1 mysql mysql 1024 27 Februari 20:08 kolom_priv.MYI
-rw------- 1 mysql mysql 8778 27 Februari 20:08 kolom_priv.frm
-rw------- 1 mysql mysql 302 27 Februari 20:08 db.MYD
-rw------- 1 mysql mysql 3072 27 Februari 20:08 db.MYI
-rw------- 1 mysql mysql 8982 27 Februari 20:08 db.frm
-rw------- 1 mysql mysql 0 27 Feb 20:08 func.MYD
-rw------- 1 mysql mysql 1024 27 Feb 20:08 func.MYI
-rw------- 1 mysql mysql 8641 27 Februari 20:08 func.frm
-rw------- 1 mysql mysql 0 27 Feb 20:08 host.MYD
-rw------- 1 mysql mysql 1024 27 Feb 20:08 host.MYI
-rw------- 1 mysql mysql 8958 27 Februari 20:08 host.frm
-rw------- 1 mysql mysql 0 27 Februari 20:08 table_priv.MYD
-rw------- 1 mysql mysql 1024 27 Februari 20:08 table_priv.MYI
-rw------- 1 mysql mysql 8877 27 Februari 20:08 table_priv.frm
-rw------- 1 mysql mysql 428 27 Feb 20:08 pengguna.MYD
-rw------- 1 mysql mysql 2048 27 Februari 20:08 pengguna.MYI
-rw------- 1 mysql mysql 9148 27 Februari 20:08 user.frm
Jika pemilik dan atribut file ini tidak seperti ini, silakan gunakan dua perintah berikut untuk memperbaikinya:
shell>chown -R mysql.mysql /usr/local/mysql/var
shell>chmod -R go-rwx /usr/local/mysql/var
Menggunakan pengguna root untuk memulai layanan jarak jauh selalu menjadi tabu keamanan, karena jika ada masalah dengan program layanan, kemungkinan besar penyerang jarak jauh akan mendapatkan kendali penuh atas host. MySQL telah membuat perubahan kecil sejak versi 3.23.15. Secara default, layanan harus dimulai oleh pengguna mysql setelah instalasi, dan pengguna root tidak diperbolehkan untuk memulai. Jika Anda harus menggunakan pengguna root untuk memulai, Anda harus menambahkan parameter --user=root (./safe_mysqld --user=root &). Karena ada pernyataan SQL LOAD DATA INFILE dan SELECT... INTO OUTFILE di MySQL, jika pengguna root memulai server MySQL, maka pengguna database memiliki izin menulis dari pengguna root. Namun, MySQL masih memiliki beberapa batasan. Misalnya, LOAD DATA INFILE hanya dapat membaca file yang dapat dibaca secara global, dan SELECT... INTO OUTFILE tidak dapat menimpa file yang sudah ada.
File log lokal tidak dapat diabaikan, termasuk log shell dan log MySQL sendiri. Untuk kenyamanan saat login secara lokal atau membuat cadangan database, beberapa pengguna terkadang langsung memasukkan kata sandi database di parameter baris perintah, seperti:
shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
shell>/usr/local/mysql/bin/mysql -uroot -ptest
Perintah-perintah ini akan dicatat dalam file sejarah oleh shell. Misalnya, bash akan menulis file .bash_history di direktori pengguna. Jika file-file ini tidak sengaja dibaca, kata sandi database akan bocor. Perintah SQL yang dijalankan setelah pengguna login ke database juga akan dicatat oleh MySQL dalam file .mysql_history di direktori pengguna. Jika pengguna database mengubah kata sandi database menggunakan pernyataan SQL, itu juga akan bocor melalui file .mysql_history. Oleh karena itu, kita tidak boleh menambahkan kata sandi langsung setelah -p selama login dan pencadangan shell, tetapi masukkan kata sandi database setelah diminta.
Selain itu, kita tidak boleh membiarkan kedua file ini merekam operasi kita, untuk berjaga-jaga.
cangkang>rm .bash_history .mysql_history
cangkang>ln -s /dev/null .bash_history
cangkang>ln -s /dev/null .mysql_history
Kedua perintah ini menghubungkan kedua file ini ke /dev/null, sehingga operasi kita tidak akan direkam dalam dua file ini.
Keamanan jaringan eksternal
Setelah database MySQL terinstal, tabel user pada platform Unix terlihat seperti ini:
mysql> gunakan mysql;
Basis data berubah
mysql> pilih Host,Pengguna,Kata Sandi,Pilih_priv,Grant_priv dari pengguna;
+-----------+------+----------+-------------+----- -------+
|.Tuan Rumah |.Pengguna |.Kata Sandi |.Pilih_priv |.Grant_priv |
+-----------+------+----------+-------------+----- -------+
|.host lokal |.akar |.|.Y |
|.redhat |.akar |.|.Y |
|.host lokal |.|.N |
|.redhat |.|.N |
+-----------+------+----------+-------------+----- -------+
4 baris dalam set (0,00 detik)
Tabel pengguna pada platform Windows terlihat seperti ini:
mysql> gunakan mysql;
Basis data berubah
mysql> pilih Host,Pengguna,Kata Sandi,Pilih_priv,Grant_priv dari pengguna;
+-----------+------+----------+-------------+----- -------+
|.Tuan Rumah |.Pengguna |.Kata Sandi |.Pilih_priv |.Grant_priv |
+-----------+------+----------+-------------+----- -------+
|.host lokal |.akar |.|.Y |
|.% |.akar |.|.kamu |
|.host lokal |.|
|.% |.|
+-----------+------+----------+-------------+----- -------+
4 baris dalam set (0,00 detik)
Pertama mari kita lihat tabel pengguna pada platform Unix. Diantaranya, redhat hanyalah nama mesin dari mesin pengujian saya, jadi sebenarnya MySQL pada platform Unix hanya mengizinkan mesin ini untuk terhubung ke database secara default. Namun kata sandi pengguna root default kosong, jadi prioritas utama adalah menambahkan kata sandi ke pengguna root. Ada tiga cara untuk menambahkan kata sandi ke pengguna database:
1) Gunakan perintah mysqladmin pada prompt shell untuk mengubah kata sandi pengguna root:
shell>mysqladmin -tes kata sandi uroot
Dengan cara ini, kata sandi pengguna root database MySQL diubah untuk diuji. (test hanya contoh saja, password yang sebenarnya kita gunakan tidak boleh menggunakan password lemah yang mudah ditebak)
2) Gunakan kata sandi yang ditetapkan untuk mengubah kata sandi:
mysql> atur kata sandi untuk root@localhost=kata sandi('test' );
Saat ini, kata sandi pengguna root diubah untuk pengujian.
3) Langsung ubah kata sandi pengguna root dari tabel pengguna:
mysql> gunakan mysql;
mysql> perbarui set pengguna kata sandi=kata sandi('test') di mana pengguna='root';
mysql> hak siram;
Dengan cara ini, kata sandi pengguna root database MySQL juga telah diubah untuk diuji. Perintah terakhir, hak istimewa flush, berarti menyegarkan secara paksa tabel otorisasi memori. Jika tidak, kata sandi dalam cache akan tetap digunakan. Saat ini, pengguna ilegal juga dapat masuk dengan pengguna root dan kata sandi kosong hingga server MySQL dimulai ulang.
Kami juga melihat pengguna anonim yang penggunanya kosong. Meskipun tidak memiliki izin pada platform Unix, kami harus menghapusnya demi alasan keamanan:
mysql> hapus dari pengguna di mana pengguna='';