Ruby On Rails4 の開発を始められるまで その1

Ruby On Rails4 の開発を始められるまで その1

posted at 2014/01/14 by chikkun@コワーキングスペース町田

Ruby On Rails4の基本を、自分のメモも兼ねて、3回シリーズでご報告します。

今日はその第1回目(2回目はdeviseを使った認証機能の追加。3回目はRspecやCucumberを利用したテストの予定です)。

Railsを使って開発する直前までをまとめます。ただ一応、環境と目標とするのは以下のようです。OSの違いや、仮に同じOSでも微妙にバージョンで違ったりする場合もあるのでご注意下さい。

  1. OSはCentOS6.5とする(MarvericksにParallelsを利用して、SDカードにインストールしたもの—ほとんど何もインストールされていない)。
  2. アプリ名は「comachi」。
  3. Apache2+Passengerを利用し、標準で付いているWEBrickは利用しない。
  4. Railsは4とする。
  5. DBはPostgreSQLを利用する。
  6. 外見はTwitter Bootstrapを使用する。
rbenvのインストール

CentOS6ですとRubyが2系ではないので、まずはRuby2をインストールします。というのもRails4はRuby2を推奨しているからです。

ただ今後1.9等も必要になることが予想されるので、便利なrbenvを使ってRubyのバージョンを変えられるようにします。ただrbenvをインストールする前に、RubyやPassenger等で必要になりそうなものを事前にyumでインストールします。

$ yum -y install  yum-plugin-priorities zlib zlib-devel readline readline-devel openssl openssl-devel libxml2 libxml2-devel libxslt libxslt-devel httpd httpd-devel curl-devel bison gcc gcc-c++ git emacs
  • ※↑は1行です。
  • ※最後のemacsは、好みでvimなどでもw
  • ※上記のいくつかは、gitやapache、Passengerのインストールに必要なもの等も入っています。Passengerの場合は必要なものをインストール時に教えてくれるので、仮に足らなくても大丈夫です。
  • ※CentOSのバージョンによっては「–enablerepo=remi,epel」オプションを入れる必要があるかもしれません(6.5では必要はありませんでした)。

これで準備が出来たので、早速rbenvのインストールです。

# 必要に応じてsuなりsudoをして下さい
$ cd /usr/local
$ git clone git://github.com/sstephenson/rbenv.git rbenv
$ groupadd rbenv
$ chgrp -R rbenv rbenv
$ chmod -R g+rwxXs rbenv
$ cd rbenv
$ mkdir plugins
$ cd plugins
$ git clone git://github.com/sstephenson/ruby-build.git ruby-build
$ chgrp -R rbenv ruby-build
$ chmod -R g+rwxs ruby-build
環境変数の設定

rbenvのインストールは終わりましたが、環境変数を設定しないと使えません。

そこで環境変数を/etc/profileに設定します(「/etc/profile」を直接編集したくない場合は「/etc/profile.d/rbenv.sh」等に書くのも手です)。

$ emacs /etc/profile #viでも

で、一番下に以下のように環境変数を設定します。

export RBENV_ROOT="/usr/local/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

これを書き込んで、それら環境変数を読み込みます。

$ source /etc/profile
Autoconfのバージョンアップ

最新のRuby2.2-devのインストールでは、autoconfのバージョンが低いと怒られるので、m4とAutoconfの上書きバージョンアップを行います。

$ wget ftp://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz
$ tar xvzf m4-1.4.17.tar.gz
$ cd m4-1.4.17
$ ./configure --prefix=/usr
$ make
$ make install
$ cd ..
$ wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
$ tar xvzf autoconf-2.69.tar.gz
$ cd autoconf-2.69
$ ./configure --prefix=/usr
$ make
$ make install
インストール可能なRubyの確認

インストール可能なRubyのパッケージを確認する。

$ rbenv install -l
...
  1.9.3-rc1
  2.0.0-dev
  2.0.0-p0
  2.0.0-p195
  2.0.0-p247
  2.0.0-p353
  2.0.0-preview1
  2.0.0-preview2
  2.0.0-rc1
  2.0.0-rc2
  2.1.0
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.2.0-dev
...

バージョンはお好みで。とりあえずここでは「2.2.0-dev」をインストールします。

$ rbenv install 2.2.0-dev #時間はそこそこかかります
$ rbenv rehash # これをやる必要があります
$ rbenv global 2.2.0-dev
インストールできたか確認
$ ruby -v
ruby 2.2.0dev (2014-01-12 trunk 44563) [x86_64-linux]

OKのようですw

PostgreSQLのインストール

yum.postgresql.orgに行って「pgdg-centos93-9.3-1.noarch.rpm」を持ってきて、rpmを実行します。

wget http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm
rpm -ivh pgdg-centos93-9.3-1.noarch.rpm

すなわち、wgetでダウンロードし、rpmでrepositoryのファイルをインストールします。そして次にyumでPostgreSQLをインストールします。

yum install -y postgresql93-server postgresql93-devel postgresql93-contrib

次にお決まりの「initdb」をし、サーバーを立ち上げます。またOSを再起動しても自動で立ち上げるためにchkconfigし、ついでにapacheも自動起動するようにします。

さらに、postgresユーザのパスワードを作成し、新しいユーザ(chikkun)、データベース(comachi)を作成します。

$ /etc/init.d/postgresql-9.3 initdb
$ /etc/init.d/postgresql-9.3 start
$ chkconfig --level 345 postgresql-9.3 on
$ chkconfig --level 345 httpd on
$ su postgres
$ psql
% alter role postgres with password 'hogehoge'; #postgresユーザにパスワードを設定
% \q
$ createuser -P -s chikkun
Enter password for new role: 
Enter it again:
createdb comachi
$ exit

それから、/var/lib/pgsql/9.3/data/pg_hba.confを少々書き換えます。

local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

のpeer、identをmd5にします。

local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

そして再起動。

/etc/init.d/postgresql-9.3 restart

たぶん、PostgreSQLのRuby用のモジュールでインストールで失敗するので、先にオプションを付けて、インストールしていまいます。

gem install pg -- --with-pg_config=/usr/pgsql-9.3/bin/pg_config
  • ※上の「–」が余計に見えますが、これがないと「そんなオプションはないよ」と言われます(というか、言われ続けました・涙)。
Railsのインストール

さてさて、何はなくともRailsをインストールします。

$ gem install rails
$ rbenv rehash
$ rails -v
Rails 4.0.2

どうやら大丈夫そう。

passengerのインストール

次に、gemを使ってpassengerをインストールします。

gem install passenger
passenger-install-apache2-module

先回りして、必要なものをインストールしているので全く同じ環境ならば大丈夫ですが、環境が違っていたりすると、足らないものが出たりします。

しかし、そのような場合は、以下のようなメッセージで、必要なもののリストをyumコマンド付きで教えてくれるので、インストールしたら再度「passenger-install-apache2-module」を実行します。

Installation instructions for required software

 * To install C++ compiler:
   Please install it with yum install gcc-c++

無事コンパイルが始まって、終了すると以下のようなメッセージが出ます。このうち、最初の頃のLoadModuleの部分と、最後の辺りにあるVirtualHostの部分が必要になります。

The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/local/rbenv/versions/2.2.0-dev/lib/ruby/gems/2.2.0/gems/passenger-4.0.33/buildout/apache2/mod_passenger.so
   PassengerRoot /usr/local/rbenv/versions/2.2.0-dev/lib/ruby/gems/2.2.0/gems/passenger-4.0.33
   PassengerDefaultRuby /usr/local/rbenv/versions/2.2.0-dev/bin/ruby

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!

Press ENTER to continue.


--------------------------------------------

Deploying a web application: an example

Suppose you have a web application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public    
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /usr/local/rbenv/versions/2.2.0-dev/lib/ruby/gems/2.2.0/gems/passenger-4.0.33/doc/Users guide Apache.html

http://www.modrails.com/documentation/Users%20guide%20Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)

https://www.phusionpassenger.com

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

すなわち

LoadModule passenger_module /usr/local/rbenv/versions/2.2.0-dev/lib/ruby/gems/2.2.0/gems/passenger-4.0.33/buildout/apache2/mod_passenger.so
PassengerRoot /usr/local/rbenv/versions/2.2.0-dev/lib/ruby/gems/2.2.0/gems/passenger-4.0.33
PassengerDefaultRuby /usr/local/rbenv/versions/2.2.0-dev/bin/ruby

