2012/02/18

apache経由でwebminを使う

今回のお話は...

・apache + SSL + クライアント証明書 でサーバを構築する(構築済みとする)
・apacheのproxy機能を使って、https://ec2.my.server/webmin/ を localhost:10099にリダイレクトする
・webminはリソース大食いなので、webminはdaemonで常時動かさずxinetd経由で必要時のみ起動させる
・セキュリティ上の観点から webminが待ち受けるポートはデフォルトの10000ではなく、10099(任意)に変更する
・同じく、webminは127.0.0.1からのみの接続を許可する

要は、安全にwebminを使えるようにしましょう、というお話です。

AWS EC2インスタンスで構築したサーバをwebmin経由で操作できるように設定します。webminをデフォルトで起動すると 10000番ポートをLISTENし、基本的にbasic認証になりますが、今回サーバでは既にapacheが起動しており、SSL接続のクライアント認証しているので、アクセスコントロールはこちらに任せることにします。
職場などの環境からは10000番ポートに限らず大方のHigh-Portはブロックされているので、SSL(443)でアクセスする必要がありました。これはapache proxyで解決させます。
webminをapache経由(mod_proxy経由)にする方法は http://www.webmin.com/apache.html に書かれていますが、SSLが絡むと少し追加設定が必要でした。

まずは webminをインストール。
http://webmin.com/download.html から .deb形式のファイルをダウンロード。
2012/1/29時点では http://prdownloads.sourceforge.net/webadmin/webmin_1.580_all.deb でした。
# wget  http://prdownloads.sourceforge.net/webadmin/webmin_1.580_all.deb
# dpkg -i webmin_1.580_all.deb

libxxxに依存している とエラーが出るので、dependパッケージをインストールします。この追加するパッケージは環境によって異なると思いますので、必要なものをインストールしてください。
# aptitude install libnet-ssleay-perl libauthen-pam-perl libio-pty-perl apt-show-versions

apache側の設定。proxy設定をします。
Debianのapacheはproxy(mod_proxy)が使えるようにビルドされているので、モジュールでそれを有効にします。
# a2enmod proxy
# a2enmod proxy_http

SSL接続なので、SSLProxyEngine On にしておきます。これを忘れると 500番台エラーになります。ちょっとハマりました。
/etc/apache2/conf.d/proxy (新規作成)
SSLProxyEngine On
ProxyPass /webmin/ https://localhost:10099/
ProxyPassReverse /webmin/ https://localhost:10099/

/etc/apache2/mods-available/proxy.conf を以下のように書き換えます。
ProxyRequests On
<Proxy *>
# AddDefaultCharset off
# Order deny,allow
# Deny from all
Allow from all
#Allow from .example.com
</Proxy>

webmin側の設定
/etc/webmin/config に以下の設定を記述します。(変更点のみ)
webprefix=/webmin
webprefixnoredir=1
referer=***.***.jp    # 新規追加行。稼動しているホストのDQDNを記述します。

/etc/webmin/miniserv.conf を編集して xinetd経由にします。(変更箇所のみを記述しています)
#session=1
inetd=1
webmin daemonが動いている場合はそれを停止し、サーバ再起動などでdaemonモードで起動しないようにします。
# /etc/init.d/webmin stop
# update-rc.d webmin remove
 
/etc/xinetd.d/webmin を新規に作成します。
# webmin
service webmin
{
disable = no
type = UNLISTED
id = webmin
socket_type = stream
protocol = tcp
user = root
wait = no
env = LANG=
port = 10099
server = /usr/share/webmin/miniserv.pl
server_args = /etc/webmin/miniserv.conf
}
 
xinetdのリスタート
# /etc/init.d/xinetd restart

10099番ポートを誰がLISTENしているか、確認します。
# lsof -i:10099
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 18478 root 5u IPv4 5968365 0t0 TCP *:webmin (LISTEN)
無事にxinetdがLISTENしています。

apacheをリスタートします。
# /etc/init.d/apache2 restart

クライアント証明書をインストールしてあるwebブラウザから、 https://ec2.my.server/webmin/ にアクセス。

https://ec2.my.server:10099/ のようにポート番号直打ちでアクセスされるとapache proxyを経由せずにbasic認証になるので、ブルートフォース攻撃の対象になるおそれがあります。
対策として、webmin上の設定で、Webmin Configuration の Ports and Addresses にて 127.0.0.1 からの接続のみを受け付ける(apacheでproxyされたものだけを受け付ける)ように変更します。
これでアタックが多い日でも安心。

お楽しみください!

参考URL
webmin公式
http://www.webmin.com/apache.html
ネットワーキングすきま情報
http://last-resort.seesaa.net/article/123147890.html
bushimichiの日記
http://d.hatena.ne.jp/bushimichi/20090417/1239970196


2012/02/11

Blogpress had updated.

オンラインに記事が保存出来ないという致命的なバグを含んでいた Blogpressが数週間という緩慢な速度で更新されたので書き込んで見るテスト。

追記。
はい、無事に修正されているようです。
公開出来ないBlog管理/作成アプリではお笑いにしても寒過ぎます。

2012/01/24

