序章

アプリケーションまたはWebサイトが大きくなると、現在のサーバー設定を超えてしまう可能性があります。 Webサーバーとデータベースバックエンドを同じマシンでホストしている場合は、これら2つの機能を分離して、それぞれが独自のハードウェアで動作し、訪問者の要求に応答する負荷を共有できるようにすることをお勧めします。

このガイドでは、Webアプリケーションが接続できるリモートMySQLデータベースサーバーを構成する方法について説明します。 何かを操作できるように、例としてWordPressを使用しますが、この手法はMySQLを利用するすべてのアプリケーションに広く適用できます。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

  • Ubuntu 16.04 での初期サーバー設定で説明されているように、root以外のsudoが有効なユーザーとUFWファイアウォールが有効になっている2つのUbuntu16.04サーバー。
  • サーバーの1つに、LEMP(Linux、Nginx、MySQL、PHP)スタックをインストールする必要があります。 チュートリアルLinux、Nginx、MySQL、PHP(LEMPスタック)をUbuntu 16.04 にインストールする方法では、プロセスをガイドします。 MySQLのインストールに関するステップ2はスキップする必要があります。 代わりに、このチュートリアルでMySQLをインストールします。
  • オプションで(ただし強くお勧めします)、SSL証明書を使用してLEMPWebサーバーを保護できます。 ドメイン名が必要ですが、証明書は無料です。 ガイドUbuntu16.04でLet’sEncryptを使用してNginxを保護する方法でその方法を説明します。

ステップ1—データベースサーバーへのMySQLのインストール

データを別のサーバーに保存することは、1台のマシン構成のパフォーマンスの上限に達したときに適切に拡張するための良い方法です。 また、負荷分散を行い、後でインフラストラクチャをさらに拡張するために必要な基本構造も提供します。

開始するには、LEMPスタックをインストールしなかったサーバーにMySQLをインストールします。 このサーバーにログインし、パッケージキャッシュを更新して、MySQLサーバーソフトウェアをインストールします。

  1. sudo apt-get update
  2. sudo apt-get install mysql-server

インストール手順中に、MySQLのrootパスワードを設定して確認するように求められます。 後で必要になるので、強力なパスワードを選択してメモしておきます。

MySQLがインストールされ、実行されているはずです。 systemctlを使用して確認しましょう。

  1. systemctl status mysql
Output
● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2017-05-23 14:54:04 UTC; 12s ago Main PID: 27179 (mysqld) CGroup: /system.slice/mysql.service └─27179 /usr/sbin/mysqld

Active: active (running)行は、MySQLがインストールされて実行されていることを意味します。 次に、インストールをもう少し安全にします。 MySQLには、システムをロックダウンする手順を説明するスクリプトが付属しています。

  1. mysql_secure_installation

これにより、設定したMySQL rootパスワードの入力を求められます。 入力してENTERを押します。 次に、一連の「はい」または「いいえ」のプロンプトに答えます。 それらを見てみましょう:

まず、パスワード検証プラグインについて質問されます。これは、MySQLユーザーに特定のパスワード強度ルールを自動的に適用できるプラグインです。 これを有効にすることは、個々のセキュリティニーズに基づいて行う必要がある決定です。 yENTERを入力して有効にするか、ENTERを押してスキップします。 有効にすると、パスワード検証の厳密さについて0〜2のレベルを選択するように求められます。 番号を選択し、ENTERを押して続行します。

次に、rootパスワードを変更するかどうかを尋ねられます。 MySQLをインストールしたときにパスワードを作成したばかりなので、これをスキップしても問題ありません。 ENTERを押して、パスワードを更新せずに続行します。

残りのプロンプトには、はいと答えることができます。 匿名MySQLユーザーの削除、リモート root ログインの禁止、 test データベースの削除、特権テーブルの再読み込みについて質問されます。これにより、以前の変更が有効になります。ちゃんと。 これらはすべて良い考えです。 yと入力し、それぞれENTERを押します。

すべてのプロンプトに応答すると、スクリプトは終了します。 これで、MySQLのインストールは適切に保護されました。 次のステップでは、リモート接続からのアクセスを許可するようにMySQLを構成します。

ステップ2—リモート接続をリッスンするようにMySQLを構成する

データベースが稼働しているので、他のコンピューターからの接続を許可するためにいくつかの構成値を変更する必要があります。

エディターでroot権限でmysqld構成ファイルを開きます。

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

このファイルは、角かっこ([および])内の単語で示されるセクションに分割されています。 mysqldというラベルの付いたセクションを見つけます。

