第2回 SSH 公開鍵の設置

2008/03/25

今回は Capistrano を使うための前提条件の一つである SSH について。

本番サーバは用意されているという前提だから、あなたは既に SSH で本番サーバにログインできるはずだ。しかし、SSH の公開鍵を作って本番サーバに設置してあるだろうか。もしまだなら、そこから作業開始だ。

ただし、Windows から Capistrano を使うためのセットアップ方法については、次回(第3回 Windows で Capistrano)で説明する。


まず、SSH の公開鍵を作る。

% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kuroda/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/kuroda/.ssh/id_rsa.
Your public key has been saved in /home/kuroda/.ssh/id_rsa.pub.
The key fingerprint is:
a3:ed:8b:aa:6d:6c:92:16:70:6b:1d:51:3a:24:6f:b9 kuroda@desktop

次に、公開鍵を本番サーバにコピーする。本番サーバのドメイン名を alpha.oiax.jp としよう。

% scp .ssh/id_rsa.pub alpha.oiax.jp:~
kuroda@alpha.oiax.jp's password:

本番サーバにログインする。なお、今後はローカルホストで作業するときのプロンプトは % で、リモートホスト(本番サーバ)で作業するときのプロンプトは $ で表すことにする。

% ssh alpha.oiax.jp
Password:

最初に app ユーザーを作る。

% sudo /usr/sbin/useradd -m app

これは Rails アプリケーションをデプロイメントし起動するための専用ユーザーである。もし、すでにこのユーザー名が他の目的で作られていたら、rails などの別の名前を選ぶ。なお、開発者個人のアカウント(例えば、kuroda)でデプロイメントする方法もあるが、複数人で開発している場合は、ファイルのパーミッションに関係するややこしい問題に遭遇しやすいので専用のユーザーを作ることをお勧めする。

まず ~/.ssh に公開鍵を設置する。

$ mkdir -m 700 .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys

続いて /home/app/.ssh に公開鍵を設置する。

$ sudo -u app mkdir -m 700 /home/app/.ssh
$ sudo -u app touch /home/app/.ssh/authorized_keys
$ sudo sh -c "cat id_rsa.pub >> /home/app/.ssh/authorized_keys"

ログアウトする。

$ exit

パスフレーズを繰り返し入力する手間を省きたい人は、次のようにして ssh-agent に秘密鍵を記憶させる。

% ssh-agent bash
% ssh-add
Enter passphrase for /home/kuroda/.ssh/id_rsa: 
Identity added: /home/kuroda/.ssh/id_rsa (/home/kuroda/.ssh/id_rsa)

公開鍵で本番サーバにログインする。

% ssh alpha.oiax.jp
$ exit

ログイン時にパスワードを尋ねられなければ、OKだ。

次に、app ユーザーでログインする。

% ssh app@alpha.oiax.jp
$ exit

こちらもパスワードの入力なしでログインできるはずだ。


では、Capistrano を試してみよう。

ローカルホストの適当なディレクトリに、次のような内容を持つテキストファイル Capfile を作成する。拡張子は付けないこと。また、'kuroda' の部分は、リモートホストに SSH でログインするユーザー名を指定し、'alpha.oiax.jp' は、実際のリモートホストの名前で置き換えること。

set :user, 'kuroda'
task :stamp, :hosts => "alpha.oiax.jp" do
  run "touch /home/kuroda/touched"
end

これで、alpha.oiax.jp にログインして、コマンド touch /home/kuroda/touched を実行するタスク stamp を定義したことになる。Unix コマンドの touch は、ファイルのタイムスタンプを更新するものだが、ファイルがなければ新規に作成してくれる。

stamp タスクを実行するには、Capfile を保存したディレクトリに移動して、cap stamp と入力する。

% cap stamp
  * executing `stamp'
  * executing "touch /home/kuroda/touched"
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
    command finished

本番サーバで結果を確認する。

$ pwd
/home/kuroda
$ la -l touched
-rw-r--r--  1 kuroda kuroda 5 Mar 24 22:58 touched

stamp タスクを実行するまでは存在しなかった touched ファイルが生成された。


[改訂] 2008/05/17 ユーザー app でリモートホストにログインする方式に合わせて記述を修正。