Twitter Facebook github

Category “Tech”

WordPressをSSLに対応させる手順

非SSL環境で動かしていたWordPressをSSL化するときの手順です。ちょうどLet’s Encryptを使って認証された証明書が手に入ったので、これを使ってWordPress全体をSSL化してみました。手順を備忘録として残しておきます。

 

wp-config.phpの修正

まずは基本ですね。WP_HOMEとWP_SITEURLを書き換えます。また、FORCE_SSL_ADMINを設定することで管理画面はHTTPSを強制できます。

 

データベースの修正

WordPressのデータベースに接続し、(WPプレフィックス)_options テーブルを開きます。

option_nameカラムがsiteurlになっているレコードを探し、値のhttp://をhttps://に書き換えます。続いてoption_nameカラムがhomeになっているレコードを探し、同じように書き換えます。

 

HTTP接続をHTTPSにリダイレクト

上の2ステップでWordPressのシステム的な部分の移行が終わりました。HTTPSで適当なページを開いて正しくリンクが遷移できるか、リンク遷移後もページもHTTPSになっているか、画像や画像のサムネイルが正しく読み込めているか、管理画面へHTTPSのままログインできるか、などをチェックします。

問題がないようであれば、httpでの接続はすべてhttpsにリダイレクトするようにします。(任意です。httpsにすると若干サーバーの負荷も増えますので、ハイトラフィックなブログを運営されている方はhttpの方が有利という考え方もできます。ブログであれば、http/httpsどちらでもアクセス出来るようにしておき、通信を暗号化するかどうか判断をユーザーに委ねるのも良い方法です。)

今回nginxを使っているので、nginx.confを書き換えることにしましょう。リダイレクトにはrewiteを使っているブログも多く見られますが、nginx.orgではreturnが使われていたのでreturnを使うことにします。計った訳ではないですが、シンプルな分処理も早そうです。

保存したらnginxを再起動します。

再起動が終わったら、適当なURLを叩いてみてHTTPSに正しくリダイレクトされることを確認します。

 

安全でないリソースを排除する(Mixed Content問題)

これで9割方終わっていて、SSLにするという目的自体は達成なのですが、次のように「このページに安全でない他のリソースが含まれています。」と表示され、URLのアイコンや文字色も緑色にならないことがあります。

これは、アクセスしているページはSSL接続にも関わらず、そのページ内から非SSLの静的ファイル等をロードしているためです。例えば、サードパーティのCSSやJavaScript、フォントファイル、画像ファイル等を絶対パスでhttp:// に続く形でロードしていることに起因するものが多いです。

これらを見つけて、httpsが提供されているコンテンツはhttpsでロードするように、提供されていない場合はライセンスを確認して自分のサーバーでホスティングできるか確認して移行するなどの対策を行います。量が多いと結構大変ですね…。

どのファイルがMixed Contentなのかは、Google Chromeのデベロッパーツールにあるコンソールが助けになります。

例えば上の画像のように、過去にアップロードした画像ファイルに起因するものであれば、次の項を読んでみてください。テーマやプラグインに起因するものは、手動で直さなければいけません。

