aka:SSH Basics
- What's SSH?
- References
- Memo
- このメモでSSHの設定やコマンドを例示するところは、OpenSSHを使います。
- SSHの基本情報
- SSHの目的を一言でいうと、リモートコンピュータとの間でチャンネルを確立し、その間の通信を暗号化することである。
- その目的の実現のためにSSHが有する主な機能は、認証、暗号化、データ整合性である。
- SSH-1とSSH-2という2つのメジャーバージョンが存在する。
- SSH-1は、セキュリティの課題を持つため、使わない方がよい。
- SSH関連の名前の整理
- SSH
- SSH-1, SSH-2
- SSHプロトコルのバージョン1とバージョン2の名前。
- SSH1
- Tatuが作成したオリジナルのSSH-1実装の名前。
- SSH2
- Tatuが作成したオリジナルのSSH-2実装の名前。彼の会社の名前でもある。
- ssh
- SSHクライアントプログラムの名前。多くの実装で採用されている。ssh1、ssh2等の名前が使われることもある。
- OpenSSH
- OpenBSDプロジェクトによるSSH実装の名前。
- SSH-2の基本構造 (Architecture)
- 公開鍵暗号を認証の基本としている。
- クライアント・サーバ型である。
- レイヤー構造である。
- 大規模構造
application software (ssh, sshd, scp, ...)
|
SSH-2 (protocol family)
|
TCP (or other transparent, duplex byte-oriented connection)
|
- SSH-2プロトコルファミリ
|------------------------------------------+------------------------------------+--------------------------------------|
| SSH Authentification Protocol [SSH-AUTH] | SSH Connection Protocol [SSH-CONN] | SSH File Transfer Protocol [SSH-FTP] |
| | | |
| client Authentification | channle multiplexing | remote filesystem access |
| - publickey | pseudo-terminals | file transfer |
| - hostbased | flow control +--------------------------------------|
| - password | signal propagation |
| - gssapi | remote program execution |
| - gssapi-with-mic | authentication agent forwarding |
| - external-keyx | TCP port and X forwarding |
| - keyborad-interactive | terminal handling |
| | subsystems |
|------------------------------------------+---------------------------------------------------------------------------|
| SSH Transport Protocol [SSH-TRANS] |
| |
| algorithm negotiation |
| session key exchange |
| session ID |
| privacy |
| integrity |
| data compression |
|----------------------------------------------------------------------------------------------------------------------|
- SSH-2の認証達の概要
- このメモでSSHの設定やコマンドを例示するところは、OpenSSHを使います。
- 基本
- サーバ認証
- 暗号鍵(公開鍵暗号)
- SSHサーバを認証する。
- 公開鍵暗号を使用した認証である。サーバ認証のための鍵は'host key'と呼ばれる。いわゆるチャレンジ-レスポンス認証方式の一種である。
- Known hostsという、中間者攻撃を防ぐための仕組みを持つ。
- host keyの公開鍵部分と、SSHサーバのIPアドレスまたはFQDN+IPアドレスをクライアント側の~/.ssh/known_hostsファイルに記録する。
- host keyの公開鍵部分の周知は、信頼のおける方法で初回接続前に実施されるべき。例えば、システム管理者がknown_hostsエントリ達を作成し、配布する。例えば、secure DNS。例えば、X.509公開鍵基盤。
- ただし、それらが利用できない場合は、初回接続時に対話的に公開鍵をSSHサーバから取得しknown_hostsに追加するという手法もある。
- ユーザ(クライアント)認証
- 暗号鍵(公開鍵暗号)
- 公開鍵暗号を使用した認証である。ユーザ認証のための鍵は'user key'と呼ばれる。いわゆるチャレンジ-レスポンス認証方式の一種である。
- 典型的なシーケンス
- とあるクライアント:ぴよサーバさん、「ほげ」アカウントで接続させてください。
- ぴよサーバ:どうかな? ほいこれが a challenge。
- とあるクライアント:ども。the challengeと「ほげ」のprivate keyから an authenticatorを作りました。どぞ。
- ぴよサーバ:ども。「ほげ」アカウントに紐づく公開鍵でthe authenticatorを確認(matches)すると、、、ああ、対応する公開鍵がありました。あなた確かに「ほげ」さんですね。接続どぞ。
- ログインパスワード
- クライアントがサーバに、平文のパスワードを投げて、サーバが手元にもっているパスワード確認機構で確認する。
- パスワード確認機構が何かは、実装依存。PAM、Unixパスワードファイル、LDAPなどなどいろいろあろう。
- 「平文のパスワード」というのはあくまでSSH-AUTHのプロトコル上の話であり、そのやりとりにあたっては、下のレイヤであるSSH-TRANSによって暗号化は実施される。
- Hostbased
- ホスト同志で信頼関係を結ぶ。信頼関係のあるホストのログイン済みユーザからの接続は無条件受入れ。
- T.B.D.
- Kerberos
- 周辺
- SSH-2の運用TIPS
- ユーザ鍵
- ひとつのユーザマシンのひとつのユーザアカウントにて複数のユーザ鍵を使うことができる。
- 自分以外はアクセス不可能なマシンで使用する鍵と、共用マシン上の自分のアカウントで使用する鍵は分けた方がよいかも。管理者は共用マシン上の秘密鍵をコピーすることができるから。もちろん秘密鍵はパスフレーズで守られてはいるが。
- ひとつのサーバマシンのひとつのユーザアカウントについて複数のユーザ公開鍵を登録することができる。ただし、ここで複数というときに、それが同一ユーザ(例えばbob@example.comについて複数)であってもよいのかは不明。
- 判明。下の「SSH-2のなんだかよくわからないところ」参照。
- ユーザ鍵のパスフレーズは変更可能なので、定期的に変更すべし。
- ssh-keygenで作成したときデフォルトの名前は、id_rsaとか、id_rsa.pubとかのはず。この名前は一般性が高すぎるし、偶発的に上書きしてしまうかもしれないので、変えた方がいいかもしれない。変えたときは.ssh/configを書く必要あり。
- SSH-2のなんだかよくわからないところ
- ユーザ鍵
- Q: 「ユーザ鍵」の「ユーザ」って何? 他のユーザ概念(例えばUnixユーザ)と関係あるの?
- A: 一切関係ない。単なる鍵ペア。OpenSSH形式の公開鍵に'ユーザ名@ホスト名'が入っているが、あれはコメントのデフォルト値なだけ。なお、コメントがあるのはSSH-1のRSA鍵だけ。ちなみにこのコメントはssh-keygenの-cオプションにて後から変更可能ですらある。[訂正:コメントがあるのはRSA1鍵(SSH-1用RSA)だけ、と読める記述がmanにあるが、実際はSSH-2用RSA鍵にもコメントはある。ただし、'-c'で変更できるのはRSA1だけだ。]
- Q: では、~/.ssh/configにでてくる'User'は何?
- A: これは例えば、Host hoge.example.com で User piyo を定義しているとしたら、'ssh -l piyo ...'とやらなくてもユーザ piyo で接続しようとするということ。接続先のユーザ名が手元の端末のそれとは異なるときに、いちいち覚えとかなくてよいので便利。
- Q: とどのつまり、何がどうユーザなの?
- A: ユーザ鍵は単なる鍵ペアにすぎない。それがユーザ認証時に使われるからユーザ鍵と呼ばれるだけ。手元の端末のユーザとの紐付けは、鍵ペアファイルの名前が、1)~/.ssh/内に存在しておりデフォルト名をもっている(例:id_dsa)、2)~/.ssh/内に存在しておりconfigファイル(デフォルトは~/.ssh/ssh_config)にそのファイル名が記載されている、3)sshの-iオプションで指定、という三通りの方法で実施される。接続先のホストのユーザとの紐付けは、~/.ssh/authorized_keysに公開鍵が含まれるかどうかで実施される。接続時における接続先ユーザは、1)デフォルトは手元端末のcurrent user、2)configファイルにてそのホストについて指定されているUserの値、3)sshの-lオプションで指定したユーザ名、あたりで決まる。
- ssh_config (~/.ssh/ssh_config, /etc/ssh/ssh_config)
- Q: '~'の下のやつと'/etc/'の下のやつの読み込み関係はどう定義されてるの? 例えば、両方に'Host *'があったとき、'/etc/'の方も読まれるの?
- A: sshで-Fで指定したときは、それだけが読まれて他のものは読まれない、ということがssh(1)で定義されている。しかし他のことはmanには無いみたい。OpenSSH 5.9のソースをみると、
/*
* Read per-user configuration file. Ignore the system wide config
* file if the user specifies a config file on the command line.
*/
if (config != NULL) {
if (!read_config_file(config, host, &options, 0))
fatal("Can't open user config file %.100s: "
"%.100s", config, strerror(errno));
} else {
r = snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir,
_PATH_SSH_USER_CONFFILE);
if (r > 0 && (size_t)r < sizeof(buf))
(void)read_config_file(buf, host, &options, 1);
/* Read systemwide configuration file after user config. */
(void)read_config_file(_PATH_HOST_CONFIG_FILE, host,
&options, 0);
}
なので、読込順は'~'->'/etc/'で読み込みはなされる。さらにソースを読み込むと、sshは実行の度にOptions構造体を作成する。作成する手順は、1) メモリ領域を確保して名前をつける、2) 全項目に初期値として未定義を表わす値を入れる(initialize_options())、3) コマンドラインをパースしてそこで定義されている項目に値を入れる(main())、4) '~'のssh_configをパースしてそこで定義されている項目の中で現在接続しようとしているホストに該当するものに関する項目について値を入れる(read_config_file())、5) 4と同じことを'/etc/'のssh_configでやる(read_config_file())、6) sshが持つデフォルト値を入れる(fill_default_options())。ただし、「未定義」じゃない項目は上書きしない仕様となっている。これによって、個別性の高い設定が、一般的な設定に対して優先することを実現している。
とうわけで、答は、両方に'Host *'があったときは、双方で定義されている項目については'~'のものが採用され、'/etc/'でしか定義されていない項目についてはそれもちゃんと採用される。
- Q: いまいち書きぶりがわからないんだけど、基本的な感じのテンプレないの?
- A: テキトーに作ってみたり、Webから拾ってきたりしました。動作確認はまだしてませんが、初歩の道標として。
- サンプル:ごった煮
Host example.com
User test
Port 1234
# 'ssh exmaple.com' とすると自動的に '-l test -p 1234' が指定される。
Host github-projecta
HostName github.com
User git
IdentityFile /path/to/.ssh/id_rsa_for_project_a
# HostNameがある場合、Hostはエイリアスになる。すなわち'ssh github-projecta'とできる。
Host github-projectb
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_for_project_b
# '~'の他にいくつかのエスケープ文字が使えます。
Host example2.com
IdentityFile ~/.ssh/id_dsa_hoge
IdentityFile ~/.ssh/id_dsa_piyo
# ひとつのホストに複数鍵の割り当ても可能。この場合、上から順に試していく。
Host *
Compression yes
CompressionLevel 1-9
KeepAlive yes
# '*'は共通設定に使える。'*'の設定は末尾に書くこと。上からマッチするので。
- サンプル:sshの挙動の制御一覧
Host *
AddressFamily inet
CheckHostIP yes
Ciphers aes256-ctr,aes192-ctr,aes128-ctr,arcfour256,aes128-cbc
Compression no
ConnectionAttempts 1
ConnectTimeout 10
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
EscapeChar ~
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
HashKnownHosts yes
IdentityFile ~/.ssh/identity
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_dsa
IdentityFile ~/.ssh/id_ecdsa
IdentitiesOnly yes
MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
PermitLocalCommand no
Port 22
Protocol 2
RekeyLimit 1G
ServerAliveInterval 15
ServerAliveCountMax 3
StrictHostKeyChecking ask
TCPKeepAlive no
Tunnel no
TunnelDevice any:any
VisualHostKey no
- サンプル:OpenSSH 5.9 のreadcon.cの中の例
/* Format of the configuration file:
# Configuration data is parsed as follows:
# 1. command line options
# 2. user-specific file
# 3. system-wide file
# Any configuration value is only changed the first time it is set.
# Thus, host-specific definitions should be at the beginning of the
# configuration file, and defaults at the end.
# Host-specific declarations. These may override anything above. A single
# host may match multiple declarations; these are processed in the order
# that they are given in.
Host *.ngs.fi ngs.fi
User foo
Host fake.com
HostName another.host.name.real.org
User blaah
Port 34289
ForwardX11 no
ForwardAgent no
Host books.com
RemoteForward 9999 shadows.cs.hut.fi:9999
Cipher 3des
Host fascist.blob.com
Port 23123
User tylonen
PasswordAuthentication no
Host puukko.hut.fi
User t35124p
ProxyCommand ssh-proxy %h %p
Host *.fr
PublicKeyAuthentication no
Host *.su
Cipher none
PasswordAuthentication no
Host vpn.fake.com
Tunnel yes
TunnelDevice 3
# Defaults for various options
Host *
ForwardAgent no
ForwardX11 no
PasswordAuthentication yes
RSAAuthentication yes
RhostsRSAAuthentication yes
StrictHostKeyChecking yes
TcpKeepAlive no
IdentityFile ~/.ssh/identity
Port 22
EscapeChar ~
*/
- Q: SSH Agent ってどこでどう起動するのがいい感じの運用なの?
- Q: 鍵の暗号化方式ってどれにしときゃいいの? その選択理由含めて知りたい。
- とりあえずこうしとけっていう鉄板なsshd_configってあるの?
- SSH-2 (OpenSSH) そぞろ歩き
- aka:ssh:基本的なファイル達
- ユーザ鍵管理関係 (ssh-keygen, ssh_config, etc)
- ホスト鍵管理関係
- SSH Agent関係 (ssh-agent, ssh-add, etc)