Wordpressにお引越し

PHPが嫌いなのでWordpressにはできるだけ関わらないようにしてきた.

ところが,仕事上さわる必要があったので,どうせ覚えるなら自分事にしようと,自分のサイトをWordpressでホストしてみることにした.

例によって殆ど更新はされないのだけれども・・・

exempla.jp

個人的な開発サーバを建てる

Preface

次のような機能が欲しい.

  1. フロントエンドのあるGitのリモートリポジトリ
  2. BTS
  3. ToDo管理ツール

どれもサービスとして提供されているものなので,それを使えばいい話ではあるのだが,好き勝手絶頂に使いたいので,自分でホストすることにする.

具体的には,以下のプロダクトを使うことにした.

  1. Rhodecode
  2. Redmine
  3. Tracs

Products

1. Rhodecode

http://rhodecode.org/

Pythonで実装されたSCMで,WebUIを備えている.

元々はMercurial専用だったが,後にGitにも対応した.

以前所属していた会社で,SCMをGitに置き換える際,Githubのような事が実現可能でLDAP連携機能を備えているものを探しているときにたどり着いた.GitoliteやGitlabなども候補にあったが,WebUIとLDAPの2つを満たしていたのは当時Rhodecodeだけだった記憶がある.(GitoliteはWebUIがない.GitlabはLDAP対応がまだされていなかったと記憶している)

また,Rhodecodeの利点として,リポジトリグループという機能がある.これはあるプロジェクトの構成要素であるような複数のリポジトリをグループに所属させることで,リポジトリの関係に見通しを立てやすくするという点で役にたった.さらに,Rhodecodeのグループは階層構造を持つことができ,その階層はURLにも反映される.

今日に至っては,Gitだけを扱うのであればGitlabのほうがいいような気がするが,それは今後試すとして,まずはRhodecodeを導入しよう.

2. Redmine

http://www.redmine.org/

説明不要のBTSだろう.RoRで実装されている.

issueはチケットとして,ここで管理する.また,markdown記法が使えるWikiを求めた.

上の要件だけであれば,それこそRhodecodeをGitlabにすれば全部付いてくるのだが,仕事や個人プロジェクトで使う以外にも,友人と情報共有したり大人数でやる飲み会の予定調整をするときなどにも使っているので,Redmineを導入する.

3. Tracs

http://getontracks.org/

GTDで利用できるタスク管理ツールで,RoRで実装されている.

ToDo管理はToodledoを使っていて,大変気に入っているのだが,RoRで実装されたオープンソースのToDo管理プロダクトがあったのでとりあえず入れてみたくなった.コラボレーション機能がついていれば良いのだが,サイトを流し読みした限り,ついていないようだ.

Architecture

RhodecodeはPaste,RedmineとTracksはUnicornで動作させるが,同一サーバでの実行となるので,名前ベースのバーチャルホストを利用してHTTP/HTTPSアクセスができるようにしたい.

用途的にApacheは重すぎるので,Nginxを使うことにした.

具体的には,以下のような構成をとる.

f:id:cariandrum22:20130523190749p:plain

導入した際の手順は,ここにまとめて書くと長くなるので,個別の記事に分けることにした.

書き終えたものから,ここに参照を追加していく.

Ubuntuでufwを設定する

ufw (Uncomplicated Firewall) は主にUbuntuで採用されているiptablesのラッパーで,pythonで実装されている.

iptablesをより平易な構文で使えるようになるのが利点だ.

ネットワークにあまり詳しくないサーバエンジニアにとっては,iptablesはそれなりに難解なものらしい.

筆者はインフラ系のSEとして,Reflexive ACLやLock and Key ACLに始まり,Time Based ACLやEEMとTCLを駆使したEvent Driven ACLなど,変態的なアクセス制御をCisco謹製ルータで実装してきた身としては,iptablesは構文も平易で機能も充実しておりなかなか便利なやつである.最初はBSDのipfwより設定書きにくいなーなどと思ったものだが.

閑話休題

今回は Ubuntu Server 12.10 quantal quetzal を使用し,以下の示す要件を満たす設定を実施する.

要件

今回設定対象のサーバはVPSでホストされたUbuntuで,ウェブアプリケーションサーバとして利用する. アクセス制御は以下の要件を満たすものとする.

  1. IPv6サポートをOFFにする
  2. 特定の Source IP address(自宅,オフィス等)に対し,SSH(TCP/22)を制限無しで許可する
  3. 明示的に許可されていない通信は全て遮断する
  4. SSH(TCP/22)を開放し,総当たり攻撃対策として,接続要求に閾値を設ける
  5. HTTP(TCP/80)を開放する
  6. HTTPS(TCP/443)を開放する

さて,実装にかかるまえの注意事項だが,当然ufwやiptablesが初期状態かつ無効化されていることを前提にしている.

ufwが動いている状態で設定を行うと,当然ながら既存の設定や接続に影響を及ぼす可能性があるので十分に注意が必要だ.

Set up the firewall using ufw on ubuntu

1. IPv6サポートのOFF

/etc/default/ufw に以下の設定を追加する.

-IPV6=yes
+IPV6=no

2. 特定の Source IP addressに対し,SSH(TCP/22)を制限無しで許可する

/etc/ufw/before.rules に設定を追加する.

参考までに筆者の設定を以下に記載した.

0.0.0.0の部分は,適宜必要なホストあるいはネットワークアドレスに変更してほしい.

# allow SSH remote access
## home
-A ufw-before-input -m state --state NEW -m tcp -p tcp --dport 22 -s 0.0.0.0 -j ACCEPT
## office
-A ufw-before-input -m state --state NEW -m tcp -p tcp --dport 22 -s 0.0.0.0 -j ACCEPT

3 . 明示的に許可されていない通信は全て遮断する

ここからがufwコマンドを使った設定だ.

以下のコマンドを特権にて発行する.

# ufw default DENY

4. SSH(TCP/22)を開放し,ブルートフォース攻撃対策として,接続要求に閾値を設ける

以下のコマンドを特権にて発行する.

# ufw limit 22

ここまでで,簡単なブルートフォース攻撃対策を設けたSSHの許可設定と,それ以外を遮断するルールの準備ができた.

ufwを起動し,ステータスの確認をしてみよう.

ここまでで失敗をしていると,最悪リモートアクセスできなくなる恐れがあるので,念の為コンソールに入れるように準備をしておく.

まずは有効化だ.以下のコマンドを特権にて発行する.

# ufw enable

続いて,設定の確認をしてみよう.以下のコマンドを特権にて発行する.

# ufw status

Status: active

To                         Action      From
--                         ------      ----
22                         LIMIT       Anywhere

上記のように見えていれば問題ない.

5. HTTP(TCP/80)を開放する

以下のコマンドを特権にて発行する.

# ufw allow 80

6. HTTPS(TCP/443)を開放する

以下のコマンドを特権にて発行する.

# ufw allow 443

7. 確認

要件通りの設定が入っていることを確認する.

# ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         LIMIT       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere

2.の要件はiptablesコマンドで確認する必要がある.

# iptables -L ufw-before-input -v -n

Chain ufw-before-input (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 5552  375K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 380K  152M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
 3688  180K ufw-logging-deny  all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID
 3688  180K DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 4
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 12
  373 13392 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:67 dpt:68
2322K  326M ufw-not-local  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            224.0.0.251          udp dpt:5353
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            239.255.255.250      udp dpt:1900
    5   276 ACCEPT     tcp  --  *      *       XXX.XXX.XXX.XXX        0.0.0.0/0            state NEW tcp dpt:22
    3   180 ACCEPT     tcp  --  *      *       YYY.YYY.YYY.YYY        0.0.0.0/0            state NEW tcp dpt:22
2322K  326M ufw-user-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0 

上記出力においてXXXやYYYでマスクされている箇所が,自分で設定した任意のIPアドレスになっていれば問題ない.

UbuntuでIPv6を無効化する

最近のdistributionでは,なにも考えずにインストールするとIPv6が有効になっている場合が多い.

不要なものは切っておこう.トラブルの芽を摘むことができる.

なお,今回は Ubuntu Server 12.10 quantal quetzal で実施した.

Disable IPv6

1. 事前確認

現在,IPv6が有効化されていることを確認する.

# cat /proc/net/if_inet6 
fe800000000000000xxxxxxxxxxxxxxx 02 40 20 80     eth0
00000000000000000000000000000001 01 80 10 80       lo

cat /proc/net/if_inet6 でエントリが存在すれば,IPv6が有効化されていることがわかる.

2.コンフィグレーション

/etc/sysctl.conf に以下の設定を追加する.

# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

3. 反映

設定をカーネルに読み込ませる.

以下のコマンドを特権にて発行する.

# sysctl -p

pオプションは引数がない場合/etc/sysctl.confを読み込む.

再起動によって反映してもよい.

以下のコマンドを特権にて発行する.

# reboot

4. 事後確認

IPv6が無効化されていることを確認する.

# cat /proc/net/if_inet6 

cat /proc/net/if_inet6 でエントリが存在しなければ,IPv6が無効化されていることがわかる.