如何在 MySQL 中找到当前用户连接的 IP 地址?
Posted
技术标签:
【中文标题】如何在 MySQL 中找到当前用户连接的 IP 地址?【英文标题】:How can I find the IP address of the current user's connection in MySQL? 【发布时间】:2012-05-18 08:56:06 【问题描述】:在您回答“使用 current_user()”(在很多情况下都有效)或“使用 user()”(实际上不起作用)之前,请阅读以下内容...
我正在尝试在表上创建一个视图,该视图限制用户对表中某些行的访问,由用户连接的 IP 地址控制。
我的第一次尝试是这样的:
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';
现在的理论是,我应该能够从主机 192.168.3.30 以 testuser 身份登录并执行select * from testview
之类的操作,并获得适用于我的正确的 testtable 子集。
以上行不通。它不起作用的原因是current_user()
默认返回视图的定义器,导致没有数据,或者(更糟糕的)错误数据,这取决于定义者是谁。如果我希望current_user()
返回 invoking 用户,我需要使用SQL SECURITY INVOKER
子句创建视图,这也将安全权限限制为调用用户的权限,从而违背了最初的目的的代码。
我很想使用user()
,但不幸的是,它几乎总是返回主机名/域而不是 IP 地址。
旁注,以防不清楚:在这种情况下,在 php(或 Ruby、perl 或其他任何东西)中获取 IP 地址是没有用的。我正在设置一些数据库安全性,因此依赖客户端显然是不够的。我需要 SQL 中的 IP 地址。
对于寻找想法/参考/背景的好奇者:
作为参考,我从here 获得了这个漂亮的安全技巧的想法,但他们使用的是用户名而不是 IP 地址,这会使这更容易。就我而言,我正在尝试建立一个主机数据库,该数据库是从主机本身部分更新的。我不想为每台主机设置不同的用户,但我确实希望每台主机能够更新自己的记录(文件系统、风扇速度、温度等)。
【问题讨论】:
为什么有人反对这个问题?写的很好,作者已经做过研究了吗?show processlist
将列出用户/IP 内容,但似乎没有办法按特定用户过滤它。不要认为有任何其他函数/查询会返回此数据
看this answer
Retrieve client ip address in mysql 的可能副本
@Darhazer:如果不更改 mysqld 调用(我最终可能会这样做,但我想要一个适用于一般情况的解决方案),该解决方案将无法工作。 information_schema.processlist 默认给我主机名,而不是 IP 地址。
【参考方案1】:
如果您可以控制mysqld
进程,则可以使用--skip-name-resolve
选项启动它;那么SUBSTRING_INDEX(USER(), '@', -1)
会给你当前用户的IP 地址。
【讨论】:
这就是我要说的。 好的,很高兴知道这一点。但是如果我无法控制 mysqld 进程,或者我希望能够在我的授权表中使用主机名(例如,对于其他不相关的用户)怎么办?【参考方案2】:我不想留下一个没有答案的问题......
如果不全局修改 mysqld 的行为(通过完全禁用名称解析),似乎没有办法做到这一点,这显然会对其他领域产生影响。
幸运的是,另一种选择是创建一个“存根”程序,通过 SSH 访问,该程序接受来自客户端的数据,检查 IP 地址,并将(可能已修改的)数据传递到数据库。当然,这使用 SSH 验证而不是数据库帐户,并引入了另一层复杂性。它还要求您对可以充当中间人的服务器具有外壳级访问权限。从好的方面来说,如果存根实施得当,它确实可以提供更好的安全性(线路加密和高级身份验证)。
【讨论】:
您可以使用您喜欢的任何身份验证方式通过 SSL/TLS 连接到 MySQL...所以 SSH 的那些“优势”不是真正的;我还建议,虽然这种解决方法可能适合您的需求,但它并不能真正回答问题(如何确定 MySQL 客户端 IP - 在这种情况下,它应该发现 SSH 服务器的地址)。 @eggyal:你在所有方面都是正确的。不幸的是,最初的问题似乎没有真正的答案。换句话说,如前所述,这是不可能的。我认为发布解决方法总比没有好。 ssh 解决方法的主要优点是它可以工作。 ;-)以上是关于如何在 MySQL 中找到当前用户连接的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 root 用户上允许远程 MySQL 连接? [复制]