#navi_header|技術| SSHの使い方のメモ書き。 #more|| 日記から: - [[317]] - [[722]] - [[732]] - [[733]] #outline|| ---- * ~/.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: #pre||> 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: #pre||> SSH_AGENT_SRC=~/.ssh_agent_env ssh-agent -k >& /dev/null /bin/rm -f ${SSH_AGENT_SRC} ||< ポイント: + 一度、".ssh_agent_env"を読み込んだ後に ssh-add してみて、戻り値をチェックして異常があれば、古いのが残ってるとか何かだと思うので、ssh-agentを起動しなおして ".ssh_agent_env" を更新+再読み込みしてる。 + ".bash_logout" はログインシェルからログアウトする場合に読み込まれる。screenから起動したbashからexitする時は読み込まれないので、例えばWindowsホストからPuttyでログイン~screenで複数のbash開いて作業~最後、閉じてログアウトしたら削除される。 ・・・ただし、これだと、screenをdetachしてログアウトしてしまうと、screenの各セッションから参照しているssh-agentが終わってしまうので、もう一度SSHとかでログインしてscreen -rすると、ssh-agentと通信できなくなっててアウトな気がする。 ちょっと使い方に工夫と注意が必要そう。bashの関数にして、ユーザが明示的に操作できるようにするのもありか。 参考: - 自分サーバの構築その14:ssh-agentでノンパスワードを実現 - Akio’s Log -- http://d.hatena.ne.jp/elwoodblues/20070619/1182240574 - .bash_profileとか.bash_loginとか.profileとか.bashrcとか.bash_logoutとか多すぎる - rderaログ -- http://d.hatena.ne.jp/rdera/20080806/p1 * 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ページ): - encryption - What is the difference between DSA and RSA? - Stack Overflow -- http://stackoverflow.com/questions/2841094/what-is-the-difference-between-dsa-and-rsa - encryption - RSA vs. DSA for SSH authentication keys - IT Security Stack Exchange -- http://security.stackexchange.com/questions/5096/rsa-vs-dsa-for-ssh-authentication-keys - さて、今日も勉強するか。 SSHでの暗号方式、RSAとDSAの違い メモ -- http://monoknock.blog116.fc2.com/blog-entry-34.html - 第12回 SSHについて - Linux入門講座 -- http://www.phppro.jp/school/linux/vol12/1 - DSA暗号とRSA暗号 | ネットワークセキュリティのQ&A【OKWave】 -- http://okwave.jp/qa/q1806455.html 参考2(2001 - 2003年ごろのリソース): - Which is better RSA or DSA public key? -- http://www.linuxquestions.org/questions/linux-security-4/which-is-better-rsa-or-dsa-public-key-12593/ - RSA versus DSA -- http://www.linuxforums.org/forum/security/3515-rsa-versus-dsa.html ** 生成する秘密鍵・公開鍵のファイル名を変更したい →秘密鍵のファイル名を "-f" で指定する。公開鍵のファイル名は指定できない(多分)。公開鍵のファイル名は、秘密鍵のファイル名の後ろに ".pub" が追加される。 $ ssh-keygen.exe -t rsa -f abc -> 現在ディレクトリに "abc"(秘密鍵), "abc.pub"(公開鍵)が生成される。 ** 鍵ファイルのフォーマットについて ssh-keygenで生成される鍵ファイル("-t rsa"の場合): 秘密鍵:(多分PKCS8かPEM形式のどちらかかと・・・) #pre||> -----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の違いが理解不能。 参考: - RFC 4716 - The Secure Shell (SSH) Public Key File Format -- http://tools.ietf.org/html/rfc4716 -- http://www.unixuser.org/~haruyama/RFC/ssh/rfc4716.txt -- SSH2の公開鍵ファイルのフォーマット。"---- BEGIN SSH2 PUBLIC KEY ----"で始まり、"---- END SSH2 PUBLIC KEY ----"で終わる、で確定。 -- '' authorized_keys のフォーマットではない。 '' - PKCS8 : 秘密鍵ファイルのフォーマット -- http://www.openssl.org/docs/apps/pkcs8.html -- http://tools.ietf.org/html/rfc5208 : あまり具体的なファイルヘッダー・フッターの情報が見つからない・・・。中身の方の定義? ** 秘密鍵のパスフレーズを思い出すために入力して確認したい、あるいは秘密鍵からもう一度公開鍵(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" パスフレーズを設定していない秘密鍵を指定した場合は、パスフレーズの入力なしでいきなり公開鍵が出力されます。 参考: - linux - How to verify if two strings are key pairs generated using ssh-keygen? - Stack Overflow -- http://stackoverflow.com/questions/8242608/how-to-verify-if-two-strings-are-key-pairs-generated-using-ssh-keygen - encryption - How do you test a public/private keypair? - Stack Overflow -- http://stackoverflow.com/questions/274560/how-do-you-test-a-public-private-keypair ** 秘密鍵をパスフレーズ無しにしたい、あるいはパスフレーズ無しの秘密鍵にパスフレーズを設定したい $ ssh-keygen -p -f 秘密鍵ファイル名 →新しいパスフレーズを聞かれるので、何も入力しなければパスフレーズ無しに、パスフレーズを入力すればパスフレーズ有りになります。 注意点:秘密鍵ファイルは '' 上書き保存される '' ため、もし不安であればバックアップをとって置くと良いでしょう。 * ホスト毎に秘密鍵を使い分けたくなったら、"~/.ssh/config" を活用しよう! "~/.ssh/config": #pre||> # "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 ||< 参考: - "man ssh_config" - SSH_CONFIG (5) -- http://www.unixuser.org/~euske/doc/openssh/jman/ssh_config.html - .ssh/config でSSH設定を活用する方法。 - それマグで! -- http://takuya-1st.hatenablog.jp/entry/20110705/1309873005 - Mac で ssh config を設定した後、 「Too many authentication failures for xxxx」エラーへの対応をして、さらに鍵使用時に毎回パスフレーズを訊かれないようにする。 - modifiedの日記 -- http://d.hatena.ne.jp/modified/20120612/1339492459 * 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" 設定例: #pre||> 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を編集する場合は、一旦保存した後、ターミナルソフトの画面幅を変えてもう一度表示して見ることをおすすめします。時々コピペした時に改行が混ざってたりして、それらの消し忘れを画面幅を変えて折り返しを変えることで確認します。 参考: - putty - How to convert SSH keypairs generated using PuttyGen(Windows) into key-pairs used by ssh-agent and KeyChain(Linux) - Stack Overflow -- http://stackoverflow.com/questions/2224066/how-to-convert-ssh-keypairs-generated-using-puttygenwindows-into-key-pairs-use - PuTTY FAQ -- http://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html#faq-ssh2-keyfmt - SSHの秘密鍵について - 禿散らかしてごめんなさい -- http://d.hatena.ne.jp/machua/20110809/1312899353 #navi_footer|技術|