ssh

(更新:2017/10)
(作成:2006/03)

リモートログインするならSSH。Linux導入したら大抵は最初から導入されとるだろうから、導入云々は省略。
で、OpenSSH。Telnetみたくパスワード認証で接続出来るもので、SSHの場合は通信が暗号化されて送受信される。んが、これだけだと結局ローカルなログインと同じくパスワード盗聴されただけで「なりすまし」されたりするので、あんまし安全でない。そこで、パスワード認証だけでなく公開鍵認証も利用した接続について紹介。

プロトコル

SSHにはProtocol 1およびProtocol 2の二種類があるらしい。機能の違いはだいたいこんな感じ。

暗号方式 改竄チェック
SSH1 RSA CRC
SSH2 DSA(RSA) HMAC

SSH1 → SSH2では、暗号方式の特許問題回避(最近はRSA特許問題が解決されてSSH2でもRSAが使えるらしい)、データ改竄チェックアルゴリズムの複雑化、という改良が加えられ、理論的にはSSH2のが安全。 でも、SSHで接続するユーザ側からすると、例えばWindowsユーザはTeraTerm + TTSSHの組み合わせがまだ主流、てな場合もある。これだとクライアントソフトの問題でSSH1しか使えない。
(追記:2017/10)最近ではTTSSHでもSSH2サポートしたみたい。
そんな事もあり、安全性だけでSSH2を使うという判断が出来るかというと難しい所らしい。まあ、この辺は各自で使い分ければ良いと思う。

設定

SSHサーバ側の認証制限

/etc/ssh/sshd_config に以下の設定を加えて再起動し、認証鍵を用いた接続のみ許可するように変更。

# /etc/ssh/sshd_config

...
#### パスワード認証を禁止(公開鍵での認証は許可)
PasswordAuthentication no
# 空パスワードで認証しない(これはお好みで)
PermitEmptyPasswords no
...

SSHが接続がばかに時間かかるようなら、以下の設定を見直すと良い。

#### /etc/ssh/sshd_config

...
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
# GSSAPI options
GSSAPIAuthentication no
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
GSSAPICleanupCredentials yes
UseDNS no
...

これ実は余計な認証作業をSSHサーバが実施しているせいなので、もし認証サーバみたいのを持っていなければ、そのあたりの設定を削る。 UseDNS も禁止にしておいた方が良い。要らんでしょ、sshd側での名前解決なんて。。。一体何に使うんだろう。

SSH1認証鍵の生成

認証鍵を生成するには、クライアントPC上で ssh-keygen コマンドにより秘密/公開鍵を生成する。Windowsの場合は PuTTY付属の puttygen.exe とか使えば良いと思う。

$ ssh-keygen -t rsa1 -C riyo@kappa.hyakki.local

オプションの意味は以下の通り。

オプション 意味
-t rsa1 プロトコル1認証鍵を作成する。
-C ... 公開鍵に記述するコメント。ユーザ@ホスト名が解り易い。

認証鍵を生成する場所の指定。特に必要が無ければデフォルトのままで良いんじゃなかろか。

Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/riyo/.ssh/identity):

パスフレーズ入力。

Created directory '/home/riyo/.ssh'.
Enter passphrase (empty for no passphrase):********
Enter same passphrase again:********
Your identification has been saved in /home/riyo/.ssh/identity.
Your public key has been saved in /home/riyo/.ssh/identity.pub.
The key fingerprint is:
e9:35:6a:4b:fa:75:3f:76:1c:b7:c4:cf:ec:4e:f5:30 riyo@kappa.hyakki.local
$

生成されたファイルは以下の通り。

ファイル名 用途
identity 秘密鍵。ローカルマシン側で管理、流出厳禁。
identity.pub 公開鍵。リモートの authorized_keys にこの内容を登録する。

初めて鍵を作ったなら、 identity.pub の内容をそのままリモートの authorized_keys に記入する。サーバ管理者が別なら、その人に公開鍵を渡して登録をお願いすることになる。

