LANDISK HACKING DIARY
Since2005/8/17
TOPへ戻る

   INDEX
 
1. ssh,sloginコマンド
2. マシンAとマシンB間でRSA認証を使ってログインする
3. パスフレーズ入力なしでログインする
4. scpコマンド
5. 参考文献




 
   ssh,sloginコマンド

 

 


筆者の環境では、Fedora Core の入ったデスクトップマシン1台しかLinux はなかったので、あまりLinux間同士のファイルのコピーやら同期などは興味を持たなかったが、LANDISKを導入し、常時電源のついているマシンが2台になったことで、Linux 同士のデータのやりとりも少しは考えてみることにした。まず、ssh コマンドを使って他のLinuxマシンへログインしてみる。以下の例では、LANDISK の root ユーザが172.16.50.2 のroot としてログインすることを意味している。因みにssh コマンドと、slogin のコマンドに違いはないのでどちらを使っても構わない(たぶん)。

landisk:~# ssh 172.16.50.2

ログインするユーザを変更したい場合は、[ -l ユーザ名 ] オプションをつける。

landisk:~# ssh -l kororo 172.16.50.2
または、
landisk:~# ssh kororo@172.16.50.2

その他のオプションは以下の通り。

 -i RSA公開鍵ファイルを指定する。初期設定は~/.ssh/identity
 -p 接続ポートを指定する。
 -X Xポートフォワードを有効にする。リモート・マシンのXアプリケーションを実行できる。
 -x Xのポート・フォワーディングを無効にする



 
     マシンAとマシンB間でRSA認証を使ってログインする
   
上記で説明したssh でのログインを元にして実際に2台のマシンの間でRSA認証を使ってログインしてみる。ここでいう、マシンAとマシンB とは双方ともLinuxマシンを指す。

マシンA --> ns1.kororo.jp
マシンB --> ns2.kororo.jp
ユーザ名 --> kororo


① マシンAでの作業内容

 パスフレーズを入力し、RSA鍵を作成する。コマンド実行後に、.ssh/ というディレクトリが作成される。

landisk:~$ ssh-keygen -t rsa
landisk:~$ cp -p id_rsa authorized_keys


作成された .ssh/id_rsa_pub をマシンBにコピーしておく。

②マシンBでの作業内容

 同様にパスフレーズを入力し、RSA鍵を作成する。ここでのパスフレーズは、マシンAのパスフレーズと同じである必要はない。

$ ssh-keygen -t rsa
$ cp -p id_rsa authorized_keys


作成された .ssh/id_rsa_pub をマシンA にコピーしておく。

③マシンAでマシンBの情報を追加する

マシンAに戻り、先ほどマシンBからコピーされた.ssh/id_rsa_pub を マシンA のauthorized_keys に追加する。お勧めできるかどうかは別問題として、Teraterm などを利用して別々のターミナルを立ち上げて双方のマシンにログインできる環境ならば、id_rsa_pub の 内容をそのまま、相手先マシンの authorized_keys に貼り付ければよいだけなので転送しなくて済むだけ作業効率はいい。

landisk:~$ cat ~/.ssh/id_rsa_pub >> ~/.ssh/authorized_keys


④マシンBでマシンAの情報を追加する

マシンBに戻り、先ほどマシンAからコピーされた.ssh/id_rsa_pub を マシンB のauthorized_keys に追加する。

$ cat ~/.ssh/id_rsa_pub >> ~/.ssh/authorized_keys



これでマシンAとマシンBで互いにログインできるはずであるが、一筋縄でいかない場合も多いだろう。Fedora Core 側(ここでは、マシンB)はソースから openssh インストールしているため、sshd_config のパラメータがデフォルトでコメントされているものが多いのだが、トラブルを未然に防ぐためにも有効にしたいものは先頭の # をきちんと取り除き設定を有効にするようにしたほうが良さそうだ。そうでないと段々こんがらがってきてどれがデフォルト有効でどれがデフォルト無効のパラメータなのか混乱してくる。確認の意味で、PermitRootLogin を no にした場合、「slogin root@172.16.50.2」などとした場合に「Permission denied (publickey,keyboard-interactive).」の表示がでれば問題ない。root ではなく、ユーザとしてログインしているのに Permission denied のエラーが表示され、相手先マシンに接続できない場合は、自マシンの ~/.ssh/known_hosts を削除してみるといいだろう。




 
     パスフレーズ入力なしでログインする
   
LAN内のLinux管理者は全て自分なのでこれでも問題ないよね?いちいちパスワード入力するのは面倒なのでこの作業はやっぱり飛ばしたいと考えるわけです。この方法には、RSA rhosts 認証を使った場合と、ssh-agent を使った場合で説明していきます。他にもホストベース認証もありますがここでは説明しません。

■RSA rhosts 認証

パスフレーズの入力をせずともログインできる方法があります。方法は、.ssh 以下に shosts と呼ばれるファイルを作成し、双方のマシンのsshd_config の設定を変えるだけである。マシンAでは、マシンBのホスト名とユーザ名が記述された .shosts をホームディレクトリ直下に置いておく。マシンBでは逆の記述をする。また、作成した .shosts のパーミッションをオーナのみ読み書き可能にしておかないとその .shots は使われないようになっている。

マシンAで実行する場合

$ echo ns2.kororo.jp kororo >> ~/.shosts
$ chmod 600 ~/.shosts


マシンBで実行する場合

$ echo ns1.kororo.jp kororo >> ~/.shosts
$ chmod 600 ~/.shosts


次に、双方のマシンで、sshd_config を以下のように編集しておく。IgnoreRhosts は個人の環境で.shosts の使用を禁止するという意味で、RhostsRSAAuthentication は、サーバー全体でRSA rhosts 認証を許可するか拒否するかを決定します。

IgnoreRhosts no
RhostsRSAAuthentication yes


■ssh-agent

次に、ssh-agent を使ってパスフレーズの入力の手間を省いていきます。ssh-agent はパスフレーズをキャッシュとして保存し、認証を代行してやってくれる機能があります。秘密鍵をssh-agent に登録しておけばログアウトするまではずっとパスフレーズの入力をする必要はなくなります。慣例(?)としては以下のようにして登録するようですが、これだとログアウトした後も、プロセスとして残ってしまうため、メモリリソースを消費しかねません。

$ eval `ssh-agent`
$ ssh-add
$ ps aux | grep ssh-agent //ログアウトした後も残る
kororo 11501 0.0 1.6 3496 1016 ? Ss 18:01 0:00 ssh-agent
kororo 11503 0.0 1.6 3496 1016 ? Ss 18:01 0:00 ssh-agent
kororo 11505 0.0 1.6 3496 1016 ? Ss 18:01 0:00 ssh-agent
$ killall ssh-agent


ssh-agent がプロセスとして残らないようにするために、ssh-agentの子プロセスとしてシェルを起動してあげるとよいらしい(〇〇とssh-agentは使いよう参照)。これなら、ログアウトした後に同時にプロセスも消えるので万万歳となるわけです。ログイン時に登録したい場合は、.bash_profile なりに以下のコマンドを記述しておくといい。だが、ssh-add は手動で行う必要がある。

$ exec ssh-agent bash


また、普通に毎回、ssh-agent コマンドとssh-add コマンドを入力しても構いません。これなら一応、ログアウトした後も、プロセスは残りません。

$ ssh-agent
$ ssh-add





 
     scpコマンド
   
SCPコマンドは相手先マシンにログインすることなくファイルをAからBへと転送[ コピー] することができます。SCP コマンドを使う際も毎回パスワード入力をしなければならない手間は変わりません。上記で説明した、~/.shost なり、ssh-agent なりを使用していればこのパスワード入力の手間は省くことができて楽ちんです。

scp [-r] [コピー元サーバ]:[コピーするファイル/ディレクトリ] [コピー先サーバ]:[コピー先ファイル/ディレクトリ]


実際にコマンドを打つと以下のようになる。最初は、お決まりのホスト認証の質問がされるので、yes と答え、転送先のマシンの パスワードを入力する。すでに、ssh-agent が起動していればパスワードの入力は求められずに直接コピーされる。SCPコマンドの注意点として、同名のファイルが存在した場合は上書きされてしまうという点です。

landisk:~# scp debian_stop 172.16.50.2:/home/kororo/
The authenticity of host '172.16.50.2 (172.16.50.2)' can't be established.
RSA key fingerprint is b1:a7:b5:96:ee:af:19:d4:03:a4:da:02:34:8e:d1:45.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.50.2' (RSA) to the list of known hosts.
Enter passphrase for key '/home/kororo/.ssh/id_rsa':
debian_stop   100% 0 0.0KB/s 00:00

ワイルドカードを使う場合は2重引用符を用いないと異なる解釈をされるようなので注意が必要です。以下の例だと、172.16.50.2 のマシン内にある/home/kororo/ 以下を自分のホームディレクトリにコピーするという意味になる。

landisk:~# scp 172.16.50.2:/home/kororo/"*" ./




 
     参考文献
   
SSH User setup guide
ssh-agent と emacs で scheme
〇〇とssh-agentは使いよう





TOPへ戻る
 
Copyright © KORO All Rights Reserved.