home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/Security/SSH

技術/Security/SSH

技術 / Security / SSH
id: 1221 所有者: msakamoto-sf    作成日: 2013-07-27 15:37:39
カテゴリ: SSH セキュリティ 

SSHの使い方のメモ書き。

日記から:


~/.ssh 以下のパーミッション

基本的にownerしか読み書き出来ないようにしておく。OpenSSHのバージョンや設定によっては、owner以外にrとかxが許可されてるとエラーになって接続出来なかったりするっぽい。

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

ssh-agentのメモ

ログインのbash起動時に ssh-agent 立ちあげて、そこからscreen経由でサブのbash開く時は単にssh-agentの環境変数読むだけで、最後にログアウトするときに ssh-agent -k するTips:

.bashrc:

SSH_AGENT_SRC=~/.ssh_agent_env
if [ ! -f ${SSH_AGENT_SRC} ]; then
    echo "ss-agent starting..."
    ssh-agent > ${SSH_AGENT_SRC}
fi
source ${SSH_AGENT_SRC}
ssh-add -l >&/dev/null
if [ $? == 2 ] ; then
    echo -n "ssh-agent: old env rmeains, restarting...."
    ssh-agent > ${SSH_AGENT_SRC}
    source ${SSH_AGENT_SRC}
fi

.bash_logout:

SSH_AGENT_SRC=~/.ssh_agent_env
ssh-agent -k >& /dev/null
/bin/rm -f ${SSH_AGENT_SRC}

ポイント:

  1. 一度、".ssh_agent_env"を読み込んだ後に ssh-add してみて、戻り値をチェックして異常があれば、古いのが残ってるとか何かだと思うので、ssh-agentを起動しなおして ".ssh_agent_env" を更新+再読み込みしてる。
  2. ".bash_logout" はログインシェルからログアウトする場合に読み込まれる。screenから起動したbashからexitする時は読み込まれないので、例えばWindowsホストからPuttyでログイン~screenで複数のbash開いて作業~最後、閉じてログアウトしたら削除される。

・・・ただし、これだと、screenをdetachしてログアウトしてしまうと、screenの各セッションから参照しているssh-agentが終わってしまうので、もう一度SSHとかでログインしてscreen -rすると、ssh-agentと通信できなくなっててアウトな気がする。
ちょっと使い方に工夫と注意が必要そう。bashの関数にして、ユーザが明示的に操作できるようにするのもありか。

参考:

ssh-keygenのメモ

ssh-keygenで個人的に気になる点をメモ。

"-t" では何を指定すれば良いのか?

ぐぐってみると、記事によっては "-t dsa" を指定したり "-t rsa" を指定してる。
SSHのプロトコルバージョンと、RSAの特許の有効期限に関連してバリエーションが出来ている。

SSHプロトコルバージョン1用には、"-t rsa1"を使う。
ただし、RSAの特許の問題もあり、SSHプロトコルバージョン2ではDSAがサポートされた。
→DSAを使う場合は "-t dsa" を指定する。
2000年になりRSAの特許の有効期限が切れた・・・らしい。そのため、以降のOpenSSHでは、SSHプロトコルバージョン2用として "-t rsa" をサポートして、RSAを使えるようになった。

DSAはあくまでも"Digital Signature Algorithm"であり、電子署名に使われることを想定していた。暗号化に使うことは想定していなかった・・・らしい・・・。後にDSAを暗号化に使う方法が出てきたが、速度が遅いとかナントカ。
なので、2013年の今となっては、SSHプロトコルバージョン2用のRSAとして "-t rsa" を選択するのが無難。

※RSA/DSAの仕様や、それらがどうSSHプロトコルに関連するのか、SSHプロトコルの中身など自分で調べず、下記参考資料からの抜き書きでまとめてますので、正確性は保証出来ません・・・。

参考1(2005年以降とかわりと新しいWebページ):

参考2(2001 - 2003年ごろのリソース):

生成する秘密鍵・公開鍵のファイル名を変更したい

→秘密鍵のファイル名を "-f" で指定する。公開鍵のファイル名は指定できない(多分)。公開鍵のファイル名は、秘密鍵のファイル名の後ろに ".pub" が追加される。

$ ssh-keygen.exe -t rsa -f abc
-> 現在ディレクトリに "abc"(秘密鍵), "abc.pub"(公開鍵)が生成される。

鍵ファイルのフォーマットについて

ssh-keygenで生成される鍵ファイル("-t rsa"の場合):
秘密鍵:(多分PKCS8かPEM形式のどちらかかと・・・)

-----BEGIN RSA PRIVATE KEY-----
AAAAAAAAAAAAAAAAAAA....
...
AAAAAA....AAAA
-----END RSA PRIVATE KEY-----

公開鍵:→そのまま、"~/.ssh/authorized_keys" に追加できる形式になっている。

ssh-rsa AA.....AAA user@host

また、ssh-keygenの"-i", "-e"オプションでは、読み込む鍵ファイルのフォーマットを "-m" オプションで 'RFC4716', 'PKCS8', 'PEM' のどれかを指定出来ます。

