ArchLinuxでお洒落にMariaDBする
時計システム、BigTable、ブラックホール・・・
この世のすべてを作っている男・エンジニアリング王ジェフ・ディーン。
彼の言い放った一言は、人々をπの海へかり立てた。
「オレの暗証番号か?欲しけりゃくれてやる。
探せ!この世のすべてをそこへ置いてきた!!」
男たちは円周率の最後の4桁を目指し、夢を追い続ける。
いや、いつか
Jeff Dean
のコピペを書いてみたいと思っていたんだけれど、、、
まぁ大データ時代なのは間違いない!ってことで、
ArchLinuxでMariaDBというデータベースをはじめる時のメモです。
MariaDB
MariaDBの情報は以下から。
ArchLinuxでのインストール
MariaDBはArchLinuxの公式リポジトリにある mariadbパッケージでインストール出来ます。 pacmanを使ったインストールコマンドは次の通り。
$ sudo pacman -S mariadb
pacmanコマンドでmariadbパッケージをインストールすると、 他の必要なパッケージ (mariadb-clientsやmariadb-libs等) が一緒にインストールされます。
MariaDBのシステムディレクトリ初期化
まずは、 pacmanでのインストール時の出力の最後の方に、 サーバー起動前に行なうべき必須の作業 の指示があるので確認します。
メッセージに書かれた重要な指示
以下がインストール時のpacmanでの出力です。
出力メッセージの中にある以下の記述に着目しましょう。
You need to initialize the MariaDB data directory prior to starting the service. This can be done with mariadb-install-db command, e.g. :
mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
ここには、 「サーバー起動する前に MaridaDBのデータディレクトリを初期化する必要があります。 この初期化は次のように、 mariadb-install-dbコマンドを使って行ないます。」 と書かれています。 ですから、pacmanのインストール直後、指示通りに
$ sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
実際にコマンドを実行すると、次の様な出力がされます。
まず、 mariadbを管理するためのシステムテーブルを /var/lib/mysql に作成した旨が述べられています。 しかし、 更に、メッセージが続いています。 その主な内容は、新しいMariaDBで採用されている、 新しい認証システムについての説明です。
この認証システムの紹介は後の項目で行なうとして、 まずは、サーバーを立ち上げましょう。
MariaDBサーバー起動!!
なんにせよ、mariadb-install-dbスクリプトを実行したので、 MariaDBサーバーの初期化作業は完了しています。 とりあえず、MariaDB サーバーを起動してみましょう。
MariaDBをsystemdで立ち上げる
先のメッセージの中に、 mariadb.service(systemdのユニットファイル)を 手動でコピーするように指示がありますが、pacmanがしてくれているので その必要はありません。 また、mariadb デーモンの立ち上げコマンドが紹介されていますが、 ArchLinuxではsystemdから立ち上げるのが普通です。
ですから、以下のコマンドでMariaDBサーバーを立ち上げましょう。
$ sudo systemctl start mariadb
サーバーの停止は、上記コマンドの start の部分を stop にしたものを実行すればOKです。 systemdのsystemctlコマンドに疎い方は、 一度、 ArchWikiのsystemdのページ を見ておきましょう。
systemd enableで常時起動
LinuxのBoot時からのサーバーの自動起動(デーモン)の設定は、 systemctlにenableを渡す以下の様なコマンドを実行することで行なえます。 ちなみに、自動起動のとりやめは、disableです。
$ sudo systemctl enable mariadb
systemctl enable を実行しても、 「今」起動するわけではありません。 次回のLinuxブート時に起動する設定であることに注意しましょう。 (サーバー起動のつもりで、 enableして、サーバーが立ち上がらない!!っていう、 systemd 初心者あるある)。
新しいMariaDBへのログインの仕方
先にみた、 mariadb-install-dbスクリプトの実行時に出力されたメッセージの 中に書かれていた、次の部分に着目します。
Two all-privilege accounts were created. One is root@localhost, it has no password, but you need to be system 'root' user to connect. Use, for example, sudo mysql The second is mysql@localhost, it has no password either, but you need to be the system 'mysql' user to connect. After connecting you can set the password, if you would need to be able to connect as any of these users with a password and without sudo
See the MariaDB Knowledgebase at https://mariadb.com/kb
ここでは、上記の初期化によって、 「root@localhost」と「mysql@localhost」の ふたつの特権アカウントが作成された旨が述べられ、 ともにパスワードが設定されていないことが説明されています。 ここで、「 ここでパスワードが設定されていない 」とは、 パスワード無しで誰でもアクセス出来るという意味ではありません。 パスワードを要求されてアクセスするような方法ではアクセス出来ない という意味です。
初心者殺しのMariaDB
例えば、 よくあるMySQL等のデータベース初心者ページで 「サーバーへのアクセスの仕方」を見ると 次の様なコマンドが載っています。
$ mysql -u root -p
しかし、今、インストールしているArchLinuxのMariaDBでは、 この方法でサーバーにアクセス出来ません。 パスワードのプロンプトに単にエンターキーを押した場合、 以下の様なエラーがでます。 すなわち、 アクセスが拒否(Access denied) されます。
通常、 初心者として初心者ページを読んでいて、 そこに書いてある通りにやって、 書いてある通りにならない場合、、、 先に進む手段がありません。
が、このノートでは、先に進めるので大丈夫です! 色々読むのが面倒な人は、 初心者ページで`mysql -u root -p`と指示されている所は、 代りに以下のコマンド を使いましょう。
$ sudo mysql
-u とか -p とかのオプションは一切いりません。 sudoを使ってroot権限でmysqlを実行するだけです。
同名のシステムアカウント権限でログイン
さて、上に書いたsudoコマンドを使う方法、 上手く行かないので無理矢理root権限で動かしているわけではありません。
実は、ちゃんと上述の出力メッセージで
例えば、` sudo mysql `等で
と説明されているのです。 原文は次の通り。
One is root@localhost, it has no password, but you need to be system 'root' user to connect. Use, for example, sudo mysql
すなわち、mariadb上のrootアカウントならシステムのrootアカウントとして、 mariadbのmysqlアカウントならシステムのmysqlアカウントとして mysqlクライアントを実行すると、 パスワード無しでアクセスできるということです。
逆にいえば、 mariadbアカウントと同名のシステムアカウントからしかアクセス出来ない ということであり、 mariadbのデータベースアカウントだけが乗っ取られるということが不可能になるので セキュアになります。
さてここで使われる システムの別ユーザー権限になるためのコマンドの例が sudo コマンドです。 PC-UNIXを使っている方々は、この sudo コマンドを root権限を得るのに通常使っていてお馴染だと思いますが、 実は、rootに限らずどのユーザーにもなれる 「他人の権限でコマンドを実行するためのコマンド」です。
sudoを使ってログイン
ここで、あらためて新しいMariaDBでのログインの仕方を紹介すると、 rootとしてmysqlでmariadbにアクセスするためには、 次のコマンドのようにsudoを使ってシステムのrootユーザーになって、 mysqlを実行すればOKです。 -uや-pのオプションは必要ありません。
$ sudo mysql
もちろん、あなたのユーザーアカウントがsudoの権限を持っていないといけません。 sudoコマンドはrootだけでなく、 -uオプションを使って他のユーザーにもなれます。 mysqlクライアントをmysqlユーザーとして実行する場合には、 以下の様にコマンドを実行します。
$ sudo -u mysql mysql
以下は、sudoコマンドでrootユーザーとしてmysqlを実行し、 mriadbサーバーに接続している様子です。 パスワード等を聞かれることなく (sudoでのパスワードは聞かれます)、 ちゃんとアクセス出来ていることが確認出来ます。
高機能な新しいMariaDBのまめ知識
上記で紹介した、巷の情報と違うMariaDBの新しい認証方法について、 日本語で紹介されているページが少なそうなので、 MariaDB本家で紹介されている、以下のページを紹介しておきます。
このページに書かれている一番のテーマは、 MariaDBの10.4から各アカウントについて 「 複数の認証方法 を設定しておけるようになった」というものです。
まず、「認証方法」とは?ということですが、
例えば、みなさんが直感的にイメージしやすい認証方法は
「
パスワードでの認証
」方法です。
そして、他の認証方法としては、先に紹介した「sudoを使う方法」です。
実際には、MariaDBのアカウントと同名のシステムアカウントからアクセスするというものですが、この方法は「
unix socket認証
」と呼ばれています。
更に、これ以外にも認証方法がいくつかあるようです
(実際には、パスワードの認証方法も複数ある)。
そして、実はそもそも、MySQLやMariaDBは幾つかある認証方法の中から 自分の好きなものを一つ選んで設定することが出来ました (認証プラグインという仕組み)。 しかし、今回の新機能によって、複数を組みあわせた設定、 例えば「まず、unix socket認証を試して、失敗したら、パスワード認証する」 という設定をすることが出来るようになったのです。
パスワード認証に変更できます
さて、新機能云々や何故そうなったのかという話はさておき、
まず、重要なことは、
ということです。
MariaDBのrootアカウントへのアクセスに unix socket認証ではなく、パスワード認証を使いたいなら、 一旦、sudoを使ってmysqlクライアントを実行し、 そこに次のSQLステートメントを発行します。
ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("verysecret")
実際に変更する場合は、 PASSWORD("verysecret")のverysecretの部分をあなたが使う パスワードに置き換えて実行します。 以下が実際にmysqlクライアントで認証方法をパスワード認証に 変更している様子です。
この作業を行なっておけば次回から'mysql -u root -p'で、 今設定したパスワードを使って、 MariaDBのrootにログイン出来るようになります。
初期化時に作られたrootとmysqlアカウントの話をしている
さて、ここまで読んで、よくわからないけれど、 新しいMariaDBでは認証方法が変ったらしい事だけは 把握した初心者さんが、 巷の初心者ガイドを片手に色々と勉強していく場合、 「新規ユーザー作成のときの認証方法はどうなるの??」 という不安があるかもしれませんが、大丈夫です! ガイド通りにやればガイド通りになるはずです。
複数認証の設定は、複数認証を設定するように設定を行います。 そして、rootとmysqlアカウントは、初期化スクリプトで 複数認証できるアカントとして作成したので、 unix socket認証されるようになっているだけです。
mysql_secure_installationスクリプト
MariaDBをセキュアに利用するための設定をチェックしてくれる シェルスクリプトがあり、 これを実行することが推奨されています。 さて、これは`mysql_secure_installation`という名前のスクリプトで、 内容は簡単なインタラクティブ形式で処理を進めるものなのですが、 もともと、MySQLなどはインストール直後、 rootのパスワードが設定されていなかった (今と違って誰でもアクセスができる)ので、 少くともrootパスワードの設定を促すためのセキュリティスクリプトだったようです。 なので、今はデフォルトでrootアカウントにunix socket認証が設定されており、 昔ほど「必須」というわけでもないのでしょうが、 ネットでのMySQL等のインストールに際して、 このスクリプトが紹介されているので、 みなさんなんの気なしに実行することと思います。
ところが実はこのスクリプト、 認証の強化(先に紹介した「unix socket認証」と「パスワード認証」) の部分がややこしい(昔の無防備な状態を前提としている)ので、 このノートで紹介したいと思います。
スクリプトでは以下の事を行ないます。
- 認証の強化
- 匿名ユーザーの削除
- ローカルホスト以外からのrootアカウント接続禁止
- 匿名ユーザーが接続できるテストテーブルの削除
スクリプトはインタラクティブ形式の質問に 答えることで設定を進めて行きます。 ひとつひとつ順番にみて行きましょう。 尚、このスクリプトでは、MariaDBに接続して、その設定を行なうので、 このスクリプトを実行する前に必ず、 MariaDBサーバーが立ち上がっている ことを確認してください。
スクリプトの実行は、次のコマンドで行ないます。 ここでの注意は、 sudoコマンドを使ってroot権限で実行 することです。
$ sudo mysql_secure_installation
MariaDBへの接続
コマンドを実行すると、まず、次ような出力がなされます。
はじめに、このスクリプトが推奨事項である説明がなされ、 続いて以下のように書かれています。
In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here.
これは「 MariaDBに接続するために、rootユーザーの現在のパスワードが必要です。 MariaDBをインストールしたばかりで、 まだパスワードを設定していない場合、 rootユーザーのパスワードはありません。 ですから、その場合には、ここで単にエンターキーを押してください。 」と書かれています。
さて、 通常MariaDBのインストール直後で何もしていない場合、 メッセージ通りパスワードが設定されていません。 但し、unix socket認証が効いているので、 セキュアスクリプトがsudoを使ってroot権限で実行されている場合、 パスワード無し、即ち、エンターキーのみで、 サーバーにアクセス出来ます。
一方で、 このノートに書いてある方法で パスワードを設定して「パスワード認証」にした場合、 プロンプトに対してさっき自分が設定した rootのパスワードを入力 してサーバーにアクセスすることになります。
どちらにしても、 エンターキーを押すと次の様な出力になります。
認証の強化
質問は以下の通りです。
Setting the root password or using the unix_socket ensures that nobody can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n]
まず、「 rootパスワード、または、unix socketを使った認証を設定する事で、 適正な認証なしにMariaDBのroot権限で誰もログインできないようにします。 」と述べ、次に 「 あなたのrootアカウントは既に保護されているので、 安心して"n"の選択肢を選べます。 」と言った上で、 「 unix soket の認証に切り替えますか? 」と聞いてプロンプトを出しています。
この項目は単純に認証方法を 「unix socket認証」や「パスワード認証」に 切り替えるため の項目ではありません。
実は、この質問自体が、先に話した 「パスワードが無く誰でもアクセス出来た」頃の名残なのです。 つまり、この質問の前提は、 サーバーが「パスワードが無くアクセス出来る状態」であり、 このままでは危険なので、 「unix socket認証」か 「パスワードの設定されたパスワード認証」を設定しましょう。 という項目なのです。
現在は、先の初期化作業が終った段階で、 unix socket認証の設定が行なわれています。 ですから、通常、 必ず 「root account protected」の状態になっているのです。
そして、unix socket認証ではなく、 自らパスワード認証に変更した場合、 自分でパスワードを設定しています。 ですから、この場合であってもやはり 「root account protected」の状態になっているのです。
ここで、あらためて、スクリプトで聞かれている質問は、 「unix socket認証に切り替えますか?」です。
既に何かのセキュリティ対策されているものにかえて 「unix socket認証」に切り替えますか?という意図ではないのです。 なので、既にセキュリティ対策はなされている場合、当然、 この質問には「 n 」と答えます。
入力を行なうと、次の出力がされます。
同じ文言ですが、最後の質問が、パスワードの設定になっています。
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n]
ここでの意図は、「パスワードの設定されていないパスワード認証にパスワードを設定しますか?」という質問なので、 既にセキュリティ対策はなされている場合、当然、 この質問にも「 n 」と答えます。
さて、このセキュリティスクリプトでトラブルにならないコツは、 通常、今のMariaDBでの初期化作業では、 「誰でもログインできるパスワード認証」を採用していないので、 上記二つの質問はいつでも「n」で答えることです。 そのうえで、認証方法の切り替えを行いたい場合は、 このスクリプトで切り替えるのではなく、 ちゃんと自分で発行したSQLステートメントで切り換えるようにしましょう。 ずっとトラブルが少なくなるはずです。
匿名ユーザーの削除
ここから先は、項目に書いてある通りであり、難しくありません。 適当にやっていきましょう。
ここでは、匿名ユーザーの削除について、述べられています。
By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment.
Remove anonymous users? [Y/n]
「 デフォルトでのMariaDBのインストールでは、 特定のアカウントをもっていなくてもMariaDBにアクセスできる 「匿名ユーザー」が設定されています。 これは、インストールがスムーズに進むようにする、 テスト目的で用意されているものであるので、 本番環境に移行する前には、 この匿名ユーザーは削除しなければなりません。」と述べた上で、 「匿名ユーザーを削除しますか?」とプロンプトを出しています。
この質問には「 y 」と答えます。
rootのリモート接続を禁止
ここでは、rootのリモート接続の禁止について述べています。
Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n]
ここでは、 「通常、rootユーザーは'localhost'からのみ接続を許されるべきです。 そうする事で、 悪意者によるネットワーク越しのrootパスワード探しを防ぐことができます。 」と述べた上で、 「リモートからのrootログインを禁止しますか?」というプロンプトを出しています。
この質問には「 y 」と答えます。
テストテーブルの削除
ここでは、テストテーブルの削除について述べられています。
By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment.
Remove test database and access to it? [Y/n]
ここでは、 「 デフォルトでのMariaDBのインストールでは、 'test'と名前の付けられた誰でもアクセス出来るデータベースが インストールされています。 このtestデータベースはテスト目的のためだけに設置されており、 本番環境へ移行する前に削除しなければなりません。 」と述べた上で、 「testデータベースとそこへのアクセスを削除しますか?」 というプロンプトを出しています。
この質問には「 y 」と答えます。
設定の反映
ここでは、ここまでの設定の反映について述べられています。
Reloading the privilege tables will ensure that all changes made so far will take effect immediately.
Reload privilege tables now? [Y/n]
ここでは、 「 権限設定テーブルを再読み込みすることで、 ここまでの変更を今すぐ反映させます。 」と述べた上で、 「ここで権限設定テーブルを再読み込みしますか?」 というプロンプトを出しています。
この質問には「 y 」と答えます。
最後は、以下の通りに出力されて、 設定は終了です。
All done! If you've completed all of the above steps, your MariaDB installation should now be secure.
Thanks for using MariaDB!
最後に
最近、私事でデータベースを触る機会があったのですが、 さっぱりわからなかったので、 「勉強してみよう!」というモチベーションが出来ました。 素人の僕でも「MySQL」という名前ぐらいは知っていたので、 ArchLinuxにインストールしようと思ったら、 「Arch Linux で選ばれているMySQLの実装は コミュニティによって開発されているフォークのMariaDBです」 などと書かれており「MySQLの実装って??」と頭をはてなで 埋めながら、「ようわからんけどMariaDBつこたろー」となったわけです。
ネットでは「MariaDB」そのものの初心者向けチュートリアルみたいのが あまりなくて、しょうがないので、 本家のドキュメントをみるようになったのですが めちゃめちゃ充実していて、めちゃめちゃわかりやすいです (実は、はじめはどこにあるのかわからなかったけど)。
データベース全くわからない時に、凄く役に立ったのが以下のページです。 SQLステートめんとのこと殆どしらなかったですが、 凄くわかりやすかったです。
No comments: