深夜のPermission Deniedエラーへの対処
午前2時、スマホが激しく振動する。監視システムがデータベースのダウンを告げている。急いで構築したばかりのFedora ServerにSSHで入り、ログを確認すると「Permission Denied」の嵐。データディレクトリ全体に chmod 777 を試しても, エラーは消えない。これは、FedoraのSELinuxを制御できていない時によくある典型的なシナリオだ。
FedoraはUbuntuほど「甘く」はない。このOSは最初から厳格なセキュリティルールの遵守を求めてくる。私は2年以上Fedoraをメイン環境として使ってきたが、得られた教訓は「セキュリティ機能をオフにしようとするな、共存する方法を学べ」ということだ。以下に、眠れない夜を避けるためのMySQL 8セットアップ手順をまとめる。
MySQL 8のインストール:迅速かつ確実に
ローカルでのテスト用にデータベースが必要なだけなら、以下のコマンドだけで十分だ。しかし、本番環境に導入する場合は、後のセクションにあるセキュリティ設定を熟読してほしい。
# システムを最新版にアップデート
sudo dnf update -y
# MySQL Community Serverをインストール
sudo dnf install community-mysql-server -y
# システム起動時にサービスが自動開始されるよう設定
sudo systemctl enable --now mysqld
インストールが完了したら、すぐにセキュリティ設定コマンドを実行しよう。これにより、サンプルデータベースの削除やrootの遠隔ログイン禁止が可能になる。
sudo mysql_secure_installation
実運用環境向けのデータベース設定
インストールコマンドを打つのは5分で終わる。SysAdminの価値の95%は、1,000人以上の同時ユーザーに耐えうる最適化を行い、ハッカーの侵入を防ぐことにある。
1. Firewalld:必要なポートのみを開放する
デフォルトでは、Fedoraはポート3306へのすべての接続をブロックする。Firewallを無効にするのは絶対にNGだ。代わりに、ブルートフォース攻撃のリスクを最小限に抑えるため、アプリケーションサーバーのIPのみにアクセスを許可しよう。
# 特定のサブネットに対してポートを開放(例:192.168.1.0/24)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
# 設定をリロード
sudo firewall-cmd --reload
2. SELinux:権限の壁を乗り越える
ここが最も厄介な部分だ。SELinuxはデフォルトで、MySQLが /var/lib/mysql にのみデータを書き込むことを許可している。もしI/O速度向上のために2台目のSSDを /data/mysql にマウントして使おうとすれば、MySQLは即座にブロックされるだろう。
SELinuxを無効化する(極めてリスクの高い行為だ)代わりに、新しいディレクトリに正しいラベル(コンテキスト)を割り当てよう。
# サポートツールをインストール
sudo dnf install policycoreutils-python-utils -y
# 新しいデータディレクトリにコンテキストを登録
sudo semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
# 変更を即座に適用
sudo restorecon -Rv /data/mysql
これら2つのコマンドだけで、システムのセキュリティ障壁を弱めることなく、Permissionエラーを根本的に解決できる。
大容量RAMサーバー向けのパフォーマンス最適化
MySQL 8のデフォルトパラメータはかなり控えめで、通常1GB RAMの仮想マシンに適した設定になっている。サーバーに16GBや32GBのRAMがある場合は、/etc/my.cnf.d/mysql-server.cnf を編集してハードウェアを最大限に活用しよう。
InnoDB Buffer Poolの設定
黄金律は、サーバーでデータベースのみを動かす場合、RAMの約60〜70%をBuffer Poolに割り当てることだ。例えば8GB RAMのサーバーなら以下のようになる:
[mysqld]
# ディスクI/Oを減らすためにキャッシュメモリを増やす
innodb_buffer_pool_size = 5G
innodb_log_file_size = 1G
innodb_flush_method = O_DIRECT
max_connections = 800
ファイルを保存した後、サービスを再起動して適用する: sudo systemctl restart mysqld
新しいメカニズムによるユーザー管理
バージョン8.0から、MySQLはデフォルトで caching_sha2_password を使用する。もしアプリケーション(古いPHPや古いツールなど)が接続できない場合は、安全性を確保しつつ古いプラグインに戻そう:
CREATE USER 'web_app'@'192.168.1.10' IDENTIFIED WITH mysql_native_password BY 'SuperPassword_2024';
GRANT SELECT, INSERT, UPDATE ON my_database.* TO 'web_app'@'192.168.1.10';
運用における死活的に重要な注意点
- 幸運を信じるな: 毎日データベースをダンプするCronjobを設定しよう。シンプルな
mysqldumpコマンド一つが、ディスク故障時にあなたのキャリアを救うことになる。 - 実際のログを監視する: エラーを推測するのではなく、
tail -f /var/log/mysql/mysqld.logを使ってリアルタイムで何が起きているかを確認しよう。 - dnf update時の注意: Fedoraは頻繁にカーネルや新しいパッケージを更新する。大規模なシステムアップグレードを行う前には、必ずサーバーのスナップショットを取るようにしよう。
FedoraでMySQLを使いこなすことは、単にインストールして終わりではない。それはソフトウェアの設定と、OSの深い階層にあるセキュリティメカニズムの両方を理解することの組み合わせだ。皆さんのシステムが安定して稼働し、午前2時の電話に悩まされないことを願っている!