<VirtualHost *:80>
   ServerName www.yourhost.com
   # !!! Be sure to point DocumentRoot to 'public'!
   DocumentRoot /somewhere/public    
   <Directory /somewhere/public>
      # This relaxes Apache security settings.
      AllowOverride all
      # MultiViews must be turned off.
      Options -MultiViews
   </Directory>
</VirtualHost>

が必要になります。もっと具体的には、上のものはそのままhttpd.confにコピペ、下のものは自分の環境に合わせて書き換えた後にhttpd.comfに追記します。

実際には私の場合以下のようにしました。

<VirtualHost *:80>
    ServerAdmin hoge@fuga.com
    DocumentRoot /var/www/html/rails/comachi/public
    ServerName www.comachi.com
    ErrorLog logs/comachi.error_log
    CustomLog logs/comachi.access_log common
    RackEnv development
    <Directory /var/www/html/rails/comachi/public>
        Options -MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

という感じです。

  • ※実際にの「DocumentRoot」は違っていて、CentOS自体がSDカードに入っていて、そのSDカード自体にRailsアプリを置いてあるので、実際には/media/psf/UBUNTU/rails/publicで「UBUNTU」はSDカードのボリューム名です。

そこで、/etc/httpd/conf/httpd.confのLoadModuleを記載している最後に(今回の例では217行あたり)上記の3行を追加します。

そして、VirutualHostの設定はhttpd.confの最後に(ディストリビューションによっては別ファイルのことも)上記のを参考に追記します。

ここではrailsのアプリの場所が「/var/www/html/rails/comachi」としていますが、適宜置き換えて下さい。また、Rails的にはdevelopmentにしてあります。

もう1つ。SELinuxが悪さしてApacheが立ち上がらないので(というか必要なことなんでしょうが、開発ではいらないので)「/etc/selinux/config」を

SELINUX=disabled

とし、これは再起動後もdisabledにするものなので、コマンドラインでも

setenforce 0

として、現在も無効にします。そして

$ /etc/init.d/httpd restart

します。

最後にVirtualHostを使っているので、「/etc/hosts」の最初の行のローカルホストの部分に「www.comachi.com」を追記します。すなわち

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 www.comachi.com

さてさてあとは、railsのアプリを作成するだけです。

comachiアプリを作成

とりあえず今回のアプリ名を「comachi」と名付け、まずは何はなくともrailsコマンドのnewを実行します(comachiを作成する親ディレクトリにcdしてから)。

cd /var/www/html/rails
$ rails new comachi -d postgresql -T

※-Tはunit testを作成しないオプションで、Rspec等を使う場合には必要ないので付けました。

DBはsqliteがデフォルトなので、「-d postgresql」を付けてPostgreSQLを利用するようにします。ここで「Javascriptライブラリがない云々」とか怒られます。「therbyracer」を入れないとダメで、後で必要になるかもしれない「execjs」も含めて、GemFileに以下の2行を書き込みます。

gem 'therubyracer', platforms: :ruby
gem 'execjs'

そして

bundle install

を実行します。

外見はTwitter Bootstrap

Twitter Bootstrapを使ってデザインするので、Gemfileに以下を書き込みます(と思ったですが、後にこれは利用するBootstrapが2で、それ以外にgemなどで3が簡単に使えるようにならないか探したのですが、結局良さげなのがないのと「stackoverflow」であっさり、「ダウンロードしてvendor/assetに置くだけなんだから、自分でやれ」みたいなのを見て、全くその通りと思い、この方法をやめます)。

gem "twitter-bootstrap-rails"
gem "less-rails"

なので、↑はless-railsだけ残して、まずはBootstrapのダウンロードに行って、最新版をダウンロードして、解凍すると、

dist/
    css/
        bootstrap-theme.css
        bootstrap-theme.min.css
        bootstrap.css
        bootstrap.min.css ※
    fonts/
        glyphicons-halflings-regular.eot
        glyphicons-halflings-regular.svg
        glyphicons-halflings-regular.ttf
        glyphicons-halflings-regular.woff
    js/
        bootstrap.js
        bootstrap.min.js ※

というようなファイルが出てくるので、↑の※のファイルを(必要に応じて、追加します)

vendor/
    assets:
        javascripts/
            bootstrap.min.js
        stylesheets/
            bootstrap.min.css

というように、コピーします(vendorでなくても、「app/assets」でも大丈夫です)。
そして「app/assets/stylesheets/application.css」に