EC2インスタンスのDynamic DNSへの登録

今回構築したAWS EC2のインスタンス(サーバ)はElastic IP Addressは付与せずに動的IPアドレスで運用しているので、世界から見たホスト名は ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com です。(xxx-xxx-xxx-xxxにはIPv4アドレス相当の数字が入ります)
リブート(インスタンス停止/開始)するとIPアドレスも変化するので、外部からホスト名決め打ちで接続することができるように Dynamic DNSへの登録をします。
数あるDDNSサービスの中から、今回は無料で、ドメイン名が短く、さらにDNS登録が簡単に行える(=危険性もあり。後述) ddo.jp (http://ddo.jp)を選びました。
無料で xxxx.ddo.jp (xxxxは任意)のドメインが登録でき、Aレコード1つ、MXレコード3つ、TXTレコードが登録可能で、一ヶ月更新がないと自動的に登録が削除されるサービス。今回は 1サーバだけなので、無料の範囲で十分です。

DDNS更新はwebアクセスのgetメソッドで行います。
http://free.ddo.jp/dnsupdate.php?dn=xxxx.ddo.jp&pw=xxxxxx
にアクセスすることで DDNSが更新されます。

Linuxからの更新は具体的には、
wget -O - 'http://free.ddo.jp/dnsupdate.php?dn=xxxx.ddo.jp&pw=xxxxxx'
のコマンドを cronで一日一回の周期で定期的に行うように設定します。

このDNS更新方法の欠点は、httpのgetメソッドを使うため登録ドメインと登録用パスワードが平文でインターネット上を流れる、という事です。
これらが第三者に漏洩するとファーミングされてしまい、正しいドメインを指定しても第三者が指定したサーバに接続されてしまうので注意が必要です。
(注意といっても、気が付いたときにはもう遅いんだけどさ)





2012/01/21

自宅サーバをAWSへ移行する検討

これまで10年以上前から、時代遅れのCPU(Pentium時代にi386を使うとか)を搭載した中古ノートPCを安く購入しては自宅に設置し、基本的に24h/7dサーバを運用してきました。
CPUパワーは必要としないので問題はないのですが、ストレージやメインメモリの容量制限から数年ごとにリプレースする必要が生じ、そのたびに次の中古PCを購入してはOS(Debian GNU/Linux 1.3(bo)の頃から Debian一択です)を入れ替えてきたのが、そろそろ疲れた…
と思って先日 Xenによる仮想環境を作成してハードウェア変更に伴う環境構築のやり直しは回避できる環境にしましたが、そろそろ...

中古のノートPCを24h運用するのはやはりあまりよろしくないであろうということから、Amazon Web Servicesの一つ Amazon EC2で仮想サーバを借りて運用することにしました。
EC2はよくあるWebベースレンタルサーバー(?)と異なって sshログインして ターミナル上で rootになって何でも作業できるので自由度も違います。

それにいまなら(2012/1/19現在) マイクロインスタンスのLinux(or Windows Server)を1年間無料で使用できます。(http://aws.amazon.com/jp/free/)
マイクロインスタンスは 613 MB メモリ、5GBストレージ、32ビッドまたは64ビットプラットフォーム で、CPUは他インスタンスの空きリソースを使うタイプですが、現在自宅サーバで使用している EeePC 4G-Xに比べれば十分なスペックです。
(インスタンスについては http://aws.amazon.com/jp/ec2/ を参照してください)
1年間の無料期間が終了しても、同じマイクロインスタンスであれば オンデマンドからリザーブドインスタンスにして 1年間 $65+$0.009/時*750時間 = $71.75 ですから格安です。
AWS EC2の価格設定は、CPUやメモリのサーバスペック、使用するストレージ、データ転送量などいろいろな要素があるので公式サイトで確認してください。無料マイクロインスタンスも各種制約があります。 (http://aws.amazon.com/jp/ec2/pricing)

早速 AWSにweb経由で登録すると、本人確認用の電話が掛かってくるので正しくpin番号を音声で伝えます。英語で答えても発音が悪いらしく何度言っても全く伝わらなかったのですが、日本語で答えたらOKでした...

AWSアカウントが作成したら、AWS Management Consoleにログインして Launch Instance でインスタンスを作成します。
DebianはCommunity AMIsから選択する必要があり、私は EBS image のDebian 64bit (rightimage_debian_6.0.1_amd64_20110405.1_ebs) を選択しました。



さぁ、遊びましょう!







2012/01/12

Blogpress update again, again

Blogpressが再び更新されて ver.3.0.2 になったので試してみます。
line breakのbugfixと書かれていたから、今度こそ大丈夫...と願いたいところです。
日本語の変換カラムに隠れる問題は治っていないようで、少々残念です。

追記
改行問題は解決しています。
この記事を読み返してみると、小学生の作文みたいですね。





2012/01/04

Blogpress update again

iPhone/iPad アプリケーション Blogpress がまた更新されたので、さっそく使ってみました。 改行問題は解決したかな? カーソルが漢字変換カラムに隠れる問題は再発しているようだ。非常に入力し辛い、何とかして欲しいものです。 追記 改行は勝手にはいらないようです。