Pengerasan MySQL untuk situs WordPress Anda

Diterbitkan: 2023-01-18

WordPress, CMS paling populer, berjalan di MySQL, database paling populer di luar sana. Menghabiskan waktu untuk memastikan instalasi MySQL dan instalasi konfigurasi database WordPress cukup kuat terhadap vektor serangan umum dapat membantu Anda mengurangi risiko. Ini terutama benar jika Anda mengelola sendiri server MySQL Anda.

Perlu dicatat bahwa banyak instalasi WordPress menggunakan MariaDB, yang merupakan fork dari MySQL. Karena keduanya bekerja sangat mirip, kami akan menggunakan MySQL yang berarti MySQL dan MariaDB. Apa pun jenis RDMS yang Anda jalankan, mengeraskan MySQL dapat membantu Anda meminimalkan risiko serangan dari peretas. Namun, ini tidak menggantikan tindakan keamanan lainnya, seperti memasang firewall aplikasi web, memastikan Anda memiliki plugin, tema, dan WordPress versi terbaru, dan memperkuat WordPress.

Perhatian , artikel ini ditargetkan untuk MySQL 8.0 yang berjalan di Linux (Ubuntu). Meskipun konsep akan diterjemahkan ke sistem operasi lain dan versi MySQL/MariaDB, perintah dan jalur file yang digunakan dalam contoh ini mungkin berbeda. Sebelum melakukan perubahan apa pun pada sistem produksi, sangat disarankan untuk menguji setiap perubahan dalam lingkungan pementasan atau praproduksi.

Pada artikel ini, yang terutama ditujukan bagi mereka yang mengelola MySQL mereka sendiri, kami menawarkan beberapa tip dan tutorial tentang cara mengamankan MySQL. Meski begitu, daftar ekstensif praktik terbaik yang disajikan dalam artikel ini layak dibaca oleh siapa pun yang mengelola situs web WordPress. Mengamankan server MySQL Anda adalah langkah penting dalam menjaga keamanan WordPress, dan melindungi diri Anda dari berbagai jenis serangan brute force, injeksi malware, dan jenis serangan lainnya.

Daftar Isi

  • Pertimbangkan untuk menggunakan Database sebagai Layanan (DBaaS
  • Selalu perbarui MySQL
  • Jalankan MySQL pada mesin khusus
  • Ikat MySQL ke alamat IP
  • Batasi penggunaan alat GUI berbasis web
  • Jalankan daemon MySQL menggunakan pengguna khusus
  • Gunakan skrip mysql_secure_installation
  • Buat pengguna database WordPress khusus
  • Pastikan local_infile dinonaktifkan
  • Nonaktifkan riwayat perintah MySQL
  • Pastikan bahwa mysqld tidak dimulai dengan argumen –skip-grant-tables
  • Buat cadangan basis data Anda
    • Sering-seringlah mengambil cadangan
    • Verifikasi integritas cadangan Anda sesering mungkin
    • Simpan cadangan Anda dengan aman
  • Mengaktifkan dan menerapkan koneksi TLS
    • Ubah awalan tabel
    • Bagaimana menerapkan perubahan
    • Menjaga keamanan WordPress Anda

Pertimbangkan untuk menggunakan Database sebagai Layanan (DBaaS)

Database sebagai Layanan layak dipertimbangkan jika Anda tidak menghosting WordPress dengan paket terkelola. Itu menggantikan model tradisional menginstal MySQL secara lokal dengan layanan yang Anda sambungkan. Ini mungkin sesuai dengan kasus penggunaan Anda jika Anda menjalankan situs WordPress dengan penyedia hosting yang menawarkan layanan database terkelola. Pilihan yang tersedia umumnya mencakup Amazon RDS, DigitalOcean Managed MySQL, dan Linode Managed MySQL). Sepintas lalu, layanan ini bisa lebih mahal daripada menjalankan MySQL sendiri. Namun, mereka melakukan semua pekerjaan berat dalam menjalankan database tingkat produksi. Sebagian besar layanan menyertakan prasetel praktik terbaik keamanan, tambalan dan pemeliharaan keamanan berkelanjutan, serta pencadangan.

Menggunakan Database sebagai Layanan (DBaaS) adalah salah satu opsi terbaik dalam hal keamanan dan keandalan. Meskipun ini tidak wajib, itu masih bagus untuk dimiliki. Namun, jika Anda ingin mengelola sendiri MySQL, berikut ini adalah kumpulan tip pengerasan yang perlu diingat.

Selalu perbarui MySQL

Sama pentingnya untuk memastikan Anda menjalankan versi terbaru WordPress, penting juga untuk selalu memperbarui MySQL. Seperti kebanyakan perangkat lunak lainnya, pembaruan ke server MySQL dirilis secara berkala. Pembaruan ini mengatasi bug, mengurangi kerentanan, dan menyediakan fitur baru. Anda harus selalu memperbarui MySQL dengan tambalan keamanan terbaru untuk mengurangi risiko menjalankan perangkat lunak dengan kerentanan yang diketahui. Ingatlah bahwa setelah diperbarui, Anda akan diminta untuk me-restart 'daemon mysql.' Ini adalah proses yang mungkin menimbulkan waktu henti. Seperti biasa, rencanakan ke depan.

Jalankan MySQL pada mesin khusus

Banyak instalasi WordPress menjalankan MySQL, PHP, dan server web (seperti Nginx atau Apache HTTP Server) pada mesin yang sama. Ini tidak optimal – baik dari segi kinerja maupun keamanan. MySQL idealnya dijalankan di server khusus untuk mengurangi radius ledakan serangan. Jika penyerang berhasil mengkompromikan dan meningkatkan hak istimewa di server web, akan jauh lebih sulit bagi penyerang tersebut untuk bergerak secara lateral dan juga mengkompromikan server MySQL.

Ikat MySQL ke alamat IP

Anda dapat mengonfigurasi MySQL untuk hanya menerima koneksi TCP/IP dari antarmuka IPv4 atau IPv6 tertentu. Yang perlu Anda lakukan hanyalah menyetel opsi konfigurasi alamat-bind ke alamat IP tertentu. Ini memberikan kontrol dan batasan tambahan tentang bagaimana aplikasi klien (dalam kasus kami, WordPress) dapat terhubung ke MySQL. Secara default, pengaturan ini diatur ke *, artinya MySQL out-of-the-box akan mendengarkan semua antarmuka.

Jika tidak dikonfigurasi untuk mendengarkan IP tertentu, semua IP dapat digunakan untuk terhubung ke MySQL. Pengaturan ini sangat penting untuk diatur jika Anda menjalankan MySQL pada mesin yang sama dengan server web yang Anda buka ke Internet (dalam hal ini, Anda harus mengatur alamat bind ke 127.0.0.1 sehingga MySQL hanya mendengarkan di localhost) .

Misalnya, jika Anda ingin server MySQL hanya menerima koneksi pada alamat IPv4 tertentu, Anda dapat menambahkan entri yang mirip dengan contoh di bawah ini. Anda harus memasukkan ini di bawah grup opsi [mysqld] di file konfigurasi /etc/mysql/mysql.conf.d/mysqld.cnf server Anda.

bind-address=192.168.0.24

Perhatikan bahwa setelah Anda mengatur ini, Anda perlu mengkonfigurasi ulang WordPress untuk terhubung ke database menggunakan alamat IP ini (kecuali sudah melakukannya) karena koneksi pada alamat host server lain tidak akan diizinkan.

Batasi penggunaan alat GUI berbasis web

Banyak instalasi WordPress menyertakan alat manajemen grafis front-end berbasis web. Contoh umum termasuk Cpanel, phpMyAdmin, atau Adminer. Alat-alat ini memudahkan untuk mengelola MySQL dan aspek lain dari infrastruktur yang mendasarinya. Meskipun antarmuka grafis berbasis web dapat membantu Anda mengelola database MySQL, antarmuka ini dapat meningkatkan permukaan serangan dengan menambahkan vektor lain. Selain itu, ada risiko mereka akan ditemukan dan disalahgunakan oleh penyerang untuk menjalankan kueri SQL yang merusak atau berbahaya terhadap database Anda. Serangan bahkan dapat mengakibatkan pengambilalihan penuh situs WordPress Anda.

