MariaDBには、インストール後にやっておくべき初期設定がふたつあります。設定ファイルの編集とmysql_secure_installationコマンドの実行。
rootパスワード設定や、だれでも使える匿名ユーザーの削除などのセキュリティ対策をします。
今回の内容はMySQLと互換性があります。(MySQLでも同じ。)
(ただし、設定ファイル名がちがうこともある。)
検証バージョン |
---|
MariaDB 10.4.11 |
インストール後にやること
インストール直後のMariaDBは、ユーザー・パスワードなしでログインできたり、設定がほぼない状態だったり、ザルです。
たとえば、OS一般ユーザーでもデータベースにかんたんにログインできます。
ログインユーザー・パスワード無しで、『mysql』と打つだけで見れちゃいます。infomation_schemaまでイジれてしまっては、セキュリティはないも同然です。
infomation_schemaはDBシステムの根幹です。これにおかしな変更を加えるとデータベースが動きません。
これをどうにかしないといけないのと最低限の設定も必要です。
設定ファイルの編集
まず、MariaDBの設定ファイルを編集します。設定ファイルは
/etc/my.cnf.d/
にあります。インストール直後は何も設定されていません。今回はとりあえず、文字コードの設定をUTF-8に変更しましょう。
ほか、ログ設定やリカバリ・ポイント作成、接続ポート番号変更、DBサーバープロセスのチューニングなど、いろんなことをしますが、必要なときに設定すればいいです。
文字コードの初期状態
いまの状態をSQL実行で確認します。
まずは文字コードから。
character_set_client | DBを操作するクライアントの文字コード |
character_set_connection | 数値->文字列変換などで使う文字コード |
character_set_database | デフォルトDBの文字コード。 デフォルトDBがないとき、character_set_serverと同じ値。 単独で変更しない。 |
character_set_filesystem | ファイル名の文字コード。 binaryは文字コード変換をしない。 このままでいい。というか変えると面倒。 |
character_set_results | SQL結果やエラーメッセージの文字コード。 |
character_set_server | DBサーバーの文字コード。 『Debianの文字コードとのちがいを見てください。』 とあるので、OS毎にデフォルトがちがうらしい。 データベース・テーブル・カラム作成に影響する。 |
character_set_system | つねにutf8。 変更しない。 意味を知らなくていい。 |
デフォルトは、クライアントとSQL結果はutf8を使うようですね?(DBサーバーはlatin1)
もうひとつ、文字コードと関係が深い照合順序(Collation)も確認しておきます。
照合順序は文字列を比較するときのルールです。大文字小文字を区別する・しないとか。
値を見れば分かるように文字コードが関係しています。
ちなみに、データベースの操作の終了はquitです。
UTF8は『utf8mb4』を使う
MariaDBのutf8は絵文字が文字化けして問題です。
utf8はサイズが3byteで絵文字が使えません。UTF8での絵文字は4byteで表現するのでutf8mb4に変える必要があります。
データベースがutf8mb4を使えるか確認します。
結果に表示されるので使えます。
クライアントの文字コード変更
まずはSQLクライアントの設定を変更します。
データベースを再起動しましょう。
MariaDBのsystemdでは、設定ファイルのリロードができません。再起動で代用します。
クライアント側がまとめて変更できました。
character_set_client | utf8mb4 |
character_set_connection | utf8mb4 |
character_set_results | utf8mb4 |
collation_connection | utf8mb4_general_ci |
default-character-setは変数ではなくオプション
***.cnfでは、設定方法がふたつあります。
変数を指定する。
オプションを指定する。
default-character-setは、クライアントの文字コードを変更する『オプション』です。
だから、クライアントに関係する複数の変数がまとめて変更できたんですね?
区別がつきにくいですが、
変数は『アンダーバー(_)』
オプションは『ハイフン(-)』
と覚えておきましょう。
変数指定では、ひとつひとつ変更しないといけない、変数の関係を知っておかないといけないので面倒。オプションでできるならそっちを優先する。
(オプション指定の後ろに変数指定を書けば併用可。)
default-character-setはクライアントの文字コードを変更するオプション。サーバーサイドでは使えない。
DBサーバーの文字コード変更
こんどはDBサーバーの文字コードを変更します。
結果はこうなります。
character_set_database | utf8mb4 |
character_set_server | utf8mb4 |
collation_database | utf8mb4_general_ci |
collation_server | utf8mb4_general_ci |
4つの変数が変更されました。これで文字コードの変更は終わりです。
"character-set-server"はオプションで、変数"character_set_server"でないことに注意。
よく見ると『-』と『_』でちがう。
セキュアな初期設定の実行
インストール直後のMariaDBはユーザー設定がユルユルです。
(だからかんたんにログインできる。)
作業前の状態
いまのユーザーを確認します。
rootパスワードが無効、ユーザー・パスワードがないもの(匿名ユーザー)が2つもあります。これが無条件にログインできる正体。
ついでにユーザーの権限設定も見ときましょう。
この設定を変えるツールが用意されています。
mysql_secure_installationコマンド
これを実行してゆるい状態を直します。
mysql_secure_installationコマンド実行
さっそくコマンドを実行しましょう。
このコマンドはいろいろな入力を求められます。
MariaDBにログインしてセキュリティを確保するための現在の
和訳
rootユーザーのパスワード。 MariaDBをインストールしたばかりで、まだルートパスワードを設定していない場合は、ここでEnterキーを押すだけです。

