OS X:使用软链接在加密的 FileVault 映像上安全地存储 MySQL 数据

OS X:使用软链接在加密的 FileVault 映像上安全地存储 MySQL 数据

我正在尝试让安装有 macports 的 MySQL 使用存储在受 FileVault 保护的主目录中的数据目录。

我使用sudo cp -a /opt/local/var/db/mysql5 ~/db/-a以确保文件权限保持完整),然后用软链接替换原始的 mysql5 目录:sudo ln -s ~/db/mysql5 /opt/local/var/db/mysql5

但是,当我尝试启动 MySQL 时,它失败了。它至少会跟随软链接,以至于修改目录中的某些文件~/db/mysql5,尤其是附加到其中的错误日志:

110108 15:33:08 mysqld_safe Starting mysqld daemon with databases from /opt/local/var/db/mysql5
110108 15:33:08 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.
110108 15:33:08 [Warning] '--log_slow_queries' is deprecated and will be removed in a future release. Please use ''--slow_query_log'/'--slow_query_log_file'' instead.
110108 15:33:08 [Warning] '--default-character-set' is deprecated and will be removed in a future release. Please use '--character-set-server' instead.
110108 15:33:08 [Warning] Setting lower_case_table_names=2 because file system for /opt/local/var/db/mysql5/ is case insensitive
110108 15:33:08 [Note] Plugin 'FEDERATED' is disabled.
110108 15:33:08 [Note] Plugin 'ndbcluster' is disabled.
/opt/local/libexec/mysqld: Table 'mysql.plugin' doesn't exist
110108 15:33:08 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
110108 15:33:09  InnoDB: Started; log sequence number 4 1596664332
110108 15:33:09 [ERROR] /opt/local/libexec/mysqld: Can't create/write to file '/opt/local/var/db/mysql5/mac.local.pid' (Errcode: 13)
110108 15:33:09 [ERROR] Can't start server: can't create PID file: Permission denied
110108 15:33:09 mysqld_safe mysqld from pid file /opt/local/var/db/mysql5/gPod.local.pid ended

我不明白为什么 MySQL 无法创建该pid文件,因为使用_mysql用户手动创建该文件成功(sudo -u _mysql touch mac.local.pid从内部~/db/mysql5

有什么想法可以解决这个问题吗?

答案1

我评论过你的一个类似问题,因为我认为有更好的方法以加密状态存储 MySQL 数据


这听起来像是权限问题。FileVault 在您的主文件夹中设置权限rwx------(即所有者可以读取、写入和执行,但组和其他用户没有权限),而不是rwxr-xr-x典型文件夹的默认权限。

这里起作用的因素是执行权限允许用户搜索(即遍历)文件夹。因此,当_mysql用户调用mysqld并跟随符号链接时,它会尝试遍历您的主文件夹,从而导致阻塞。它会mysqld_safe使用调用它的用户的权限将错误消息写入日志(如果mysqld_safe使用 MacPorts 启动脚本sudo /path/to/mysqld_safe或类似脚本启动,则可能是 root 用户)。

您可以通过按顺序运行以下命令来测试此假设:

$ cd ~/db/mysql5/
$ sudo -u _mysql touch mac.local.pid

应该会成功,因为不涉及遍历,并且

$ sudo -u _mysql touch ~/db/mysql5/mac.local.pid
$ sudo -u _mysql touch /Users/[username]/db/mysql5/mac.local.pid

两者都失败了,但是

$ sudo -u _mysql touch ../mac.local.pid

可能会成功,因为~/db/可能具有前面提到的更宽松的默认文件夹权限。

一个简单的解决方案是将你的主文件夹上的组设置为_mysql,并授予该组搜索你的主文件夹的权限:

$ sudo chown :_mysql ~
$ chmod g=x ~

但这严重的安全后果。任何以_mysql用户身份(可能通过 MySQL 中的漏洞)的人都可以导航到您的主文件夹并根据其权限操作文件和文件夹,默认情况下rwxr-xr-x文件夹和rw-r--r--文件。如前所述,这包括~/db/和任何用户创建的文件夹或文件,以及和~/Public/~/Sites/即使攻击者无法直接获取主文件夹中的文件列表,也有很多常见文件可供读取,并且有很多方法可以使用它们来收集有关周围其他内容的数据。(.bash_history突然想到。)

答案2

Tait Lewis 很好地解释了执行权限的问题。然而,对真实用户帐户执行此操作既存在安全风险,也可能会阻止其他staff组成员的合法执行。

我解决同样问题的方法如下:

  • 创建一个新的标准用户帐户(在本例中我们将其称为db),并为其启用 FileVault。使用至少与主要用户一样强的密码。
  • 以主用户身份登录后,运行以下命令:
  • 挂载 db 用户的 FileVault 映像,但不使其在 Finder 中可浏览:

sudo hdiutil attach /Users/db/db.sparsebundle -owners on -mountpoint /Users/db -nobrowse

  • 修复权限,以便_mysql用户可以执行 db 用户的主目录:

sudo chown :_mysql /Users/db; sudo chmod g=x /Users/db

  • 关闭 MySQL:

sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper stop

  • 将 MySQL 文件复制到 FileVault:

sudo cp -a /opt/local/var/db/mysql5 /Users/db//(后面不要添加mysql5

  • 现在您可以删除、安全删除或者只是重命名该/opt/local/var/db/mysql5目录。

  • 接下来创建软链接:

sudo ln -s /Users/db/mysql5 /opt/local/var/db/mysql5

  • 最后,再次启动MySQL:

sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper start

请注意,每次重新启动 Mac 时,您都需要挂载映像(使用命令sudo hdiutil ...)并手动启动 MySQL,因为当 launchd 在挂载映像之前尝试自动启动它时,它将无法挂载。

答案3

首先,如果你还没有这样做,请务必验证你的 MySQL 版本是否支持相关表的符号链接。根据这篇 2008 年的文章,当时仅 MyISAM 表支持符号链接,并且“对于其他存储引擎的表使用的文件,如果您尝试使用符号链接,可能会遇到奇怪的问题。”

一旦你确信你的 MySQL 版本应该支持你正在做的事情,请仔细检查你试图mysqld_safe以哪个用户身份启动,并将其与 上的权限进行比较/opt/local/var/db/mysql5/。由于你使用了cp -a,所以目录很可能是 _mysql 用户拥有并可写的(这就是它在你 时可以工作的原因sudo -u _mysql touch...),但是当你试图从你的普通用户帐户启动 MySQL 时会失败(这不是 _mysql ,因此,没有对该目录的写权限)。

答案4

这可能有些牵强,但如果您软链接到单独的分区,则始终可以在软链接点挂载该分区,然后在通常挂载它的位置进行软链接。

相关内容