KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

IDCFクラウドに300円サーバーを作ってみた。

クラウドサーバーがあっちこっちにあって、どこがいいのだか全く謎ですが、ワンコイン(500円)という最小価格の安さでプッシュしている感の強いIDCFクラウドが目にとまりました。

とりあえず仮想マシン作成のテンプレートを眺めていたら、Ubuntu16.04がなくて悲しくなりましたが、公式以外の公開テンプレートを物色したところ、以下のような記事で紹介されているテンプレートを発見。

cloudyarouze.blogspot.jp

さくらクラウドやconohaクラウドだと仮想マシンの停止だけだと課金が続くので、こういう使い方には向かなくて、AWSとかの方になるだろうなと思っていたら、IDCFクラウドならディスクの方の課金は止まりませんが、マシン分の課金が止まるので、かなりお安くちょっとしたサーバーを建てられるということになるようです。

上のテンプレートを使うのもいいんですけど、せっかくなので、使ってみたかったSnappy Ubuntu Coreさんを使ってみることにしました。ここでIDCFクラウドのマイテンプレートなる機能が、力を発揮してくれます。

SnappyをIDCFクラウドで立ち上げるまで

1. マイテンプレートにSnappy Ubuntu CoreのOVAイメージをつくる

Snappyのページ(の下の方)から、OVAのイメージダウンロードURLを取得。 https://developer.ubuntu.com/en/snappy/start/#ova

今回、自分が使ったのはこのURL。 http://cloud-images.ubuntu.com/ubuntu-core/15.04/core/stable/current/core-stable-amd64-cloud.ova

マイページ→コンピューティング→テンプレートとたどっていくと、以下のようなテンプレートの管理ページが開きます。

f:id:kacchan822:20160915214825p:plain

ここで右上の緑色の「テンプレート作成」をクリックすると、以下のような画面がポップアップしてくるので、先ほど取得したURLをURLのところに入れて、その他の必須項目をいい感じ設定してあげて、フォームの最下部にある緑色の「テンプレートを作成」ボタンをクリックすれば作成が始まります。

f:id:kacchan822:20160915214839p:plain

ややしばらく待つと、

f:id:kacchan822:20160915215211p:plain

ステータスが「Download Complete」になってテンプレートが使える状態になります。

2. 作ったマイテンプレートから仮想マシンをつくる

コンピューティングの画面を開いていれば常に画面左上に入るっぽい水色の「仮想マシン作成」をクリックして、先ほど作ったマイテンプレートを指定してつくれば、OKです。

f:id:kacchan822:20160915215429p:plain

最小のプランのlight.S1で追加ディスクなし(ルートディスクの5GBのみ)にすれば、月額300円上限のお安いサーバーが仕上がります。

3. SSH接続のためのNAT設定をする

サーバーが立ち上がるまで少しだけ待ち時間があるので、この間にNATルーターの設定をしてあげます。IDCFクラウドの仮想サーバーたちは、デフォルトだと閉じたクラウドネットワークの中にいるようで、グローバルからつながりません。FWとポートフォワードの設定をしてあげる必要があります。

左側のメニューリストの「IPアドレス」をクリックするとグローバルIPの一覧が出るので、一つデフォルトで割り当てられるIPアドレスの名前をクリックして設定画面を開きます。

まず、FWで必要なポートを開けます。SSHの標準22を開けるのもありですが、雑な攻撃対策として、ポートを変えてみました。とりあえず2000とかにしてみます。 f:id:kacchan822:20160915220721p:plain

FWで開けたポートに対応するように、ポートフォワードの設定をします。
パブリックポートはFWで開けた、2000、プライベートポートは仮想マシンは標準ポートでSSHを待ち構えているので、22を指定します。仮想マシン側のsshの設定ファイルを調整せずにSSHのポート変更ができるという意味では、VPSとかを使う時より楽ちんです。 f:id:kacchan822:20160915220732p:plain

SSH接続できるか確認してみます。ユーザー名はubuntuで、ポート2000、仮想マシン作成時に指定した公開鍵とペアの秘密鍵を使って接続します。 f:id:kacchan822:20160915222203p:plain

うまくいけば、ウェルカムなメッセージが出るはずです。よきSnappyライフを。


という具合にして300円サーバーが出来上がりました。厳密には、マイテンプレートの保存料金が誤差の範囲ぐらいの額かかるようです。月額30円上限?課金の部分についてはよくわかりませんので、気になる方は実践する前にIDCFクラウドサポートに問い合わせてください。書いてある通りにやったら、300円以上かかったじゃないか!と言われても、私は責任を負いかねます....ご注意を。