Satu-satunya server yang aman adalah server yang dimatikan dan dicabut – namun, risikonya dapat dikelola. Menghapus instalan sistem non-kritis adalah salah satu opsi; namun, ini juga dapat dikunci dan dibatasi untuk meminimalkan risiko.

Dimungkinkan untuk membatasi akses ke alat-alat ini dengan berbagai cara. Anda dapat menginstal phpMyAdmin untuk WordPress dari jarak jauh, sehingga meminimalkan risiko ke server web. Alternatifnya, Anda mungkin juga ingin mempertimbangkan untuk menggunakan alat seperti MySQL Workbench atau Beekeeper Studio di mesin lokal Anda dan terhubung ke server database Anda melalui terowongan SSH.

Jalankan daemon MySQL menggunakan pengguna khusus

Seperti halnya layanan lain yang berjalan di server, Anda dapat menjalankan daemon MySQL di bawah pengguna khusus. Saat Anda menjalankan MySQL menggunakan pengguna khusus, Anda dapat dengan tepat menentukan izin apa yang diberikan pengguna di dalam sistem. Menjalankan MySQL di bawah pengguna khusus juga mengikuti prinsip hak istimewa paling rendah karena ini mengurangi radius ledakan kerentanan MySQL. Ini juga mengurangi kemungkinan kesalahan konfigurasi yang dimanfaatkan karena pengguna yang dibatasi tidak akan dapat mengakses sumber daya yang tidak terkait dengan MySQL (seperti konfigurasi dan rahasia sistem operasi).

Kabar baiknya adalah penginstalan melalui pengelola paket (seperti apt atau yum) menangani langkah ini secara otomatis saat menginstal MySQL. Cara cepat untuk memverifikasi apakah MySQL berjalan di bawah pengguna khusus adalah dengan menjalankan perintah berikut di mesin yang menjalankan daemon MySQL.

ps -ef | egrep “^mysql.*$”

Jika MySQL berjalan menggunakan pengguna khusus, Anda akan melihat setidaknya satu baris dari keluaran ps dikembalikan.

Gunakan skrip mysql_secure_installation

Paket mysql-server dilengkapi dengan utilitas skrip shell bernama mysql_secure_installation. Anda dapat menggunakan skrip ini untuk menyiapkan titik awal yang aman untuk server MySQL. Karena itu, Anda harus menjalankannya setelah instalasi baru MySQL. Utilitas ini membantu Anda:

  • Tetapkan kata sandi untuk akun root
  • Hapus akun root yang dapat diakses dari luar localhost
  • Hapus akun pengguna anonim
  • Hapus database pengujian (yang, secara default, dapat diakses oleh pengguna anonim)

Untuk mengaktifkan mysql_secure_installation, jalankan perintah berikut:

sudo mysql_secure_installation

Setelah proses penyiapan dimulai, Anda akan diberi beberapa petunjuk yang menanyakan apakah Anda ingin mengaktifkan plugin kata sandi validasi , yang digunakan untuk menguji kekuatan kata sandi yang Anda pilih untuk pengguna MySQL. Anda disarankan untuk mengaktifkan plugin ini.

Setelah Anda mengaktifkan plugin validasi kata sandi, skrip akan meminta Anda untuk menentukan kebijakan validasi kata sandi. Di sini, Anda harus memilih kebijakan kata sandi yang kuat. Anda selanjutnya akan diminta untuk mengatur ulang kata sandi pengguna root.

Selanjutnya, skrip akan meminta Anda untuk menghapus pengguna MySQL anonim. Ini penting untuk mengurangi kemungkinan penyerang mendapatkan akses ke server database dengan memanfaatkan pengguna MySQL anonim.