ちなみに、Protocol Relative URLという仕様により、CSSやJavaScriptをロードする際のhttpやhttpsを省いて記述すると、読み込み元のスキーム(SSLか非SSLか)に従って読み込むスキームも変更されポータビリティが高まります。(例えば //example.com/main.js をSSLのページからロードさせた場合はhttps://〜と解釈され、非SSLのページからロードさせた場合はhttp://〜と解釈されます。)

 

アップロード画像に起因するMixed Contents問題を直す

この場合、基本的には記事を編集して、画像へのURLを書き直すことで修正できますが、過去の記事・画像が多いと直すのに骨が折れます。

一気に前述したProtocol RelativeなURLに画像リンクを書き換えるSQL文を使うと一瞬で解消できるでしょう。テストしていますが、万一のために必ず実行前にテーブルのバックアップを取ってください。

 

無事にMixed ContentsによるSSLの警告も消えました。

 

雑感

サクっとこなすつもりが意外と色々気にすることがあって大変でした。一度やっておくとノウハウ的に使い回せるので、知識として蓄えておきたいですね。

次はHTTP/2, SPDY対応や、証明書の透明性確保あたりを触れたらいいなと思っています。

Let’s Encryptをnginxで使ってみる

Let’s Encryptとは

https://letsencrypt.org/

無料で認証されたSSL証明書を発行できるサービスです。今月パブリックベータになり、誰でも試すことができるようになりました。Web Tech界隈では今アツい技術の一つです。

今回使うnginxは1.8系のため、HTTP/2、SPDYは使えません。メインラインの1.9系を使うことで対応できるので、興味がある方は別に調べてみてください。

ビジネスなどエンタープライズで使用する際はこのSSLではなく信頼された発行元から

 

Let’s Encryptのインストール

Let’s Encryptを使うためには、nginxやapacheなどのウェブサーバーのほかGitが必要です。OpenSSLなどはインストールされていない場合、Let’s Encryptが自動的にインストールしてくれます。Gitがインストールされていなければ、事前にyumで入れておきます。

まず、Let’s Encryptのクライアント本体を適当な場所にgitでクローンしておきましょう。

gitが必要な箇所はここだけです。結構頻繁に更新されているようなので、都度ローカルリポジトリも追従させてあげるのが良いでしょう。

クローンしたら、内包されているメインのコマンド letencrypt-auto を叩いてみましょう。このコマンドを実行した場合、letsencryptが使用する必要なライブラリがインストールされていなければ自動でインストールしようとします。rootで実行していない場合はパスワードを入力してください。

今回、AWS EC2で実行している関係で上のような警告が表示されました。EC2上で利用するのであれば一般的なCentOS等と使い方は何ら変わりませんので、言われるままに継続します。

一度debugをつけて実行した後はdebugなしで利用できるようです。

 

証明書の取得

発行にはドメインの所有権認証が必要です。letsencrypt-autoでは、次の方法でこの認証を簡単なコマンドだけで実行できます。

現時点でlets encryptでは apache, standalone, webroot の3種類の証明書取得方法をサポートしています。apacheを使っている場合はapacheを使うと自動でインストールしてくれます。standaloneはletsencrypt自身がウェブサーバーを起動して所有権の認証を行います。webrootは既にウェブサーバーが起動している場合、ドキュメントルートを指定して既存のサーバーを介して認証を行います。 詳しい違いについては ./letsencrypt –help で確認してください。

今回はnginxですし、既に起動しているサーバーに対してインストールしょうとしているので、3番目のwebrootオプションを使って認証を行います。

上記を実行するとメールアドレスの入力と利用規約への同意が求められますので、指示通り進みます。認証情報を紛失した際などは、ここで登録したメールアドレスを使ってリカバリするので間違えないように気をつけてください。

次のようなメッセージが出力されれば、正しく証明書を取得することができました。

 

上の例では、/etc/letsencrypt/live/<ドメイン>/ の中に証明書類が保存されています。

 

DH鍵交換のパラメーター生成

証明書をウェブサーバーにインストールする前に、セキュリティ向上のために実行することをおすすめします。

opensslコマンドで生成します。AWSのsmallインスタンスで3分程度かかりました。環境によってはもっと時間がかかるかもしれません。

 

証明書をnginxに設定

最後に取得したSSL証明書をnginxから参照して利用できるようにします。

上の通り変更して、nginxを再起動します。設定ファイルに問題がなければSSLで通信できるようになっていますので、テストしてみましょう。

ssl-test

ということで、Let’s Encryptで簡単にSSL対応できました!

 

SSLのセキュリティテスト

SSLサーバーのセキュリティテストは Qualys SSL Report を使って簡単に実施できます。

ssl-check

最低限の設定を施しただけだとCやDランクになるかと思います。例えばPOODLEや弱いDHパラメーター、ダウングレード攻撃などの脆弱性を防いでいない場合は評価が下がります。

前述のnginx.confの設定を施せばAまたはA+の評価になると思います。ときどきこのサイトでSSLの安全性をチェックして、常にこの評価をキープしていきましょう。

 

雑感

以前から無料で発行できるSSL証明書もありましたが、手続きが煩雑だったりと色々厄介なことが多かったです。Let’s Encryptもまだ改善の余地はあり、速い速度で開発も進んでいますので、まだまだ今後に期待できるでしょう。Let’s EncryptでSSL対応が当たり前な時代になれば良いですね。

 

Vagrant+Chef-Zero入門

今更感があってごめんなさい。確かにAnsibleとかFabricとか流行ってますもんね。でも老舗感と重厚感あるChef触っておくのもいいと思うんです。にしてもChefって色々複雑そうで入りにくいですよね…。

私はChef初級者です。一応裏付けは取るようにしていますが、もし間違いがあれば指摘いただけると嬉しいです。

Chef-Zeroっていうのは、消えゆく(らしい)Chef-Soloに代わる形で推奨されている単体で動く環境構築の自動化ツールです。元々Chefはサーバーとクライアントが分かれているアプリケーションですが、Chef-Soloは独立して動くChefで、Chef-Zeroは1つのマシンにサーバーとクライアントの両方を入れたようなイメージらしいです。

 

導入編

昔はRubyのgemでChef入れて、関連ツール入れて・・・のような形でRubyの環境がない人はそこから、という結構導入が重めでした。

最近はChefDKというのがあり、Chef本体とその関連ツールを一気にインストールできるようになっています(実際は内部でgemが使われているんですが…)。

https://downloads.chef.io/chef-dk

今回はこのMac用のChefDK、執筆時点の最新 0.10.11を使います。バージョン番号から察するに、まだ正式リリースではないようですがインストールされるChefは最新のものなので心配ありません。

インストール直後のバージョン情報は次の通りです。

 

Vagrantを準備

とりあえず適当にVagrantのゲストOSを用意します。今回は Vagrantことはじめ でダウンロードしてきた bento/centos-6.7 を使います。読むのに慣れてVagrantfileのコメントが邪魔になってきたら init時に –minimal (-m)オプションを付けましょう。コメントが消えてくれます。

Chefを使ってプロビジョニングを行うためには、ゲストOS内にもChefが必要です。色々な解説サイトを読むと、Vagrantのプラグインを入れてゲストOSにChefをインストールするような記事が多く見られますが、そうするとVagrantfileを配布する際にそのプラグインのインストール手順を共同開発者に伝え、手動で入れてもらう必要があります。せっかくの自動化なのに、vagrant upだけで完結させたいですよね。なので今回はChefのインストール部分だけインラインシェルを使うことにします。

 

Chefリポジトリを作る

まずはベースとなるリポジトリを作ります。今後はこの中で作業するので、移動しておいてください。

 

Cookbookを作る

オリジナルなcookbookはデフォルトで作られているcookbooksではなくsite-cookbooksに入れるのが慣習のようなので、それに従おうと思います。ここでは例として空のCookbookを置いてみます。

これで空のクックブックができました。

 

Berksfileを作る

実際にCookbookの中身を作り込む前に、Berkshelfへの登録を済ませておきましょう。
BerkshelfというのはRubyのBundler、PHPのComposerのように、Cookbookに依存するCookbookを自動で入れてくれるCookbookマネージャーのような役割を担います。

Berkshelfで自分の使いたいCookbookを記述しておくのがBerksfileになります。これをChefリポジトリのルートに作ります。

1行目のsourceというのは、指定された名前のCookbookをデフォルトでどこから落としてくるか指定します。今回は有名な Chef Supermarket を使いました。

その後で使いたいcookbookの名前とバージョンを指定し、

コマンドを実行することで、 Berksfileを元にcookbooksディレクトリに依存性が解決されたCookbookが保存されるようになります。

実際に上のコマンドを実行してみてください。./site-cookbooks/do-something が ./cookbooks/do-something にコピーされたと思います。今回のようにpathパラメーターにローカルのCookbookを与えた場合は、sourceに記述したリモートロケーションではなく指定されたローカルのCookbookを見に行くようになります。

 

Vagrantのプロビジョンで実行する

Chef-Soloでプロビジョンを行ったことがある人は同じように使えます。

chef_zero provisionerを使って、cookbooksのディレクトリと実行するレシピをadd_recipeで列挙していきます。

add_recipe の代わりに add_role を使ってRolesという機能も使えます。これは複数のレシピをロールという単位で管理することで、役割という意味単位でグルーピングして扱うことができます。

 

Marketで公開されているCookbookを使ってみる

既に作った do-something のCookbookを自分で書いてもいいのですが、とても長くなってしまうので今は公開されているCookbookを使ってみます。例えばApacheやMySQL Serverなどの有名どころは大抵公開されているので、そもそも自分で一から書くことは少ないかもしれません。

上でBerksfileのsourceに指定したURLが Chef Supermarket です。

https://supermarket.chef.io/

今回はApacheのCookbook、 apache2 を使ってみようと思います。

berks vendorでCookbookを取得してきます。

cookbooksディレクトリの中にapache2のcookbookがインストールされればOKです。

Vagrantfileにも追加して、実行してみましょう。

プロビジョンが完了したら、正しくインストールされているか確認してみましょう。

 

Vagrantfileを公開するとき

チーム内で開発用仮想マシンを共有したいときは、Vagrantfileの他に最低限 ./provision/cookbooksを共有するといいでしょう。Berkshelfがインストールされているユーザーであれば、 Vagrantfile+Berkshelfでなんとかなりますが、一般的にはVagrantfile+cookbooksの共有が多いような気がします。

 

まとめ

Chef勉強しながら作業内容の備忘録と共有のために書きました。実際これだけではChefの2割にも満たないくらいの知識量だと思います。学習コストが比較的高いですが頑張っていきましょう。

treeコマンドのススメ

treeとは

その名の通り、配下のファイル構造をツリー表示するコマンドです。

深い箇所にあるファイル構造を把握するのにとてもベンリ。あと、こういうブログとかSlackとかで他人にファイル構造を伝えるときなんかにも。

百聞は一見にしかずということで、こんな感じです。

ちなみに単にtreeだけだと日本語含むファイル名とかだと文字化けしちゃいます。そういうときは -N オプションを付けることで、ASCII以外もそのまま表示してくれます。

ただこのコマンドは元から入ってる環境は少ないと思うので、自分でインストールしないとダメです。特に悪影響あるものでもないので、自分が管理権限を持っていなくてもお願いすれば入れてもらえると思いますよ。

 

インストール手順(Mac)

Homebrewで入れるのが手っ取り早いです。コマンド一つで簡単。

Homebrew自体のインストールの仕方はmac homebrewとかでググってください。入れておいて損はないですよ。

 

インストール手順(RedHat系)

所謂yumが使える環境の話。CentOSやAmazonLinuxなんかはこれです。これも単純にyumでOK。

 

便利なオプション

  • -N: 上でも少し取り上げましたが、非ASCII文字を正しく表示してくれます
  • -L <数字>: 辿る階層の深さを制限できます
  • -C: ディレクトリに色を付けてくれます
  • -X: XML形式で出力します
  • -J: JSON形式で出力します
  • -o <ファイル名>: 標準出力の代わりにファイルに書き出します

これだけで色々と遊べそうじゃないですか?

 

ちなみにtreeが使えない環境でもsedとか駆使してツリー上に配下ファイルを網羅することもできなくはない…です。でも無駄でしかないのでtree入れちゃいましょうね 🙂

VCCWでイマドキWordPress開発環境

WordPressを使ってウェブを作っているみなさん!まだXAMPPでMAMPで消耗してるんですか!?

 

VCCWを使う選択

VCCWというのは、VagrantをベースにしたWordPressの開発環境です。

従来、何もないところからWordPressの開発をはじめるとなると、WebとDBサーバーをインストールして、データベースを作って、WordPressをダウンロードして、接続情報を入力して…など、多くの手順を踏まなくてはいけませんでした。Web、DBサーバーも独立しているため管理も煩雑になりがちです。

VCCWを使うと本当に簡単に開発環境が整います。また、WordPressの開発に便利な色々な支援ツールも一気に使えるようになります。WordPressのサイト個々にOSイメージが作られるため、一つのMySQLサーバーで複数のサイトを飼いながら開発…なんてこともなくなります!

テーマを作るデザイナーの方は少し敷居が高いかもしれませんが、プラグインなどを作るエンジニアよりの方は是非一度お試しください!一度これに慣れると、もう従来の方法でなんて開発できませんよ!

 

事前準備

VCCWはVagrantfileを使って仮想環境を構築するため、先にVagrantを使えるようにしなければいけません。

拙著 Vagrantことはじめ にしたがって、VirtualBox+Vagrantの開発環境を先に整えてから読み進めてください。

 

hostsupdaterプラグインをインストール

(※ Windowsの方はこのプラグインを使えないので読み飛ばしてください。ホスト名でアクセスしたい場合は、「Windows hosts 編集」とかでググってください。)

VCCWで構築したWordPressの環境は、ローカルIPアドレスでアクセスできるようになりますが、PC内にあるhostsファイルというものを編集することで、任意のホスト名(デフォルトであれば vccw.dev)でアクセスできるようになります。これは完全に好みですが、複数サイトを開発する際に直感的な名前でアクセスできるので私は便利に使っています。

インストールは次のコマンドを実行します。グローバルにインストールされるので、好きなディレクトリ上で実行して構いません。

 

Boxの準備

Vagrantことはじめ でも触れたように、仮想マシンの起動にはBoxが必要です。VCCWで用いるBoxをダウンロードしておきます。

Boxのダウンロードにはまた時間がかかるので、ダウンロードしている間に次のステップを終わらせておきましょう。

 

VCCWをダウンロード

前述のステップでBoxは用意しましたが、このBoxを使うためには予め用意されたVagrantfileと環境構築用のスクリプト(内部ではChefを使っています)が入ったVCCW本体と呼べるものをダウンロードして、それを作業用のフォルダとして使います。

次のVCCW公式ページからzip、もしくはtar.gz形式で圧縮されたVCCW本体をダウンロードしてきてください。執筆時点の最新バージョンは2.18.0です。

http://vccw.cc/

ダウンロードしたら解凍して、サイトの名前など分かりやすいものに変更します。また今後頻繁に開くことになるので、開発用のフォルダなど決めているのであれば移動しておきましょう。

 

VCCWの設定

実際に起動する前に、日本語のWordPressが導入されるように設定を変更しておきましょう。これを設定しておかないと、デフォルトで英語のWordPressがインストールされることになります。後から変更するのは一手間です。

まず、VCCWを配置した下のprovisionフォルダにあるdefault.ymlを、VCCWのフォルダ直下にsite.ymlという名前でコピーしてきてください。

仮にVCCWを ~/vccw/ に設置したとすると、 ~/vccw/provision/default.yml を、 ~/vccw/site.yml にコピーするということになります。(私はここでprovisionフォルダ内にコピーするものと思い込み、何故動かないのかソースコードを読んでコピー先の位置間違いに気付きました……。)

コピーできたら、エディタで site.yml を開いて、次の通りlangを変更します。

PCのスペックに余裕がある人は、Virtual Machine Settingsのmemoryとcpusの数を増やしておくと良いでしょう。

また、前述のhostsupdaterを導入した人は、Network Settingsのhostnameをサイト名などを使ったホスト名に変更しておくと良いと思います。このホスト名を使ってWordPressにアクセスできるようになります。

 

VCCWを起動

BoxとVCCWの準備が終わったらいよいよ起動してみます。ダウンロードしてきたVCCWが入っているディレクトリにターミナルで移動して、その中にあるVagrantfileを元にVagrantを起動します。

VCCWを初めて起動する場合、仮想マシンのコピーに加えて、Apache+MySQLサーバーのダウンロードやWordPressのダウンロード、開発支援ツール群のダウンロードなど、様々な処理がVagrant内で行われます。これにも結構な時間がかかります(私の環境で5分程度)ので、気長に終わるのを待ちましょう。ただし、前述したhostsupdaterプラグインをインストールしている場合、その処理が実行される際にrootユーザーのパスワードを求められることがあります。入力しないと進まないので気をつけましょう。

 

使ってみる

無事に起動できたら早速チェックしてみましょう!ブラウザで http://192.168.33.10/ を開いてみてください。hostsupdaterを導入した方は、設定したホスト名でも開けるかと思います(デフォルトは http://vccw.dev/ です)。

ちゃんと日本語のWordPressが表示されればOKです!管理画面は /wp-admin で、IDとパスワードは変更していなければ共に admin です。

 

開発してみる

vagrant upを実行すると、VCCWの中に /www/wordpress というディレクトリが作られます。/www ディレクトリはVagrantの仮想マシン内と共有されています。

例えばテーマを作る時は /www/wordpress/wp-content にある themes  内を編集すればいいですし、プラグインは同じく plugins になります。/www/wordpress の中で従来通りの開発すればよいということですね!

もちろんWordPressの管理画面からテーマやプラグインをインストールした場合も、そのフォルダの中に保存されていきます。もちろんリアルタイムです!

 

まとめ

従来の開発環境と比べて、いかに楽にクリーンで本番環境に近い開発環境が構築できたか体感いただけましたか?これからのWordPress開発はVCCWの時代ですよ!

 

 

Vagrantことはじめ

職場でもプライベートでも、他の人に説明することが多くなったのでここにまとめます。

 

Vagrant(ベイグラント)って?

仮想化ソフト上で動く環境構築ツールです。VagrantはVagrantだけで動くと思っている人もいましたが、実際は仮想ソフトウェアがなければ役に立ちません。一般的に仮想化ソフトウェアには、VirtualBoxを用いることが多いですが、その他VMwareやAWS EC2なども使うことができます。Vagrantでは、これら仮想化ソフトのことをプロバイダと呼びます。

 

なぜ使うか

これまでの開発環境は、例えば手元のパソコンにウェブサーバーのApacheを入れて、MySQLサーバーを入れて(MAMPとか使ったりして)やっていたと思います。でもそれって、結局Mac(あるいはWindows)上で動くサーバーであり、本番環境は大抵何らかのLinux系OSが使われているために、環境差異が生まれます。

また、実務では本番で使われてるWebやDBサーバー、また言語のバージョンが異なるなんてことはザラです。皆さんのPCは、本当に受け持っているプロジェクトすべて本番と同じ環境で開発ができているでしょうか?

Vagrantを使うとOSから丸々同じ環境を作れるため、環境差異による不具合リスクを大きく低減させることができます。

これは、VirtualBoxなど仮想化ツール単体でも実現できていたことですが、Vagrantと組み合わせて使うことで更に強力な開発支援ツールとなりました。これは、Vagrantが間に入ることで単体ではできなかった自動での環境構築やファイルの同期など便利な機能の数々を提供してくれるからです。

 

VirtualBoxをインストール

前述の通りVagrantはプロバイダがなければ動かすことはできません。ここではプロバイダを一般的なVirtualBoxを採用して進めていきます。次のURLから使っているOSに合うものをインストールしてきてください(なおこの記事ではMacを対象にしています)。

https://www.virtualbox.org/

執筆時点の最新は「VirtualBox 5.0.10 for OS X hosts」です。

 

Vagrantをインストール

VirtualBoxをインストールしたら次はVagrant本体です。これも次のURLからお使いの環境に合うものをダウンロードしてインストールしてください。

http://www.vagrantup.com/

執筆時点の最新は 1.7.4 です。

インストールが終わったら、ターミナルからvagrantコマンドが使えるか確認しておきましょう。

 

Boxを追加

Boxというのは、今から作っていく仮想マシンの元となるテンプレートのようなファイルです。実際にはCentOSやDebianなどOSのイメージファイルとなっています。新しく仮想マシンを立ち上げるとき、このBoxをコピーして起動します。本記事では割愛しますが既に環境構築済みの仮想マシンイメージを元に自分でBoxを作ることもできます。

ここではサーバー用途に一般的なCentOS 6系を仮に入れてみます。指定したBoxが複数のプロバイダに対応している場合、コマンド入力後にどのプロバイダ向けのBoxを取得するか入力を求められる場合があります。このときはvirtualboxと書かれたものを選択します。

このコマンドはOSのイメージファイルをダウンロードしてくるので結構時間がかかります。途中で止めてしまうと中途半端にファイルが作られてしまって再ダウンロードに一手間掛かったりするのでのんびり待ちましょう。

BoxはVagrantBoxesというサイトで公開されていますが、このサイトは個人もアップロードすることができるため、信頼できないユーザーが作ったBoxは使わないようにしましょう。

ダウンロードが終わったら、正しくBoxが利用可能になっているか確認します。

 

仮想マシンの初期化

いよいよ上で落としてきたBoxを元に起動してみます。

まずは適当なワーキングディレクトリを作ってそこに移動します。

初期化するには vagrant init を使います。

これでカレントディレクトリにVagrantfileというファイルが作られ、起動する準備が整いました。

Vagrantfileは、ベースとなるBox名など起動する仮想マシンの構成を保存しておくためのファイルです。Rubyで書かれています。

 

仮想マシンの起動

Vagrantfileを元に仮想マシンを起動するには vagrant up コマンドを使います。

実行が終わったら、正しく起動しているか確認しましょう。

runningになっていれば正常にその仮想マシンは動いています。

また、今回は前述の通り先にBoxをダウンロードしていますが、もしvagrant upを実行した時にVagrantfile内に記載されているBoxがローカルに存在しない場合、内部的にvagrant box addが実行されBoxの取得を試みます。

 

仮想マシンへSSHでアクセスする

起動した仮想マシンの操作はどう行うかというと、vagrantのコマンドから簡単にsshでログインすることができます。

無事にログインできましたか?早速コマンドを叩いてみましょう。

この通り、vagrantというユーザーでログインできていることが分かります。

もちろんroot権限も使えます。sudoはパスワードなしで使うことができ、rootのパスワードは vagrant になっています。

sshで接続できることを確認したら、exitコマンドを使って一度sshから抜けておいてください。suでrootになっている場合、2回入力する必要があります。

 

仮想マシンの停止

次は動いている仮想マシンを停止してみましょう。その前に、ターミナルで今居る場所が仮想マシン内でないことを確認してください。vagrantは仮想マシン内にはインストールされていないため、仮想マシン内でこのコマンドを使っても受け付けてくれません。

仮想マシンはCPUとメモリ消費が多く、また長時間起動していると仮想マシンが不安定になりがちです。使い終わったら停止することを心がけましょう。

実行後に前述の vagrant status を実行し、runningだったものがpoweroffに変わっていればシャットダウンが完了しています。

 

まとめ

ざっくりVagrantことはじめとして書いてきました。今後書く記事の中でも参照することがあると思います。実践的な使い方についてはまた別記しようと思います。

 

// TBD

  • 起動、停止、サスペンド、削除
  • ネットワーク
  • プロビジョン
  • etc

 

 

WordPressのセキュリティ対策

いくらWordPressをホストするサーバーのセキュリティを高めたところで、WordPressが脆弱だと意味がありません。WordPressのセキュリティ対策をまとめてみます。

それぞれの先頭の★は、3段階でその対策の効果を元にしたお勧め度を表します。

 

管理用のユーザー名を変更する(★★★)

ログインする際のユーザー名は管理画面の設定から変更することができません。ただし、新しくユーザーを作成し、古いユーザーを削除する方法で管理用のアカウントを作り直すことができます(記事は引き継げます)。adminのような脆弱なユーザー名を使っているのであれば、今すぐにでも変更すべきです。また当然ですがパスワードは使い回さず、堅牢なものを設定しましょう。

 

ログイン時に2段階認証を行う(★★★)

2段階認証というのは、IDとパスワードの他にワンタイムパスワードを入力する方式のことです。管理画面へのブルートフォース攻撃対策にとても有効です。

WordPressでこれを実現するには「Google Authenticator」プラグインがお勧めです。ユーザー毎に二段階認証の有効無効を切り替えることができます。スマートフォンに「Google Authenticator」のアプリをインストールして、WordPressのユーザー管理画面に表示されたQRコードをスキャンして紐付けます。ちなみに、有料版の1Passwordなど一部その他ワンタイムパスワード用のアプリでも利用可能です。

 

ログイン用のURLを変更する(★★★)

WordPressは /wp-admin や /wp-login.php にアクセスすることでログインページが表示されますが、このログイン用のファイル名を変更してしまうことでそもそも不正なログインを試される可能性がぐんと下がります。

直接コードに手を加えて実現することも可能ですが、日本語対応のお勧めプラグインもあります。Login Rebuilder です。これも簡単に実装可能な上、効果はとても大きいので是非実装しましょう。ただし、他のセキュリティ系プラグインとの相性が悪いこともあるのでその点は要注意です。

 

wp-config.phpファイルを守る(★★☆)

このファイルはWPがデータベースに接続するための接続情報などが含まれ、流出などに一番気をつけなくてはいけないファイルです。PHPのコードになっているため、PHPファイルが正しく処理される環境下では基本的に問題になることはありませんが、万が一PHPが正常に処理されなかった場合に備えてウェブサーバー側で対策を講じておきましょう。

nginxの場合、/etc/nginx/nginx.confのserverセクションに以下を記述します(ただしphpをハンドリングしている箇所より上に書く必要があります)。

apacheの場合、WPルートにある.htaccessに下記を追記します。

 

xmlrpc.phpを無効化する(★★☆)

WordPressは3.5以降、デフォルトでXML-RPCの機能が有効になっています。これはpingbackやメール投稿などの機能をサポートするものですが、pingbackの悪用によりDoS攻撃の踏み台にされることがあります。これらの機能を使っていないのであれば、上記wp-config.phpを無効にする手順と同様に xmlrpc.php を無効にしてください。適切に設定がなされていれば、/xmlrpc.php へアクセスした際に403 Forbiddenが返されるはずです。

 

WordPressのバージョンを隠す(★☆☆)

WordPressで生成されたページのソースコードには、metaタグやcssのサフィックスとしてWordPressのバージョン番号が記載されています。バージョン番号が知られてしまうと、既知の脆弱性を用いた攻撃が容易となります。悪意のある攻撃者へ情報を与えないために、バージョン番号を出力しないようにしましょう。

これもプラグインを用いることで用意に実現できます。「Remove Version」というプラグインをインストールして有効化するだけで、ソースコードにバージョン番号が出力されなくなります。

 

readme.htmlを削除する(★☆☆)

インストールする際のreadme.htmlがルートディレクトリに残っていたりしませんか?このファイルにもWordPressのバージョン番号が含まれています。もし存在するようなら消しておきましょう。

 

テーブルのプレフィックスを変更する(★☆☆)

データベースのテーブルに割り当てられるプレフィックスです。もしデフォルトの wp_ を設定されているのであれば、これも別のものに変更されることをお勧めします。SQLインジェクションの対策になります。インストール済みのWPでプレフィックスを変更することも可能ですが、手を入れなければならない箇所が多く、長くなるので割愛します。

 

管理画面からソースコードの編集を禁止する(★☆☆)

wp-config.phpに次の行を追記することで、管理画面からテーマやプラグインのソースコードを編集できなくすることができます。

これは管理権限を持つユーザーの不正なコードの改竄を防ぐ効果があります。また、不正に第三者に管理画面にアクセスされた際にも限定的ながら有効です。

 

その他

  • wp-adminのホスト制限

これも良い対策の一つですが、私の場合は外出先からでも執筆のためアクセスすることが多く、IPを固定できないため敢えて導入していません。その場合でも、国外からのアクセスなど出来るだけ絞り込むというのは十分にアリな対策です。

  • HTTPS化
  • DBユーザの権限設定
  • ファイルパーミッション
  • など

 

まとめ

いくつか対策を挙げてみました。WordPressを用いたサイトを運用する上での、セキュリティ対策の一助になれば幸いです。

実務で役立つワンライナーコマンド雑記

実際の業務で個人的によく使うものや、過去に使ったトリッキーなものをまとめてみます。

 

空のファイルを作成

 

連番で100個ファイル作成

 

ディレクトリ作って中に同時にcd

$_ で直前のコマンドの引数を参照できます。

 

一つ前のディレクトリに戻る

ホームから深い階層間を飛び回るときなどに重宝。

 

指定したプロセスが動いているか確認

 

大きいファイルランキング

出力結果

 

ファイルの内容を再帰検索

該当箇所のファイルパス、行番号、該当箇所を色付きで出力します。見やすくてオススメ。

 

複数のファイルからユニークな行だけを抽出してソート

使用例

 

また随時追加していきます

EC2起動後に行うべき設定

標準のAmazon Linux AMIを前提に進めていきます。

AWS EC2はデフォルトでrootログイン禁止、オプトイン方式のインバウンドセキュリティポリシー、公開鍵認証のキーペア生成など、適当に使っていてもある程度セキュアになりますが、少しの手間でより堅牢なサーバーにできます。是非取り組んで欲しいです。

 

とりあえずアップデート

AmazonLinuxの場合大抵最新のパッケージが入っていますが、念のために更新しておきます。

以下の指定にすることでセキュリティパッケージの更新のみを適用できるため、すべてのパッケージを更新したくない場合、最低限こちらだけでも実行しましょう。

 

 

タイムゾーンの変更

EC2は起動したリージョンにかかわらずUTCの設定になっています。最近は世界を目指すプロダクトではアプリケーションやDBクロックを日本時間に変えずUTCのまま使用し、表示時にアプリケーションが変換するなど、UTCスタンダードなモデルもよく聞きますね。とはいえ日本に住む以上日本時間で統一したくなるのも事実。

設定が終わったら再起動して全てのプロセスに反映させます。

再起動後はdateコマンドで日本時間になっているのを確認します。

 

rootパスワードの設定

適切にインスタンスを起動した場合、接続に必要な鍵が適切に管理されていれば通常安心ですが、万が一の漏洩に備えてrootにパスワードを設定しておきましょう。

 

管理用ユーザーの変更

デフォルトではec2-userというユーザーが管理用に作られていますが、セキュリティを高めるために別の名前のユーザーを使うことをお勧めします。その際、AmazonLinuxでは他Linuxによくあるwheelグループなどの管理グループ全体にsudoを付与しているわけではなくユーザー単位に設定されているため、新規で追加したユーザーにも個別にsudo権限を付与するようにしましょう。

まずは新しいユーザーを追加して、管理(sudo)権限を付与します。

cloud-initファイルを次のように変更します。

ec2-userのsudo権限は /etc/sudoers.d/cloud-init に書かれており、/etc/sudoersからロードされています。引数なしのvisudoでは編集できません。また、sudoersファイルを直接viなどで編集するのは危険なのでやめましょう。ここではec2-userの権限を剥奪し、またsudo実行時にパスワードを求めるように(NOPASSWD非設定)しました。

すべて完了したら、一度ログアウトして外部からnewuserでログインしてみましょう。鍵もコピーされていますので、ssh接続時はユーザー名だけを変更すればOKです。正しく接続できて、sudoがパスワード入力後に実行できれば完了です。

最後にec2-userを削除して終わりです。ec2-userでログインできないことを確認しましょう。

 

ポート番号の変更

定番のセキュリティ対策ですね。SSHのポート番号をデフォルトの22番から別のものに変更します。簡単で単純ですが、効果は高いです。

ここでは仮に22922に変更します。また、待ち受けポートは1つという縛りはないため、下記例のように変更前のポート22でも待ち受けるようにしたまま進めると万が一の特に困らないでしょう。

終わったらreloadして設定を反映させます。また、iptablesが稼働中であれば不正なルーティングによって弾かれる可能性があるので停止されているのを確認してください。

SSHのポートを変更しますので、AWSのEC2に紐付いているセキュリティポリシーも変更する必要があります。新しく設定したポート番号のTCPを、自分のIPアドレスから通すように設定を変更しましょう。

これで新しいポートを用いて接続できるようになりました。一度ログアウトして、新しいポートへのSSH接続が成功すれば完了です。sshd_configを開いて Port 22 の記述を削除したあとでreloadしましょう。AWSのセキュリティポリシーからもTCP:22のルールを削除して完了です。

万が一新しいポートで接続できない場合は、落ち着いて22ポートで接続して、設定を再確認してください。ポートが正しく待ち受けられているかチェックするにはnetstatコマンドが有効です。

 

SSHをもっとセキュアに

  • iptablesでアクセスできる回数を制限
  • 認証試行回数の設定
  • アクセス試行ログの通知

もろもろ考えましたが次の観点からこれらを講じる意味はないと思っているので割愛します。

  • 鍵認証が強制になっていること(デフォルト)
  • rootログインができないこと(デフォルト)
  • ユーザー名を変更したこと
  • SSHポートを変更したこと
  • EC2のセキュリティポリシーにより、SSHポートは信頼されたIPにしか公開されていないこと

これだけの対策を講じていれば、上述の更なる対策はあまり意味がありません。

鍵の管理だったり、権限を持つ内部からの不正アクセスリスクの方が高いはずなので、その辺の対策(運用体制などの整備)に時間を割く方が良いでしょう。

 

そのほか

nginxやその他サーバー類の個別なセキュリティ対策についてはまた別に書こうと思います。

特にエンタープライズでのウェブサイト改竄や情報流出などの危機管理が取り沙汰されている昨今、エンジニアである以上最前線で食い止めていきたいですね。

 

  • 2015-11-18 公開
  • 2015-11-25 加筆

 

EC2にサクっとnginxとphpの環境を整える

そういうメンテ済みのAMIを拾ってくるっていう話はなしで、普通にキレイなAmazonLinuxAMIをベースに入れていきます。

既にインスタンスは起動していて、sshで接続しているのを前提にします。また、インスタンスに紐付いているセキュリティポリシーで外部からHTTP(TCP 80)へ通信が通るようにしてください。

nginxとPHPをインストール

PHPモジュールはphp56とphp56-fpmが必須です。他は任意で選択してください。

 

nginxの設定

nginxはデフォルトでphpファイルをハンドリングしないため、インデックスパスへの追加とphpファイルへアクセスした際にphp-fpmへソケットで受け流す設定にします。

php-fpmの設定

こちらは主にapacheで使用する設定からnginxで使用する設定に変更し、ソケット通信を用いるようにします。

起動

設定ファイルの変更が終わったらいよいよ起動です。

OSを再起動したときに自動起動する設定にしておきます。

動作確認

それぞれのURLでアクセスでき、正しくechoの中身だけが出力されていればOKです。

もし繋がらないときは、設定ファイルを見直して、nginxとphp-fpmが正しく起動されているか確認してください。見落としやすいミスとして、AWS上で起動したインスタンスに紐付いているセキュリティポリシーでHTTPのアクセスを弾いていることがあります。またインスタンス上でiptablesが実行されている場合は次のコマンドで停止させてください。

さいごに

これらの設定は最速で動かすことを目指して書いています。実際にはこれらをインストールする前にLinuxのセキュリティ設定を行うべきですし、nginxのセキュリティ設定やチューニング、アプリケーション側のnginx対応などを行う必要があります。

それらについてはまた別に書きますが、上の設定のまま実際にウェブサイトを公開することは危険です。必ずセキュアな状態にした上で公開してください。