Wordpressにお引越し
個人的な開発サーバを建てる
Preface
次のような機能が欲しい.
- フロントエンドのあるGitのリモートリポジトリ
- BTS
- ToDo管理ツール
どれもサービスとして提供されているものなので,それを使えばいい話ではあるのだが,好き勝手絶頂に使いたいので,自分でホストすることにする.
具体的には,以下のプロダクトを使うことにした.
- Rhodecode
- Redmine
- Tracs
Products
1. Rhodecode
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
説明不要のBTSだろう.RoRで実装されている.
issueはチケットとして,ここで管理する.また,markdown記法が使えるWikiを求めた.
上の要件だけであれば,それこそRhodecodeをGitlabにすれば全部付いてくるのだが,仕事や個人プロジェクトで使う以外にも,友人と情報共有したり大人数でやる飲み会の予定調整をするときなどにも使っているので,Redmineを導入する.
3. Tracs
GTDで利用できるタスク管理ツールで,RoRで実装されている.
ToDo管理はToodledoを使っていて,大変気に入っているのだが,RoRで実装されたオープンソースのToDo管理プロダクトがあったのでとりあえず入れてみたくなった.コラボレーション機能がついていれば良いのだが,サイトを流し読みした限り,ついていないようだ.
Architecture
RhodecodeはPaste,RedmineとTracksはUnicornで動作させるが,同一サーバでの実行となるので,名前ベースのバーチャルホストを利用してHTTP/HTTPSアクセスができるようにしたい.
用途的にApacheは重すぎるので,Nginxを使うことにした.
具体的には,以下のような構成をとる.
導入した際の手順は,ここにまとめて書くと長くなるので,個別の記事に分けることにした.
書き終えたものから,ここに参照を追加していく.
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で,ウェブアプリケーションサーバとして利用する. アクセス制御は以下の要件を満たすものとする.
- IPv6サポートをOFFにする
- 特定の Source IP address(自宅,オフィス等)に対し,SSH(TCP/22)を制限無しで許可する
- 明示的に許可されていない通信は全て遮断する
- SSH(TCP/22)を開放し,総当たり攻撃対策として,接続要求に閾値を設ける
- HTTP(TCP/80)を開放する
- 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が無効化されていることがわかる.
markdownが使える!
というので,放置に放置を重ねたはてなダイアリーは更新せず,今度からこちらに書こう.
たぶん殆ど技術ネタ.