MySQLリモート接続を安全に実現する方法—ユーザー作成からファイアウォール設定まで

スポンサーリンク

以前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 PRIVILEGESSELECTINSERTなど)
  • データベース名:権限を付与するデータベース名(例:'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データベースを安全かつ効率的にリモートから利用することの支えとなるでしょう。

タイトルとURLをコピーしました