Bagaimana cara menemukan alamat IP koneksi pengguna saat ini di MySQL?

Sebelum Anda menjawab "use current_user()", yang berfungsi pada banyak kasus, atau "use user()", yang sebenarnya tidak berfungsi, harap baca yang berikut...

Saya mencoba membuat tampilan pada tabel yang membatasi akses pengguna ke baris tertentu dalam tabel, dikontrol oleh alamat IP tempat pengguna terhubung.

Upaya pertama saya terlihat seperti ini:

create table testtable (
  `RowID` bigint not null auto_increment,
  `owner` varchar(64),
  `key` varchar(64),
  `val` varchar(64),
  primary key (`RowID`)
);
create view testview (
  `RowID`,
  `owner`,
  `key`,
  `val`
) as select
  `testtable`.`RowID` as `RowID`,
  `testtable`.`owner` as `owner`,
  `testtable`.`key` as `key`,
  `testtable`.`val` as `val`
from testtable
where (testtable.owner = substring_index(current_user(), '@', -1));

create user 'testuser'@'192.168.3.30' identified by 'testpass';
grant select, insert, update, delete on testview to 'testuser'@'192.168.3.30';

Sekarang teorinya adalah saya harus bisa masuk sebagai pengguna penguji dari host 192.168.3.30 dan melakukan sesuatu seperti select * from testview dan mendapatkan subset tabel pengujian yang sesuai untuk saya.

Hal di atas tidak berhasil. Alasannya tidak berhasil adalah karena current_user() mengembalikan definer tampilan secara default, sehingga tidak ada data, atau (lebih buruk lagi) data yang salah, bergantung pada siapa yang mendefinisikannya. Jika saya ingin current_user() mengembalikan pengguna yang memanggil, saya perlu membuat tampilan dengan klausa SQL SECURITY INVOKER, yang juga membatasi hak keamanan hanya untuk pengguna yang memanggil, sehingga menggagalkan tujuan awal kode.

Saya ingin menggunakan user(), tapi sayangnya, itu hampir selalu mengembalikan nama host/domain, bukan alamat IP.

Catatan tambahan, jika tidak jelas: Mendapatkan alamat IP dalam PHP (atau Ruby, atau Perl, atau apa pun) tidak berguna dalam kasus ini. Saya sedang menyiapkan sedikit keamanan basis data, jadi mengandalkan klien jelas tidak memadai. Saya memerlukan alamat IP di SQL.

Bagi yang penasaran mencari ide/referensi/konteks:

Sebagai referensi, saya mendapatkan ide untuk trik keamanan yang bagus ini dari di sini, namun ternyata tidak. kami menggunakan nama pengguna dan bukan alamat IP, yang akan membuat hal ini lebih mudah. Dalam kasus saya, saya mencoba menyiapkan database host yang sebagian diperbarui dari host itu sendiri. Saya tidak ingin mengatur pengguna yang berbeda untuk setiap host, tapi saya ingin setiap host dapat memperbarui catatannya sendiri (sistem file, kecepatan kipas, suhu, dan sebagainya).


person Rick Koshi    schedule 09.05.2012    source sumber
comment
Mengapa seseorang tidak menyukai pertanyaan ini? Itu ditulis dengan baik dan jelas penulis telah melakukan penelitiannya?   -  person dfb    schedule 09.05.2012
comment
show processlist akan mencantumkan hal-hal pengguna/ip, tetapi sepertinya tidak ada cara untuk memfilternya berdasarkan pengguna tertentu. Jangan kira ada fungsi/kueri lain yang akan mengembalikan data ini   -  person Marc B    schedule 09.05.2012
comment
Lihat jawaban ini   -  person Maxim Krizhanovsky    schedule 09.05.2012
comment
kemungkinan duplikat Ambil alamat ip klien di mysql   -  person Maxim Krizhanovsky    schedule 09.05.2012
comment
@Darhazer: Solusi itu tidak akan berfungsi tanpa mengubah pemanggilan mysqld (yang pada akhirnya mungkin saya lakukan, tetapi saya ingin solusi yang berfungsi dalam kasus umum). information_schema.processlist memberi saya nama host secara default, bukan alamat IP.   -  person Rick Koshi    schedule 10.05.2012


Jawaban (2)


Jika Anda memiliki kendali atas proses mysqld, Anda dapat meluncurkannya dengan --skip-name-resolve; lalu SUBSTRING_INDEX(USER(), '@', -1) akan memberi Anda alamat IP pengguna saat ini.

person eggyal    schedule 09.05.2012
comment
Itulah yang ingin saya katakan. - person Marcus Adams; 09.05.2012
comment
Oke, itu sangat baik untuk diketahui. Tetapi bagaimana jika saya tidak memiliki kendali atas proses mysqld, atau saya ingin dapat menggunakan nama host di tabel hibah saya (misalnya untuk pengguna lain yang tidak terkait)? - person Rick Koshi; 10.05.2012

Aku benci meninggalkan pertanyaan yang tidak terjawab...

Tampaknya tidak ada cara untuk melakukan ini tanpa mengubah perilaku mysqld secara global (dengan menonaktifkan resolusi nama sepenuhnya), yang jelas memiliki konsekuensi di area lain.

Untungnya, opsi berbeda adalah membuat program "rintisan", diakses melalui SSH, yang menerima data dari klien, memeriksa alamat IP, dan meneruskan data (yang mungkin dimodifikasi) ke database. Tentu saja, ini menggunakan validasi SSH alih-alih akun database dan menimbulkan lapisan kompleksitas lainnya. Hal ini juga mengharuskan Anda memiliki akses tingkat shell ke server yang dapat bertindak sebagai perantara. Di sisi positifnya, ini bisa dibilang memberikan keamanan yang lebih baik (enkripsi melalui jalur dan otentikasi yang unggul) jika stub diterapkan dengan benar.

person Rick Koshi    schedule 13.05.2012
comment
Anda dapat terhubung ke MySQL melalui SSL/TLS menggunakan cara otentikasi apa pun yang Anda suka... jadi 'kelebihan' SSH tersebut tidak asli; Saya juga menyarankan bahwa, meskipun solusi ini mungkin sesuai dengan kebutuhan Anda, solusi ini tidak benar-benar menjawab pertanyaan (bagaimana menentukan IP klien MySQL - dalam hal ini solusi tersebut harus menemukan alamat server SSH). - person eggyal; 14.05.2012
comment
@eggyal: Anda benar dalam semua poin. Sayangnya, tampaknya tidak ada jawaban nyata terhadap pertanyaan awal. Dengan kata lain, seperti yang dinyatakan, hal itu tidak dapat dilakukan. Saya pikir memposting solusi lebih baik daripada tidak sama sekali. Keuntungan utama dari solusi ssh adalah ia berhasil. ;-) - person Rick Koshi; 31.07.2012