やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SSHのconfigファイルを編集する方法について調べてみた

実装する前に。

問題

GitHubアカウント登録した後のSSH設定を全自動化したい。

  • SSH鍵生成(秘密鍵,公開鍵)
  • ~/.ssh/configファイル編集
  • GitHubに作成したSSH公開鍵の設定

SSH鍵生成

ssh-keygenコマンド

http://monsat.hatenablog.com/entry/generating-ssh-keys-for-github
ssh-keygen自動化スクリプト - mk_1211の日記

SSH鍵を生成するコマンド。CUI対話があって自動化できない。

http://qiita.com/suthio/items/2760e4cff0e185fe2db9

暗号強度も指定する。

ssh-keygen -t rsa -b 4096 -P "" -C "your_email@example.com" -f "{秘密鍵ファイルパス}"

CUI対話なしで実行できる。

  • 暗号方式はrsa
  • 暗号強度は4096(2048以上推奨らしい)
  • パスフレーズなし
  • メールアドレスをコメントとして入力する
  • {秘密鍵ファイルパス}は任意。例えばrsa_4096_{username}のようにする

ファイルが2つ生成される。

ファイル名 説明
{秘密鍵ファイルパス} 秘密鍵ファイル
{秘密鍵ファイルパス}.pub 公開鍵ファイル

SSH設定

configファイルが曲者。

config

SSHを使うための設定ファイル。

設定内容

~/.ssh/configファイル

Host github.com.{user}
  User git
  Port 22
  HostName github.com
  IdentityFile {秘密鍵ファイルパス}
  TCPKeepAlive yes
  IdentitiesOnly yes

Hostの値はSSH鍵を指定するキーワードになる。任意の値を付与できる。識別しやすくするため、GitHubで使うキーの場合はgithub.com.ではじめて末尾にユーザ名をつけて使い分けるようにする。

paramikoでは編集できない

Pythonでconfigファイルを参照できるライブラリにparamikoがあるらしい。

http://docs.paramiko.org/en/2.1/api/config.html
http://calkinos.hatenablog.com/entry/2016/04/25/092414
http://qiita.com/k2tanaka/items/fc1d83a5bb751cd6dd83

しかし、configファイルの参照はできても、編集はできないっぽい。

SSH鍵を生成したら、自力でファイルに追記するしかなさそう。

configは分割できない

すべてのSSH設定をたったひとつのファイルで一元管理せねばならない。

たとえばGitHubだけの設定を別ファイルにしたいとか、個人用アカウントだけを別ファイルにしたいとかができない。

~/.ssh/configについて - Qiita

複数のconfigファイルを作ってコマンド実行単位で使い分けたい。が、それもできないと思われる。

SSHの確認

暗号強度

指定した鍵ファイルの暗号強度を調べる。

ssh-keygen -l -f "{秘密鍵ファイルパス}.pub"
{-b入力値} {長い文字列}  {-C入力値} (RSA)
  • SSH鍵生成時に-bで指定した値が4096なら{-b入力値}は4096になっているはず
  • SSH鍵生成時に-Cで指定した値がメールアドレスなら{-C入力値}はメールアドレスになっているはず

お前らのSSH Keysの作り方は間違っている - Qiita

通信

~/.ssh/configで設定した値を使ってSSH鍵などを指定する。

ssh -T {config.User}@{config.Host}
ssh -T git@github.com.{user}
Hi trysrv! You've successfully authenticated, but GitHub does not provide shell access.

successfullyと表示されたら成功。

~/.ssh/configで設定した値のなかに存在しない名前を使ったら以下のエラー。

ssh: Could not resolve hostname csharpstudy0: Name or service not known

存在しない公開鍵ファイルパスを使ったら以下のエラー。

{存在しない公開鍵ファイルパス}: No such file or directory

API

https://developer.github.com/v3/users/keys/#create-a-public-key

GitHubSSH公開鍵を設定するAPI

このAPIを使い、先述の通りに作成したSSH公開鍵をGitHubに設定する。

GitHubアカウント作成

新しいテスト用のアカウントを作っておく。

  1. GitHub登録ページにアクセスする
  2. ユーザ名、メールアドレス、パスワードを入力する
    f:id:ytyaru:20170403202153p:plain
  3. freeプランを選択する
    f:id:ytyaru:20170403202205p:plain
  4. テキトーに自分の情報を入力してsubmitボタン押下する
    f:id:ytyaru:20170403202219p:plain
  5. ログイン後の画面が表示される
    f:id:ytyaru:20170403202235p:plain
  6. 登録したMailAddressにGitHubからメールが届くのでVerify email addressリンクを押下する f:id:ytyaru:20170403202245g:plain
  7. Your email was Verified.と上部に表示されているはず。これで有効なE-MailAddres f:id:ytyaru:20170403202251p:plain

このアカウントに対してSSH鍵の作成APIを発行する。

問題

  • ssh-keygen, ssh, コマンドが必要である
  • ~/.sshディレクトリ, ~/.ssh/configファイルを作成する必要がある

Windowsの標準コマンドプロンプトにはssh-keygen, ssh, コマンドがないと思う。Pythonでできたらいいのだろうが調査が面倒。とりあえずLinuxコマンドを使用して実装する。

所感

これをPythonで実装する。