カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

authorized_keyの苦痛を少しでも軽減させる方法

この前初めて知ったのですが、本読んでたら、こんなもんあるのかと思ったので、紹介してみる。

そのコマンド名は「ssh-copy-id」です。周知の事実だったらごめんなさい。あと、セキュリティの話しは末尾に。

ssh-copy-idって何?

sshで公開鍵認証とかしてると、接続先のサーバの「~/.ssh」以下に「authorized_keys」作らないといけないわけですが、どうも作成するのが面倒。

転送なり、ファイル作りなり、まぁ色々方法はあるんでしょうけど、いずれにしてもめんどい。権限周りもあるし。まぁ、セキュリティとして大事なとこなので、わがまま言っちゃいけないんですが、楽はしたい。

そんな悩みを軽減してくれるのが、「ssh-copy-id」です。簡単に言えば、ローカルにある公開鍵をリモートサーバにauthorized_keysとしてインストールしてくれるというもの。

manには以下のように書かれています。

ssh-copy-id - install your identity.pub in a remote machine's authorized_keys

identity.pubをリモートマシンのauthorized_keysに設定くれるよーと。

使い方は以下のような感じ

$ ssh-copy-id -i ~/.ssh/id_rsa.pub masuda@192.168.1.1

これだけで192.168.1.1というリモートの「/home/masuda/.ssh/authorized_keys」にローカルの公開鍵が設定されます。便利ですな。権限もownerにrwのみになっております。

ということで、簡単にシェルスクリプト作ってみる

IPのリストを作って、そのリストにあるサーバには同じ鍵を設置するような場合。
まず、seqなりを使って、IPの末尾をファイルに出力。

$ seq 115 125 > servers.list

vimとかemacsで連番できるならそれでもよいかもしれない。
んで、vimとかでservers.listを開いて、

%s/^/192.168.1./gc

とやって、行頭に「192.168.1.」を全行付与する。コマンドでもできる気がする…
joinとかでやるのは大変か…

そしたら、あとはサーバの分だけシェルスクリプトでループさせるだけ。

#/bin/sh

USER='masuda'
SERVERS_LIST='/home/masuda/.ssh/servers.list'
SSHKEY='/home/k_masuda/.ssh/id_rsa.pub'
for IPADDRESS in `cat ${SERVERS_LIST}`
do
    ssh-copy-id -i ${SSHKEY} ${USER}@${IPADDRESS}
    ELEVEL=$?
    if [ $ELEVEL -ne 0 ]; then
        echo -e "\033[40m\033[1;31mFailed: ${IPADDRESS} \033[0m"
    else
        echo "Success: ${IPADDRESS}"
    fi
    echo '----------------------------------------'
done

コマンドに失敗した場合は、色をつけたりしたら、わかりやすいでしょう(この例は、失敗すると文字色が赤になる)。
こんな感じで、特定のサーバ群にauthorized\_keysを作ることができるという。
(ファイルの存在の有無確認してないじゃない…)

終わりに(セキュリティは…)

VMのイメージコピーとかクラウドのコピー機能使っていたら、出番少ないかもだけど、新しいVM作った時とかさくっとできると言えばできる。ただ、これだけだとセキュリティがどうしても気になるので、コマンドの制限とかやったほうがよいと思うので、その人のポリシー次第ですな。

ほんとはこういう記事とかも読んで、リモートホストに作成した、リモートのファイル編集しよ、ssh経由でできるようにコマンド覚えよとかでもよいのかもだけど、こういうコマンドもあるよ!ということで。

なので、ご利用は計画的にということで、お願いします!


P.S.
台数増えると、微妙に時間もかかるし、並列できないのは色々もったいないし、やっぱpushよりpullのほうがよいなぁと思う今日この頃…