月: 2017年4月

ubuntu16.04にNGINXで作成したバーチャルホストに、WordPressをインストールする

近年のWEBサイトの構築は、Wordpressをインストールすることが多いと思いますので、そのあたりの手順もみておきましょう。

今回は、おさらいを兼ねて、今、conohaのVPSでサーバー環境が整っており、Ajentiが利用できるところで、バーチャルホストを立ち上げてWORDPRESSをインストールするところまでを順にやっていきます。

今回は、外部で正式なSSL証明書を取得した場合を想定して進めていきます。Let’s Encryptで前回のように無料のSSL証明書を取得する場合は、以前の記事を参考にやってみてください。

  1. conohaのVPSコントロールパネルから、Wordpressブログ用のサブドメインをDNSに登録する。
    • conohaのVPSにログインします。
    • DNSメニューを開き、ドメインリストから、example.com(任意のメインドメイン)を開きます。
    • 右上の鉛筆マークの編集アイコンをクリックし、一番左下の+アイコンをクリックして、新しいDNSレコードを追加します。
    • 通常のサブドメインのWEBサイトを立ち上げる予定ですので、レコードのタイプ=Aレコードで、名称は=letsgo、TTLには=3600、値にはVPSサーバーのIPアドレスを入力しましょう。
    • 入力できたら右下の保存ボタンをクリックして、レコードを保存します。
  2. Ajentiの管理パネルを開き、バーチャルホストのWEBサイトを作成する。
    • Ajentiにログインし、WEBサイトメニューから、新しいサイトを追加します。サイトの名称は、分かり安ければ良いです。
      letsgo.example.comとしておきましょうか。
    • 出来上がったWEBサイトの管理画面を開きます。
    • 一般設定タブで、メンテナンスモードのチェックを外します。
    • WEBSITE FILESのパスは、(実際は、自分がわかればどこでも良いのですが)通常は、/var/www/以下にドメインごとのディレクトリを作成して運用するのがわかりやすいと思いますので、/var/www/letsgo.example.com/html/と入力し、ディレクトリ作成ボタンをクリック、続けて、セットボタン、最後に、FIX FILE PERMISSIONSボタンをクリックしていきます。
      これは、順に、WEBサイトのファイルを格納するディレクトリを作成し、それを、このWEBサイトのルートディレクトリとして、Ajentiから自動でconfigファイルに書き込んでもらい、このサイトへブラウザ経由で外からアクセスできるようにアクセス権限を最適化していく、という流れになります。
    • 一番下の APPLY CHANGESボタンをクリックして、一旦変更を確定します。Ajentiの管理パネルでは、最後に設定を反映させるボタンを押し忘れないように気をつけましょう;
    • ドメインタブに移り、letsgo.example.comを新規追加します。
    • ポートタブで、SSL接続用の443ポートを追加します。新しい443ポートを追加し、SSLにチェックを入れてください。
    • (この後、正式なSSL証明書を外部でとった場合の設定を行いますので、SSLタブは一旦飛ばします。)
    • Contentタブから、PHP7.0-FastCGIを選び、+作成ボタンで追加します。
    • 高度な設定タブで、カスタム設定の項目に、下記を入力し保存します。Wordpress用の設定です。
       #Rewriteでパーマリンク設定可能にしておく
      if (!-e $request_filename) { rewrite ^ /index.php last;  }
  3. FTPユーザーを作成する。
    • 続けて、同じくWEBサイトメニューのFTPタブで、FTPユーザー名、パスワードを入力し、パスは、フォルダのアイコンをクリックして先に作成したWEBサイトのドキュメントルートディレクトリ(/var/www/letsgo.example.com/html/)にしておきます。
      ※ここは、そのままでも良いのですが、こうしておくと、FTPでアクセスした際に、このFTPユーザーは、常に初期設定としてWEBサイトのドキュメントルートにアクセスできるようになります。
    • FileZillaなどのFTPクライアントでFTP接続設定をし、接続確認しておきます。(ここまでで通常のFTP接続はできるはずです。後ほど、SSL通信にも対応します)
  4. WordPress用のMySQLデータベースを作成する。
    • 同じくWEBサイトメニューのMySQLタブから、新規データベースを1つ作成し、DBのユーザーとパスワードを追加しておきます。
  5. SSL証明書を取得する。
    • ここまでで一旦Ajentiの管理パネルを抜け、SSL証明書を取得しましょう。
      (SSLの証明書は、証明書の発行元や種類にもよりますが、WEBサイトが実在していないと証明書を発行してくれないものもありますので、先に、バーチャルホストのWEBサイトを作成し、ついでにFTPユーザーとDBの追加までを行いました。先に取得できるタイプの場合は、先に取得してもらって構いません。)
    • 自分の予算や目的にあったSSL証明書を購入します。1,000円程度の安価なものから20万円もするものまで、SSL証明書は様々な種類があります。その差は、認証期間が、WEBサイトの所有者についてどこまでの調査を行い補償対象としているかによります。
    • SSL証明書を購入すると、下記のような形式の長〜い文字が羅列された.crtまたは.pemファイルが送られてきます。あるいは、メールの本文内などに、そのまま記載されて送られてくる場合もあるかもしれません。
      -----BEGIN CERTIFICATE-----Mgtdghjy4524965TTvvkgia・・・・・・(以下略)-----END CERTIFICATE-----

      この、—–BEGIN CERTIFICATE—–から–END CERTIFICATE—–までの部分が、証明書の内容になります。

    • SSL証明書は、証明書と公開鍵がセットになって、お互いの認証が一致した場合に安全な通信を行うものです。一般的には、証明書ファイルとは1つで、共通鍵として、その2つを兼ねています。(※より安全に別の鍵認証を行うタイプもあり)
  6. 証明機関から取得した証明書ファイルを、letsgo_cert.pem(あるいはcert.crt)ファイルとletsgo_priv.pem(あるいはpriv.key)として保存し、サーバーにアップロードする。
    • Ajentiの管理パネルのファイルマネージャーメニューから、下記ディレクトリに、証明書と公開鍵ファイルを、アップロードします。(もしディレクトリが無かった場合は作成します)
      letsgo_cert.crt => /etc/ssl/certs/
      letsgo_priv.pem => /etc/ssl/private/
    • 同じファイルを、pure-ftpd.pemという名称にして、/etc/ssl/private/にアップロードします。これがSFTP用のSSL証明書になります。
      pure-ftpd.pem => /etc/ssl/private/
    • ファイルのパーミションを600に変更します。
    • Let’s Encryptで発行したSSL証明書を使用する場合、証明書ファイルとプライベートキーファイルが、別のファイルになっているため、Ajenti用のSSLファイルを作成した時と同様、fullchain.pemとprivkey.pemの2つを1ファイルに繋げて、pure-ftpd.pemを作成します。
    • すでにajenti.pemを作成している場合は、このファイルをコピーしてリネームしましょう。
  7. FTPSアクセス用にfirewallのpassiveポートを開ける。
    • TLS/SSLで暗号化したファイルをFTPで送受信する場合、ほとんどは、passiveモードでやりとりしますが、passiveモードでは、ポートへのアクセスがランダムになってしまうため、pure-FTPDのconfigファイルとfirewall双方でpassiveモードに使用する解放ポートを合わせ、さらにpure-FTPDのconfigで安全なTLS/SSLアクセスのみを許可する制限を設けましょう。
    • Ajentiの管理パネルで、ファイルマネージャーメニューより、/etc/pure-ftpd/conf/内に、新規ファイルを作成し、ファイル名を、「PassivePortRange」に変更します。
      クリックして、ファイルを開き、編集ボタンをクリック。
      メモ帳で開かれますので、

      #空いているポートで他と被らない範囲を100程度取りましょう。40000台など、おおよそなんでも良いです。
      20000 20100

      と入力し保存します。
      ファイルのパーミションは、644に変更します。

    • 同じ手順で、「TLS」というファイルを作成し、
      #2は、TLS/SSLアクセスのみを許可します。(プレーンなFTPも許可する場合は、1を、入力します。)
      2

      と入力し、保存。パーミションも同じく、644にします。

    • ターミナルで、firewallのポートを開けます。
      #20000から20100ポートを開けます。レンジでポートを開ける場合は、/tcpの指定が必要です。
      ufw allow 20000:20100/tcp
      ufw enable

      Ajentiのサービスメニューから、pure-FTPDを再起動します。

    • FTPS通信でFTPクライアントからアクセスできるか確認しましょう。
  8. FTPクライアントからサイトのドキュメントルートに アクセスして、Worpressをインストールする。
    • WordPressのWEBサイトより、日本語版のWordpressパッケージ(現在の最新パッケージは、wordpress-4.7.3-ja.zip)をダウンロードします。ページ右のダウンロードボタンをクリックして、ファイルを自分のPCにダウンロードしたら、解凍しておきます。
      https://ja.wordpress.org/
    • FTPクライアント(FileZillaなど)からWEBサイトのドキュメントルート(/var/www/letsgo.example.com/html/)へ、解凍された/wordpress/の中身を全てアップロードします。
  9. ブラウザで、https://letsgo.example.comへアクセスし、Wordpressをインストールする。
    • アクセスすると、Wordpressのインストール画面が表示されるので、先ほど作成した、MySQLのデータベース情報を入力します。データベース名=先ほど作成したDB名
      ユーザー名=先ほど作成したDBユーザー名
      パスワード=DBユーザーのパスワード名
      データベースのホスト名=localhost
      テーブル接頭辞:wp_

