(更新: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/
のパーティションを 700
や 755
に変更してやる。
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: