/etc/mysql の権限ではスーパーユーザー以外がソケットに接続できない

/etc/mysql の権限ではスーパーユーザー以外がソケットに接続できない

私たちは Vagrant で Ubuntu サーバー 13.10 を実行していますが、興味深い問題に遭遇しました。

conf.d/my.cnfのソケットの場所を上書きしています

[client]
port                           = 3306
socket                         = /tmp/mysql.sock


[mysqld_safe]
socket                         = /tmp/mysql.sock

[mysqld]
user                           = mysql
pid-file                       = /var/run/mysqld/mysql.pid
socket                         = /tmp/mysql.sock
port                           = 3306
datadir                        = /var/lib/mysql
bind-address                   = 0.0.0.0

ここまでは順調です。サーバーを起動すると、実際に /tmp でソケットがリッスンしています。

ただし、アクセスできるのはスーパーユーザーのみです。

スーパーユーザー以外の場合、mysql -u root -pXXXX を実行すると次のエラーが発生します。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

クライアントが間違ったソケットに接続しようとしています。

問題は、権限のないユーザーが conf ファイルにアクセスして正しいソケットを見つけることができないことだと想定しました。実際、/etc/mysql の権限を 0755 に変更するとこの問題は修正されますが、正しい修正方法ではないようです。

補足として、12.04 でもこの動作は同じですが、mysql の起動時に /tmp にソケットが作成され、/var/run/mysqld の下にシンボリック リンクも作成されるため、クライアントが接続しようとすると、デフォルトのソケットが見つかるという点でマスクされています。

両方のマシンで、mysql のバージョンは 5.5.37 です。

答え1

正確な構成によっては、以下の手順で接続の問題を解決できる場合があります。

--socket=/tmp/mysql.sock でmysqlを起動できます。

からMySQL マニュアル

--socket=path, -S path

localhost への接続の場合、使用する Unix ソケット ファイル、または Windows の場合、使用する名前付きパイプの名前。

ユーザーにmysql設定全体を読み取らせることなくその設定を保存するには、~/.my.cnfファイルの設定を変更します。

見るオプションファイル詳細については

あなたの場合は、このファイルに socket=/tmp/mysql.sock を追加します。

答え2

Ubuntu 14.04 の比較的新しいインストールを調べたところ、/etc/mysql のデフォルトの権限は 755 でした。正直なところ、なぜそれが問題だと思われるのか理解できません。

関連情報