"-e" : 他のSSH実装で生成された秘密鍵・公開鍵ファイルをOpenSSHのフォーマットに変換
"-i" : 公開鍵や、暗号化されていない秘密鍵ファイルを読み込んでOpenSSHのフォーマットに変換

※ただ、今の自分の知識ではどれがどう異なるのか良くわかりません・・・。特にPKCS8とPEMの違いが理解不能。

参考:

秘密鍵のパスフレーズを思い出すために入力して確認したい、あるいは秘密鍵からもう一度公開鍵(authorized_keys用)を生成したい

"ssh-keygen -y" を使うと便利です。他にもOpenSSLコマンドを使う手法もあるようです。

-y  This option will read a private OpenSSH format file and print an OpenSSH public key to stdout.
$ ssh-keygen -y -f 秘密鍵ファイル名
Enter passphrase:(パスフレーズ入力)
→"ssh-rsa AAA...AAA" というように公開鍵が出力されます。

authorized_keysに追加するには、さらに行末にコメントを追加しておきます。

ex: "ssh-rsa AAA...AAA this_is_repaired_public_key"

パスフレーズを設定していない秘密鍵を指定した場合は、パスフレーズの入力なしでいきなり公開鍵が出力されます。

参考:

秘密鍵をパスフレーズ無しにしたい、あるいはパスフレーズ無しの秘密鍵にパスフレーズを設定したい

$ ssh-keygen -p -f 秘密鍵ファイル名

→新しいパスフレーズを聞かれるので、何も入力しなければパスフレーズ無しに、パスフレーズを入力すればパスフレーズ有りになります。

注意点:秘密鍵ファイルは 上書き保存される ため、もし不安であればバックアップをとって置くと良いでしょう。

ホスト毎に秘密鍵を使い分けたくなったら、"~/.ssh/config" を活用しよう!

"~/.ssh/config":


# "ssh myserv1" == "ssh -i .ssh/server1_private_key -p 2222 user01@myserv1.example.com"
Host myserv1
  HostName myserv1.example.com
  Port 2222
  User user01
  IdentityFile .ssh/server1_private_key

# for GitHub ssh user
Host github.com
  HostName github.com
  User git
  IdentityFile .ssh/git_private_key

参考:

AWSや実験環境で、IPアドレスやホストの鍵が頻繁に変わるような場合

AWSやローカルのVM環境で、IPアドレスやホストの鍵が頻繁に変わるような場合、 "~/.ssh/known_hosts" のホスト鍵のチェックに失敗して接続できないケースがあります。
そのような場合、意図的に known_hostsのチェックをskipしたり、known_hostsへの自動追加を無効化しておく方法があります。
もちろん、ホストのなりすましに対して弱くなってしまうので、環境によってバランスを考慮する必要はあります。

1. 厳密なホスト鍵チェックを無効化し、known_hostsに登録済みの既存の鍵と異なっていても接続を拒否しない。

StrictHostKeyChecking no

2. ホスト鍵の追加先を/dev/nullにすることにより、自動追加を無効化。

UserKnownHostsFile /dev/null

"~/.ssh/config" 設定例:

Host test
  HostName 192.168.1.20
  User username
  Port 22
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null

sshコマンドラインオプションでの指定例:

ssh username@192.168.1.20 -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null"

PuTTY系とOpenSSH系を併用する場合の鍵ファイルのフォーマットについて

PuTTY、TortoiseXXX系のツール、WinSCPなどで提供されている "puttygen.exe" で生成した秘密鍵・公開鍵ファイルは、OpenSSHで生成したものとはフォーマットが違うため、変換が必要です。
puttygen.exeを起動して、"Conversions"メニューから"Import Key"をクリックし、 puttygen.exeで生成した秘密鍵を選択すると 、秘密鍵を読み込み公開鍵情報やコメント情報を表示してくれます。その後、"Conversions"メニューから"Export OpenSSH Key"とすればOpenSSH形式の 秘密鍵ファイルに 変換出来ます。
OpenSSH形式の = "authorized_keys"にそのまま追加出来る形式の公開鍵ファイルには変換してくれませんので、puttygen上で表示された公開鍵情報を手動でコピペすることになります。といっても、

ssh-rsa (ここにputtygenでインポートして表示された公開鍵の文字列を1行にしてコピペ) comment

という形式でauthorized_keysに書き込めば終わりです。

なお、authorized_keysを編集する場合は、一旦保存した後、ターミナルソフトの画面幅を変えてもう一度表示して見ることをおすすめします。時々コピペした時に改行が混ざってたりして、それらの消し忘れを画面幅を変えて折り返しを変えることで確認します。

参考:



プレーンテキスト形式でダウンロード
現在のバージョン : 3
更新者: msakamoto-sf
更新日: 2014-05-06 15:51:19
md5:a202ac61d706803d4609f5d30e007f87
sha1:a40abc7d36d7a8c6b0dfa973b75336efcc9cc883
コメント
コメントを投稿するにはログインして下さい。