Upgrade to Pro — share decks privately, control downloads, hide ads and more …

sshの秘密鍵にpassphrase掛けない人と、 無闇やたらにsudoする人に、死の鉄槌を!!!!!!!!!!!!!!!!!!!!!!!!!!! #TechLunch

sshの秘密鍵にpassphrase掛けない人と、 無闇やたらにsudoする人に、死の鉄槌を!!!!!!!!!!!!!!!!!!!!!!!!!!! #TechLunch

sshの秘密鍵にpassphrase掛けない人と、 無闇やたらにsudoする人に、死の鉄槌を!!!!!!!!!!!!!!!!!!!!!!!!!!!
2013/02/06 (水) 12:00-13:00 @ Livesense TechLunch
発表者:松永 一郎

Livesense Inc.
PRO

April 21, 2014
Tweet

More Decks by Livesense Inc.

Other Decks in Technology

Transcript

  1. ssh agentの薦め
    より楽に、そしてある程度secureに

    View Slide

  2. まず質問
    ● agent使ってる人。
    (場合によっては、このrc終了)
    ● linux開発環境に入る毎に、sshの秘密鍵の認
    証(パスワード入力)を行なっている人。
    ● ある環境から別環境(例えば、tanzaniaや、
    viper等から本番等)にログインする為に、秘密
    鍵ファイルを各踏み台に転送している人。
    ● 先週、松阪氏がbash completeの話してたけ
    ど、scp、リモートのファイル名補完してくれない
    よね!! 駄目じゃんと思った人。

    View Slide

  3. それ、ssh agentを使うと簡単
    基本unix系(含むOS X)の人の話ですが、puttyに
    もagentがあるんで、多分出来るはずです。
    ssh agentとは、鍵の認証情報をローカルPCに保
    持し、agentとログイン先のssh serverとの通信経
    路を作ってくれ、エージェントとネゴをするような
    process(常駐? アプリ。)
    ローカルにある秘密鍵との認証情報も転送してく
    れるので、agent内の鍵がtimeoutするまでは、
    agentが認証を肩代りしてくれる。

    View Slide

  4. View Slide

  5. 普通の認証を図で説明
    sshの起動毎に秘密鍵へアクセスし、パスワード入
    力による復号を行なう。

    View Slide

  6. ssh agentを使った場合を図で説明
    ようするにagentに鍵の認証情報が
    ある鍵り(笑う所!!)楽出来る。

    View Slide

  7. 三行でたのむ。
    ● 認証一回
    ● 各serverに秘密鍵不要
    ● (゚д゚)ウマー

    View Slide

  8. 御託はわかった。やりかたを教えろください。
    ichiro@ichiro:~
    $ ssh-add -l
    Could not open a connection to your authentication agent.
    ichiro@ichiro:~
    $ ps auxww|grep ssh-agent
    ichiro 29177 0.0 0.0 14576 920 pts/8 S+ 02:10 0:00 grep ssh-agent
    ichiro@ichiro:~
    $ eval $(ssh-agent)
    Agent pid 29188
    ichiro@ichiro:~
    $ ps auxww|grep ssh-agent
    ichiro 29188 0.0 0.0 12492 324 ? Ss 02:11 0:00 ssh-agent
    ichiro 29192 0.0 0.0 14576 920 pts/8 S+ 02:11 0:00 grep ssh-agent
    ichiro@ichiro:~
    $ ssh-add -l
    The agent has no identities.
    $ ssh-add -t180 ~/.ssh/id_rsa_livesense
    Enter 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 seconds
    ichiro@ichiro:~
    $ ssh-add -t 180 ~/.ssh/id_dsa_mars
    Enter 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 seconds
    ichiro@ichiro:~
    $ ssh-add -l
    2048 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)

    View Slide

  9. 細かいんだ、う゛ぉけーーーー
    実演

    View Slide

  10. bashrcにどう書くか。
    接続周りの設定を.ssh/configに書く方法もありま
    すが、僕は.bashrc(がsourceするファイル)にまと
    めてます。

    View Slide

  11. bashrc (agent常駐部)
    # SSHのagent周りの設定
    if ssh-add -l >/dev/null 2>&1
    then
    :
    elif [ 2 == "$?" ]
    then
    export SSH_AUTH_SOCK=${HOME}/.ssh/sock.`hostname`
    if ssh-add -l > /dev/null 2>&1
    then
    :
    elif [ 2 == "$?" -a ! "$SSH_CLIENT" ]
    then
    rm -f ${SSH_AUTH_SOCK}
    eval `ssh-agent -a ${SSH_AUTH_SOCK}`
    fi
    fi
    ============ いいわけ ====================================================================================
    ちょっと冗長に見えますが、僕は同じ
    bashrcを各serverにばら撒いているので、
    sshのagentが転送されているかどうかを判断したりするロジックが入ってい
    るので、こんな書き方になっています。
    eval `ssh-agent`な書き方とか、thenの字下げが、ちょっと時代を感じさせますね。多分
    10年位前に書いた部分ですね。
    どっかで書き直したいと思います。というか、今回の為に見直してて、なんでこんな書き方になっているのか、ちょっと自分でも悩みました。
    おそらくこんな書き方しなくても良いはずですが、まー、若気の至りとい
    (ry

    View Slide

  12. bashrc (鍵追加部)
    # ssh-agentへkeyを追加
    function keyadd {
    ssh-add -l | grep "mars" > /dev/null
    if [ 1 == "$?" ]
    then
    echo "ssh key add"
    ssh-add -t 180m ~/.ssh/id_dsa_mars
    fi
    }

    View Slide

  13. bashrcから各環境依存ファイル読み込み
    ls ~/misc-env/*.sh >/dev/null 2>&1
    if [ $? -eq 0 ]; then
    for f in ~/misc-env/*.sh;do
    . ${f}
    done
    fi
    なぜ.bashrcに書かないかというと、僕は.bashrc等
    をgithubに上げている関係で、securityを考え、こ
    のように分離しています。

    View Slide

  14. ~/misc-env/livesense.sh
    function dev {
    #keyadd
    eval ${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を使ってる(はずで
    す。細かい調査してません。時間取れしだいやります。ごめんなさいごめんなさいご
    めんなさいごめんなさいごめんなさい。)

    View Slide

  15. あとは繋ぐだけ
    $ dev
    とかやれば繋がる。

    View Slide

  16. 一応、リスクの話
    agentと通信をしているsocketは700で自分持ちに
    なってますが、rootだと覗けます。
    まー、秘密鍵奪うよりは大変ですが、一応、乗っと
    られる可能性は残ります。
    でも、秘密鍵をserverに置くよりは良いでしょう。

    View Slide

  17. View Slide