*= require bootstrap.min

を書き加えます。

また「app/assets/javascripts/application.js」に

//= require bootstrap.min

を書き込みます。

これで終了wtwitter-bootstrap-railsは使わないので、

gem "less-rails"

そして、以下を実行。

bundle install
最後にconfig/database.ymlの編集

データベースのinitdb で、作成したユーザやデータベース名に併せて、今回はdevelopment環境なので以下のように書き換えます。

development:
  adapter: postgresql
  encoding: utf8
  database: comachi
  pool: 5
  username: chikkun
  password: hogehoge

これで、ブラウザで http://www.comachi.com で次のような画面が見られたらOKです。

ok

これで開発が始められそうですw

『メールサーバを立てる』–まとめ–

せっかくメールサーバを構築したので、後々のためにブログに残しておくことにしました。

基本的な流れを追って、シリアスな(?)ところは省いたりしています。この設定でも十分実用的だとは思うのですが。

メールサーバを構築する

メールサーバの構成を決める

メールサーバをどのような形で守っていこうかを決めておきましょう。
特に、スパムメールの対処法とパスワード認証ですかね。全体的な構成を以下のようにします。

  • SpamAssassin(スパムアサシン)でスパムフィルタリング。
  • そのために、Procmailが必要。
  • IMAP / POP3 サーバは、Dovecot(ダヴコット)を使い、IMAPに設定します。
  • SMTPサーバは、Postfixです。
  • SMTPの認証は、saslauthdでプレインテキストまたはmd5ログイン認証とします。

必要なものをインストール

# yum install postfix dovecot spamassassin
# yum install cyrus-sasl cyrus-sasl-md5 cyrus-sasl-plain

※ Procmail はおそらくインストール済みと思います。

設定の大まかな流れ

dovecot 設定手順
  1. 各設定ファイルを編集する
    • /etc/dovecot/dovecot.conf
    • /etc/dovecot/conf.d/10-auth.conf
    • /etc/dovecot/conf.d/10-mail.conf
    • /etc/dovecot/conf.d/10-master.conf
    • /etc/dovecot/conf.d/10-ssl.conf
  2. サービス実行
    • systemctl start dovecot.service
  3. システム起動時にサービスを自動実行
    • systemctl enable dovecot.service
spamassasin 設定手順
  1. SpamAssassin用のユーザの作成
  2. SpamAssassin設定ファイル最新化スクリプトの作成
    • /etc/cron.daily/spamassassin-update
  3. SpamAssassin学習スクリプト作成
    • /etc/cron.hourly/spamassassin-learn
  4. procmail 設定ファイル作成
    • /etc/procmailrc
    • /etc/logrotate.d/procmail
  5. スパム専用メールボックス作成
    • 既存ユーザ用
    • 新規ユーザ用
postfix 設定手順
  1. Postfix 設定ファイル編集
    • /etc/postfix/main.cf
    • /etc/postfix/master.cf
  2. sendmail をやめて、postfix に切り替える

  3. postfix、saslauthd、spamassassinの実行およびシステム起動時の自動実行

設定の詳細

各設定ファイルの内容を中心に記録しておくことにします。

dovecot 設定

以前は一つのファイルで設定していたと思うのですが、設定内容ごとにファイルに分けられています。

/etc/dovecot/dovecot.conf
  # 24行: コメントを外し変更(複数記述できますが、そのポートが開きます)
  protocols = imap
  # 30行: IPv6を使わないときは、コメントを外し変更する
  listen = *
/etc/dovecot/conf.d/10-auth.conf
  # 10行: プレインテキスト認証の時には、コメントを外して変更する
  disable_plaintext_auth = no
  # 100行: 追加
  auth_mechanisms = plain login
/etc/dovecot/conf.d/10-mail.conf
  # 30行: コメントを外して追加
  mail_location = maildir:~/Maildir
/etc/dovecot/conf.d/10-master.conf
  # 96-98行: コメントを外して追加
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
      mode = 0666
      user = postfix # 追加
      group = postfix # 追加
  }
/etc/dovecot/conf.d/10-ssl.conf
  # 8行: SSLを使わないので変更
  ssl = no
spamassasin 設定
SpamAssassin用のユーザの作成
 # groupadd spamd
 # useradd -g spamd -s /bin/false -d /var/log/spamassassin spamd
 # chown spamd:spamd /var/log/spamassassin