Prompt berikutnya akan menanyakan apakah Anda ingin menonaktifkan login menggunakan pengguna root saat mengautentikasi dari jarak jauh ke server MySQL. Otentikasi jarak jauh menggunakan pengguna root berbahaya dan jarang diperlukan. Sebagai gantinya, Anda harus SSH ke MySQL dan menggunakan klien MySQL di server untuk mengautentikasi sebagai pengguna root atau, sebaiknya, gunakan terowongan SSH untuk meneruskan port MySQL jarak jauh ke mesin lokal Anda dan terhubung menggunakan klien lokal.

Selanjutnya, Anda akan diminta untuk menghapus database default (jika ada) yang disertakan dengan MySQL. Ini adalah praktik yang disarankan untuk produksi server MySQL.

Hapus basis data default

Terakhir, Anda akan ditanya apakah ingin memuat ulang tabel hak istimewa agar semua perubahan yang telah diterapkan diterapkan.

Buat pengguna database WordPress khusus

Praktik terbaik keamanan menentukan pemisahan pengguna dan hak istimewa berdasarkan tugas atau peran. Ini berarti bahwa setiap aplikasi yang menggunakan database harus memiliki pengguna khusus sendiri dengan jumlah minimum izin database MySQL yang diperlukan untuk menjalankan tugasnya. Dengan demikian, Anda akan memastikan hak istimewa pengguna tidak melebihi apa yang diperlukan.

Praktik ini harus diperluas ke penerapan yang menjalankan beberapa situs web WordPress — setiap situs web WordPress harus memiliki database khusus dan pengguna MySQL sendiri. Ini memastikan bahwa setiap saat, hanya satu pengguna yang memiliki akses ke satu database pada satu waktu, dan pengguna tidak dapat mengakses database lain, menghindari akses tidak sah dan pelanggaran data.

Pernyataan SQL berikut (gantikan <host> dan <password> dan <database> agar sesuai dengan kebutuhan Anda) dapat digunakan untuk membuat pengguna khusus untuk situs web WordPress Anda dan memberikan hak istimewa untuk penggunaan reguler. Perlu diingat bahwa beberapa plugin, tema, dan pembaruan WordPress terkadang memerlukan hak istimewa tambahan untuk beroperasi dengan benar (lihat panduan resmi WordPress tentang ini untuk informasi lebih lanjut)

Pastikan local_infile dinonaktifkan

Pernyataan LOAD DATA memungkinkan Anda memuat file data ke dalam tabel database. Dalam kondisi tertentu, ini dapat disalahgunakan untuk membaca file dari server MySQL. Dengan demikian, kecuali Anda memiliki kasus penggunaan khusus untuk ini di situs WordPress Anda, Anda harus menonaktifkan fitur ini.

Jika MySQL dan server web berjalan pada mesin yang sama, penyerang dapat menggunakan pernyataan LOAD DATA LOCAL untuk membaca file arbitrer yang telah dibaca oleh proses server web. Ini mengasumsikan bahwa penyerang memiliki kemampuan untuk menjalankan pernyataan SQL yang sewenang-wenang terhadap MySQL. Seperti halnya dengan kerentanan injeksi SQL atau melalui penginstalan plugin WordPress yang berbahaya. Ini adalah alasan lain untuk memisahkan server web dan server basis data Anda.

Secara default, local_infile dinonaktifkan di MySQL 8.0 (dulu diaktifkan secara default di versi MySQL sebelumnya). Untuk mencegah server MySQL menerima pernyataan LOAD DATA LOCAL, pastikan daemon mysqld dimulai dengan local_infile dinonaktifkan.

Nonaktifkan riwayat perintah MySQL

Di Linux, pernyataan log klien MySQL yang dijalankan secara interaktif disimpan ke file riwayat (biasanya terletak di $HOME/.mysql_history). Riwayat perintah MySQL idealnya harus dinonaktifkan karena ini mengurangi kemungkinan terungkapnya informasi sensitif, seperti kata sandi, kunci enkripsi, atau rahasia lainnya.

Untuk memverifikasi bahwa file .mysql_history tidak ada di sistem, jalankan perintah berikut:

cari /home -nama “.mysql_history”
temukan /root -nama “.mysql_history”