国内のクラウドサービスとしては通信量に対する課金が無いところが多いイメージですが、IDCFクラウドは、デフォルトだと、月間3TBまでの通信が無料で、それ以上は従量課金ということです。3TBに行くのかな....。少し使ってみて様子を探ります。

PostfixAdmin的なものを作ってみた。

1台のメールサーバーで複数ドメイン運用したり、システムアカウントと連動せずにメールアカウント運用したいとかのときに、便利なPostfixAdmin( Postfix Admin - Web based administration interface)さん。

わたくしもお世話になっておりましたが、MySQLPostgreSQLと一緒にメールサーバーを動かしてあげないといけないのが面倒になってきた今日この頃...。LXDコンテナで流浪人のように移動しやすいコンテナとしておきたいわけです。もちろんMySQLでもPostgreSQLでもコンテナごと動かす分にはいんですけど、システムリソース的に...ということで...。

そんなオレオレ要件を満足させるものを作ってみました。 github.com

バーチャルメールユーザー管理画面

f:id:kacchan822:20160911135015p:plain

バーチャルメールユーザーの変更画面

f:id:kacchan822:20160911135033p:plain

バーチャルメールエイリアス管理画面

f:id:kacchan822:20160911135020p:plain

バーチャルメールエイリアスの変更画面

f:id:kacchan822:20160911135448p:plain

バーチャルメールドメイン管理画面

f:id:kacchan822:20160911135023p:plain

バーチャルメールドメインの変更画面

f:id:kacchan822:20160911135511p:plain

今回使ったもの

Pythonの軽量フレームワークのBottleをメインにして、UI部分と入力制御系をJavascriptで実装してみました。
本当は、PostfixAdmin的にユーザーログインによる認証機構もつけようとしたのですが、オレオレツールとしては、取り急ぎ必要ではないという英断により、未実装。これからお勉強がてら実装したいです。
Cork - Authentication for the Bottle web frameworkというのを使えばよさげかなと思っています。

今回、ちょっと積極的にcodeclimateさんのチェックを通しながらやったら、確かにコードが短くなったり煩雑だったところがすっきりとしました。(最初のコーディングが美しくな過ぎたというのはさておき....pythonやら、javascriptやら、jQueryやら、PostfixやらDovecotやらsqlite3やらいろんな勉強になったので、個人的には満足です。(これってよくあるダメなやつじゃないか...)

いうまでもなく、現状としてはデバックもかねて、SSHトンネル経由でbottleの簡易サーバー機能をそのまま使って動かしているレベルなので、実運用レベルにはありません。


ちなみにGoogle先生に「postfixadmin sqlite」尋ねてみたら、こんなのがあった。

github.com

2010年3月ごろからある模様。MySQLやらPostgreSQLやらを使ってやるまでの規模じゃないんだけど...なことはそりゃ考えるよな。


(2016.09.15 追記)

2016/09/12にPostfixAdmin3.0がついにリリースされたようで、なんと、add sqlite backend optionと言っているので、動作検証していないけどsqliteでも使えるようになったようです。

sourceforge.net

0. Raspberry Pi3 の初期セットアップ

Raspbery Pi3のセットアップの記事を探すとさくっと出てくるのはディスプレイを繋いで、マウスとキーボード繋いで式だったりしますが...

HDMIの繋がるディスプレイなんてないよ!」
でも大丈夫!僕らにはSSHがあるじゃないか。

「有線LANとか繋ぐのだるくね?」
でも大丈夫!wifiの設定ファイルを書いちゃっとけばいいじゃないか。

という我が家の環境を鑑みたバージョンでお送りします。

Raspbianイメージの書き込まれたmicroSD作成

1. OSイメージファイルのダウンロード

Download Raspbian for Raspberry Pi
素直にRaspbianにしておく。あとでリモートデスクトップとか別所で画面つないで使うこともあるので、「Full desktop image based on Debian Jessie」の方を利用。

2. OSイメージをmicroSDに書き込む

Installing operating system images - Raspberry Pi Documentation
公式殿のドキュメントにしたがってやればよい。Ubuntu16.04環境でやると以下のような流れ。

## SDカードのマウント状況確認
kacchan822@ubuntu16:~$ df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         7.8G     0  7.8G   0% /dev
tmpfs                        1.6G  9.5M  1.6G   1% /run
/dev/mapper/ubuntu--vg-root  101G   45G   52G  47% /
tmpfs                        7.8G  390M  7.4G   5% /dev/shm
tmpfs                        5.0M  4.0K  5.0M   1% /run/lock
tmpfs                        7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/sda2                    237M  171M   54M  77% /boot
/dev/sda1                    511M  3.6M  508M   1% /boot/efi
cgmfs                        100K     0  100K   0% /run/cgmanager/fs
tmpfs                        1.6G   80K  1.6G   1% /run/user/1000
/dev/mmcblk0p1                15G  8.0K   15G   1% /media/kacchan822/9779-6F81


## microSD(/dev/mmcblk0p1)がマウントされていたのでマウント解除
kacchan822@ubuntu16:~$ umount /dev/mmcblk0p1

### マウント解除されたのを一応確認
kacchan822@ubuntu16:~$ df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         7.8G     0  7.8G   0% /dev
tmpfs                        1.6G  9.5M  1.6G   1% /run
/dev/mapper/ubuntu--vg-root  101G   45G   52G  47% /
tmpfs                        7.8G  390M  7.4G   5% /dev/shm
tmpfs                        5.0M  4.0K  5.0M   1% /run/lock
tmpfs                        7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/sda2                    237M  171M   54M  77% /boot
/dev/sda1                    511M  3.6M  508M   1% /boot/efi
cgmfs                        100K     0  100K   0% /run/cgmanager/fs
tmpfs                        1.6G   80K  1.6G   1% /run/user/1000


### ダウンロードしたOSイメージファイルのディレクトリへ移動・ファイル存在確認
kacchan822@ubuntu16:~$ cd Downloads/
kacchan822@ubuntu16:~/Downloads$ ls
2016-05-27-raspbian-jessie.img


## OSイメージの書き込み
### さっきのアンマウントしたのは、「/dev/mmcblk0p1」だけど、書き込み先としては、「/dev/mmcblk0」になるので注意って公式ドキュメントも言っている。
kacchan822@ubuntu16:~/Downloads$ sudo dd bs=4M if=2016-05-27-raspbian-jessie.img of=/dev/mmcblk0
[sudo] password for kacchan822: 
958+1 records in
958+1 records out
4019191808 bytes (4.0 GB, 3.7 GiB) copied, 859.35 s, 4.7 MB/s

## 公式殿にはこのあとmd5チェックサムで書込結果の検証する方法が紹介されているけど、大丈夫だと信じて割愛。
3. Wi-fiの設定ファイルを編集する。

2.でOSイメージを書き込んだSDカードをマウントし直す。コマンドでやればいい気もするけど、一回抜いて、挿し直せば自動でマウントしてくれるはず。

「boot」と「2f840c69-cecb-4b10-87e4-01b9d28c231c」というようなのがマウントされるので、長ったらしい名前の方のマウントされている方の中にあるwifiの接続設定ファイルを編集れば、有線で最初に一度繋がなくていい。

## 設定ファイルのあるディレクトリへ移動
kacchan822@ubuntu16:~$ cd /media/kacchan822/2f840c69-cecb-4b10-87e4-01b9d28c231c/etc/wpa_supplicant/

## 設定ファイルを開く(root権限(SUDO)で開く必要がある。)
kacchan822@ubuntu16:/media/kacchan822/2f840c69-cecb-4b10-87e4-01b9d28c231c/etc/wpa_supplicant$ sudo vi wpa_supplicant.conf 

設定ファイルを以下のように編集する。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
    ssid="接続するwifiのSSID"
    psk="接続するwifiのパスワード"
    key_mgmt=WPA-PSK
}

countryは後でも直せるけどついでなのでJPにしておく。 wifiのセキュリティ設定によって、少し設定値が変わってくるだろうけど、 wpa_supplicant.conf(5) - Linux man pageを参考にすれば大丈夫かなと。

完成!

取り出しておく。

Raspbery Pi3を起動してSSH接続

1. OS起動!

f:id:kacchan822:20160813145901j:plain OSイメージの入ったmicroSDをRaspberry Pi3に差し込んで、microUSBで給電するとピカピカと、赤および緑のランプが光って起動を始める。緑のランプの点滅が落ち着いた頃合いでsshしてあげるとよさ気。

2. SSHで接続

IPアドレスDHCPで割り当てられるだろうので(固定にしたかったら、wifiの設定をした流れでついでにネットワークせってファイルもいじっとけばいいだろう)、ipアドレスがわからないが、、、

kacchan822@ubuntu16:~$ ssh pi@raspberrypi.local

と叩けば、うまいこと見つけて接続してくれる。初期パスワードは「raspberry」なので、パスワードを聞かれたら入力してあげるとログインできる。

とりあえずアップデートとか

ログインできたらとりあえず、初期パスワードからログインパスワードを変更したり、ソフトウェアアップデートをしたり、raspberrypiの設定値をいろいろ調整したりしておく。

## ログインパスワード変更
pi@raspberrypi:~ $ passwd

