Monthly Archives: March 2014

Raspberry Pi購入とセットアップ

Raspberry Piを買ってしまった。
ま、ほら、消費増税前だし。

セットアップ!
私はCentOSが好きなのです。CentOSのロングサポートはすごいと思います。が、Raspberry PiにインストールしたのはRaspbian。情報が多かったので、Raspbianにしました。

インストールはいろいろなサイトに書いてあるので、省略します。
MacではddコマンドでSDカードにインストールすると良いでしょう。

HDMIケーブルでテレビにつないで、Desktopを試しました。軽量と言われるブラウザMidoriも、重い・・・。w3mとかにするべきかも。そういえば、前の会社でよくw3m使ってたなあ。上司に遊んでいるのがバレないのがいいんですよね(おいおい)。さておき、w3m使うんじゃあ、別にXでログインする必要も無いか。

ということで、使い道としては、サーバ用途だろうと思います。消費電力も少ないし。ホームサーバとして今後は使っていこうかな。何に使うかなあ。悩むなあ。まずはVPNサーバかなあ。

自慢の腕時計Olient Starと比べてみました。小さい。かわいい。無線LANにするためのUSBのアダプタも買ったのですが、電力消費が多くなるそうなので、しばらくは有線で使ってみます。動かさないしね。

Raspberry Pi

RubyでTwilio使って電話してみた

池澤あやかさんがTwilio使って電話しているのを見まして(MacPeople)、面白そうだなあと思ったので、私もやってみました。前に「Zabbix Conference Japan 2013」で「Zabbix × Twilio でサーバー監視電話連絡の自動化」という発表を聞いたことがあって、Twilioが気になってはいたんですよね。けけけ、けっして、池澤あやかさんがやってたから真似した訳ではないです。

そもそもTwilioとは何か?
公式ページから引用しましょう。

「Twilio を使えば、標準的なウェブ言語を使用して、簡単に、インテリジェントな音声通話アプリケーションを構築できます。 Twilio は従来のテレコム サービスの世界と IPコミュニケーションの橋渡しをします。」

自由かつオープンにテレコムサービスを利用できる。素晴らしいです。本来はNGN(Next Generation Network)にこのような役割が期待されていたと思うんですけどね。残念ながら、いまだNGNは自由でもオープンでもないですからねえ。残念なことです。

利用するにはまず登録が必要です。Twilioのサイトに行く。
日本だとKDDIのグループ会社であるKDDIウェブコミュニケーションズが事業として運営しているようです。うーん、通信キャリアの色が付くのは微妙だなあ。
ともあれ、登録。利用登録ボタンから登録するだけです。テストコールもかかってきます。トライアル中は無料。ただ、いつトライアル終わるのかが不明瞭です。使用量が一定量に達したら使えなくなるみたいです。

Rubyから電話をかける方法は、Twilioのブログに載っていますし、ログイン後の「Api Explorer」というコーナーでサンプルスクリプトを見ることもできます。サンプルは、なんと、Curl/Ruby/PHP/Python/Node.js/Java/C#が用意されています。好きな言語で書けるのはいいですなあ。

Twilioはマークアップ言語TwiMLを使います。TwiMLでTwilioにしゃべらす内容などを書きます。TwiMLはTwilioが読める場所に無いといけません。つまりインターネット公開する必要があります。私は自分のWebサーバを使いました。持っていない人は、TwiML用のホスティングサービスなどがありますので、そちらを使うといいかも。

日本語も話せますが、とりあえず英語にしてみました。

このwelcome.xmlをWebサーバに置きます。
ここでは仮にhttp://hogehoge/welcome.xmlとしておきます。

続いて、Rubyでコードを書きます。Ruby 2.1.1を使用。
まずはtwilio-rubyを入れます。

# gem install twilio-ruby

サンプルを参考に(というかそのまま)書く。

これで準備完了。

$ ruby call.rb

と実行すると、電話がかかってきました!
試用期間中はTwilioの宣伝文言が入りますが、その後、男性の声で「Welcome to Twilio!」と話してくれました。

TwilioのWebサイトを見てみると、IVRとかも作れちゃうようです。
これは色々な可能性があるなあ。

さくらのVPSにRuby 2.1.1を入れた

さくらのVPS(CentOS 6.5)にRuby 2.1.1を入れました。
こちらのサイトを参考にさせていただきました。

普通にyumでインストールしようとしたのですが、

# yum install ruby
================================================================================
 Package                Arch         Version                Repository     Size
================================================================================
Installing:
 ruby                   x86_64       1.8.7.352-13.el6       updates       534 k

なー、古い!

インストール方法をいろいろと調べたところ、Ruby Version Manager(RVM)というものを使うべきだそうな。本家でも紹介されていました。

事前準備。

# yum install gcc-c++ patch readline readline-devel zlib zlib-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison gdbm-devel tcl-devel tk-devel libxslt-devel libxml2-devel
# yum install --enablerepo=epel libyaml-devel

RVMのインストール。私しか使わないサーバなので、ユーザ毎に環境を作る必要性はなく、rootでインストールすることにしました。/usr/local配下にインストールされます。

# curl -L https://get.rvm.io | bash -s stable
...
  * First you need to add all users that will be using rvm to 'rvm' group,
    and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.

  * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
    in all your open shell windows, in rare cases you need to reopen all shell windows.

上記のメッセージが出ますが、rootで使うだけだったら、いったんログアウトしてログインすればオッケーみたい。

# rvm -v
rvm 1.25.22 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

# rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-p374]
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p320]
[ruby-]1.9.3[-p545]
[ruby-]2.0.0-p353
[ruby-]2.0.0[-p451]
[ruby-]2.1[.1]
[ruby-]2.1-head
ruby-head

インストール。コンパイルするので時間がかかります。

# rvm install 2.1.1
# rvm docs generate-ri

無事にインストールできました。

# ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

# irb
2.1.1 :001 > puts "Hello! World!"
Hello! World!
 => nil 

一般ユーザでもRubyを使う場合は、source /etc/profile.d/rvm.shを実行します。

$ source /etc/profile.d/rvm.sh

$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

$ irb
2.1.1 :001 > puts "Hello! World!"
Hello! World!
 => nil 

終わり。

さくらVPSでdenyhosts

logwatchでログ監視してますが、結構いろいろなところからのアクセスがあります。
denyhostsはログを監視して、不正と思われるIPアドレスを/etc/deny.hostsに追加してくれるソフトです。

$ sudo yum -y install denyhosts
...
Installed:
 denyhosts.noarch 0:2.6-19.el6

Complete!
$ sudo service denyhosts start
Starting denyhosts: [ OK ]
$ sudo chkconfig denyhosts on

これでいいはず。

さくらのVPSでApacheのVirtualHostを使う

1台のマシンで複数のサイトを立ち上げたい場合、VirtualHostを使います。公開するドメインと、それ以外とを分けておきたいと思ったので、VirtualHostの設定を行いました。

まず、/etc/httpd/conf/httpd.confのVirtualHostのサンプル設定を消します(重要)。
その後、/etc/httpd/conf.d/virtualhost.confに以下を設定しました。
VirtualHost毎に設定を分けるとか、色々な方法があるみたいです。

NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName hostname1.com:80
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/html2
    ServerName hostname2.com:80
</VirtualHost>

SSLでもアクセス可能にする場合は、ポート443のNameVirtualHostを作ってあげる必要があります。で、VirtualHost毎に設定してあげると。

NameVirtualHost *:443

<VirtualHost *:443>
    DocumentRoot /var/www/html
    ServerName hostname1.com:443
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/hogehoge.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/hogehoge.key
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot /var/www/html2
    ServerName hostname2.com:80
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/hogehoge2.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/hogehoge2.key
</VirtualHost>

さくらのVPSにアンチウィルスソフトClam AntiVirusを入れる

メールサーバの運用をしていることから、アンチウィルスソフトを入れなくてはと考えました。インストール方法は、ほぼすべてこちらに書いてある通りでオッケーです。素晴らしい。

$ sudo yum -y install clamd
$ sudo vi /etc/cram/cramd.conf
#User clam
#TCPSocket 3310
#メールサーバと連携させるため、TCPはオフにしておきます。

$ sudo freshclam

$ sudo service clamd start
$ sudo chkconfig clamd on

$ sudo clamscan --infected --remove --recursive

参考サイトにある一日一度のスキャン設定も入れておきました。

さくらのVPSをメールサーバとして利用する

さくらのVPSにドメインを割り当てたので、メールサーバの設定をすることにしました。しかし、いろいろとトラブルに見舞われました。

当たり前のことですが、設定内容をちゃんと理解してからメールサーバ設定をするようにすると、失敗が少なくなると思います。適当にあれこれ設定して、いろいろとミスしてしまいました。反省反省。

まずはメールの仕組みを把握することが重要です。これについては色々なサイトや本があるので、それを読んでおけばOKですね。中でも、SMTPで利用するSMTP AUTHの理解が重要です。こちらのサイトが非常によくまとまっています。設定については色々なサイトを参考にしましたが、特にこちらこちらのサイトが参考になりました。

仕組みを理解したら設計します。
プライベートなので、頭の中で設計してもいいと思います。どのような構成にするかを考えます。特にセキュリティ。以下の構成にしました。

・送信サーバ=Postfixを利用。SMTP AUTHで認証。SASLでSASL独自のパスワードデータベースを利用します。サブミッションポートを使い、通信はTLSで暗号化。
・受信サーバ=Dovecotを利用。IMAP。Linuxユーザとパスワードで認証。通信はTLSで暗号化。

TLSを使うと決めたからには、まずは証明書を作成します。
make  mail.pemしたら、促されるままにいろいろと設定すればオッケー。

$ cd /etc/pki/tls/certs
$ sudo make hogehoge.pem