mysqld.cnf
. . .
[mysqld]

このセクション内で、bind-addressというパラメーターを見つける必要があります。 これは、接続をリッスンするネットワークアドレスをデータベースソフトウェアに通知します。

現在、MySQLはローカル接続のみを検索するように構成されています。 サーバーにアクセスできる外部IPアドレスを参照するように変更する必要があります。

両方のサーバーがプライベートネットワーク機能を備えたデータセンターにある場合は、サーバーのプライベートネットワークIPを使用します。 それ以外の場合は、パブリックIPアドレスを使用できます。

/etc/mysql/my.cnf
[mysqld]
. . .
bind-address = db_server_ip

インターネット経由でデータベースに接続するため、データを安全に保つために暗号化された接続が必要になります。 MySQL接続を暗号化しないと、ネットワーク上の誰もがWebとデータベースサーバー間の機密情報を盗聴する可能性があります。 更新したbind-address行の後に次の行を追加します。

/etc/mysql/my.cnf
. . .
require_secure_transport = on

終了したら、ファイルを保存して閉じます。

SSL接続を機能させるには、いくつかのキーと証明書を作成する必要があります。 MySQLには、必要なものすべてを自動的に設定するコマンドが付属しています。

  1. sudo mysql_ssl_rsa_setup --uid=mysql

これにより、必要なファイルが作成され、MySQLサーバー(--uid=mysql)で読み取り可能になります。

MySQLに構成を更新させ、新しいSSL情報を読み込むようにするには、データベースを再起動します。

  1. sudo systemctl restart mysql

サーバーが外部インターフェイスでリッスンしていることを確認するには、netstatで確認します。

  1. sudo netstat -plunt | grep mysqld
Output
tcp 0 0 db_server_ip:3306 0.0.0.0:* LISTEN 27328/mysqld

netstatは、サーバーのネットワークシステムに関する統計を出力します。 この出力は、mysqldというプロセスが標準のMySQLポートであるポート3306db_server_ipに接続されていることを示しています。

次に、ファイアウォールでそのポートを開いて、トラフィックが通過できるようにします。

  1. sudo ufw allow mysql

次に、サーバーにリモートでアクセスするために必要なユーザーとデータベースを設定します。

ステップ3—WordPressデータベースとリモートクレデンシャルを設定する

MySQL自体が外部IPアドレスをリッスンしていますが、現在、リモート対応のユーザーまたはデータベースは構成されていません。 WordPress用のデータベースとそれにアクセスできるユーザーを作成しましょう。

MySQL rootアカウントを使用してMySQLに接続することから始めます。

  1. mysql -u root -p

MySQL root パスワードの入力を求められた後、新しいmysql>プロンプトが表示されます。

これで、WordPressが使用するデータベースを作成できます。 後で簡単に識別できるように、これをwordpressと呼びます。

  1. CREATE DATABASE wordpress;

注:すべてのSQLステートメントはセミコロン(;)で終了する必要があります。 MySQLコマンドでENTERを押しても、->プロンプトが表示された新しい行のみが表示される場合は、セミコロンを忘れている可能性があります。 新しい行に入力し、ENTERをもう一度押すだけで続行できます。

データベースができたので、ユーザーを作成する必要があります。 ユーザーを作成する際の1つの工夫は、ユーザーが接続している場所に基づいて2つの異なるプロファイルを定義する必要があることです。 ローカル専用ユーザーと、WebサーバーのIPアドレスに関連付けられたリモートユーザーを作成します。

まず、ローカルユーザー wordpressuser を作成し、宣言で localhost を使用して、このアカウントがローカル接続の試行にのみ一致するようにします。

  1. CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';

先に進んで、このアカウントにデータベースへのフルアクセスを許可しましょう。

  1. GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';

このユーザーは、WordPressのデータベースで任意の操作を実行できるようになりましたが、このアカウントはローカルマシンからの接続とのみ一致するため、リモートで使用することはできません。

次に、Webサーバーからの接続のみに一致するコンパニオンアカウントを作成します。 このためには、WebサーバーのIPアドレスが必要です。 このアカウントには任意の名前を付けることができますが、より一貫性のあるエクスペリエンスを実現するために、ホスト部分のみを変更して、上記とまったく同じユーザー名を使用します。

mysqld.cnfファイルで構成したものと同じネットワークを利用するIPアドレスを使用する必要があることに注意してください。 つまり、プライベートネットワークIPを使用した場合は、WebサーバーのプライベートIPを使用するために以下のルールを作成する必要があります。 パブリックインターネットを使用するようにMySQLを構成した場合は、それをWebサーバーのパブリックIPアドレスと一致させる必要があります。

  1. CREATE USER 'wordpressuser'@'web-server_ip' IDENTIFIED BY 'password';