## アップデート(結構時間かかる)
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade

## 設定値の変更
pi@raspberrypi:~ $ sudo raspi-config 

ひとまずこんなところでしょうか。raspi-configの各種設定値はお好みで。Expand Filesystemは、32GB、16GBのは特にしなくてもうまいことなっている感じだった。

kitaeng.hateblo.jp

Raspberry Pi3 で子どもたちと「遊ぶ」までの道のり(とりあえず自分で遊んでみる編)

前々から気になっていたRaspberry Piですが、なんだかんだとウダウダしていて、なかなかポチッとなしてなかったのですが、実験やらプログラミングやら電子工作やらして子どもらと遊ぶことになったので、ついに購入。

子どもらとどうやって遊ぶかも含めて、まずは自分で遊び倒してみることにしたはいいが、やれることが無限大すぎて、どこから手をつけたらいいものやらなので、Raspberry Pi3と一緒に注文してみた、以下のキットに含まれる部材でできることをいろいろやってみることにする。

amzn.to

とりあえず以下予定。

  • 0. Raspberry Pi3 の初期セットアップ
  • 1. Raspberry Pi3 でLEDをチカチカ
  • 2. Raspberry Pi3 でLCDに文字表示
  • 3. Raspberry Pi3 で温度センサーで室温取得
  • 4. Raspberry Pi3 でフルカラーLEDをチカチカ
  • 5. Raspberry Pi3 でモーター制御
  • 6. Raspberry Pi3 でサーボモーター制御

Apache 2.4 + MariaDB 5.5 でmod_dbd を使ったDigest認証の設定をしてみた。

使いどころがあるのか謎だけど、Apacheの認証系でもDB連携あるぞというのをたまたまみかけたので、やってみた。

環境

必要なパッケージのインストール

DBドライバーのインストール。今回は、MariaDBで試すので、apr-util-mysqlをインストール。

Daigest認証用のDB.TABLE作成、ユーザーデータ登録

まずDBとテーブルを作る

DB名:apacheauth (任意)
TABLE名:digest_auth_users (任意)

CREATE DATABASE apacheauth;

CREATE TABLE digest_auth_users (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    user VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    realm VARCHAR(255) DEFAULT 'AuthRequirePage'
);

** realmは後にApacheの設定でAuthNameで指定する文字列。

Apacheからデータを参照するためのDB接続ユーザーを作成する

基本的には参照権限だけあれば十分。プログラムで動的に変更するなど操作を同じユーザーでさせるならば、UPDATEやDELETEも権限を与えてあげる。

GRANT SELECT ON apacheauth.* TO 'apache'@'localhost' identified by 'apache';
テスト用のユーザーデータを入れる

セキュアじゃないけど今回はDB上には平文のパスワードを保持させることにした。

INSERT INTO digest_auth_users ( user, password ) VALUES ( "test", "test" );
id user password realm
1 test test AuthRequirePage

Apacheの設定

conf/httpd.conf(またはconf.d/<任意の名称>.conf)または、VirtualHostディレクティブ内 に以下の記述を行う。

DBD~の部分は、Directoryディレクティブの中には書けないので注意。
参照 --> mod_dbd - Apache HTTP Server Version 2.4

DBDriver mysql
DBDParams "host=localhost,dbname=apacheauth,user=apache,pass=apache"
DBDMin 2
DBDKeep 2
DBDMax 10
DBDExptime 300

<Directory "/var/www/auth_html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require valid-user
    AuthType Digest
    AuthDigestAlgorithm MD5
    AuthName "AuthRequirePage"
    AuthDigestProvider dbd
    AuthDBDUserRealmQuery "SELECT MD5(CONCAT(user, ':', realm, ':', password)) AS password FROM digest_auth_users WHERE user = %s AND realm = %s"
</Directory>

今回はDBには平文でパスワードを保存したので、AuthDBDUserRealmQueryの部分でDB問合せ時に、Apachemod_auth_digestが求める形のパスワード形式(user:realm:passwordMD5ハッシュした32文字列)
参照 --> Password Formats - Apache HTTP Server Version 2.4

%sには、前から順に入力されたuser名AuthNameの値が入る。

一応SQLの部分だけ抜き出しておくとこんな感じ。

SELECT
  MD5(
   CONCAT(user, ':', realm, ':', password)
  ) AS password
FROM digest_auth_users
WHERE user = %s AND realm = %s

%sに入る値は、mod_dbdでうまいことSQLインジェクション対策として不正な文字列はエスケープしてくれるらしい。
参照 --> mod_dbd - Apache HTTP Server Version 2.4

完了!

あとはApacheの再起動をして設定を反映させればよい。