Я пытаюсь заставить MySQL, установленный на macports, использовать каталог данных, хранящийся в моем домашнем каталоге, защищенном 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)

Есть идеи, как решить эту проблему?

4 ответа4

2

Я прокомментировал один из ваших похожих вопросов, поскольку считаю, что есть лучший способ хранить данные MySQL в зашифрованном виде.


Это похоже на проблему с разрешениями. В вашей домашней папке FileVault устанавливает разрешения для rwx------ (то есть владелец может читать, писать и выполнять, но у группы и других пользователей нет разрешений), в отличие от значения по умолчанию rwxr-xr-x для типичной папки.

Фактор здесь заключается в том, что права на выполнение позволяют пользователю выполнять поиск (или проходить) папку. Поэтому, когда пользователь _mysql вызывает mysqld и он следует по символической ссылке, он задыхается, пытаясь пройти через вашу домашнюю папку. Это mysqld_safe который записывает сообщения об ошибках в журнал, используя разрешения пользователя, который его вызвал (вероятно, root, если mysqld_safe запускается с помощью сценария запуска MacPorts, sudo /path/to/mysqld_safe или аналогичного).

Вы можете проверить эту гипотезу, выполнив следующие команды в последовательности:

$ 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 приходит на ум.)

1

Тейт Льюис очень хорошо объяснил проблему с разрешением на выполнение. Однако делать это на реальный счет пользователя является как угроза безопасности и потенциально может предотвратить законное исполнение со стороны других членов группы staff

Я решил ту же проблему следующим образом:

  • Создайте новую стандартную учетную запись пользователя (для этого примера мы назовем ее db) с включенным для нее FileVault. Используйте пароль, по крайней мере такой же надежный, как пароль вашего основного пользователя.
  • Войдите в систему как основной пользователь и выполните следующие команды:
  • смонтировать образ FileVault пользователя db, не делая его доступным для просмотра в 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 пытается запустить его автоматически до монтирования образа.

0

Прежде всего, если вы еще этого не сделали, убедитесь, что ваша версия MySQL будет поддерживать символические ссылки для рассматриваемой таблицы. Согласно этой статье 2008 года, символические ссылки в то время поддерживались только для таблиц MyISAM и «Для файлов, используемых таблицами для других механизмов хранения, могут возникнуть странные проблемы, если вы попытаетесь использовать символические ссылки».

Убедившись, что ваша версия MySQL должна поддерживать то, что вы делаете, перепроверьте, какой пользователь пытается запустить mysqld_safe и сравните его с разрешениями на /opt/local/var/db/mysql5/ . Так как вы использовали cp -a , вполне вероятно, что каталог принадлежит и доступен для записи пользователю _mysql (именно поэтому он работает, когда вы sudo -u _mysql touch...), но вы получаете ошибки при попытке запустить MySQL из ваша обычная учетная запись пользователя (которая не является _mysql и, следовательно, не будет иметь права на запись в каталог).

0

Это может быть несущественным, но если вы мягко связываетесь с отдельным разделом, вы всегда можете смонтировать этот раздел в точке мягкого соединения, а затем создать мягкое соединение там, где вы обычно его монтируете.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .