猫でもわかる、公開鍵認証

みなさんこんにちは。ぐーどらくらんちです。最近の週末は、ほぼ欠かさずもくもく会に参加し、すっかり意識高い系エンジニアになっている最近です。高いのは意識だけで実力は全く付いていない

週末にようやく、このブログのサーバのログイン方法を公開鍵認証に設定できたので、今回は忘れないうちに公開鍵認証の設定方法を記事にしてしまおう!という趣旨でブログ記事を書いていきたいと思います。題して「猫でもわかる、公開鍵認証」!

今回の記事は初心者の方でもわかるような記事を書きたいと思います。また、初心者でない方のためにも、設定方法をまとめて書いていきますのでよろしくお願いします!

リモートログイン

今回の記事で何が出来るようになるかというと、「リモートログイン」が簡単に出来るようになります。

そこで、リモートログインからしっかり説明していきたいと思います。

リモートログインとは「遠隔地のパソコンを手元のパソコンで操作できるようにすること」と言えます。

慣例として、手元で操作する側のパソコンを「クライアント」と呼び、離れた場所にあり実際にコマンドを実行している側のパソコンを「アクセス先」や「ログイン先」「サーバー側」と呼びます。

リモートログインは、1:パソコンに接続し 2:認証する の2段階で行われます。

SSH接続

遠隔地のパソコンに接続する際は、SSH接続という接続方法が使われます。

Secure Shell(セキュアシェル、SSH)は、暗号認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコルパスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化される。

出典: フリー百科事典『ウィキペディア(Wikipedia

ものすごくざっくりとした説明をすると、「この方法で通信すると安全じゃね?SSHって名前つけるで」と決められた通信規約(ソフトウェアにおける標準化のための決めごと)のことです。

認証

ツイッターとかラインとかインスタ使う前のあれです。

リモートログインをするためには、SSH接続+ログイン認証が必要になります。ログイン認証には下記の2方式があります。

  • パスワード方式
  • 公開鍵認証方式

パスワード方式はよくある、ユーザー名とパスワードが毎回必要になる方法で、SSH接続をする際にはユーザー名、パスワード、更にアクセスするポート番号の入力が必要になります。

対して公開鍵認証は設定さえしてしまえば、ユーザー名、パスワード、ポート番号も入力がいらなくなります。

公開鍵認証の仕組み

公開鍵認証の仕組みを図にしてみました。

まず鍵のペアを手元で操作する側のPCで作ります。

次にログインしたいサーバーに公開鍵を配置し

あとは設定を正しく行うと、秘密鍵と公開鍵を使って自動で認証が行われます。

鍵の生成

まずは先程の図で説明した、公開鍵と秘密鍵のペアを生成させます。準備として作業するディレクトリ(パソコンの中の場所)を移動しておきましょう。上の図では説明を省きましたが、秘密鍵と公開鍵はそれぞれ予め決められたディレクトリに配置されていないと正しく動作しません。

一般的なMacやLinuxでは、OpenSSHというソフトウェアを使ってSSH通信をします。OpenSSHの場合、公開鍵認証の鍵は「ホームディレクトリ」直下の「.ssh」というディレクトリを読み込みにいきます。慣例として、「ホームディレクトリ」は「~」の記号で表されます。ですので、「.ssh」ディレクトリのパス(配置場所)の表し方は「~/.ssh」と表記されます。つまり、リモートログインをしようとした際に、秘密鍵と公開鍵はクライアントとアクセス先で、下の図のように配置されている必要があります。

ですので、まずは下のコマンドを入力しましょう。

mkdir .ssh

このコマンドは、ディレクトリを作るコマンドです。次に本当に出来ているか確認しましょう。

ls -a

そうすると、今のディレクトリに配置されいるサブディレクトリとファイルの一覧が出てくるかと思います。その中に先程作った「.ssh」のディレクトリも含まれているはずです。

次に公開鍵のペアを生成します。下のコマンドを実行しましょう。

ssh-keygen -b 4096

そうすると生成する秘密鍵と公開鍵の保存先を聞かれます。

Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa):

気にしない場合は空のままEnterを押しましょう。次にパスフレーズの入力を求められます。パスフレーズとは、秘密鍵を使う際のパスワードのようなものです。

Enter passphrase (empty for no passphrase): 
Enter same passphrase again:

入力と確認の2回、パスフレーズを入力します。パスフレーズも空でも先に進めますが、パスフレーズを設定しておくことは様々な団体から推奨されています。(GitHub)入力が終わるとホームディレクトリに「.ssh」ディレクトリが作られ、その中に「id_rsa」と「id_rsa.pub」というファイルが置かれているはずです。コマンドを使って確認してみましょう。

cd .ssh
ls
id_rsa id_rsa.pub

「id_rsa」が秘密鍵で「id_rsa.pub」が公開鍵です。

公開鍵の配置

次に公開鍵をサーバー側に配置します。まず公開鍵をクリップボードへコピーします。

pbcopy < id_rsa.pub

pbcopyはMacOSで使えるコマンドで、クリップボードへ文字列をコピーするコマンドです。なので「⌘+V」で公開鍵の内容をすべて貼り付けることが出来る状態です。

