今日から本気出すブログ

やりたいことだけやって生きていくためにコツコツと

Ubuntu 14.04+Nginxにたった3ステップでセキュアなphpmyadminを設定する方法

国内のブログではリバースプロキシ設定の紹介と共にapt-getでphpmyadminをインストールし、phpmyadmin.example.comといったURLに設定する方法が紹介されています。 紹介されているやり方そのままだと誰でもphpmyadminのログインページにアクセスできてしまい、攻撃から守るのはデフォルトのパスワード認証のみとなっています。 それはちょっと頼りないですよね。 もうちょっと凝ったやり方を簡単にできる方法が海外のサイトで紹介されていたので超意訳で紹介します。

元記事:

How To Install and Secure phpMyAdmin with Nginx on an Ubuntu 14.04 Server | DigitalOcean

前提としてUbuntu14.04+Nginx+MySQLPHPのLEMP環境がインストールされている状態とします。

ステップ1 phpMyadminのインストール

$ sudo apt-get update
$ sudo apt-get install phpmyadmin

インストールする際にphpMyadminが使用するデータベースを作成していいか尋ねられますので、[YES]を選択。 rootパスワードを求められた後、pmaユーザーが使用するパスワードを求められるので、適当に打ち込む。 インストールが完了されるので、nginxの公開ルートディレクトリにシンボリックリンクを貼ります。

$ sudo ln -s /usr/share/phpmyadmin /var/www/yourdomain.com/public_html

続いてPHP5モジュールのmcryptを有効化し、PHP-FPMをリスタートします。

$ sudo php5enmod mcrypt
$ sudo service php5-fpm restart

これをしておかないとmcryptのエラーが出ます。 この段階でhttp://yourdomain.com/phpmyadminにアクセスし、phpmyadminにrootユーザーでログインしてみます。 WordPressを使うならこの段階でWP用のユーザーとテーブルを作成しておくといいでしょう。後でもいいですが。

phpmyadminをセキュアにする

phpmyadminMySQLを管理する非常に優れた手段なため、多くのサーバー管理者が使用しています。 そのため、phpmyadminのURLに簡単にアクセスでき、パスワード認証があるだけでは攻撃者の格好の的となります。 URLを秘匿しBASIC認証を設けることで、攻撃にさらされるリスクを減らした方が賢明です。

ステップ2 URLを隠す

phpmyadminという文字列を使うことは避けましょう。シンボリックリンクによって簡単に設定できます。

$ cd /var/www/yourdomain.com/public_html
$ ls -l
lrwxrwxrwx 1 root root  21 Aug  6 10:50 phpmyadmin -> /usr/share/phpmyadmin

このphpmyadminディレクトリをシンボリックリンクにすることで、ボットからの攻撃を避けます。

$ sudo mv phpmyadmin nothingtosee
$ ls -l
lrwxrwxrwx 1 root root  21 Aug  6 10:50 nothingtosee -> /usr/share/phpmyadmin

これでhttp://yourdomain.com/phpmyadminにアクセスすると404エラーが出ます。 http://yourdomain.com/notingtoseeにアクセスするとphpmyadminの管理画面が出るはずです。

ステップ3 BASIC認証を設ける

http://www.yourdomain.com/notihingtoseeのページにBASIC認証を設置します。 まずはSSLパスワードを発行します。

$ openssl passwd
パスフレーズを入力

O5az.RSPzd.HEとかこんな感じのパスワードができます。 これをコピー

$ sudo vim /etc/nginx/pma-pass
yourusername:O5az.RSPzd.HE

保存して終了。 次はNginxのサーバー設定に追記します。

server {
    ===

    location / {
        try_files $uri $uri/ =404;
    }

    location /nothingtosee {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/pma_pass;
    }

    ===
}

これでhttp://yourdomain.com/notingtoseeにアクセスするとBASIC認証が出てきます。 設定したユーザー名とパスフレーズを打ち込めばログイン画面に進めます。

以上でURLの秘匿に加えてBASIC認証を備えたphpMyadminとなりました。 うまくいけばこのままエラーも何もなく使えるはずです。