格安VPSを探して
1時間1円($0.007)で使える手軽さからDigitalOceanを好んで使っています。環境構築部分はスクリプト化しておいて、開発やテスト用にインスタンス(DigitalOceanではDroplet)を作成し使い終わったら削除するという使い方です(Vagrantなんかも興味はあって勉強したいとは思ってるんですが)。以前から、自宅に仮想サーバを常時起動させておりその中のインスタンスで開発、テストを行っていました。この仮想サーバ環境がそのままDigitalOceanに置き換わったイメージです。インスタンスの作成時間はDigitalOceanの方が圧倒的に早いこともあり、自宅の仮想サーバの利用頻度が落ちています。常時起動の必要もなくなり電気代削減に大きく貢献です。
実際には、仮想サーバを常時起動していた一番の理由は、自由に作業できるサーバをインターネット上に確保しておきたかったためです。一応IT屋として飯を食わせて頂いています。制約なくインターネットに繋がることができる環境はちょっとしたテストなど結構重宝します(企業ネットワークて、ねぇ)。常時起動サーバについてもDigitalOceanに置くことで自宅には常時起動サーバが必要なくなりました。また、常時起動サーバがなくなったことで自宅のネットワーク回線もWiMAX一本にすることができPC、ネットワーク環境は相当身軽になれました。
DigitalOceanは最も安いインスタンスなら$5月(2015年1月現在)で利用できます。いい時代になりました。「さくらのVPS」が始まった時の月額980円も衝撃的でしたが、あれからもう4,5年たつんですね。
DigitalOceanのVPSは月$5です。月額500円という感覚でこれまで利用していましたが、気付けば円安も進み現在では月額600円程度です(それでも十分安いとは思いますが)。いい機会なので 100円をケチって、格安VPSサーバを探してみたところ、無料で使えるVPSが世の中には存在するようです。いくつかある中から、今回はHaphostを試してみます。浦下.comさんの記事を参考にアカウント作成すると2週刊程度でVPNの準備ができたとメールが届きました。インスタンスはCentOS5、6、Debian6、7、Ubuntu12.04〜13.10が選択可能です。Debian 7.0で新環境を構築します。ちなみに、リージョンはフランクフルトにしました。ヨハネスブルグも利用可能ですが、ヨーロッパの方がスループットは良さそうな気がしたので雰囲気でフランクフルトにしました。
Haphostでのサーバ構築
本エントリーの本題に入ります。Haphostでのサーバ構築の備忘録です。
作業ユーザの作成とタイムゾーンの設定
ユーザはrootしか用意されていないため、作業ユーザを作成します。今後はこのユーザで作業するため、sudoグループに追加しておきます。
# adduser <username> # addgroup <username> sudo
以後の手順は作業ユーザによるものです。
海外のVPSサービスのため、タイムゾーンがAsia/Tokyoとはなっていません。とりあえず、タイムゾーンを修正します。
$ sudo dpkg-reconfigure tzdata
セキュリティ強化
初期状態では、rootでSSH接続しパスワード認証でサーバにログインします。rootでのSSH接続、パスワード認証を禁止します。(鍵認証はデフォルトで有効でした)
$ sudo vim /etc/ssh/sshd_config #PermitRootLogin yes PermitRootLogin no #PasswordAuthentication yes PasswordAuthentication no $ sudo service ssh restart
iptables を確認してみます。
$ sudo iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
ノーガードで漢らしいですが、少し怖いので設定を入れておきます。
$ sudo apt-get install iptables-persistent $ vim iptables.rules *filter -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT -A OUTPUT -j ACCEPT #-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p tcp --sport 80 -j ACCEPT -A INPUT -p tcp --sport 443 -j ACCEPT -A INPUT -p udp --sport 53 -j ACCEPT -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT -A INPUT -p tcp --dport 22 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 -A INPUT -j REJECT -A FORWARD -j REJECT COMMIT $ sudo iptables-restore > iptables.rules $ sudo iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 REJECT all -- 0.0.0.0/0 127.0.0.0/8 reject-with icmp-port-unreachable ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp spt:53 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 LOG all -- 0.0.0.0/0 0.0.0.0/0 limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables denied: " REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
再起動時にも設定が反映されるように、設定ファイルを更新します。
$ sudo sh -c "iptables-save > /etc/iptables/rules.v4"
iptables のルールは、DebianのWikiを参考しました。本来は、「iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT」でサーバ自身からの接続(Output)からの戻り(Input)は許可するというルールにしたいところです。しかし、この設定のためにはkernelモジュール「ipt_recent」が必要です。HaphostはOpenVZで提供されており、kernelはホストOSと共有です。よって、「ipt_recent」のロードを諦めDNS、HTTP、HTTPSへの接続に対する戻り(Input)の通信のみ個別に許可を与えています。
その他の設定
Haphostで払いだされたインスタンスでは最初からbind9とapache2.2が動いています。bind9に関しては必要ないので削除します。
$ sudo apt-get purge bind9
Apacheに関しては一応バージョだけ隠しておきます。
$ sudo vim /etc/apache2/conf.d/security # ServerTokens # This directive configures what you return as the Server HTTP response # Header. The default is 'Full' which sends information about the OS-Type # and compiled in modules. # Set to one of: Full | OS | Minimal | Minor | Major | Prod # where Full conveys the most information, and Prod the least. # #ServerTokens Minimal #ServerTokens OS #ServerTokens Full ServerTokens Prod # Optionally add a line containing the server version and virtual host # name to server-generated pages (internal error documents, FTP directory # listings, mod_status and mod_info output etc., but not CGI generated # documents or custom error documents). # Set to "EMail" to also include a mailto: link to the ServerAdmin. # Set to one of: On | Off | EMail # ServerSignature Off #ServerSignature On $ sudo service apache2 restart
予告
以上でサーバの基本設定はとりあえず終了です。次回は、Ruby実行環境を整え、OreoreCA.を移行し、DigitalOceanのインスタンスを停止します。
さて、ここまでDigitalOceanからの移行のためのエントリーを書いていたわけですが、DigitaiOcean自体はたへん便利で良いサービスです。ここから申し込んで頂くと、みなさんが$10分利用されるたびに、私に$25チャージされて大変幸せな気持ちになります。興味のある人は是非。