これにて完了です。

NGINXは、細かな設定ができ、プラグインモジュールを読み込むことで、独自の機能を追加していくことが可能です。
apacheの設定に慣れていると最初はとっつきにくいかもしれませんが、Ajentiを使用して設定する場合は、WEBサイトメニューのWEBサイトの管理画面から高度な設定で、カスタム設定フォームに設定内容を追加していくことで、configファイルが編集されていきます。

また、Ajnetiは、オープンソースのため、まだ日本語の情報が少なかったり、マニュアル的なものが充実していなかったりしますが、UIがわかりやすく、よく考えられたツールでもありますので、今後はもっと普及してくるのではないでしょうか。

一旦、これでバーチャルホストの設定は、完了としますが、また、セキュリティの強化に視点を移して、追加のパッケージインストールなどもやっていきたいと思います。

長らくお付き合いありがとうございました。

<やること一覧>





ubuntu16.04にNGINX+mySQLで作成したバーチャルホストに、PhpMyAdminをインストールする

phpMyAdminをインストールしていきます。

phpMyAdminは、先にconohaのDNSで追加しておいた、https://phpmyadmin.exmple.comでSSL接続する前提です。

それではやっていきましょう!

最初にAjentiの管理パネルの「パッケージ」メニューから、’php-mbstring’を検索し、’インストール/アップグレード用マーク’にチェックを入れ、左上の「適用」ボタンをクリックしてインストールします。(※同時に、php7.0-mbstringもインストールされます。)

