初めに
Unix系のSSH公開鍵認証鍵の作成と設置はやることは単純で、ほぼやることは同じだけど、地味に面倒いですよね。
これを可能な限り自動化したいと思ったのがきっかけです。
概ねやることはこんな感じだと思います。
# (1) 鍵作成
ssh-keygen -N "" -t rsa -f ~/.ssh/id_rsa
# (2-a) 鍵をサーバーに転送する
ssh-copy-id -i ~/.ssh/id_rsa.pub hoge@sample.com
# (2-b)もしくは手動でサーバーのauthorized_keysに追記する
cat ~/.ssh/id_rsa.pub| ssh hoge@sample.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh/ && chmod 755 ~/"
# (3) 必要なら秘密鍵情報を追記する
vi ~/.ssh/config
毎日使うわけじゃないけど
対象のサーバーがたくさんあると地味に面倒だし、
自動化出来そうなんだよなぁ。と思ったのがきっかけです。
特徴
Mac OS X , CentOS 7で動作確認済みです。
Unix/Linux系でsshが利用でき、Python2.7が動けば利用できると思います。
(1) (2) (3) の必要なコマンドを1コマンドで出来ます。
(2)が必要ならサーバーのパスワードを1回うつだけでよいです。
裏で実行されるコマンドが緑色で表示されるので安心(?)
VPSなどを借りた時のまっさらな状態から、とりあえず公開鍵認証設定しようとしたときなどに便利だと思います。
使い方
導入
python2.7.xが実行できる環境
手軽に扱えるようにと、プログラム本体は1ソースにしてます。
リポジトリはこちら
https://github.com/yuki2006/pubkey
本体だけで良ければ
wget https://raw.githubusercontent.com/yuki2006/pubkey/master/pubkey.py
免責事項
秘密鍵を扱うので
動作原理が理解できる方のみご使用ください。
このツールを使って問題が発生しても、開発者は保証しないとします。
ヘルプ
python pubkey.py
#もしくは実行権限をつけて
./pubkey.py
./pubkey.py -h
usage: pubkey.py [-h] [-l] [-p PrivateKeyPath] [-k] [-c] [-a ALIAS]
[-N PassPhrase]
server
positional arguments:
server user@server
optional arguments:
-h, --help show this help message and exit
-l, --LocalOnly オプションをつけると、サーバー上の操
作を行いません。
-p PrivateKeyPath, --private PrivateKeyPath
private key のパスです [default
/Users/yuki2006/.ssh/id_rsa]
-k, --keygen keygenで鍵を生成します
-c, --config .ssh/config にHost情報を書き込みます
-a ALIAS, --alias ALIAS
-cオプションをつけた時のみ有効,
configファイルの
Host欄をこの指定にします
-N PassPhrase パスフレーズを指定します。空文字も可
能です。(-k オプション時に有効です)
リモート上に鍵を追記する
最低限のオプション
./pubkey.py hoge@sample.com
~/.ssh/id_rsa.pubを公開鍵として(2)を実行します。
hoge@sample.com の~/.ssh/authorized_keys に公開鍵を追記します。
この時、ローカルでssh-copy-id
コマンドが利用できるなら (2-a)を利用し、利用できないのなら(2-b)を実行します。
サーバーのパスワードを入力してください。
秘密鍵と公開鍵の生成もする(-k)
./pubkey.py -k hoge@sample.com
(2)を実行するまえに(1)を実行します。
この時、単純に(1)を呼び出してるので、表示に従ってパスフレーズを入力してください。
パスフレーズを指定する(-N)
./pubkey.py -N "" -k hoge@sample.com
(1)の呼び出し時、パスフレーズを打つのがめんどい方用です。
ssh-keygen 呼び出し時に -Nオプションをつけています。
秘密鍵ファイルを指定する。(-p/--private)
./pubkey.py -p ~/.ssh/key -N "" -k hoge@sample.com
./pubkey.py --private ~/.ssh/key -N "" -k hoge@sample.com
デフォルトの秘密鍵以外を使いたい場合です。
-pの後に秘密鍵のパスを指定してください。
公開鍵は~/.ssh/key.pub のように.pubが付加されるものが使われます。
~/.ssh/config に設定を書く (-c)
./pubkey.py -c -p ~/.ssh/key -N "" -k hoge@sample.com
-cオプションをつけると~/.ssh/configに下のようなテキストが追記されます。
(3)の処理の自動化です。
Host sample.com
User hoge
IdentityFile ~/.ssh/key
aliasを指定します。(-a)
./pubkey.py -a sample -c -p ~/.ssh/key -N "" -k hoge@sample.com
簡単にいうと下のように追記されます。
Host sample
hostname sample.com
User hoge
IdentityFile ~/.ssh/key
これを設定すると、このように打つだけで接続できます。
(ユーザー名とhostnameの省略)
ssh sample
リモート上に公開鍵を置く処理をしない(-l/--LocalOnly)
./pubkey.py -l -a sample -c -p ~/.ssh/key -N "" -k hoge@sample.com
(2)を実行しません。
keygenやconfigファイルは作りたいけど、リモート上に公開鍵を置く必要が無い場合に指定します。
主にデバッグ用です。
あとがき
実際何台にも対して使用したり、人に使ってもらったりして効率化できてることを確認しました。
Pythonの書き方が怪しいところもあるかもしれません。
argparseを使っているため2.7以上ですが、
メインの処理はどれでも動くはずなので要望があれば2.6などでも動くのを考えたいと思います。
問題やプルリクがもしあればgithub上にお願いします。
逆にこれを使わなくても便利なツールがあったりしたら教えて下さい。