Jika perintah di atas mengembalikan output apa pun, hapus file .mysql_history apa pun. Selain itu, Anda dapat mengatur $HOME/.mysql_history sebagai symlink ke /dev/null sebagai berikut:

ln -s /dev/null $HOME/.mysql_history

Pastikan bahwa mysqld tidak dimulai dengan argumen –skip-grant-tables

Jika kata sandi root MySQL salah tempat, meskipun bukan metode yang disukai, beberapa administrator MySQL dapat menggunakan pengaturan MySQL untuk memulai dengan argumen –skip-grant-tables. Saat memulai MySQL dengan parameter ini, ia akan menghindari memeriksa tabel hibahnya saat klien menghubungkan atau menjalankan kueri, secara efektif memungkinkan siapa saja, di mana saja (asalkan mereka dapat menjangkau database melalui jaringan), untuk melakukan apa saja di server database.

Untuk memastikan bahwa –skip-grant-tables tidak diaktifkan, buka file konfigurasi server Anda /etc/mysql/mysql.conf.d/mysqld.cnf dan cari skip-grant-tables. Nilai sebaiknya tidak disetel, atau disetel ke skip-grant-tables = FALSE.

Buat cadangan basis data Anda

Mencadangkan database WordPress Anda sangat penting untuk dapat segera pulih dari bencana atau serangan. Meskipun ada banyak sekali cara untuk mencadangkan database WordPress Anda – mulai dari plugin dan layanan cadangan WordPress hingga skrip buatan sendiri yang mengambil dump database secara berkala – berikut adalah beberapa tip penting yang perlu diingat.

Sering-seringlah mengambil cadangan

Mengambil cadangan reguler cukup jelas dan cukup jelas — semakin sering Anda mengambil cadangan basis data, semakin mudah untuk pulih dari insiden kehilangan data. Meskipun frekuensi pencadangan akan bergantung pada jenis situs WordPress yang Anda jalankan, sebagai aturan praktis, melakukan pencadangan setiap hari berfungsi dengan baik untuk sebagian besar kasus penggunaan.

Verifikasi integritas cadangan Anda sesering mungkin

Cadangan Anda hanya berguna jika berhasil. dan Anda mungkin lebih memilih untuk tidak mengetahuinya saat Anda berada di tengah-tengah insiden yang mencoba memulihkan data. Perbaikan sederhana untuk ini adalah dengan sering memverifikasi bahwa cadangan Anda benar-benar berfungsi dengan sering melakukan uji pemulihan. Cara yang baik untuk melakukannya adalah dengan mengatur acara kalender setiap beberapa bulan untuk menjalani prosedur pemulihan guna memastikan pencadangan Anda masih berfungsi seperti yang diharapkan. Selain itu, mendokumentasikan langkah-langkah pemulihan database juga merupakan ide yang bagus — semakin sedikit tebakan saat menanggapi insiden, semakin baik.

Simpan cadangan Anda dengan aman

Jangan pernah menyimpan cadangan situs WordPress Anda di web atau server basis data Anda (terutama di server web Anda). Cadangan adalah tempat yang tepat bagi penyerang untuk melakukan penyelaman tempat sampah. Menyimpan cadangan Anda di lokasi luar kantor yang aman sangat disarankan. Jika Anda mengambil dump database berkala, pertimbangkan untuk menyimpan dump database Anda pada layanan penyimpanan objek. Ini dapat mencakup Amazon S3, Cloudflare R2, DigitalOcean Spaces, Penyimpanan Objek Linode, dll. Mengambil rute ini bisa menjadi cara yang hebat dan hemat biaya untuk menyimpan cadangan database Anda. Namun, berhati -hatilah agar keranjang penyimpanan yang Anda gunakan tidak dapat diakses publik.

Mengaktifkan dan menerapkan koneksi TLS

Kecuali jika Anda menjalankan MySQL pada mesin yang sama dengan server web Anda (yang, seperti yang telah kami bahas di atas, bukanlah praktik keamanan yang ideal), sangat disarankan untuk mengenkripsi data antara WordPress dan MySQL menggunakan Transport Layer Security (sertifikat TLS), sebelumnya disebut sebagai Secure Socket Layer (sertifikat SSL).