次にサーバーへログインし、先ほどと同じように.sshディレクトリを生成しましょう。

mkdir .ssh

次にこちら側には、authorized_keysというファイルを作ります。次のコマンドを実行しましょう。

cd .ssh
vim authorized_keys

vimはLinux環境下ではほぼ標準でインストールされているテキストエディタです。

何も入力されていない画面が出てきているはずですが、そのままでは書き込めませんので、「a」をタイプしましょう。すると書き込めるようになりますので、「⌘+V」を押して、先程取り込んだ公開鍵の中身を貼り付けましょう。すると下のようなものが書き込まれるかと思います。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDnQa7o7xSb3OCmoaZ6p1K/9xDpgY5gTiJlw6X3Boq+/3zfXugsAfTxOGQw5vURj/vupKnZAuFgt3YT+J8j80B4x1ek2Q9MrD5Qqguuh0FDeZtdSzGciAsnfT2UKJ1QwVtrqm1C9ww73KU+5HbI0UlZY3Z0OOmV4EKQIkGBbZWqjr0qVKeH+Hr5jKtChXx40vtmb44vXCktWDVGqhwFtyRPNWD/chMtU+snLZnhzlZGXGvxHTftbEZ3Ft+hS7ucJ1TKOSY6vb7IOvoFKd55XCTamOmnxRagOBtQE3hqZupasuLnxVeQ6HZ/yEnnUMDRk5g/RUWKRaFY5refXG8XsOQJ

これが公開鍵の中身で、ランダムで生成されているものです。人により内容は変わりますので、文字が同じでない場合でも大丈夫です。画面に入力できたら次はこのまま保存します。escキーを押し、その後「:」「w」「q」「Enter」と順番に押してください。先程までのコマンドを入力できる状態に戻ります。これで公開鍵の配置は終わりです。

権限の設定

では次に、公開鍵と秘密鍵の権限設定を行います。権限とはLinux系OSでは頻繁に出てくる概念です。詳しくは今回の記事では省きますが、設定しておかないと使えないくらいに考えておいてください。ではまずAuthorized_keysの権限設定から行います。下のコマンドを実行してください。

chmod 600 authorized_keys
chmod 700 ~/.ssh

公開鍵の権限は600、ディレクトリは700でなければいけません。さらにディレクトリと公開鍵の所有者は、ログインするユーザーのものでないとログインできませんので注意してください。所有者と権限の確認を行います。

ls -l
-rw------- 1 所有者 所有グループ ファイルサイズ 日付と時刻 authorized_keys

所有者と所有グループ=ログインするユーザー名になっていましたか?なっていない場合は下のコマンドを実行しましょう。(僕はここでハマりました)

cd ..
chown ログインするユーザー名:ログインするユーザー名 -R .ssh

これでサーバー側の設定はすべて終了です。

次にMac側の権限も設定します。(僕はここにも気が付かずハマりました。)リモートを抜けたらまずは現在パスの確認をしましょう。

pwd

.sshディレクトリでしたらそのまま、権限設定のコマンドを打ちましょう。

chmod 600 id_rsa
chmod 700 ~/.ssh

権限設定は以上です。お疲れ様でした。

ログインの簡略化(configファイルのススメ)

さて、ここまでで公開鍵認証の設定は終わりですが、現状ですと下のようなコマンドを打ってログインする必要があります。

ssh user@host (-p ポート番号)

ユーザー名とホスト名とポート番号入力するの面倒くさいなと感じたので、接続時に簡略化する方法を調べました。明日からssh接続のコマンドはこれだ。

ssh hoge

超ラクじゃないですか?ここからはその設定方法を書きます。カレントディレクトリの.sshディレクトリ内にconfigファイルを作ります。書く内容は以下の通り。

Host SSHコマンド時の接続名
HostName 接続先ホスト
User ログインユーザー名
Port ポート番号
IdentityFile (秘密鍵のパス)
TCPKeepAlive yes
IdentitiesOnly yes

例えば、GitHubにSSH接続する時の設定は下記の通りです。

Host github
HostName github.com
User guldra_cranch
Port 22
IdentityFile ~/.ssh/id_rsa
TCPKeepAlive yes
IdentitiesOnly yes

作成したconfigファイルは、.sshディレクトリ内に置いておきましょう。これであなたも明日から快適SSHライフ。ここまで読んで頂きありがとうございました!

設定方法とコマンドだけ見たい人向けのまとめ

ssh-keygen(公開鍵生成)

ssh-keygen -b 4096( -C "コメント")

権限設定

chmod 600 authorized_keys
chmod 700 /.ssh
chown ログインするユーザー名:ログインするユーザー名 -R .ssh

configファイル

Host SSHコマンド時の接続名
HostName 接続先ホスト
User ログインユーザー名
Port ポート番号
IdentityFile (秘密鍵のパス)
TCPKeepAlive yes
IdentitiesOnly yes

https://euske.github.io/openssh-jman/ssh_config.html
OpenSSH-7.3p1 日本語マニュアルページ (2016/10/15)

参考にした記事