Cara menggunakan soket mysql

Sebagian besar dari kita, terutama programmer dan sysadmin Unix Web, pasti sudah cukup familiar dengan software ini. MySQL—yang dibahas di mwmag edisi 4—adalah server RDBMS open source yang paling populer, terutama untuk aplikasi Web. Artikel ini akan membahas masalah keamanan seputar menjalankan daemon MySQL di lingkungan multipengguna, seperti di server hosting bersama. Dalam lingkungan multiuser ada beberapa hal yang perlu diperhatikan, terutama yang berkaitan dengan isolasi antara satu user dengan user lainnya. Meskipun ada beberapa poin yang dijelaskan—seperti pengaturan izin MySQL—yang dapat diterapkan ke Windows, fokus artikel ini jelas pada lingkungan Unix/Linux.

Kiat 1. Instal mysqld Di Mesin Terpisah

Mari kita mulai dengan tip pertama. Jika anggaran Anda cukup, instal daemon MySQL (mysqld) di mesin terpisah. Metode ini termasuk yang paling aman, karena kita dapat menempatkan mesin terpisah ini di belakang firewall sehingga tidak menerima koneksi dari Internet tetapi hanya dari mesin tertentu di jaringan lokal. Juga, setiap pengguna yang menggunakan database tidak perlu diberikan akses shell. Kita bisa menutup semua port kecuali port default mysqld (3306) yang kita buka. Tidak ada yang bisa langsung menyentuh file atau log database kecuali pengguna mysql di mesin database, dan juga admin mesin

Namun tentunya tidak semua orang bisa membeli mesin khusus. Jadi…

Kiat 2. Jalankan mysqld Secara Terpisah Di Mesin Yang Sama

Meskipun MySQL adalah database multiuser, daemon mysqld hanya berjalan sebagai pengguna Unix (defaultnya adalah mysql). Tidak ada pembungkus seperti di Apache + suexec/cgiwrap. Pengguna Unix ini memiliki akses ke semua database di direktori data (defaultnya adalah /var/lib/mysql). Tentu saja, MySQL memiliki sistem hak akses yang cukup detail untuk mengelola klien mana yang dapat mengakses tabel atau database mana. Namun, bug dalam kode mysqld atau kesalahan konfigurasi sistem hak istimewa dapat menyebabkan database yang berisi data rahasia terbuka untuk pengguna MySQL lainnya. Misalnya melalui LOAD DATA INFILE atau LOAD LOCAL DATA INFILE atau melalui SELECT INTO OUTFILE, yang memungkinkan penyerang potensial untuk menimpa file database milik pengguna lain

Jika Anda memiliki database yang datanya sensitif atau harus benar-benar pribadi, Anda dapat menjalankan mysqld secara terpisah. Setiap mysqld berjalan sebagai pengguna Unix yang berbeda, sehingga satu mysqld tidak dapat mengganggu mysqld lainnya. Bug di satu mysqld tidak dapat mengganggu mysqld lainnya, karena masing-masing tidak dapat menyentuh direktori data daemon lainnya

Contoh berikut adalah pengguna steven menjalankan daemon MySQL pribadinya sendiri, berjalan sebagai pengguna steven dan port 3366. Daemon MySQL utama, sebagai pengguna mysql, tidak dapat menyentuh database

$ mkdir /home/steven/mysql
$ mysql_install_db --datadir=/home/steven/mysql
$ /usr/sbin/mysqld --datadir=/home/steven/mysql --port=3366 \
--socket=/home/steven/mysql/mysql.sock &

Anda dapat mengganti port 3366 dengan port favorit Anda. Sebelum menggunakan, Anda perlu memberikan kata sandi ke pengguna root MySQL tentunya

$ mysqladmin -u root -S /home/steven/mysql/mysql.sock password RAHASIA
_

Ganti SECRET dengan kata sandi yang sebenarnya. Nanti, saat menghubungkan ke mysqld dengan baris perintah klien mysql, misalnya, Anda perlu menyebutkan opsi -h (host) dan -P (port) atau -S (socket). Misalnya, koneksi melalui soket Unix

$ mysql -u root -S /home/steven/mysql/mysql.sock

Atau koneksi melalui TCP

$ mysql -u root -h 127.0.0.1 -P 3366

Tapi, sekali lagi, jika jumlah penggunanya banyak dan masing-masing ingin menjalankan mysqld-nya sendiri, tentunya overhead-nya besar. Karena itu…

Kiat 3. Mengenal Access Privilege System MySQL

Sebagai admin database, mau tidak mau, hal yang satu ini harus dikuasai dengan baik. Sistem Access Privilege adalah cara utama MySQL untuk membatasi pengguna dan host mana yang dapat terhubung, menyimpan kata sandi setiap pengguna, dan membatasi kemampuan pengguna untuk memanipulasi database (hanya dapat SELECT, atau SELECT dan UPDATE, dll.). Apa arti daemon MySQL yang diisolasi dari mesin atau daemon lain ketika sembarangan menerima koneksi dari pengguna dan host mana pun?

Sistem privilege MySQL cukup detail dan menurut saya lebih sederhana tetapi lebih detail dibandingkan sistem privilege PostgreSQL, meskipun dalam hal otentikasi sebenarnya sistem PostgreSQL lebih fleksibel. Pada dasarnya, semua informasi tentang pengaturan hak istimewa disimpan dalam database khusus yang disebut mysql. Penjelasan terperinci berada di luar cakupan artikel ini, tetapi sebagai tip, poin-poin berikut harus diikuti. Pertama, setiap pengguna harus diberi kata sandi. Kedua, tabel pengguna di database mysql sangat sensitif karena berisi kata sandi, jadi jangan biarkan ada pengguna yang memiliki hak SELECT di atasnya. Ketiga, batasi hak istimewa FILE dan PROSES, jangan berikan kecuali benar-benar diperlukan. Keempat, jangan biarkan satu pengguna database melihat database lain kecuali benar-benar diperlukan

