公開鍵認証を使って Git サーバーへ SSH で接続する

SPECIAL


公開鍵認証を使って Git サーバーへ SSH で接続する

Git サーバーへ SSH で接続するときに、パスワードではなく、秘密鍵を使って認証を行えるようにしてみます。

ここでは Linux や Mac OS X などの、OpenSSL コマンドが使える環境での設定方法です。

クライアント側で鍵ペアを作成する

公開認証鍵による SSH 接続を行うに当たって、接続元であるクライアント側に "秘密鍵" を用意する必要があります。

そのために、コマンドラインから次のコマンドを実行します。

ssh-keygen -t rsa -b 4096

このようにすると、次の事項を尋ねられます。

Enter file in which to save the key (/home/xxxx/.ssh/id_rsa): 鍵ペアを保存するディレクトリを指定します。
今回は "~/.ssh/id_git" とすることにしました。
Enter passphrase (empty for no passphrase): 秘密鍵を登録する際に必要なパスワードを設定します。パスフレーズが不要の場合は [Enter] キーを押します。
Enter same passphrase again: 入力したパスフレーズを、再度入力します。

このようにすることで、最初の "Enter file in which to save the key" で尋ねられたときに入力した場所に、秘密鍵と公開鍵とがテキスト形式で保存されました。

今回の例では、秘密鍵は "~/.ssh/id_git" という名前で保存されて、公開鍵は "~/.ssh/id_git.pub" というように、指定したファイル名の後ろに ".pub" が付与されたファイル名になります。

なお、ここでパスフレーズを設定した場合、Mac OS X では、ターミナルからでも Xcode4 からでも、リポジトリに接続する必要が出てきた場合には、起動後の毎回 1 度、パスワードを尋ねるダイアログが表示され、認証手続きを進める形になる感じでした。

Git サーバーに公開鍵を登録する

鍵ペアが作成できたら、そのうちの公開鍵(ファイル名の最後に ".pub" が付いたもの)の内容を、Git サーバーに登録します。

Git サーバーに SSH 等でログインしたら、つぎのような感じにして、Git リポジトリへのアクセスに使用するアカウントのホームディレクトリに ".ssh" ディレクトリを作成して、そこに "authorized_keys" というファイルを作成します。

例えば、Git リポジトリにアクセスするアカウントが "git" の場合は、次のように操作します。

sudo -u git mkdir /home/git/.ssh

sudo -u git touch /home/git/.ssh/authorized_keys

"~/.ssh/authorized_keys" ファイルが作成できたら、その中に、クライアント側で作成した鍵ペアのうち、公開鍵(ファイル名の最後に ".pub" が付いたもの)の内容を、このファイルに 1 行で書き込みます。

公開鍵ファイルをサーバーにアップロードできるようなら、アップロードして、次のようなコマンドを実行するのが簡単かもしれません。

cat id_git.pub >> /home/git/.ssh/authorized_keys

authorized_keys に公開鍵が登録できたら、これで Git サーバー側での準備は完了です。

ちなみに、authorized_keys ファイルは # から始まる行はコメントとして扱われるようなので、登録した公開鍵がどんなクライアントで使われているものなのかをメモしておくと、管理しやすいかもしれません。

クライアントに SSH 接続情報を設定する

そして、接続元であるクライアント側で、SSH 接続情報を登録しておきます。

SSH 接続情報の登録は、クライアント側で "~/.ssh/config" ファイルを編集し、次のような行を追加します。

host GITSERVER

user git

hostname 192.168.1.222

port 22

identityfile ~/.ssh/id_sakura

identitiesonly yes

この "host" ではじまる 1 セットは、"~/.ssh/config" ファイル内にいくつでも登録することができます。

このようにすることで、"host" で指定した名前を接続先に指定するだけで、それ以下のパラメーターを自動的に使用して SSH 接続を行ってくれるようになります。

ただし、Mac OS X の開発環境で Git サーバーを使用する場合、Xcode4 の制約か、"host" で指定する文字列は、実在するサーバー名を指定する必要があるようでした。

ドメイン名でも /etc/hosts ファイルに登録したホスト名でもいいのですけど、とにかくその名前で通常のネットワーク接続ができないと、Xcode4 はその Git サーバーは利用できないものと判定して諦めてしまうようなので、Xcode4 で Git サーバーを使用する場合には、注意して "host" の名前を指定してあげる必要があります。

ssh での接続の際に使用する場合には、"host" の名前が架空のホスト名であっても、その名前でちゃんと接続することができます。

上記の例での設定内容としては、"user" として "git" を指定しているので、接続アカウントは "git" になります。また、接続先のサーバーは "hostname" で指定した "192.168.1.222" になります。また、接続先ポート番号を "port" で "22" にしています。

併せて "identityfile" としてクライアント側に保存してある秘密鍵ファイルを指定しているので、接続の際にはこの鍵を使って公開鍵認証を行うことができるようになっています。また "identitiesonly" という設定は、"identityfile" で指定したキーだけで接続を試みるという意味合いになります。

おそらく、公開鍵認証で Git サーバーへ接続したい場合には、このように "~/.ssh/config" にあらかじめ、接続情報を登録しておく必要があると思います。

 

このように接続情報を登録したら、たとえば "ssh://git@192.168.1.222:22/home/git/" としなければいけなかったようなところ、単純に "ssh://GITSERVER/home/git/" という形で、Git サーバーにアクセスすることができるようになります。

これは Git に限ったことではないので、SSH でサーバーへアクセスしたい場合にも、単純に "ssh GITSERVER" とするだけで、ポート番号や認証鍵などを使ってサーバーへ接続できて便利です。

 

目次