我需要允许远程连接到在最新稳定的 CentOS 上运行的 mysql 服务器。
我一点也不喜欢这个想法,所以我至少想收集尽可能多的相关信息。确切地说,我需要(想要)以下内容:
- [日期时间] 1.2.3.4 已连接
- [datetime] 3.4.5.6 密码错误
根据mysql 手册,要么记录所有内容(不可接受的性能开销),要么不记录任何与我相关的内容(这可以帮助我们追踪攻击者/不负责任的管理员)。
我考虑过每 N 分钟抓取一次并删除这个日志,但这似乎不对。
答案1
实际上有一种方法可以将所有连接记录到 mysql 本身中:
假设:我们将用来存储此信息的数据库名称为 admin。
创建表来存储连接信息。如果您不想,则不必包含唯一键。
CREATE TABLE admin.connections (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, connect_time DATETIME NOT NULL, user_host VARCHAR(50) NOT NULL, connection_id INT UNSIGNED NOT NULL, UNIQUE INDEX idx_connect_time_user_host (connect_time, user_host));
设置 init-connect 变量。这是每个连接客户端都要执行的字符串。详情请见此处。
SET GLOBAL init_connect = "INSERT INTO admin.connections (connect_time, user_host, connection_id) VALUES (NOW(), CURRENT_USER(), CONNECTION_ID());";
检查所有用户的权限,以确保他们可以将记录插入 admin.connections 表中。
以不具有全局权限的用户身份登录,应在 admin.connections 表中插入一行。请注意,init-connect 系统变量对具有全局权限的用户不起作用。无论好坏,我们所有 DBA 都知道这意味着什么。
观察你的连接表的成长和繁荣。你刚刚开始了一个新的宠物(项目)。
来源:http://mysqlhints.blogspot.com.es/2011/01/how-to-log-user-connections-in-mysql.html
现在你必须期望你的用户是负责任的,他们可能会开始用数据淹没你的表,但这样你就是在与一个心怀恶意的人打交道。为了安全起见,我会使用一个远程位置来监视这个表并保留它的副本。