6.

MySQL「World-writable config file is ignored」の原因と修正(パーミッション 644)

編集
この記事の要点
  • 意味: my.cnf が誰でも書き込める権限(other に w)になっており、セキュリティ上の理由で MySQL がその設定ファイルを無視している
  • 対処: chmod 644 /etc/mysql/my.cnf(または 600/640)、chown root:root
  • ~/.my.cnfchmod 600 必須(パスワード入りなので 644 でも警告)
  • なぜ無視するか: 任意ユーザーが plugin-load 等を仕込んでサーバを乗っ取れるリスクを防ぐため
  • 所有者チェックもある: 一般ユーザー所有の my.cnf を root mysqld が読むのも警告

警告メッセージ

Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
# または
$ mysql
Warning: World-writable config file '/home/app/.my.cnf' is ignored

MySQL クライアント / サーバが設定ファイルを読み込もうとしたとき、そのファイルが全ユーザー書き込み可能(other に w ビット)だと、セキュリティ上の理由でそのファイルを無視します。同様に ~/.my.cnf は所有者以外に読み権限があるだけで警告が出ます。

なぜ無視するのか

my.cnf は MySQL の起動オプションをそのまま指定できる強力な設定ファイルです。誰でも書き換えられる状態だと:

  • plugin-load任意のコードをロードさせて mysqld 権限で実行可能
  • secure_file_priv を緩めてファイル漏洩
  • skip-grant-tables を仕込んで認証回避

これらは実質サーバ乗っ取りに直結するため、MySQL は意図的に「危険なパーミッションの設定ファイルは読まない」挙動を取ります。

パーミッションの確認

ls -l /etc/mysql/my.cnf
# -rw-rw-rw- 1 root root 1234 May 17 10:00 /etc/mysql/my.cnf  ← world-writable

# 数値表記で確認
stat -c '%a %U:%G %n' /etc/mysql/my.cnf
# 666 root:root /etc/mysql/my.cnf  ← NG (other に w)

# ~/.my.cnf
ls -l ~/.my.cnf
stat -c '%a %U:%G %n' ~/.my.cnf

対処: パーミッションを修正

ファイル推奨パーミッション所有者
/etc/my.cnf / /etc/mysql/my.cnf644root:root
/etc/mysql/conf.d/*.cnf644root:root
~/.my.cnf(パスワード入り)600自分
/etc/mysql/debian.cnf(Ubuntu)640root:root
# 一般的な my.cnf
sudo chmod 644 /etc/mysql/my.cnf
sudo chown root:root /etc/mysql/my.cnf

# パスワード入りの ~/.my.cnf は 600
chmod 600 ~/.my.cnf
chown $(whoami):$(whoami) ~/.my.cnf

# conf.d 配下を一括
sudo chmod 644 /etc/mysql/conf.d/*.cnf
sudo chmod 644 /etc/mysql/mysql.conf.d/*.cnf

# 再確認
ls -l /etc/mysql/my.cnf
mysql --help | grep -A 1 "Default options"  # 認識されているかを確認

所有者違いで読み込まれないケース

~/.my.cnf を root で作って一般ユーザーで使うと、ファイルの所有者と実行者が違うために警告が出ることがあります:

# 自分のホームに自分所有で作る
whoami           # → app
ls -l ~/.my.cnf  # -rw------- 1 app app ...   OK

# ❌ root で作って配置だけしたケース
sudo cp /root/.my.cnf /home/app/.my.cnf
ls -l /home/app/.my.cnf
# -rw------- 1 root root ...  ← 警告が出る

# ✅ 所有者を直す
sudo chown app:app /home/app/.my.cnf

chmod の数字の読み方

数値権限表記用途
600所有者 rw のみ-rw-------パスワード入りファイル
640所有者 rw / グループ r-rw-r-----共有が必要だが秘匿したい
644所有者 rw / 他 r-rw-r--r--一般的な設定ファイル
666全員 rw (危険)-rw-rw-rw-使わない
755所有者 rwx / 他 rx-rwxr-xr-x実行ファイル・ディレクトリ

影響: 無視された結果どうなるか

my.cnf が無視されると、その中の設定がすべて反映されません。たとえば:

  • character-set-server=utf8mb4 が効かず latin1 になる
  • bind-address=0.0.0.0 が効かず localhost からしか繋げない
  • max_connections=500 が効かず既定の 151 で頭打ち

「設定を変えたのに反映されない」場合は必ず警告ログを確認してください。

警告を出さずに動作確認

# クライアントで認識した変数値
mysql -e "SELECT @@character_set_server, @@bind_address, @@max_connections"

# サーバ起動時に読まれた my.cnf 一覧
mysqld --verbose --help 2>&1 | grep -A 1 "Default options"

# 起動ログ(systemd)
journalctl -u mysql -n 100
sudo tail -n 100 /var/log/mysql/error.log

関連する設定ファイルの場所

OS / 配布主な場所
Ubuntu / Debian/etc/mysql/my.cnf + /etc/mysql/mysql.conf.d/mysqld.cnf
RHEL / CentOS / Rocky/etc/my.cnf + /etc/my.cnf.d/*.cnf
macOS Homebrew/opt/homebrew/etc/my.cnf
共通(ユーザー)~/.my.cnf(要 600)

FAQ

Q: 警告は出るが MySQL は起動する
A: そのファイルが無視されただけで起動はします。中身の設定は効いていないので、業務影響を確認してください。

Q: なぜ 666 になっていた?
A: 過去に chmod 666 を実行した、Samba で Windows からコピーした、umask が異常、root 以外の編集を許すために緩めた、などが典型。

Q: SELinux でも似た現象?
A: SELinux の場合は警告メッセージが違います(permission denied や AVC denied)。ls -lZ でコンテキスト確認、restorecon で復旧。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 1071 Specified key was too long; max key length is 767 bytes
  2. ERROR 1063 (42000): Incorrect column specifier for column '~'
  3. mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
  4. Install/Remove of the Service Denied!
  5. Datetime 型が NULL に見える
  6. Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
  7. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  8. Exception: Wrong MySQL configuration
  9. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
  10. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
  11. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  12. Incorrect column specifier for column 'カラム名'
  13. BLOB/TEXT column 'description' used in key specification without a key length
  14. ERROR: /bin/sh: mysql_config: コマンドが見つかりません
  15. Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
  16. CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
  17. Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
  18. 1
  19. 1
  20. 1)
  21. 1
  22. 1
  23. 1
  24. 1
  25. 1
  26. 1
  27. 1
  28. 1
  29. 1
  30. 1
  31. 1
  32. 1
  33. 1"'`--
  34. 1
  35. 1
  36. 1
  37. 1
  38. 1
  39. 1
  40. 1
  41. 1
  42. 1
  43. 1)
  44. 1
  45. 1
  46. 1
  47. 1
  48. 1
  49. 1
  50. 1
  51. 1
  52. 1
  53. 1"'`--
  54. 1
  55. 1
  56. SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~