ターミナルから同じことを行う場合は、

apt-get -y install php-mbstring

と打ち込みます。インストールできたかどうか、

php -m | egrep 'mbstring'

と打ち込んで確認しましょう。
‘mbstring’と返されてくればOKです。

次に、phpmyadmin.exmple.comのバーチャルホストで、phpが使用できるように、fastCGIを有効にします。

Ajentiにログインしたら、「WEBサイト」メニューより、phpmyadmin.exmple.comの管理画面に入り、「Content」タブの’PHP 7.0 Fast CGI’を作成追加します。
※手順は、前回までの記事を参考にしてください。Ajentiから設定した場合、configファイルへの細かな追記はAjentiが行なってくれるので、基本これだけで大丈夫です。

これで、phpが使えるようになりました。

次に、公式サイトよりphpMyAdminのパッケージをダウンロードして、phpmyadmin.exmple.comのドキュメントルートに解凍展開します。
同じ「WEBサイト」メニューの「一般設定」タブに下記のURLを打ち込み、

https://files.phpmyadmin.net/phpMyAdmin/4.7.0/phpMyAdmin-4.7.0-all-languages.zip

「DOWNLOAD AND UNPACK」ボタンをクリックします。
/var/www/phpmyadmin.example.com/html/の中に、’ phpMyAdmin-4.7.0-all-languages’というディレクトリが作成され、その中に、ファイル一式が入ります。

その中のファイルを全て、1階層上の/html/に移動させます。
Ajentiの「ファイルマネージャー」メニューで、
/var/www/phpmyadmin.example.com/html/phpMyAdmin-4.7.0-all-languages/に移動し、中のファイルを全て選択し、画面上の、「切り取り」(ハサミのマーク)ボタンをクリック。/html/ディレクトリに移動し、「貼り付け」(クリップボードのマーク)ボタンをクリックします。同じ動作で、/phpMyAdmin-4.7.0-all-languages/から/html/へ全てのファイルを「切り取り」「貼り付け」を繰り返して移動します。全て終わったら、クリップボードは’empty’にして、中身が空っぽになった/phpMyAdmin-4.7.0-all-languages/ディレクトリも削除します。

ターミナルから同じことを行う場合は、下記です。

#/var/www/phpmyadmin.example.com/html/ディレクトリへ移動する。
cd /var/www/phpmyadmin.example.com/html/

#phpMyAdminのパッケージをダウンロードする。
curl https://files.phpmyadmin.net/phpMyAdmin/4.7.0/phpMyAdmin-4.7.0-all-languages.tar.gz | tar zx -C /var/www/phpmyadmin.papalabs.xyz/html

#中身を1つ上の/html/直ディレクトリに移動する。 mv /var/www/phpmyadmin.papalabs.xyz/html/phpMyAdmin-4.7.0-all-languages/* /var/www/phpmyadmin.papalabs.xyz/html

#空になった、phpMyAdminのフォルダを削除する。 rm -rf phpMyAdmin-4.7.0-all-languages

以上です。

ブラウザから、https://phpmyadmin.example.comへアクセスすると、phpMyAdminの管理画面へのログインページが開きます。

今回、phpMyAdminは、サーバー全体にアクセスできるようにインストールされています(というかmySQLが1つのサーバーとしてVPSにインストールされており、phpMyAdminは、そのDBへアクセスしていく)ので、各WEBサイトでDBを作成すると、作成したDBのユーザー名とパスワードでそのDBにアクセスできます。

Ajentiの「WEBサイト」メニューから、DBを作成したいサイトの管理画面を開きます。
「MySQL」タブをクリックし、DB名を入力して、DBを作成し、ユーザー名とパスワードを入力して、DBユーザーを作成します。下の「APPLY CHANGES」ボタンをクリックして確定します。
ここで作成した、DBとユーザーは、「ソフトウエア」の[MySQL」メニューからも確認できます。

作成したユーザーとパスワードでphpMyAdminにログインすれば、phpMyAdmin経由でデータベースの管理が可能です。

作成したDBを削除したい場合、Ajentiの管理画面からは、2つの操作が必要です。
「WEBサイト」メニューの「MySQL」タブから、DBとユーザーを削除し、「APPLY CHANGES」ボタンをクリックして確定します。=>これで、ウェBサーバーのconfigファイルから該当する設定が削除されます。
さらに、「ソフトウエア」の[MySQL」メニューからもDBとユーザーを削除します。

※個人的には、本来、「WEBサイト」メニューからの操作だけで、追加や削除ができているべきだと思うのですが、試してみたところ、それだけではデータが残っているようなので、どちらの操作も行なっておく方が良いと思います。

<やること一覧>





Webmail(Rainloop)をインストールしてメールの送受信をテストする

それでは、RAINLOOPを入れていきま〜す。

こんな感じのオシャレなWEBMAILクライアントです。

https://www.rainloop.net/

オープンソースでも、roundcubeとかありますが、ちょいダサいので;

これからプログラムを入れることになるので、この辺で、一旦サーバー環境をアップデート。

apt-get -y update && apt-get -y upgrade

apt-getに-yオプションがつくと、インストールの途中で、続けていいのね?と質問があったら全部yesでヨロシクやっちゃって!ということです。気になる方は、-yはつけずに、確認しながら進めましょう。

終わったら、一応サーバーを再起動。

それでは、やっていきます!
ターミナルで下記を打ち込んで、必要なphpのモジュール等を追加しておいてください。

sudo apt-get install python-software-properties
apt install software-properties-common
sudo apt install php7.0-curl php7.0-xml
sudo apt-get install unzip
php -m | egrep 'odbc|mcrypt|mysqli|iconv|imap|openssl|pdo|SPL'

RAINLOOPの動作に必要なphp関係のモジュールも確認したところ、imap,mcrypt,odbcが足りてなかったので追加します。

apt-get -y install php-imap
apt-get -y install php-mcrypt
apt-get -y install php-odbc

さて、では、ついにRAINLOOPのインストールと設定をやっていきます。
ターミナルからやっていくほうが楽だったりもするんですが、今回は、せっかくなのでAjentiの画面からインストールしてみましょう。

NGINXは、基本の仕様として、静的コンテンツのみに対応していますので、WEBサイトでphpを利用できるようにするためには、先にインストールしておいたfastCGIのモジュールをphp-7.0 FPM経由で動作するように、そのサイトのconfigファイルに組み込んでやる必要があります。(※今回はインストール時からphp7.0で進めています)

環境を準備してRAINLOOPをインストールします。

  1. 最初に、サーバーのメールの送受信をSSL対応にしておきます。
    Ajentiの管理パネルで「メール」メニューを開きます。「高度な設定」タブを開き、「TLS」の有効にチェックを入れ、「新しい証明書の生成」ボタンをクリック。すると、その上の証明書とプライベートキーのフォームに、exim4の.crtと.keyがそれぞれセットされます。一番下の「APPLY CHANGES」ボタンをクリックして、変更を保存しておきましょう。
  2. メールアドレスを1つも作成していない場合は、1つ作成しておきます。「一般設定」タブから作成します。(ここまでで、先にwebadmin@example.comのメールアドレスを作成していたと思いますので、そのアドレスで、後ほどメールテストを行います。)
  3. 「WEBサイト」メニューから、webmail.example.comの管理画面を開きます。
  4. 「content」タブで、”PHP 7.0 fastCGI”を選んで「+作成」ボタンをクリック。下の「APPLY CHANGES」ボタンをクリックして適用します。


  5. PHPが動作できるようになったかを確認します。
    「ファイルマネージャー」メニューから、/var/www/webmail.example.com/html/へ移動し、「新しいファイル」を作成します。”new file”という名前のテキストファイルができますので、それをクリックして開き、下記の内容に変更していきます。

    • 名前: phpinfo.php
    • アクセス:644(所有者のみReadとWriteにチェック、グループとその他は、Readのみチェック)
    • 所有者:www-data(rootあるいはログインしたユーザー名になっていると思いますので、WEBサイトの実行ユーザーであるwww-dataに変更します)


    • 真ん中あたりの「編集」ボタンをクリックして、メモ帳でファイルを開き、下記の内容を打ち込み、保存します。
      <?php
      phpinfo();
      ?>


    • ブラウザで、https://webmail.example.com/phpinfo.phpへアクセスし、phpinfoの画面が表示されていればOKです。


  6. 次に「WEBサイト」メニューに戻り、管理画面の「一般設定」タブの、「AUTOMATIC DOWNLOADER」の項目に、下記を入力し、「 DOWNLOAD AND UNPACK」ボタンをクリックします。
    ファイルがダダーッとwebmailのルートディレクトリにダウンロード&展開されます。

    https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip

    完了したら、念のため、その上の「 FIX FILE PERMISSIONS」ボタンをクリックして、ファイルとディレクトリのパーミションを修正しておきましょう。

  7. お約束の確認です。(笑)
    「ファイルマネージャー」メニューから、再び、/var/www/webmail.example.com/html/の中を覗くと、こんな感じになってますかね。

  8. 問題なければ、ブラウザで、
    https://webmail.example.com/?admin
    へアクセスしてみましょう。
    RAINLOOPでは、URLの後ろに/?adminと打ち込んでアクセスすると、管理者メニューのログイン画面が表示されます。/?adminなしの場合は、ユーザーのWEBMAILのクライアント画面へのログインウインドウが表示されます。
  9. 初期のログインアカウントは、下記です。ログインできたら、インストールは一旦完了です。
    アカウント:admin
    パスワード:12345

RAINLOOPでEメールの送受信ができるように管理者として初期設定をする

  1. 管理者ログインします。まずは、セキュリティのために、パスワードを変更し、言語を日本語にします。
    「Security」メニューからパスワードを変更。


    「General」メニューから言語を変更。



    日本語になりました!


  2. 「ドメイン」メニューを開きます。
    「+ドメインを作成」ボタンをクリック。


  3. メールサーバーの設定を入力していきます。
    こんな感じで、(example.comは、自分のドメイン名に置き換えてくださいよ!)設定ができたら、左下の「接続テスト」ボタンをクリックします。ちゃんと設定ができたら、IMAPとSMTPのタイトルがグリーンに変わります。
    何かがおかしい場合は、赤に変わりエラーメッセージが出てきます。ここまでで必要なものは用意できているはずですので、赤くなったら場合は、順に設定を見直していってください。
    SSL環境のみがおかしい場合は、この画面のセキュリティの項目を”なし”にすると、タイトルが緑になります。まずは、そこから確認して問題の切り分けを行いましょう。(これで緑になる場合は、9割がた、SSLの設定かファイアウォールのポートが開いてないかの問題です)これでも赤い場合は色々問題の可能性がありますが・・・)


  4. 設定ができたら、右下の「更新」ボタンをクリックして設定を保存しましょう。
  5. 色々オプションの設定はあるのですが、とりあえずこれでメールを安全なTSLで暗号化して送受信する準備ができました。
  6. 実際にWEBMAIL経由で送受信テストをしてみます。
    ブラウザで、
    https://webmail.example.com/
    へアクセスし、先ほど作成したEメールアドレスとメールのパスワードでログインします。メールのクライアントが開きますので、新規メールを作成し、どこか自分が受信できるメールアドレス宛にテストメールを送ってみましょう。
    送られたメールを相手のメールアドレスで受信したら、今度は返信で、WEBMAIL画面で、メールの受信もできるかどうか確認します。
    送信も受信もできたらメールの設定は全て完了です。
    オススメは、Gmailとのやりとりです。というのは、Gmailはスパムフィルターやメールの送受信の規制が厳しいので、Gmailにきちんとメールが届いているようなら、CONOHAのDNSで一番最初に設定したSPFレコードなどもきちんと通用していると考えられるからです。

お疲れ様でした。ここまでで、一通りのサーバー設定は完了しました!

次は、やや応用的な追加編として、MySQLのデータベースをphpMyAdminを入れて管理できるようにしようと思います。

<やること一覧>





バーチャルサイトとAjentiコントロールパネルをLet’s EncryptのSSL証明書に対応させ、ドメイン名でアクセスする

SSL証明書の各サイトへの適用は、Ajentiの管理パネルで作業します。

再び、左の「WEBサイト」メニューから、ドメインの管理画面に入ります。
(どのドメインからスタートしても構いません。)

「SSL]」タブを開き、ドキュメントの形状のアイコンをクリック。

  • SSL証明書のパス:/etc/letsencrypt/example.com/fullchain.pem
  • SSL key path:/etc/letsencrypt/example.com/privkey.pem