#### .ssh/authorized_keys
1024 37 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX riyo@kappa.hyakki.local

SSH2認証鍵の設定

SSH2認証鍵を生成するには -t オプションで指定するタイプを dsa あるいは rsa と記述し直せば良い。
文字通り、 dsa はDSA公開鍵暗号、 rsa はRSA公開鍵暗号を表す。

$ ssh-keygen -t rsa -C riyo@kappa.hyakki.local

認証鍵の生成場所を指定、パスフレーズを入力。

Generating public/private dsa key pair.
Enter file in which to save the key (/home/riyo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):********
Enter same passphrase again:********
Your identification has been saved in /home/riyo/.ssh/id_rsa.
Your public key has been saved in /home/riyo/.ssh/id_rsa.pub.
The key fingerprint is:
33:c5:3f:5f:d0:ff:52:69:f5:bc:a4:e3:52:9b:e6:4c riyo@kappa.hyakki.local
$

生成されたファイルは、DSA公開鍵暗号なら id_dsa および id_dsa.pub 、RSA公開鍵暗号なら id_rsa および id_rsa.pub 。後はSSH1の場合と同じように、秘密鍵はローカルに、公開鍵はリモートに登録して使用する。

認証鍵でログイン

ssh で接続する場合は以下オプションにて。

$ ssh -1 -i (秘密鍵ファイル) riyo@oni.hyakki.local

オプションの意味は以下の通り。

オプション 意味
-1 プロトコル番号。SSH2なら -2 または未指定。
-i (秘密鍵ファイル) 認証に用いる秘密鍵を指定。未指定の場合はデフォルト名の鍵を使用する。

接続に失敗するようならサーバの /var/log/secure を参照すること。 Authentication refused: bad ownership or modes for directory /home/riyo 等とメッセージがある場合は、 /home/riyo/ のパーティションを 700755 に変更してやる。

PC UNIXクライアント側の設定

上述ログイン方法で判るように、 ssh のオプションも色々ある。でも毎回オプション入力するのありえなーい。てなわけで、 ~/.ssh/config にクライアント側の設定を記述すれば楽々とSSHアクセスが出来るようになる。

ホームサーバなんかでは、外部から空いてるポートが1024以降ってのはザラにある。そんな場合は当然 ssh でポートを指定してログインするわけだが、CVSの ext なんかではコマンドラインオプション指定できない。 サーバのホストが判っているなら、以下のように設定をしておく。

#### ~/.ssh/config

Host oni.hyakki.local
  Port 10021

前節のような認証鍵ログインのオプションも設定できる。プロトコル1で ~/hoge/ 以下にある秘密鍵を用いたパスフェーズログインなら、次のように設定。

#### ~/.ssh/config

Host oni.hyakki.local
  IdentityFile ~/hoge/identity
  Protocol 1

もっと他の設定については /etc/ssh/ssh_config を参照。

Tips

sshを用いたネットワーク越し圧縮

HDDのバックアップを取りたいけれど、もうローカルには容量が足りない場合にリモートマシンにネットワーク越しで圧縮ファイルを置いてやれると良い。
ローカルマシン側から、以下のようなコマンドで可能。

$ tar cvfz - hoge | dd bs=1024 | ssh riyo@oni.hyakki.local dd bs=1024 of=hoge.tgz

SCPで大容量ファイルを高速転送

SSHはその通信の性質上、データ転送処理に暗号化/複合化処理が挟まれる。 scp なんかで通信が遅くなるのはこれが原因だったりするわけで、標準の暗号化方式のままではどうしてもスループットが向上しない。
というわけで、以下のオプションで暗号化方式を変更すれば多少速くなる。

$ scp -c arcfour128 hoge riyo@oni.hyakki.local:

rsyncコマンドで使いたい場合はこんな感じ。リモートバックアップなんかでは多少効果がある、かも。

$ rsync -av -e "scp -c arcfour128" hoge riyo@oni.hyakki.local: