以前MySQLデータベース管理の基本操作ガイドを記載しましたが、もうすこしリモートで利用する方法についても記載することにしました。前記時と重複するところがありますが、
リモートからMySQLデータベースにアクセスできるようにユーザーを設定することは、多くの開発者やデータベース管理者にとって重要なタスクです。本記事では、セキュリティを考慮しつつ、リモート接続を許可するユーザーの登録方法と、特定のIPアドレスやIPアドレスセグメントを指定する方法について、初心者にもわかりやすく解説します。
前提条件
- MySQLがインストールされていること
- サーバーの管理者権限(rootアクセス)があること
- ファイアウォールの設定を変更できること
基本用語の説明
- MySQL:オープンソースのリレーショナルデータベース管理システム。
- リモート接続:ネットワークを介して別のマシンからデータベースにアクセスすること。
- ユーザー権限:データベース内でユーザーが実行できる操作を制御する設定。
- ファイアウォール:ネットワークのセキュリティを維持するために、不正なアクセスを制限するシステム。
ステップ1: MySQLにログインする
まず、サーバー上でMySQLに管理者権限を持つユーザー(通常はroot
)としてログインします。
mysql -u root -p
パスワードの入力を求められたら、root
ユーザーのパスワードを入力してください。
ステップ2: リモート接続を許可するユーザーを作成する
特定のIPアドレスを指定する
セキュリティを高めるため、特定のIPアドレスからのみ接続を許可します。
CREATE USER 'ユーザー名'@'リモートIPアドレス' IDENTIFIED BY 'パスワード';
'ユーザー名'
:新規ユーザー名(例:'remote_user'
)'リモートIPアドレス'
:接続を許可するクライアントのIPアドレス(例:'203.0.113.5'
)'パスワード'
:強力なパスワード(例:'StrongPassword123!'
)
例:
CREATE USER 'remote_user'@'203.0.113.5' IDENTIFIED BY 'StrongPassword123!';
IPアドレスのセグメントを指定する
特定のIPアドレス範囲(セグメント)からの接続を許可する場合、ワイルドカードを使用します。
'%'
:0文字以上の任意の文字列を表すワイルドカード。'_'
:任意の一文字を表すワイルドカード。
例1:サブネット全体を許可
CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY 'StrongPassword123!';
この設定では、192.168.1.0
から192.168.1.255
までのIPアドレスからの接続を許可します。
例2:特定の範囲を許可
CREATE USER 'remote_user'@'192.168.1.1_' IDENTIFIED BY 'StrongPassword123!';
この設定では、192.168.1.10
から192.168.1.19
までのIPアドレスからの接続を許可します。
注意: MySQLのホスト指定では、'192.168.1.0/24'
のようなCIDR表記はサポートされていません。
ステップ3: ユーザーに権限を付与する
作成したユーザーに必要な権限を付与します。
GRANT 権限リスト ON データベース名.* TO 'ユーザー名'@'ホスト名'; FLUSH PRIVILEGES;
権限リスト
:付与する権限(例:ALL PRIVILEGES
、SELECT
、INSERT
など)データベース名
:権限を付与するデータベース名(例:'my_database'
)'ユーザー名'@'ホスト名'
:先ほど作成したユーザーとホスト
例:全権限を付与する場合
GRANT ALL PRIVILEGES ON my_database.* TO 'remote_user'@'192.168.1.%'; FLUSH PRIVILEGES;
例:特定の権限を付与する場合
GRANT SELECT, INSERT ON my_database.* TO 'remote_user'@'192.168.1.%'; FLUSH PRIVILEGES;
ステップ4: MySQLの設定を変更する
リモート接続を許可するために、MySQLの設定ファイルを編集します。設定ファイルの場所は環境によって異なる場合があります。
- Ubuntu/Debian系:
/etc/mysql/mysql.conf.d/mysqld.cnf
- CentOS/RHEL系:
/etc/my.cnf
[mysqld]
セクションで、以下の設定を確認または追加します。
bind-address = 0.0.0.0
説明:
bind-address
は、MySQLサーバーが接続を待ち受けるIPアドレスを指定します。- デフォルトでは
127.0.0.1
(ローカルホスト)に設定されており、リモートからの接続は許可されていません。 0.0.0.0
に設定することで、すべてのネットワークインターフェースからの接続を許可します。
セキュリティ上の注意:
- 特定のIPアドレスのみからの接続を許可したい場合は、
bind-address
にそのIPアドレスを指定します。- 例:
bind-address = 192.168.1.10
- 例:
ステップ5: ファイアウォールの設定を確認する
MySQLのデフォルトポート3306
がファイアウォールで開放されていることを確認します。使用しているファイアウォールによって設定方法が異なります。
UFWを使用している場合(Ubuntuデフォルト)
sudo ufw allow 3306/tcp
特定のIPアドレスのみを許可する場合:
sudo ufw allow from 192.168.1.0/24 to any port 3306
firewalldを使用している場合(CentOSデフォルト)
sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload
特定のIPアドレスのみを許可する場合:
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
iptablesを使用している場合
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
特定のIPアドレスのみを許可する場合:
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT
ステップ6: MySQLサーバーを再起動する
設定を反映させるために、MySQLサービスを再起動します。
sudo systemctl restart mysql
または
sudo service mysql restart
ステップ7: リモート接続をテストする
リモートマシンからMySQLに接続できるか確認します。
mysql -u ユーザー名 -p -h サーバーのIPアドレス
例:
mysql -u remote_user -p -h 203.0.113.10
パスワードの入力を求められたら、設定したパスワードを入力します。
接続エラー時の対処法:
- 認証エラー:
- ユーザー名、パスワード、ホスト名が正しいか確認します。
- タイムアウトエラー:
- ファイアウォールの設定や
bind-address
の設定を再確認します。
- ファイアウォールの設定や
- 権限エラー:
- ユーザーに必要な権限が付与されているか確認します。
まとめ
以上の手順で、MySQLでリモートから接続可能な設定とユーザー登録を行うことができます。セキュリティを維持しながらリモート接続を許可するために、以下の点に注意してください。
- 接続許可範囲の限定:
'%'
(すべてのホスト)ではなく、特定のIPアドレスやセグメントを指定することで、不正アクセスのリスクを低減します。
- 強力なパスワードの設定:
- 英数字や記号を組み合わせた強力なパスワードを使用します。
- 最小限の権限付与:
- 必要な権限のみをユーザーに付与し、過剰な権限は避けます。
- ファイアウォールの適切な設定:
- 必要なポートとIPアドレスのみを開放し、不要なアクセスを遮断します。
これらのベストプラクティスを遵守することで、MySQLデータベースを安全かつ効率的にリモートから利用することの支えになると思います。
本Blog内、MySQL関連ドキュメント
本文章以外にも、MySQL関連文書を記載していますので、いろいろと参考に慣れば幸いです。(10/14/2024追記)
徹底解説MySQLデータベース操作完全ガイド:検索から重複削除、パフォーマンス最適化、最新機能まで
MySQLリモート接続を安全に実現する方法—ユーザー作成からファイアウォール設定まで
徹底解説:MySQL: 結合、サブクエリ、インデックス、トランザクション
変更履歴等
shell文を見やすい表示方式へ変更。2024/10/04
本ブログの関連記事を記載。2024/10/04