リモートアカウントができたので、ローカルユーザーと同じ権限を与えることができます。

  1. GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'web_server_ip';

それらをディスクに書き込むための特権をフラッシュし、それらの使用を開始します。

  1. FLUSH PRIVILEGES;

次に、次のように入力してMySQLプロンプトを終了します。

  1. exit

新しいデータベースとリモート対応ユーザーを設定したので、データベースと接続をテストしてみましょう。

ステップ4—リモート接続とローカル接続のテスト

続行する前に、 wordpressuser アカウントを使用して、ローカルマシンとWebサーバーの両方からデータベースに接続できることを確認することをお勧めします。

まず、新しいアカウントでログインして、データベースマシンからのローカル接続をテストします。

mysql -u wordpressuser -p

プロンプトが表示されたら、このアカウントに設定したパスワードを入力します。

MySQLプロンプトが表示された場合、ローカル接続は成功しています。 次のように入力すると、再び終了できます。

  1. exit

Webサーバーにログインして、リモート接続をテストします。

Webサーバーで、リモートデータベースにアクセスするには、MySQL用のクライアントツールをいくつかインストールする必要があります。 ローカルパッケージキャッシュを更新してから、クライアントユーティリティをインストールします。

  1. sudo apt-get update
  2. sudo apt-get install mysql-client

これで、次の構文を使用してデータベースサーバーに接続できます。

  1. mysql -u wordpressuser -h db_server_ip -p

ここでも、データベースサーバーに正しいIPアドレスを使用していることを確認する必要があります。 プライベートネットワークでリッスンするようにMySQLを構成した場合は、データベースのプライベートネットワークIPを入力します。それ以外の場合は、データベースサーバーのパブリックIPアドレスを入力します。

wordpressuser アカウントのパスワードの入力を求められ、問題がなければMySQLプロンプトが表示されます。 次のコマンドを使用して、接続がSSLを使用していることを確認できます。

  1. status
Output
-------------- mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper Connection id: 52 Current database: Current user: [email protected] SSL: Cipher in use is DHE-RSA-AES256-SHA Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.18-0ubuntu0.16.04.1 (Ubuntu) Protocol version: 10 Connection: 203.0.113.111 via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 TCP port: 3306 Uptime: 3 hours 43 min 40 sec Threads: 1 Questions: 1858 Slow queries: 0 Opens: 276 Flush tables: 1 Open tables: 184 Queries per second avg: 0.138 --------------

SSL:行は、SSL暗号が使用されているかどうかを示します。 リモートで接続できることを確認したので、先に進んでプロンプトを終了できます。

  1. exit

追加のチェックとして、3番目のサーバーから同じことを実行して、この他のサーバーにアクセスが許可されていないことを確認できます。 ローカルアクセスとWebサーバーからのアクセスを確認しましたが、他の接続が拒否されることを確認していません。

先に進み、特定のユーザーアカウントを構成せず実行したサーバーで同じ手順を試してください。 上記のようにクライアントユーティリティをインストールする必要がある場合があります。

  1. mysql -u wordpressuser -h db_server_ip -p

これは正常に完了しないはずです。 次のようなエラーが返されます。

Output
ERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server

これが私たちが期待していることであり、私たちが望んでいることです。

リモート接続のテストに成功し、WordPressのインストールを続行できるようになりました。

ステップ5—WordPressをインストールする

新しいリモート対応のMySQLサーバーの機能を示すために、人気のあるブログプラットフォームであるWordPressをWebサーバーにインストールして構成します。 これには、ソフトウェアをダウンロードして抽出し、接続情報を構成してから、WordPressのWebベースのインストールを実行する必要があります。

Webサーバーで、最新リリースのWordPressをホームディレクトリにダウンロードします。

  1. cd ~
  2. curl -O https://wordpress.org/latest.tar.gz

ファイルを抽出します。これにより、ホームディレクトリにwordpressというディレクトリが作成されます。

  1. tar xzvf latest.tar.gz

WordPressには、開始点として使用するサンプル構成ファイルが含まれています。 このファイルのコピーを作成し、ファイル名から-sampleを削除して、WordPressによってロードされるようにします。

  1. cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php

ファイルを開くとき、最初の作業は、インストールにセキュリティを提供するためにいくつかの秘密鍵を調整することです。 WordPressは、これらの値の安全なジェネレーターを提供するため、自分で適切な値を考え出す必要はありません。 これらは内部でのみ使用されるため、ここで複雑で安全な値を使用してもユーザビリティが損なわれることはありません。