をそれぞれ選び、一番下の「APPLY CHANGES」ボタンをクリックして保存します。

証明書の作成の時に述べたように、Let’s Encryptの証明書発行で、メインドメイン以下のサブドメイン全てを1つの証明書として発行した場合は、この後全てのサブドメインに、同じように証明書の.pemファイルを設定します。

サブドメインごとに個別の証明書を発行した場合は、それぞれのSSL証明書を選択して設定しましょう。

注意)Let’s Encryptでは、同じドメイン名でサブドメインも含めて7日間の間に5組しか発行できない、という決まりがあります。やり直し、やり直し、としているうちに規定数を超えてしまってエラーになり、証明書が発行できなくなる場合があります。
その場合は、残念ですが、7日間開けて再びチャレンジしてみてください。

はい、これで、SSL証明書の設置も終わりました。
念のため、NGINXを再起動し、ブラウザから、それぞれのサブドメインにhttps://経由でアクセスして、ちゃんと保護された通信、となっているか確認しておいてください。

最後に、ここでみんなが疑問に思う(思わないか?w)、Ajentiの管理パネルそのものへSSL証明書を適用するには、どうしたらいいのか?というところの作業準備をしておきたいと思います。
SSLの暗号化自体は、Ajentiをインストールした時点で掛かっていますので、まあ、別に保護されない、とか言われても全然平気wという方は、ここは読み飛ばしてください。

Ajenti管理パネルは、証明書ファイルとプライベートキーファイルの2つを1つのファイルにまとめて登録しています。
ですので、fullchain.pemとprivkey.pemの2つのファイルを1枚になるようにつなぎ合わせて別にAjenti用の証明書ファイルを作成します。

#catコマンドで、fullchain.pemとprivkey.pemをajenti.pemというなの1つのファイルに繋ぎます。

cat /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem >/etc/letsencrypt/live/example.com/ajenti.pem

Ajentiの管理パネルの「設定」メニューから「一般設定」タブを選択し、SSLの項目の「証明書へのパス」を、今作成したajenti.pemに変更します。
/etc/letsencrypt/live/example.com/ajenti.pem

一番下の「保存」ボタンで、変更を保存してから、Ajentiを再起動します。

さて、ここで、今まで、ブラウザからは、https://000.000.000.000:8000とアクセスしていたところをhttps://example.com:8000にアクセスURLを変更してみます。
無事、保護された通信という緑のバッジでアクセスすることができるようになりました。
※SSL証明書は、ドメイン名に対して発行されるので、ドメイン名でアクセスした場合にのみ有効になります。

※ご理解いただいてるとは思うのですが・・・example.comは、仮の名称ですので、全て、ご自身のメインドメイン名に置き換えてくださいね(^^;
そのままコードをコピペでは動きませんよ;;

ということで、バーチャルホストのWEBサーバー、完了いたしました。

最後に、メールを作成しておきましょう!

Ajenti管理パネルの左メニューから、「メール」メニューを開きます。
初めて起動する場合は、有効にするか?と聞かれるので、ボタンをクリックして有効にします。

「一般設定:タブの私いメールボックスの項目の中の、「アドレス」へ、利用したいメールアドレスを入力します。後ろの@マーク以下は、メインドメインを使用しますので、[@example.com]を選んでください。カスタムドメインの項目には何も入れません。「+メールボックス」ボタンをクリックしたら、追加できました。一番下の、「APPLY CHANGES」ボタンのクリックも忘れずに。

とりあえず、あとでWEBMAILのソフトウエアをインストールしようと思っているので、そのテストで使用するために、webadmin@example.comを1つ作っておきましたw

続いて「高度な設定」タブで、TLSの有効にチェックが入っているか確認しておきましょう。問題なければ、これで、メールも暗号化された安全な状態で送受信ができるようになります。

WEBMAILには、いくつか有名パッケージがあるので、自分の好むものであれば、どれを使用しても良いと思います。今回は、おしゃれなWEBMAILのソフトウエア、RAINLOOPを入れてみましょう!
次は、RAINLOOPをインストールしてメールの送受信テストをやっていきます。

<やること一覧>





ubuntu16.04にNGINX+Ajentiで作成したバーチャルホストに、Let’s Encryptで無料SSLを発行する

さて、ここまでで、CONOHAのVPSにubuntu16.04でLinuxサーバーを立てて、DNSで取得した独自ドメインにwebmail用のサブドメインやメールサーバー用のサブドメイン〜メールサーバー用のレコードを作成し、ubuntuサーバーに、WEBサーバーやらデータベースサーバーやらFTPサーバーやらメールサーバーやらをインストールして、AjentiでWEBサーバーにバーチャルホストを作成した、というところまでやってきました。

あ〜長かった!!

とため息をつかれている方も多いかもしれません。

そう、サーバー構築は長くて辛い道のりなんです。笑。

ここからは、作成したWEBサイトに SSL証明書をインストールして暗号化通信を有効にしていきます。
今回は、Let’s Encryptを使って「無料」のSSL証明書を導入します。

一昔前、独自SSL証明書の導入というととにかく費用がかかってしょうがなかったものでした。
共有のレンタルサーバーなんかには独自ドメインのSSLなんかは設定できなかったので、高額な固定IPのサーバーを借りて、みたいなこともありました。
しかし、検索エンジンのGoogleが、インターネット経由の通信に、暗号をかけていないような安全じゃないサイトは、もうGoogleの検索で、上位に上げてあげないよ!的な宣告をしたもんで、WEBの中の人は、ただいま大変ざわついております。笑。笑。

ちょと話は逸れますが、SSLの証明には、いくつかの有名サービスがあり、価格帯もバラバラです。
SSLの暗号化自体は、技術の話なので、別にいつでも無料でできるのですが、要は、正しい技術を使って、ちゃんと出自の確認された運営者がこのサイトを安全に暗号化していますよ、と公的な機関に保証してもらうのがSSL証明書です。
価格がなぜ大きく違うかというと、証明機関がどこまでを責任持って確認しているか、ということと、そのサイトからクレジットカードなんかの情報が漏れてしまったような場合などに、その証明機関がいくらまで保証してくれるか、という補償範囲が違うのです。
例えば、大御所のベリサインなんかは SSL証明書の取得が大変高価です。その代わり、WEBサイトの運営者がちゃんと実在していて、連絡も取れるかとか、細かく調べて、ちゃんと安心していいしっかりした会社がこのサイトを運営しています!もしそれでも損害が発生するようなことがあれば何千万円まで補償します!というところまでの責任を負ってくれるので高額なのです。
その一方で、証明の範囲が単にちゃんとSSL技術の暗号化かかってるよ!ということだけで、もしもの保証がない証明書などは、取得費用も安価です。

Let’s Encryptは、証明の範囲を最小限、SSLがちゃんとかかっている、WEBサイトがちゃんと実在している、ということに絞って証明書を発行する手順を自動化する代わりに、無料で誰でもSSL証明書を取得できる、というオンラインサービスです。

「どっかの誰かさんが、なんかWEBサイト運営してるけど、まあSSLちゃんとかかってるよ!」程度の証明にしかならないので、ビジネスでWEBサイトを運営されるような場合は、ちゃんとお金を払って、最低限、会社名や証明書の発行者の身元がしっかりしているということを証明してくれる信頼性の高いSSL証明書を取得する方がいいでしょう。ただ、個人のブログやちょっとした趣味のサイトくらいなら、そこに費用を使うのも勿体無い、とか、とりあえず自分でVPSでやってみたいから、そこに費用をかけたくない、というニーズもあると思います。

Let’s Encryptは無料です。しかし無料なりの制限があって、現在のところ、証明できる期間は、最長で3ヶ月です。通常機関のSSL証明書が1年単位ですので、大変短いです。
ただし、Let’s Encryptには、延長の仕組みもあり、サーバーのCRONなどを使って、更新時期が近づいたら、自動で更新プロセスを走らせることもできますので、そこはそれほど困ることはないと思います。

ということで、前置き長かったですが、Let’s Encryptを入れていきます!

まずは、事前準備!

Let’s Encryptは、①実際に運営されていて、②Let’s EncryptのプログラムがアクセスできるWEBサイトにしか証明書を発行することができません。
ですので、先に作成したバーチャルホストのそれぞれのドキュメントルートに、最低限、index.htmlを置きましょう。そして、ディレクトリとファイルのアクセス権限をLet’s Encryptのプログラムがアクセスできるように最適化しておきます。

それでは、デフォルトサーバーを例に見ていきます。
下記の操作は、先にバーチャルホストを作成した際にできているはずですが、念のため確認をしつつ、まだ準備ができていなかった場合は、下記の手順で、Let’s EncryptによるSSL証明書発行のための準備を整えます。

  1. Ajentiの管理パネルの「ファイルマネージャー」メニューから、先ほど作成したWEBサイトのルートディレクトリへ移動します。
    /var/www/html/
  2. この中に、index.htmlを作成し、ファイルパーミションを、644に、所有者をwww-dataに変更します。
  3. /html/のファイルパーミションは、755、同じく所有者は、www-dataです。
  4. どちらも、「WEBサイト」メニューでバーチャルホストを作成した際に、「FIX FILE  PERMISSION」ボタンをクリックして、ディレクトリ内のファイルのパーミションを一括して変更することができますので、先に、パーミションを変更していた場合は、ここでは念のため確認をしておいてください。※パーミションや所有者が正しく設定できていないと、SSL証明書が発行できずエラーとなりますので注意しましょう。
  5. 同じように他のサブドメインについても確認していきます。
  6. 「WEBサイト」メニューでは、それぞれのバーチャルホストの管理ページで、今一度下記が正しく設定できているか確認しておいてください。
    • 「一般設定」タブで、サイトは有効にチェックが入っており、メンテナンスモードのチェックは外れていますか?WEBサイトファイルへのパスは正しいですか?
    • 「ドメイン」タブで、ドメインは正しく設定されていますか?デフォルトサーバーには、メインドメインと、www./mail.の3つのドメインが登録されています。そのほかのバーチャルホストは、サブドメイン1つだけが登録されています。
    • 「ポート」タブでは、デフォルトの80番ポートの他に、443ポートが作成されており、443ポートのSSLにチェックが入っていますか?
  7. CONOHAコントロールパネルののDNSでサブドメインは、正確に設定できている前提ですので、ここでは再確認はしませんが、この後のインストールがうまくいかない場合は、設定を確認して見てください。

Let’s EncryptのNGINX用プラグインをインストール!

Let’s Encryptは、現在最新版のクライアントの名称が、「certbot」に変更になっています。このクライアントソフトによって、簡単に証明書を作成することができます。

certbotプラグインには、いくつかオプションの種類がありますが、今回は、最新版で導入されたNGINXオプションを使って簡単にやっていきたいと思います。
ターミナルからコマンドで操作します。

#GITのリポジトリから、certbotプラグインを /opt/cartbot/ ディレクトリにコピーしてきます。
sudo git clone https://github.com/certbot/certbot /opt/certbot

#念のため、インストールディレクトリに移動して、確認します。
cd /opt/certbot
ls -la

こんな感じで、色々入っていると思いますw

NGINXのプラグインモードで、インストールしていきます。

sudo /opt/certbot/certbot-auto --nginx
Do you want to continue? [Y/n] y

必要なモジュール類が、だだだーっとインストールされます。
無事、インストールが完了したら、証明書のリニューアル時やLet’s Encryptからのセキュリティ情報の送信に使われるEメールアドレスを聞かれますので、有効なメールアドレスを入れましょう。

Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):webadmin@example.com