Secara default, ketika Anda menginstal MySQL, itu akan menghasilkan sertifikat yang ditandatangani sendiri untuk Anda secara otomatis. Anda dapat memverifikasi ini dengan menjalankan yang berikut (sebagai alternatif, Anda dapat menggunakan skrip mysql_ssl_rsa_setup untuk menghasilkan sertifikat baru).

Anda perlu menyalin ca.pem dari daftar di atas (misalnya, melalui SCP) ke server yang menjalankan situs web WordPress Anda. Setelah Anda mengunggah file ca.pem ke server WordPress, Anda harus memindahkan sertifikat ke penyimpanan kepercayaan sertifikat sistem operasi dan memperbarui penyimpanan kepercayaan sertifikat sebagai berikut.

Perhatian, nama file sertifikat CA harus diakhiri dengan ekstensi file .crt (misalnya mysql-ca.crt valid, tetapi mysql-ca.pem.crt, atau mysql-ca.pem tidak valid).

sudo mv ca.pem /usr/local/share/ca-certificates/mysql-ca.crt
sudo pembaruan-ca-sertifikat

Selanjutnya, Anda perlu mengonfigurasi WordPress untuk menggunakan TLS saat menghubungkan ke MySQL dengan menambahkan berikut ini ke file wp-config.php dari instalasi WordPress Anda.

tentukan('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Setelah Anda memperbarui wp-config.php, WordPress akan memulai koneksi ke server MySQL Anda menggunakan TLS.

Selanjutnya, Anda disarankan untuk menerapkan koneksi TLS ke server MySQL Anda menggunakan variabel sistem require_secure_transport dengan menambahkan berikut ini ke file /etc/mysql/mysql.conf.d/mysqld.cnf Anda.

require_secure_transport = AKTIF

Terakhir, restart MySQL agar perubahan diterapkan.

systemctl me-restart mysql

Ubah awalan tabel

Secara default, semua tabel WordPress dibuat dengan awalan 'wp_'. Ini dapat memudahkan penyerang untuk berhasil dalam serangan tertentu, seperti injeksi SQL, karena mereka akan mengetahui nama tabel database. Meskipun ini saja tidak akan melindungi Anda, ini adalah latihan langsung, yang direkomendasikan oleh banyak orang sebagai praktik keamanan WordPress terbaik.

Anda dapat mengubah awalan basis data selama proses instalasi atau kapan pun setelahnya, meskipun yang terakhir sedikit lebih rumit. Either way, Anda dapat menemukan tutorial online tentang mengubah awalan database WordPress.

Bagaimana menerapkan perubahan

Semoga artikel ini memberi Anda gambaran umum tentang pengerasan keamanan MySQL dalam konteks menjalankan situs web WordPress. Meskipun tidak ada peluru perak dalam keamanan situs web, dengan sedikit usaha, mengambil pendekatan keamanan yang berlapis dan mendalam akan membuat penyerangan ke situs web Anda secara signifikan lebih sulit bagi penyerang.
Meskipun panduan ini menyajikan sejumlah teknik pengerasan untuk MySQL, MySQL hanyalah salah satu komponen ekosistem WordPress. Karena itu, Anda juga harus mempertimbangkan aspek lain dari keamanan WordPress yang tercakup dalam panduan pengerasan keamanan WordPress kami. Ini, ditambah dengan langkah-langkah keamanan yang terbukti seperti otentikasi dua faktor WordPress, akan membantu Anda memastikan Anda seaman mungkin.

Jika rasanya terlalu banyak yang harus dilakukan, ingatlah bahwa Anda dapat (dan mungkin harus) menerapkan berbagai teknik pengerasan yang tercakup dalam panduan ini secara bertahap.

Menjaga keamanan WordPress Anda

Ingatlah bahwa penyerang seringkali mengincar sasaran empuk karena mereka tidak perlu berusaha keras untuk mengeksploitasi situs web yang keamanannya lemah. Menjadi selangkah lebih maju dari postur keamanan situs web WordPress berikutnya membuat Anda menjadi target yang kurang menarik.