WordPressの秘密鍵ジェネレーターから安全な値を取得するには、次のように入力します。

  1. curl -s https://api.wordpress.org/secret-key/1.1/salt/

これにより、wp-config.phpファイルにコピーして貼り付けることができる構成が出力されます。

警告!毎回一意の値を要求することが重要です。 以下に示す値をコピーしないでください!

Output
define('AUTH_KEY', '1jl/vqfs<XhdXoAPz9 DO NOT COPY THESE VALUES c_j{iwqD^<+c9.k<J@4H'); define('SECURE_AUTH_KEY', 'E2N-h2]Dcvp+aS/p7X DO NOT COPY THESE VALUES {Ka(f;rv?Pxf})CgLi-3'); define('LOGGED_IN_KEY', 'W(50,{W^,OPB%PB<JF DO NOT COPY THESE VALUES 2;y&,2m%3]R6DUth[;88'); define('NONCE_KEY', 'll,4UC)7ua+8<!4VM+ DO NOT COPY THESE VALUES #`DXF+[$atzM7 o^-C7g'); define('AUTH_SALT', 'koMrurzOA+|L_lG}kf DO NOT COPY THESE VALUES 07VC*Lj*lD&?3w!BT#-'); define('SECURE_AUTH_SALT', 'p32*p,]z%LZ+pAu:VY DO NOT COPY THESE VALUES C-?y+K0DK_+F|0h{!_xY'); define('LOGGED_IN_SALT', 'i^/G2W7!-1H2OQ+t$3 DO NOT COPY THESE VALUES t6**bRVFSD[Hi])-qS`|'); define('NONCE_SALT', 'Q6]U:K?j4L%Z]}h^q7 DO NOT COPY THESE VALUES 1% ^qUswWgn+6&xqHN&%');

受け取った出力をクリップボードにコピーしてから、テキストエディタで構成ファイルを開きます。

  1. nano ~/wordpress/wp-config.php

それらの設定のダミー値を含むセクションを見つけます。 次のようになります。

wp-config.php
. . .
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
. . .

それらの行を削除し、コマンドラインからコピーした値を貼り付けます。

次に、リモートデータベースの接続情報を入力する必要があります。 これらの構成行は、ファイルの上部、キーを貼り付けた場所のすぐ上にあります。 以前にリモートデータベーステストで使用したものと同じIPアドレスを使用することを忘れないでください。

wp-config.php
. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpressuser');

/** MySQL database password */
define('DB_PASSWORD', 'password');

/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .

最後に、ファイルの任意の場所に、MySQLデータベースへのSSL接続を使用するようにWordPressに指示する次の行を貼り付けます。

wp-config.php
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

ファイルを保存して閉じます。

次に、~/wordpressディレクトリにあるファイルとディレクトリをNginxのドキュメントルートにコピーする必要があります。 -aフラグを使用して、権限が維持されていることを確認します。

  1. sudo cp -a ~/wordpress/* /var/www/html

これで、すべてのファイルが配置されました。 あとは、ファイルの所有権を変更するだけです。 ドキュメントルート内のすべてのファイルを、Webサーバーユーザーwww-dataが所有するように設定します。

  1. sudo chown -R www-data:www-data /var/www/html

これでWordPressがインストールされ、Webベースのセットアップルーチンを実行する準備が整いました。 次のステップでそれを行います。

ステップ6—Webインターフェイスを介したWordpressのセットアップ

WordPressには、いくつかの質問をしてデータベースに必要なテーブルをインストールするWebベースのセットアップルーチンがあります。 今から始めましょう。

Webサーバーに関連付けられているドメイン名(またはパブリックIPアドレス)に移動します。

http://example.com

WordPressインストーラーの言語選択画面が表示されます。 適切な言語を選択し、クリックしてメインのインストール画面に移動します。

WordPress install screen

情報を送信したら、作成したアカウントを使用してWordPress管理インターフェースにログインする必要があります。 次に、サイトをカスタマイズおよび操作できるダッシュボードが表示されます。

結論

このチュートリアルでは、リモートのWordpressインストールからSSLで保護された接続を受け入れるようにMySQLデータベースを設定しました。 使用したコマンドと手法は、任意のプログラミング言語で記述されたすべてのWebアプリケーションに適用できますが、具体的な実装の詳細は異なります。 詳細については、アプリケーションまたは言語のデータベースのドキュメントを参照してください。