続けて、利用規約に同意するかどうかを聞かれますので、Aを入力して同意します。

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel:A

調査メールなどを送ってもいいか?と聞かれます。どっちでもお好きなように、YかNを入力します。

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y

次に、先ほどからAjentiで設定したサブドメインを含めたドメイン全体のリストがずらっと並びます。
リストのうち、どれをHTTPS化(=SSL化)したいですか?と聞かれますので、SSL対応するドメインの番号を、コンマ区切りか、/区切りか、あるいはスペース区切りで入力します。
今回、このリストにあるものは全て、SSLにするつもりですので、全てを選んでコンマでつないでいきます。
※ここで、選んだバーチャルホストは、1つのSSL証明書セットに、全てがまとめられて1組の証明書が発行されます。証明書をそれぞれ別に発行したい場合は、1つずつ選んで、個別に発行することもできます。その際も、メインのドメインと、mail,wwwは、同じ1つのデフォルトサイトにしますので、セットにしておきましょう!

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: example.com
2: mail.example.com
3: phpmyadmin.example.com
4: webmail.example.com
5: www.example.com
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):1,2,3,4,5

多少メッセージは違うかもしれませんが、およそ下記のような感じで、証明書発行したよー!と言われます。

Performing the following challenges:
tls-sni-01 challenge for example.com
tls-sni-01 challenge for mail.example.com
tls-sni-01 challenge for phpmyadmin.example.com
tls-sni-01 challenge for webmail.example.com
tls-sni-01 challenge for www.example.com
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem
Cannot find a cert or key directive in /etc/nginx/conf.d/examplecom.conf for set(['www.example.com', 'mail.example.com', 'example.com']). VirtualHost was not modified.
IMPORTANT NOTES:
- Unable to install the certificate
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2017-07-06. To obtain a new or tweaked version of this
certificate in the future, simply run certbot-auto again with the
"certonly" option. To non-interactively renew *all* of your
certificates, run "certbot-auto renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.

発行された証明書は、/etc/letsencrypt/live/example.com/ ディレクトリの中に格納されていますので、ちゃんと入っているか確認してみましょう。
”Unable to install the certificate”とか書かれていますが、この後インストールしていきますので、気にしません;
上記の手順で、サブドメインごとに別々に証明書を発行した場合は、/etc/letsencrypt/live/の中に、それぞれのドメイン名ごとにディレクトリができていて、その中にファイルが入っていると思います。

cd /etc/letsencrypt/live/example.com
ls -la
  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

この4つが入っているか、それぞれ確認してみてください。
この中で、fullchain.pemprivkey.pemを使います。
fullchain.pemは、証明書情報が一式だーっと入っているキーファイルです。privkey.pemはそれとペアになるプライベートキーになります。

見やすいので、Ajentiの管理パネルからファイルマネージャーで確認しても構いません。

長くなったので、一旦ここまで!
次は、このファイルを実際のバーチャルドメインに設定します。
ここまでできたら、SSL化はほぼできたと思って安心して大丈夫です。(*^^*)

参考1:https://letsencrypt.jp/docs/using.html

参考2:https://arashmilani.com/post?id=95

注意)Let’s Encryptでは、同じドメイン名でサブドメインも含めて7日間の間に5組しか発行できない、という決まりがあります。やり直し、やり直し、としているうちに規定数を超えてしまってエラーになり、証明書が発行できなくなる場合があります。
その場合は、残念ですが、7日間開けて再びチャレンジしてみてください。

<やること一覧>