Di server shared hosting yang saya kelola, untuk memudahkan, setiap pengguna database hanya dapat mengakses satu database, dan daftar hak istimewanya seperti ini. Entri di tabel pengguna. ('localhost', 'USER', password('PASSWORD'), 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N '). Entri dalam tabel db. ('localhost', 'DATABASE', 'USER', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'Y', 'Y', ' Y'). Artinya, pengguna USER hanya dapat melihat database DATABASE, hanya dapat terhubung dari mesin lokal melalui soket Unix, dan tidak memiliki hak istimewa GRANT. Hak istimewa FILE diberikan, tetapi karena setiap skrip CGI dibungkus, setidaknya akan lebih sulit bagi penyerang untuk membuat file sebagai pengguna Unix lainnya

Kiat 4. Hanya Terima Koneksi Lokal

Di server shared hosting misalnya, umumnya database diakses dari skrip CGI/PHP/ASP di server yang sama. Jika kita ingin hanya pengguna atau skrip dari mesin lokal yang dapat terhubung ke daemon MySQL, maka kita dapat mematikan opsi mendengarkan pada soket TCP. Seperti yang kita ketahui, MySQL mendengarkan koneksi pada soket Unix (defaultnya ada di /var/lib/mysql/mysql. sock) dan pada port TCP (defaultnya adalah pada port 3306). Soket Unix hanya untuk klien lokal, sedangkan soket TCP dapat digunakan untuk koneksi jaringan

Untuk membuat mysqld tidak mendengarkan soket TCP sama sekali, letakkan baris berikut di /etc/my. cnf

[mysqld]
skip-networking
_

kemudian restart mysqld. Atau tambahkan --skip-networking saat menjalankan mysqld

Setelah menggunakan opsi ini, bahkan koneksi ke 127. 0. 0. Bahkan 1 akan ditolak dengan pesan Connection Refused. Karena tidak ada soket TCP yang mendengarkan. Jadi untuk koneksi ke daemon MySQL kita harus menggunakan host localhost sehingga digunakan soket Unix sebagai metode koneksi

Keuntungan menggunakan soket Unix, selain sedikit lebih cepat (karena tidak ada overhead protokol TCP/IP), isolasi sistem file juga bertindak sebagai lapisan pelindung. Database milik user steven pada contoh Tip 2 tadi misalnya tidak bisa dijangkau sama sekali baik oleh client di mesin lain maupun oleh pengguna Unix lain di mesin yang sama, karena lokasi default soket Unix adalah /home /steven/mysql/mysql. Kaus kaki ini ditutup dari pengguna lain. Jadi database ini bersifat pribadi dan hanya dapat diakses oleh pengguna steven sendiri atau oleh skrip CGI/PHP yang dijalankan sebagai pengguna steven. Daemon MySQL utama, di sisi lain, adalah daemon yang terbuka untuk semua pengguna, karena /var/lib/mysql/mysql. sock secara default dapat diakses oleh semua pengguna

Tentu saja, terkadang database MySQL ingin diakses selain dari localhost (misalnya, ingin diakses dari klien GUI di komputer Windows). Dalam hal ini, mau tidak mau kita harus membuka kembali socket TCP dan kembali mengandalkan sistem privilege MySQL dalam membatasi host.

Kiat 5. Hapus basis data pengujian

Dalam lingkungan multiuser, setiap pengguna harus diberikan database mereka sendiri dan database default yang disediakan oleh distribusi MySQL, yaitu test, biasanya tidak berguna. Sebaiknya hapus saja database ini agar tidak sembarang user bisa mengakses database ini lalu mengisi disk atau melakukan serangan DOS misalnya. Alasan defaultnya adalah semua pengguna database dapat melihat database pengujian. Untuk menghapus database pengujian, keluarkan perintah ini dari klien baris perintah mysql

mysql> DELETE FROM db WHERE db='test' OR db='test_%';
mysql> FLUSH PRIVILEGES;

Kiat 6. chroot

Chroot adalah fasilitas yang disediakan di banyak sistem operasi Unix untuk membuat sistem file root "virtual" untuk program, misalnya di bawah /home/steven/root, sehingga program menganggap jalurnya adalah / dan tidak dapat melihat jalur di atasnya (/ home/steven atau /home serta /asli). Chroot sangat berguna untuk me-jail program agar tidak bisa menyentuh file-file di luar direktori yang sudah kita set sebagai jailnya

Tip ini sangat terkait dengan tip 2 (setiap pengguna mendapatkan mysqld mereka sendiri). Bahkan di lingkungan server virtual, chroot sering dilakukan terhadap setiap daemon sehingga masing-masing tidak dapat melihat file milik daemon lain

Chroot sekarang harus dilakukan sebagai root karena ini adalah operasi istimewa. Melanjutkan contoh di tip 2, berikut cara menjalankan mysqld yang dimiliki oleh pengguna steven dan memenjarakannya di /home/steven/mysql. mysqld memiliki opsi --chroot jadi kita tidak perlu menyalin /usr/sbin/mysqld sendiri, tetapi terakhir kali saya mencobanya masih bermasalah, jadi kita akan melakukan chroot menggunakan /usr/sbin/chroot. Contoh ini untuk RedHat Linux (saya menggunakan versi 7. 2) dan distribusi biner RPM dari MySQL AB (saya menggunakan 3. 23. 51)

$ chdir /home/steven
$ mkdir -p fakeroot/{var/lib,etc,tmp,lib,usr/sbin,usr/share}
$ mv mysql fakeroot/var/lib/ # direktori data yg sudah dibuat di tip 2
$ echo -e "root:*:0:0:::\nnobody:*:99:99:::\nsteven:*:500:500:::" \
> fakeroot/etc/passwd
$ echo -e "root::0:\nsteven::500:" > fakeroot/etc/group
$ cp -a /lib/{ld-*,libc.so*,libc-*.so,libnsl*,libnss_files*,libtermcap*} \
fakeroot/lib/
$ cp -a /usr/sbin/mysqld fakeroot/usr/sbin/
$ cp -a /usr/share/mysql fakeroot/usr/share/

# /usr/sbin/chroot /home/steven/fakeroot /usr/sbin/mysqld \
--user=steven \
--datadir=/var/lib/mysql \
--port=3366 \
--socket=/var/lib/mysql/mysql.sock

_

Untuk instalasi seperti di atas, diperlukan ruang disk sekitar 12MB untuk menyalin pustaka Linux dan file lain yang diperlukan ke /home/steven/fakeroot (karena jika tidak, setelah chroot, mysqld tidak akan dapat menemukan pustaka yang diperlukan). Kami juga membutuhkan /etc/passwd dan /etc/group "dummy". Ganti UID dan GID 500 sesuai dengan UID dan GID user yang akan menjalankan mysqld. Setelah semua file siap, kita panggil mysqld. Perhatikan bahwa opsi jalur di --datadir dan --socket relatif terhadap fakeroot. Program di bawah chroot yang sama akan melihat soket MySQL steven dan direktori data di /var/lib/mysql, tetapi sebenarnya—seperti yang akan dilihat oleh program lain di luar chroot—lokasi aslinya ada di / home/steven/fakeroot/var/lib/mysql

Chroot berguna terutama jika Anda tidak mempercayai pengembangan atau versi beta MySQL (mis. versi 4. 0. 2 sekarang). Chroot juga berguna dalam menutup kemungkinan perintah SQL LOAD DATA INFILE dan SELECT INTO OUTFILE memata-matai dan merusak file yang tidak diinginkan. Chroot juga perlu diperhatikan ketika sebuah server berisi beberapa pengguna yang benar-benar tidak saling percaya. Dalam praktek sehari-hari, saya jarang menggunakan chroot

Kiat 7. Jangan aktifkan LOAD DATA LOCAL INFILE

LOAD DATA LOCAL INFILE adalah fasilitas bagi client untuk membaca file dari filesystem dan memasukkannya ke dalam tabel database. Sejak 3. 23. 49, LOAD DATA LOCAL INFILE dimatikan secara default. Jika pada mesin shared hosting Anda terdapat script CGI atau ASP yang tidak dibungkus, maka ada kemungkinan perintah SQL digunakan untuk membaca file sebagai pengguna siapa pun misalnya (dan mengambil kode sumber skrip milik pengguna lain dan kemudian memuatnya ke dalam tabel database dan kemudian ke file melalui SELECT INTO OUTFILE atau melalui skrip yang melakukan SELECT dan mencetaknya ke file). Jika Anda cukup yakin bahwa semua skrip sudah dibungkus, maka Anda dapat mengaktifkan perintah SQL ini dengan memberikan opsi

[mysql]
local-infile

di /etc/my. cnf. Skrip juga harus memberikan perintah mysql_options() terlebih dahulu—saat ini tidak didukung oleh PHP—sebelum dapat memberikan perintah SQL LOAD DATA LOCAL INFILE

Kiat 8. koneksi SSL

Tip ini terkait dengan tip nomor 4. Jika koneksi MySQL Anda hanya lokal melalui soket Unix, Anda cukup aman saat ini. Tetapi jika daemon MySQL Anda harus menerima klien (atau melakukan replikasi) melalui koneksi TCP dari Internet, maka ada potensi pencurian data melalui packet sniffing. Kata sandi dan data sensitif dapat melayang dari satu lompatan ke lompatan lainnya dan siap untuk disadap. Sebaiknya pertimbangkan untuk menyiapkan SSL untuk koneksi MySQL

MySQL baru mendukung koneksi SSL asli mulai dari 4. 0. Oleh karena itu, kita dapat menggunakan stunnel untuk mengenkripsi saluran komunikasi. Prinsip stunnel adalah, di sisi klien dan server, kami memasang gerbang stunnel untuk membentuk "terowongan". Setiap klien dan server asli berkomunikasi secara lokal (melalui localhost) dengan stunnel. Sementara itu, stunnel di kedua sisi melakukan percakapan SSL satu sama lain. Ini sebuah contoh. Di sisi klien (misalnya, ditujukan pada klien. com)

# /usr/sbin/stunnel -P/tmp/ -c -d 3306 -r server.com:3307
_

Di sisi server (dialamatkan misalnya di server. com)

# cd /usr/share/ssl/certs
# openssl req -new -x509 -days 365 -nodes -out stunnel.pem \
-keyout stunnel.pem
# /usr/sbin/stunnel -P/tmp/ -p stunnel.pem -d 3307 -r localhost:3306
_

Kemudian dari klien. com membuat koneksi MySQL ke server server. com seperti biasa

Penutupan

Pesan terakhir, jangan lupa untuk membaca kembali bagian manual MySQL General Security Issues dan MySQL Access Privilege System sehingga — mengutip kata-kata dalam manual — Anda "menghindari kesalahan keamanan yang paling umum". ”

Langkah-langkah pekerjaan MySQL?

Cara kerja MySQL .
MySQL membuat database yang dapat memodifikasi, menyimpan data, dan menentukan hubungan tabel-tabel dalam perangkat lunak
Kemudian, perangkat pengguna membuat permintaan dengan perintah tertentu menggunakan bahasa SQL
Terakhir, server akan menerima dan menjalankan perintah

Langkah-langkah untuk membuat database MySQL yang sebenarnya?

Untuk membuat database MySQL baru, masuk ke cPanel dan klik menu MySQL Databases. .
Pilih nama basis data. Awalan default adalah "yoururser_". .
Gulir ke bawah dan temukan Tambah Pengguna Baru. Masukkan nama pengguna dan kata sandi, lalu klik Buat Pengguna
Cari opsi Add User To Database untuk menghubungkan User ke Database. .
Selesai

Bagaimana cara menghubungkan database MySQL dengan php?

Menggunakan MySQLi untuk Membuat Koneksi PHP ke MySQL . Buat File Baru dengan mengklik ikon tambahkan file pada menu di bagian atas layar. Simpan dengan nama databaseconnect. php, atau nama lain yang Anda inginkan, tetapi ekstensinya tetap. php.

Bahasa apa yang digunakan MySQL?

MySQL atau dibaca My Sequel adalah Database Management System atau sering disingkat DBMS yang dijalankan menggunakan perintah SQL (Structured Query Language) yang populer digunakan untuk membuat aplikasi berbasis website.