rootパスワードを設定するか、unix_socketを使用すると、適切な承認なしに誰もMariaDB rootユーザーにログインできなくなります。
ルートアカウントは既に保護されているため、「n」と安全に答えることができます。
和訳


rootパスワードを設定します。

デフォルトでは、MariaDBインストールには匿名ユーザーが含まれており、ユーザーアカウントを作成しなくても誰でもMariaDBにログインできます。 これはテストのみを目的としており、インストールを少しスムーズにするためのものです。 実稼働環境に移行する前にそれらを削除する必要があります。
和訳

通常、rootは「localhost」からの接続のみを許可する必要があります。 これにより、誰かがネットワークからルートパスワードを推測できないようになります。
rootのリモートログインを許可しない?
和訳

デフォルトでは、MariaDBには「test」という名前のデータベースが付属しており、誰でもアクセスできます。 これもテストのみを目的としており、実稼働環境に移行する前に削除する必要があります。
和訳

特権テーブルをリロードすると、これまでに行ったすべての変更がすぐに有効になります。
和訳

設定が終わりました。ユーザーの確認をしましょう。
まずはOSの一般ユーザーでログインしてみます。
OKですね?ちなみにOSのrootユーザーでは今までと同じようにログインできます。
ユーザーテーブルを確認しましょう。
テストデータベースが削除されてるか見てみます。
大丈夫ですね?
(mysql, performance_schemaデータベースが追加されて、ついでにデータベースの初期化までやってくれてる。)
MariaDB公式ドキュメント
新しいデーターベース・ユーザーを追加
OS一般ユーザーがログインできるデータベースがないので追加しましょう。ついでに、新しいユーザーも追加します。
(mysqlユーザーは元からあるのでセキュリティ上使いたくない。)
テストなのでパスワードを'mine'にしてますが、きちんとした不規則な文字列を指定してください。
ホストはlocalhostだけでいいです。いまのデータベース接続はsshトンネルを使うのが一般的なので。
sshトンネル
直接データベースに接続しないでsshを介してつなげる。
データベースのポートを外に開かなくていいのでセキュリティ上よい。
ssh接続
↓
sshログインユーザーがOSシステム内でlocalhostとしてDB接続
↓
SQL結果をsshを介して外に出す
データベースを追加します。
作ったデータベース(mydb)の権限に新しいユーザーを追加します。
(mydbデータベースのすべての権限(on mydb.*)をmine@localhostに与える。)
OS一般ユーザーでデータベースに接続しましょう。
とりあえず、DBの初期設定は終了です。