sshの秘密鍵にpassphrase掛けない人と、 無闇やたらにsudoする人に、死の鉄槌を!!!!!!!!!!!!!!!!!!!!!!!!!!! 2013/02/06 (水) 12:00-13:00 @ Livesense TechLunch 発表者:松永 一郎
ssh agentの薦めより楽に、そしてある程度secureに
View Slide
まず質問● agent使ってる人。(場合によっては、このrc終了)● linux開発環境に入る毎に、sshの秘密鍵の認証(パスワード入力)を行なっている人。● ある環境から別環境(例えば、tanzaniaや、viper等から本番等)にログインする為に、秘密鍵ファイルを各踏み台に転送している人。● 先週、松阪氏がbash completeの話してたけど、scp、リモートのファイル名補完してくれないよね!! 駄目じゃんと思った人。
それ、ssh agentを使うと簡単基本unix系(含むOS X)の人の話ですが、puttyにもagentがあるんで、多分出来るはずです。ssh agentとは、鍵の認証情報をローカルPCに保持し、agentとログイン先のssh serverとの通信経路を作ってくれ、エージェントとネゴをするようなprocess(常駐? アプリ。)ローカルにある秘密鍵との認証情報も転送してくれるので、agent内の鍵がtimeoutするまでは、agentが認証を肩代りしてくれる。
普通の認証を図で説明sshの起動毎に秘密鍵へアクセスし、パスワード入力による復号を行なう。
ssh agentを使った場合を図で説明ようするにagentに鍵の認証情報がある鍵り(笑う所!!)楽出来る。
三行でたのむ。● 認証一回● 各serverに秘密鍵不要● (゚д゚)ウマー
御託はわかった。やりかたを教えろください。ichiro@ichiro:~$ ssh-add -lCould not open a connection to your authentication agent.ichiro@ichiro:~$ ps auxww|grep ssh-agentichiro 29177 0.0 0.0 14576 920 pts/8 S+ 02:10 0:00 grep ssh-agentichiro@ichiro:~$ eval $(ssh-agent)Agent pid 29188ichiro@ichiro:~$ ps auxww|grep ssh-agentichiro 29188 0.0 0.0 12492 324 ? Ss 02:11 0:00 ssh-agentichiro 29192 0.0 0.0 14576 920 pts/8 S+ 02:11 0:00 grep ssh-agentichiro@ichiro:~$ ssh-add -lThe agent has no identities.$ ssh-add -t180 ~/.ssh/id_rsa_livesenseEnter passphrase for /home/vikke/.ssh/id_rsa_livesense:Identity added: /home/vikke/.ssh/id_rsa_livesense (/home/vikke/.ssh/id_rsa_livesense)Lifetime set to 180 secondsichiro@ichiro:~$ ssh-add -t 180 ~/.ssh/id_dsa_marsEnter passphrase for /home/vikke/.ssh/id_dsa_mars:Identity added: /home/vikke/.ssh/id_dsa_mars (/home/vikke/.ssh/id_dsa_mars)Lifetime set to 180 secondsichiro@ichiro:~$ ssh-add -l2048 15:1a:af:5c:b9:31:6b:6d:7c:4e:11:85:07:e9:e5:76 /home/vikke/.ssh/id_rsa_livesense (RSA)1024 3a:de:8f:e8:75:21:77:b7:a2:79:6d:ed:1b:ed:5b:8e /home/vikke/.ssh/id_dsa_mars (DSA)
細かいんだ、う゛ぉけーーーー実演
bashrcにどう書くか。接続周りの設定を.ssh/configに書く方法もありますが、僕は.bashrc(がsourceするファイル)にまとめてます。
bashrc (agent常駐部)# SSHのagent周りの設定if ssh-add -l >/dev/null 2>&1then:elif [ 2 == "$?" ]thenexport SSH_AUTH_SOCK=${HOME}/.ssh/sock.`hostname`if ssh-add -l > /dev/null 2>&1then:elif [ 2 == "$?" -a ! "$SSH_CLIENT" ]thenrm -f ${SSH_AUTH_SOCK}eval `ssh-agent -a ${SSH_AUTH_SOCK}`fifi============ いいわけ ====================================================================================ちょっと冗長に見えますが、僕は同じbashrcを各serverにばら撒いているので、sshのagentが転送されているかどうかを判断したりするロジックが入っているので、こんな書き方になっています。eval `ssh-agent`な書き方とか、thenの字下げが、ちょっと時代を感じさせますね。多分10年位前に書いた部分ですね。どっかで書き直したいと思います。というか、今回の為に見直してて、なんでこんな書き方になっているのか、ちょっと自分でも悩みました。おそらくこんな書き方しなくても良いはずですが、まー、若気の至りとい(ry
bashrc (鍵追加部)# ssh-agentへkeyを追加function keyadd {ssh-add -l | grep "mars" > /dev/nullif [ 1 == "$?" ]thenecho "ssh key add"ssh-add -t 180m ~/.ssh/id_dsa_marsfi}
bashrcから各環境依存ファイル読み込みls ~/misc-env/*.sh >/dev/null 2>&1if [ $? -eq 0 ]; thenfor f in ~/misc-env/*.sh;do. ${f}donefiなぜ.bashrcに書かないかというと、僕は.bashrc等をgithubに上げている関係で、securityを考え、このように分離しています。
~/misc-env/livesense.shfunction dev {#keyaddeval ${cocot} -p UTF-8 -- ssh -AY [email protected]}function staging {eval ${cocot} -p UTF-8 -- ssh -AY [email protected]}..............function l-mnt-dev {sshfs -o follow_symlinks [email protected]:/home/websites ~/mnt/dev}function l-umnt-dev {umount ~/mnt/dev}-Aでagentの転送を行なっています。-YはX windowを転送する為の設定です。って、keyadd使ってないじゃないですかーーーーー。どうもubuntuの(というかgnomeの)keyring managerとバッティングしちゃうんで、今、ssh-agentは使っておらず、gnomeのkeyring managerを使ってる(はずです。細かい調査してません。時間取れしだいやります。ごめんなさいごめんなさいごめんなさいごめんなさいごめんなさい。)
あとは繋ぐだけ$ devとかやれば繋がる。
一応、リスクの話agentと通信をしているsocketは700で自分持ちになってますが、rootだと覗けます。まー、秘密鍵奪うよりは大変ですが、一応、乗っとられる可能性は残ります。でも、秘密鍵をserverに置くよりは良いでしょう。