SpamAssassin設定ファイル最新化スクリプトの作成と実行
  • spamassassin-update を作成する。

    #!/bin/bash
    # SpamAssassin設定ファイル最新版ダウンロード
    cd /etc/mail/spamassassin
    wget -qN http://www.flcl.org/~yoh/user_prefs
    
    # 設定ファイル更新時のみSpamAssassin再起動
    diff user_prefs user_prefs.org > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    cp user_prefs local.cf
    
    # スパム判断したメールを添付形式にしないように設定
    echo "report_safe 0" >> local.cf
    
    #ベイジアンフィルタを有効にする最低のham数(defaultは200)
    echo "bayes_min_ham_num 1" >> local.cf
    
    #ベイジアンフィルタを有効にする最低のspam数(defaultは200)
    echo "bayes_min_spam_num 1" >> local.cf
    
    # スパム判断したメールの件名に「***SPAM***」を付加するように設定
    echo "rewrite_header Subject ***SPAM***" >> local.cf
    
    # SpamAssassin再起動
    /etc/rc.d/init.d/spamassassin restart > /dev/null
    fi
    cp user_prefs user_prefs.org
  • SpamAssassin設定ファイルを最新にする。

    # chmod +x spamassassin-update
    # ./spamassassin-update
  • 毎日自動実行させる。

    # mv spamassassin-update /etc/cron.daily/
SpamAssassin学習スクリプト作成
  • spamassassin-learn

    #!/bin/bash
    PATH=/usr/sbin:/usr/bin:/bin
    
    for user in `ls /home/`
    do
    # 正常メール
    hammail=/home/$user/Maildir/cur
    
    # 正常メール学習
    if [ -d "$hammail" ]; then
        # 正常メールをSpamAssassinに学習させる
        su $user -s "/bin/bash" -c "sa-learn --ham $hammail | \
        logger -p mail.info -t 'sa-learn for $user'"
    fi
    
    # スパムメール
    spammail=/home/$user/Maildir/.Spam/cur
    
    # スパムメール学習
    if [ -d "$spammail" ]; then
       # スパムメールをSpamAssassinに学習させる
       su $user -s "/bin/bash" -c "sa-learn --spam $spammail | \
       logger -p mail.info -t 'sa-learn for $user'"
    
       # 受信後一ヶ月経過したスパムメールを削除
       tmpwatch -m 720 $spammail
    fi
    done
  • スクリプトを1時間ごとに実行

    # chmod +x spamassassin-learn
    # mv spamassassin-learn /etc/cron.hourly/
procmail 設定ファイル作成
  • /etc/procmailrc

    SHELL=/bin/bash
    PATH=/usr/bin:/bin
    DROPPRIVS=yes
    MAILDIR=$HOME/Maildir
    DEFAULT=$MAILDIR/
    SPAM=$MAILDIR/.Spam/
    LOGFILE=$MAILDIR/.procmail.log # ログ出力先
    #VERBOSE=ON # 詳細ログ出力
    
    # SpamAssassinによるスパムチェック
    :0fw
    |/usr/bin/spamc
    
    # SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送
    :0
    *^X-Spam-Flag: YES
    $SPAM
  • procmailログローテーション設定ファイル作成
    /etc/logrotate.d/procmail
    /home/*/Maildir/.procmail.log {
    missingok
    nocreate
    notifempty
    }
スパム専用メールボックス作成
  • 既存ユーザ用
    スパム専用メールボックス作成スクリプトを作成し実行する
    spamfolder-create

    #!/bin/bash
    
    for user in `ls /home`
    do
    id -u $user > /dev/null 2>&1
    if [ $? -eq 0 ] && [ ! -d /home/$user/Maildir/.Spam/new ]; then
        mkdir -p /home/$user/Maildir/.Spam/new
        mkdir -p /home/$user/Maildir/.Spam/cur
        mkdir -p /home/$user/Maildir/.Spam/tmp
        chmod -R 700 /home/$user/Maildir/.Spam
        chown -R $user. /home/$user/Maildir/.Spam
        echo $user
    fi
    done
  • 新規ユーザ用
    新規ユーザ追加時に自動でスパム専用メールボックス作成

    # mkdir -p /etc/skel/Maildir/.Spam/{new,cur,tmp}
    # chmod -R 700 /etc/skel/Maildir/.Spam
postfix 設定

全体をまとめるような感じで設定していきます。

Postfix 設定ファイル編集
  • /etc/postfix/main.cf
    コメント行が多いので、有効にした行と有効になっていた行を集めてみました。
    行頭がスペースで始まると、上の行の続きになります。コピーするときには注意してください。
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
mydomain = 【メールサーバにするドメイン】# example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
unknown_local_recipient_reject_code = 550
mynetworks_style = subnet
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
mail_spool_directory = /var/mail
mailbox_command = /usr/bin/procmail
debug_peer_level = 2
debugger_command =
     PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
     ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.2/samples
readme_directory = /usr/share/doc/postfix-2.10.2/README_FILES

 ##################################################
 # ここから下は追加
 #

smtpd_client_restrictions =
  permit_mynetworks,
  reject_unknown_client,
  permit

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous

smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_auth_destination,
  permit_sasl_authenticated,
  # reject_non_fqdn_recipient,
  # reject_unauth_destination,
  reject

mailbox_size_limit = 1000000000

message_size_limit = 20000000

smtpd_recipient_limit = 50
  • /etc/postfix/master.cf
    該当行のコメントを外して、編集します。

    smtp      inet  n       -       n       -       -       smtpd
      -o content_filter=spamassassin
    submission inet n       -       n       -       -       smtpd
      #  -o smtpd_tls_security_level=encrypt
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_client_restrictions=permit_sasl_authenticated,reject

    最後に付け加えます。

    spamassassin unix - n n - - pipe flags=R user=spamd argv=/usr/bin/spamc
      -e /usr/sbin/sendmail
      -oi -f ${sender} ${recipient}
sendmail をやめて、postfix に切り替える
 # systemctl stop sendmail.service
 # systemctl disable sendmail.service
 # alternatives --config mta
postfix、saslauthd、spamassassinの実行およびシステム起動時の自動実行
 # systemctl start postfix.service
 # systemctl enable postfix.service
 # systemctl start saslauthd.service
 # systemctl enable saslauthd.service
 # systemctl start spamassassin.service
 # systemctl enable spamassassin.service

以上で終了です。

/etc/init.d/ にinitスクリプトがない!

systemd とサービスの起動・停止

友人がサーバ機にFedora19をインストール。頼まれて、メールサーバを構築することになったのですが、/etc/init.d/ に起動・停止スクリプトがない!

私自身はFedora12以降システム系をいじっていなかったので、すっかり時代遅れになっていました。Fedora15からは、デフォルトでSystemV風ではなくなりsystemdが採用されているんですね。というわけですっかり浦島太郎な私は、脱rc.dしなければなりません。

systemctl の使い方

ユニットを使う

ユニットには、例えば、サービス (.service) やマウントポイント (.mount)、デバイス (.device)、ソケット (.socket) などがあります。

コマンドsystemctlを使うとき、一般的には拡張子 (suffix) を含むユニットファイルの完全な名前を指定する必要があります。例えば、sshd.socketのようにです。しかし、サービスユニットの場合には、拡張子を省略することができます。httpd.serviceの代わりにhttpdと記述することができます。

ユニットの確認

実行中のユニットを一覧する

$ systemctl

あるいは

$ systemctl list-units

もしもserviceのみ表示したい時には

$ systemctl list-units --type=service

インストールされたユニットを一覧する

$ systemctl list-unit-files
サービス(ユニット)ごとの状態確認
$ systemctl status [service_name].service
サービス(ユニット)のスタート・ストップ等
# systemctl start [service_name].service

# systemctl stop [service_name].service

# systemctl restart [service_name].service

# systemctl reload [service_name].service

そのほかのコマンドとして、try-restartreload-or-restartreload-or-try-restart等があります(もちろんサービスユニット以外のユニット用のコマンドも多数あります)。

サービス(ユニット)の登録
# systemctl enable [service_name].service
サービス(ユニット)の停止
# systemctl disable [service_name].service

具体例

httpdサーバをインストールしてみることにしましょう。

# yum install httpd

すると
/lib/systemd/system/httpd.service が作成されます。
ファイルの中身を見てみると、

# less /usr/lib/systemd/system/httpd.service

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop

# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

となっています。一つだけ忘れないようにしておきたいと思うのは、サービスに [Install] セクションがない場合、大抵は他のサービスから自動的に起動される、ということでしょうか。

httpdを実行させるには、

# systemctl start httpd.service

とします。サービスの状態を確認するには、

# systemctl list-units --type=service

で、表示されるサービスの一覧の中に、

httpd.service          loaded active running The Apache HTTP Server

を見つけることができます。

サービスを止めるのは、

# systemctl stop httpd.service

です。

サービスの状態を表示(動いているかどうかなど)

$ systemctl status httpd.service

有効化(起動時に自動で実行するよう設定)されているかどうか表示

$ systemctl is-enabled httpd.service

サービスを手動ではなく、システム起動時に自動で開始する

# systemctl enable httpd.service

システム起動時に実行されないように無効化する

# systemctl disable httpd.service

とりあえずはこれでシステムのサービスについてはOKでしょう。

「パスワード認証はやめましょうね」の巻

「パスワード認証はやめましょうね」の巻

外に開いているサーバでsshのポートを開けていると、「/var/log/secure」のログを見ればわかるように、色々な人がsshでログインしようとしていることが伺えます。

ログインができたら、もうそれはサーバーを乗っ取られたということに等しいわけで、危険です。もしかしたらパスワードをランダムでログインしようとして、いつかは成功してしまうかもしれないからです。しかし、秘密鍵やら公開鍵を作った方が良いだろうけれど、面倒なのでパスワード認証でやっている、というサーバもありそうです(今時あまりないでしょうが、開発用の試験サーバのような暫定的な場合は結構ありそうです)。↓はsecureログの例(3秒に1回ぐらいアクセスしている・・・)。

pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=112.65.244.xxx  user=root

そこで、今回は「ほうら、sshの公開鍵方式はこんなに簡単ですよ」という話をしてみます(iptablesでアクセスできるipを絞るというようなことも可能ですが、ここでは省略)。とりあえず環境的には、ローカルはMacBook Air(Marvericks)、サーバはCentOS6.2(アドレスは「www.yyy.org」)です。

ざっくり、やることは4つだけ
  1. ローカルで公開鍵と秘密鍵を作成する(1コマンド)。
  2. サーバに公開鍵を持っていく(ログインしたいユーザの「~/.ssh/authorized_keys」に追加します(新規の場合は作成します)。
  3. サーバのsshdの「パスワード認証を使えないように」設定を変えて、sshdをリスタートする。
  4. ログインしてみる。

これで終了です。さて、具体的に見ていきます。

ローカル(Mac)でRSA鍵の作成
  1. SSH2では(もう通常はSSH2でしょう)DSAとRSAが使えますが、とりあえずRSAの公開鍵・秘密鍵を作成します。
ssh-keygen -t rsa

をMacターミナル上で上記を実行します。すると、

Enter file in which to save the key (/Users/xxx/.ssh/id_rsa):

と聞いてきます。すでにある場合は上書きされちゃうので変更する必要がありますが(一応上書きするよって聞いてくるので、心配ありません)、初めてなら、そのままリターン。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

で2度パスフレーズを入れたら、出来上がり。

Your identification has been saved in /Users/xxx/.ssh/id_rsa.
Your public key has been saved in /Users/xxx/.ssh/id_rsa.pub.

が作成されます。上が秘密鍵、下が公開鍵です。

ローカルでは、一応念のため「.ssh/config」に(なかったら新規にファイルを作って)

IdentityFile ~/.ssh/id_rsa

を書き込んでおきます。

サーバに公開鍵を置く

公開鍵なので、あまり神経質になる必要はありませんが、サーバにscpあたりで「id_rsa.pub」を転送しましょう。

scp ~/.ssh/id_rsa.pub xxx@www.yyy.org:/home/xxx

そして、とりあえず今回まではサーバにパスワード認証で入ります。

そして、↑でホームディレクトリに「id_rsa.pub」を転送したので、これを~/.ssh/authorized_keysに追記します(初めてなら新規に作成、今回は初めてなので新規に作ります)。

mkdir .ssh
mv id_rsa.pub .ssh/authorized_keys
chmod 600  .ssh/authorized_keys

そして、ローカルにある「id_rsa.pub」は通常いらないので、削除してしまいましょう。

sshdの設定変更

sshdの設定ファイルは「/etc/ssh/sshd_config」なので、これを修正します。

※「PasswordAuthentication no」は、鍵を使ってログインできることを確認してから、変更した方が無難かもしれません

Protocol 2
PermitRootLogin no #念のため
RSAAuthentication yes
PubkeyAuthentication yes
PermitEmptyPasswords no
PasswordAuthentication no

とします。そしてsshdをリスタート

/etc/init.d/sshd restart
ログイン確認
ssh xxx@www.yyy.org

でログインしようとすると、Macでは下のようなポップアップが出てきます(初めて見たときは驚きます!)。

sshmac

最初に鍵を作ったときのパスフレーズを入力すると、ログインできます。

そして、次からはパスフレーズを聞かれなくなります。

※これだとノートパソコンをどこかに忘れたりすると危険ということもあり、上記の鍵方式に加え、やはり「iptables」でIPアドレスを絞る方が心配ないですね(その分出かけたときに仕事ができませんがw)。

蛇足

この鍵を使ってのsshにすると、コマンドラインでやっている人以外、このままだとscp(WinSCPなど)が使えません。

FileZillaやWinSCPはPuTTY形式では利用できるので、問題なく使えます(FileZillaはFileZilla自身でコンバートしてくれますが、WinSCPは自分で変更する必要がありますので、とりあえずPuTTYをインストールする必要があります)。下のURL等を参考にして下さい。

終わり。

ちく

SoundflowerとQuickTimeで、ドットインストールのまねごと

MacのQuitckTimeとSoundflowerを使って、ドットインストールのような動画を作成する

QuickTimeは動画は撮れるのですが、音声を取り込めません。ですがSoundflowerというソフトを利用すると、QuickTimeで音声を取り込めるようになります(説明の中の図が小さくて見づらい場合は、図をクリックすると大きな画像が見えます)。

Soundflowerのインストール

Soundflowerのダウンロード一覧からダウンロードして、インストールします。私は一番上の新しい1.6.6bをダウンロードしましたが、動いています(最初はMountain Lion、その後Mavericksにしましたが、現状大丈夫そうですw)。

※フリーソフトですので自己責任でお願いします。

Soundflowerの設定

Soundflowerをインストールすると、下のような花がLaunchpadに現れます。

soundflower-icon

これを使って起動すると、Macの画面上上部に以下のようなアイコンが現れます(画面上部にあるアイコンバーの一番左です—小さくて見づらいですが)。

soundflower-icon2

このアイコンをクリックすると、以下のような設定画面が現れます。

soundflower-setting

この中のSoundflower(2ch)「None(off)」を2つ下の「Built-in Output」に変更します。

Macのサウンドの設定

次に、「システム環境設定」→「サウンド」で、「出力」タブ「Soundflower(2ch)」を選択します。

soundsetting

これだけでセッティングは終了です。

実際の撮影

まずはQuickTimeをLaunchpadから立ち上げます(下の図)。

quicktime

立ち上がったら、上のメニューの「ファイル」→「新画面収録」を実行します。

quicktime1

実行すると、下の図のようなコントローラが現れます。

quicktime2

このコントローラの右の方にある「下矢印」をクリックして、録音するデバイスを選択します。私の場合はUSBにつないだヘッドセットのマイクを利用するので、UAB-350を選択します。

quicktime3

そして、音声のスライダーが最低になっているので、ある程度大きくします。あとは真ん中の録画ボタンをクリックします。すると、次のようなメッセージが出ますので、今回は画面全体をキャプチャしないので、範囲をドラッグで指定します。

quicktime4

あとは真ん中に「収録を開始」ボタンがあるので、これをクリックすると録画が始まります。

quicktime5

収録が終わったら、画面上部のアイコンで○の中に■がある(下の図では右から3つ目のアイコン)をクリックすると終わります。

quicktime6
その後、お好みのファイル形式を選んで書き出せば終了です(今回は720を選んで書き出しました)。もちろん、iMovieでタイトルをつけたり、編集することも可能です。

quicktime7

実際の作品

というわけで、今回のデモ用に「ドットインストールもどき」を作成してみました。ただ、もちろん本家に比べれば、めっちゃ話が下手ですし、収録した事務所の隣のビルが現在解体中で、そのクレーンの騒音を拾っていますが、あしからず(今回は書き出した後にflvにコンバートしています)。

ちく