はじめに
こんにちは。インプリムのhmineです。
ふだんは、オープンソースのノーコード・ローコードツール プリザンターの機能追加を行っています。
この記事では、プリザンターのVer.1.4.18.0でリリースされた、「プリザンターのインストール時に別サーバのMySQLを指定できる機能」の背景説明をしたいと思います。
本記事は、RDBのユーザ管理について基本的な知識があればご理解いただける内容となっています。
MySQLのユーザの接続元情報について
MySQLのCREATE USERで接続元ホストを指定
MySQLのユーザログインには、SQL ServerやPostgreSQLにない特徴があります。
CREATE USERコマンドをご覧ください。hayatoというMySQLユーザを作成します。
create user 'hayato'@'<接続元>' identified by '<パスワード文字列>';
@の後ろで接続元のホストを指定しています。以下が指定の例です。
- 'hayato'@'localhost'
- 'hayato'@'192.168.1.100'
- 'hayato'@'%'
登録されたユーザ情報とホスト情報を確認するコマンドはこちらです。
select user, host from mysql.user;
さて。
次は、作成したユーザでMySQLにログインしてみます。
コマンドベースでMySQLにログインする際のコマンドはこちらです。コマンド実行後にパスワードを入力することで、MySQLにログインが許可されます。
mysql -h <MySQLのホスト情報> -u <ログインユーザ名> -p
このとき、どこのマシンからログインしようとしているかということが重要です。
localhostのみホストが指定されている場合
'hayato'@'localhost'のみユーザ登録されている場合、ログインはMySQLをインストールしたマシンからでなければ拒否される仕様となっています。
たとえば、MySQLをインストールしたマシンが192.168.1.110だったとして、他のマシン(192.168.1.100など)から、以下コマンドを実行してログインしようとしても接続は拒否されてしまうのです。
mysql -h 192.168.1.110 -u hayato -p
特定のホストが指定されている場合
'hayato'@'192.168.1.100'のみユーザ登録されている場合はどうなるでしょうか。
この場合、ログインは192.168.1.100のホストのマシンからのみ可能となります。
mysql -h 192.168.1.110 -u hayato -p
このコマンドは192.168.1.100のホストから行った場合のみ成功します。(Linuxのファイアウォールも許可されているのが前提です。)
それ以外からの接続は拒否されます。
%(ワイルドカード)が指定されている場合
'hayato'@'%'のみユーザ登録されている場合はどうなるでしょうか。
%は、ホストを指定する際の特殊な記号でワイルドカード、つまり、どのマシンからの接続でも許可してくれる動作となります。
mysql -h 192.168.1.110 -u hayato -p
このコマンドは接続元を問わず成功します。(Linuxのファイアウォールも許可されているのが前提です。)
ここまでが、MySQLの仕様の解説となります。
プリザンターでおこなうMySQLユーザ操作について
プリザンターのRds.json
ここまで説明してきたMySQLのユーザ情報とホスト情報について、プリザンターとの関わりがある箇所は、Ver1.4.18.0で追加されたRds.jsonのMySqlConnectingHostです。
プリザンターのユーザ情報操作
プリザンターをインストールする際に実行するCodeDefiner(_rdsモード)の処理中、以下のふたつの接続文字列を読み取ってユーザをMySQLの中に作成しています。
項目名 | 説明 |
---|---|
OwnerConnectionString | テーブルスキーマを操作するユーザの接続情報 |
UserConnectionString | プリザンターのアプリを操作するユーザの接続情報 |
本番環境のプリザンターでは、セキュリティの観点により、接続文字列をRds.jsonに直接記述するのではなく、環境変数に隠蔽しているケースも多いでしょう。
この時、先ほど示したようなCREATE USER文を実際に実行しています。
create user '<ユーザ名>'@'<接続元>' identified by '<パスワード文字列>';
ユーザ作成処理の中で、<ユーザ名>と<パスワード文字列>は上表で紹介したRds.jsonの項目の内容を読み取って取得しています。
それに対し、<接続元>はVer.1.4.18.0以降、MySqlConnectingHostという新項目から読み取る仕様となりました。これが「プリザンターのインストール時に別サーバのMySQLを指定できる機能」のアップデート内容となります。
これよりも前のバージョンでは<接続元>はアプリケーション内部でlocalhostを固定で設定していました。
→MySqlConnectingHostを追加したことで、WebサーバとDBサーバを分離した構成でMySQLのプリザンターを構築する機能が標準機能化されました。
MySqlConnectingHostに何を設定するか
MySqlConnectingHostの設定値、WebサーバとDBサーバの分離有無に関わらず、通常は既定値の"%"で問題ないでしょう。
セキュリティ上規定の関係で、MySQLへ接続してくるホストを制限したい場合は、"localhost"や特定のホストを指定してください。
注意点:rootアカウントの接続元ホスト設定は要事前準備
Rds.jsonにはもうひとつ、接続文字列を設定する項目があります。
項目名 | 説明 |
---|---|
SaConnectionString | MySQL管理ユーザ(rootユーザ等)の接続情報 |
OwnerConnectionStringとUserConnectionStringの情報を元にユーザを作成するとき、そのコマンドの実行はrootユーザで行うため、SaConnectionStringの接続情報が必要となります。
そして、rootユーザはMySQLのインストール時に作成される前提があるため、プリザンターでrootユーザの情報の操作は行いません。
WebサーバとDBサーバを分離した構成にする場合、root@% のような、他のホストからMySQLに接続可能なrootユーザが必要となります。このrootユーザの情報の追加については、プリザンターの標準機能ではなく、MySQLに直接ログインして追加する必要がある点に注意してください。
詳細な手順は、以下のマニュアルに記載されています。
まとめ
- MySQLのユーザ管理機能ではユーザの接続を許可する接続元情報を管理している
- プリザンターはセットアップ時(CodeDefiner実行時)にMySQLのユーザを2件作成している(この2件にrootユーザは含まない。rootについては既に存在する前提となっており、作成処理がないことに注意)
- root@%のユーザが存在するMySQL、かつ、Rds.jsonのMySqlConnectingHostに"%"を設定した状態でセットアップすれば、WebサーバとDBサーバを分離した構成でMySQLのプリザンターを構築することができるようになった(Ver.1.4.18.0以降~)
以上です。
本記事で前提知識を念頭においた上でマニュアルをご覧になり、MySQL環境のプリザンターを構築いただければと思います。