続いてPostfixの設定をします。SASLとTLSを使うと。私はmaster.cfの設定が間違っていて(TLSをONにしていなかった)、かなりハマってしまいました。気をつけましょう。

$ sudo vi /etc/postfix/master.cf
 submission inet n - n - - smtpd
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 smtps inet n - n - - smtpd
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes

main.cfではMaildir方式を用い、メールを10MBに制限します。

$ sudo vi /etc/postfix/main.cf
 broken_sasl_auth_clients = yes
 disable_vrfy_command = yes
 home_mailbox = Maildir/
 inet_interfaces = all
 message_size_limit = 10485760

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
 mydomain = ほげほげ.com
 myhostname = mail.ほげほげ.com
 myorigin = $mydomain
 smtpd_banner = $myhostname ESMTP unknown
 smtpd_client_restrictions = permit_mynetworks,reject_unknown_client,permit
 smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
 smtpd_sasl_auth_enable = yes
 smtpd_sasl_local_domain = $mydomain
 smtpd_sasl_security_options = noanonymous
 smtpd_sender_restrictions = reject_unknown_sender_domain

smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
 smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
 smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
 smtpd_use_tls = yes

Dovecotをインストールし、各種設定を行います。

$ sudo  yum -y install dovecot

$ sudo vi /etc/dovecot/dovecot.conf
protocols = imap pop3
#imapsとかpop3sの設定は不要です。入れると起動時にワーニングが出ます。

$ sudo vi /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login

$ sudo vi /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

$ sudo vi /etc/dovecot/conf.d/10-master.conf
#ポート番号を適切に設定(コメントアウトを外す)

$ sudo vi /etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </etc/pki/tls/certs/hogehoge.pem
ssl_key = </etc/pki/tls/certs/hogehoge.pem

Maildir形式を使うので、スケルトンを作りつつ、既存ユーザ(sampleuser)に対してはMaildirを作ってあげます。

$ sudo mkdir /etc/skel/Maildir
$ sudo chmod 700 /etc/skel/Maildir
$ sudo mkdir /home/sampleuser/Maildir
$ sudo chmod 700 /home/sampleuser/Maildir
$ sudo chown sampleuser:sampleuser /home/sampleuser/Maildir

SMTP AUTHパスワードの設定。SASL独自のパスワードデータベースsasldbを使うので、「auxprop」を指定します。

$ sudo vi /etc/sasl2/smtpd.conf
pwcheck_method: auxprop
mech_list: cram-md5 digest-md5 plain login

パスワード設定。

$ sudo saslpasswd2 -u ほげほげ.com -c sampleuser
$ sudo sasldblistusers2

sasldbのパーミッションを変更し、postfixグループとします。

$ sudo chmod 640 /etc/sasldb2
$ sudo chgrp postfix /etc/sasldb2

 起動させる。

$ sudo chkconfig postfix on
$ sudo chkconfig saslauthd on
$ sudo chkconfig dovecot on
$ sudo service postfix start
$ sudo service saslauthd start
$ sudo service dovecot start

あとはテストです。
当たり前ですが、メーラを正しく設定しておかないとメール送受信できません。
SMTP AUTHを使うとか、TLSを使うとか、自分で決めたとおりにメーラに設定して送受信試験を行います。これもいろいろと間違っていて、時間かかってしまいました・・・。
MacだとAirmailがオススメです。テストボタンもあるし、試験しやすいので。

やはり、メールのセットアップは大変です。これだけでも大変なのですが、まだまだやることがあります。それはまた今度の機会に。

さくらのVPS再起動時にApacheが起動しない問題((98)Address already in use: make_sock: could not bind to address 0.0.0.0:80)

さくらのVPSを再起動した際に、Apacheが起動しない問題があって悩んでいました。
起動させようとしてコマンドを打つと、以下のエラーが出て起動しないのです。

(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80

# service httpd start
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs   [FAILED]

Googleで調べると、こちらのサイトに解決策が載っていました。
以下のようにします。

# /usr/sbin/lsof -i | grep http
httpd 1646 root 4u IPv6 10967 0t0 TCP *:http (LISTEN)
httpd 1646 root 6u IPv6 10971 0t0 TCP *:https (LISTEN)
# kill 1646
# service httpd start

それにしても原因は何だろうなあと、調査を続けたところ、こちらのサイトに原因が書いてありました。証明書にパスフレーズを設定しているのが原因らしい。解決策としては、パスフレーズを抜くか、SSLPassPhraseDialogを設定してパスフレーズを渡してやればいいみたい。少し悩んだのですが、SSLPassPhraseDialogを使う場合は、スクリプトファイルにパスフレーズを記載しなければならず、それはそれでセキュリティ的にどうなのかなあと思ったので、さくっとパスフレーズを削除することにしました。

# cp server.key server.key.backup
# openssl rsa -in server.key -out new.server.key
# mv new.server.key server.key
# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]

これでさくらのVPSを再起動したときにも、Apacheが自動で起動するようになりました。