【问题标题】:security / server system logging of prepared statements准备好的语句的安全/服务器系统日志记录
【发布时间】:2013-03-02 05:18:21
【问题描述】:

我目前正在完成我的应用程序的安全性。

我要问各位专家的一个问题是,是否有办法让某人控制我的 unix 平台,从某种 mysql 日志中提取密码?

我平时在php和mysql之间的密码传输都是这样完成的:

$sql = "CALL client_create(?, ...)";
$stmt = $cnx->prepare($sql);
$stmt->execute(array($hashpw, ...));
$cnx->commit();

我的设置中没有autocommit,如果这改变了什么的话。

所以基本上必须有某种重做日志或类似的,对吧?那怎么办,应该担心吗?我应该偶尔冲洗一次吗?

感谢您的帮助!

【问题讨论】:

  • 如果他们控制了您的系统,他们可以通过他们想要的任何线路获取密码,并且可能只需下载您的整个数据库。但是,是的,您必须像保存密码一样保护二进制日志。如果您不关心灾难恢复,请仅将它们扔掉。
  • innodb 数据是否可以从文件系统中清晰读取?我的意思是没有实际连接到 mysql
  • 是的,除此之外,我假设您在该文件系统上有一个文件,其中包含该数据库的密码。例如,您的 PHP 代码用于插入数据(除非它在另一台服务器上)。或者我只是停止mysql,并将其设置为以root 开头,没有密码。
  • 是的,但用户的密码根本没有授权。只有 EXECUTE 授权,它不会导致任何返回任何密码的函数。没有密码的root怎么办?它会起作用吗?我有我的 root mysql 用户的密码。

标签: php mysql security logging centos


【解决方案1】:

你害怕的事情是绝对可能的。但是,这不应该是一个真正的问题。让我解释一下:

MySQL 目前使用多种不同类型的日志:

  1. Binary Logs - 这些用于复制并将每个写入查询写入它(以可逆二进制形式)。如果您要进行复制,则需要这些日志。
  2. Query Logs - 这些用于调试(通常)。它们通常不会在生产环境中启用(应该禁用)。
  3. InnoDB Transaction Log - 这用于每次写入以允许事务符合 ACID(详细信息超出此答案的范围)。
  4. Other Logs - 在这里您无需担心(错误日志、慢查询日志等)。

因此数据通常至少写入一个日志文件,但也可能写入 3 个(取决于服务器配置)。

但它也被写入磁盘。它以合理的纯文本格式存储在表空间中。因此,如果我(作为攻击者)可以访问磁盘,我将跳过日志并直接获取表信息本身。

现在,如果您在数据库层“散列”密码(意味着纯文本密码进入查询,并且数据库发出散列函数),那么您是正确的,日志可能会产生纯文本-文本密码。

不值得

不值得尝试通过刷新日志来隐藏此信息。最好从源头解决问题(在您的应用程序中使用更好的散列方法)。

问题在于 MySQL 使用的任何散列都是简单的原始散列(例如 MD5()SHA256())。两者都被设计为快速。因此,如果我可以从表中获取哈希值,我几乎可以像使用原始密码一样轻松地攻击它。为什么?因为快速哈希很容易暴力破解with GPUs

TLDR

基本上,你必须做两件事(至少从我的角度来看):

  1. 阻止人们访问数据库的文件系统。这是首要的。
  2. 使用正确的密码存储技术(bcrypt 等)。这将减轻日志文件可能构成的任何向量。

【讨论】:

  • 谢谢。我在php中加密密码,使用blowfish算法,然后通过php pdo准备好的语句将它们传递给我的存储过程。我担心散列被发现,即使我使用的技术没有外键散列/客户端 + 噪声散列,因此实际上更难破解。尽管如此,没有什么是不可能的,所以正如你所说,我真的必须阻止人们访问文件系统。我完全害怕:-)
  • @Sebas:如果是这种情况(你使用了适当的存储技术),那么不要担心日志。如果攻击者可以获得日志,他们就可以获得原始表文件。他们都有相同的信息。相反,阻止他们访问文件系统。在那种情况下我不会担心日志......
  • 感谢您提出问题。
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2019-09-12
相关资源
最近更新 更多