SSH接続するための秘密鍵と公開鍵をMacで作る
ども、どもども。
ここ最近のブログ記事はテクニカルな内容が多い…
ワタシもウェブ屋さんなんだなと実感しています(笑)
さて。
ウェブサイトの構築業務をしていると、こういう依頼を受けることはないでしょうか
- サーバーにはSSH接続(SFTP鍵認証)でアクセスして欲しい
- そのためにSSHキーを用意して知らせて欲しい
ワタシも何度かこのような連絡を受けて対応していますが、正直なところSSH接続(というか黒い画面)にはまだ慣れていない部分もあり、毎回ビクビクしながら対応しています(笑)
先日もSSHキーを用意して欲しいと連絡を受け準備したのですが、そのときに実施した手順やちょっとしたコツ?のようなものを、将来の自分のためにまとめておこうと思います。
いろいろと経緯なども書いていますが、サクッと作り方を知りたい場合は【秘密鍵/公開鍵作成のコマンドと手順】だけ読むと良いかもしれません。
なお、ちょっと説明が怪しい部分もあると思うので、その辺りはご了承くださいね(汗)
秘密鍵と公開鍵による認証とは
通常、ウェブサーバーなどにFTPアクセスする場合、以下の情報を使います。
- FTPサーバー(ホスト)
- FTPユーザー名
- FTPパスワード
この情報をFTPクライアントに登録してアクセスするのですが、もし万が一この情報が漏れてしまうと、どこからでも誰でもサーバーにアクセスできることになってしまいます。
そこで、アクセスできる環境(IPアドレス)や「鍵」を使ってそれを制限するのが一般的となります。
秘密鍵と公開鍵による認証とは、自分のパソコン(ここではMac)に秘密鍵を、アクセスするサーバーには公開鍵を用意しておいて、その2つの鍵の情報が合致しないとサーバーにアクセスできないように制限する方法のことです。
そのため鍵の紛失には十分注意する必要があり、また接続するサーバーごとに鍵を用意しておく必要があります。
ウェブ上でよく見かける解説の罠
罠はちょっと言い過ぎですが、実際にワタシは迷いました(笑)
この秘密鍵と公開鍵は、自分のMacで作ることができますが、ウェブ上で公開されている多くの記事ではその例として、以下の名前で鍵を作るよう解説されています。
秘密鍵 | id_rsa |
---|---|
公開鍵 | id_rsa.pub |
これは鍵を作るときのデフォルトのファイル名で、ワタシも当初この通りに鍵を作りました。
でもその直後、別のサーバーにも鍵認証でアクセスする必要がでたときにファイル名が重複してしまうことに気が付きました。
最初に作った秘密鍵と公開鍵を別の環境のサーバーで使用することも可能ですが、これはつまり「同じパスワードを使い回す」ことと同じことになります。
もしも秘密鍵とそのパスフレーズが盗まれてしまうと…、考えると怖いですね。
というわけで、初めて秘密鍵と公開鍵を作るときから、後々になってファイル名が重複しないような名前で作っておくと良いということになります。
すでにデフォルトのファイル名で作っていても大丈夫
ワタシも経験済みですが、秘密鍵と公開鍵を作って公開鍵をサーバー担当者さんへ渡した後でも、ファイル名の変更は問題ありません。
実際にSSH(SFTP)でアクセスする際に、使用する秘密鍵を指定するので、以下例のような感じでファイル名をセットで変更し、その区別をしやすくしておくと良いでしょう。
秘密鍵 | id_rsa_hoge |
---|---|
公開鍵 | id_rsa_hoge.pub |
先日、この疑問をTwitterに書いたところ、いろいろな人が教えてくれました。
ありがとうございました!
SSHキーを用意する必要があって、なにも考えずにid_rsa.pubって作って、それを相手に渡したのだけれど、これ今後も別の環境でSSHキーを使うなら区別のために名前を変えておきたいよな…
— にちあま (@nishi_yama) January 18, 2021
普通にファイル名を変更して良いのかググっても見つけられない。
あらためて公開鍵を作り直すしかないのかな
こんなことで迷わないよう、最初から好きなファイル名で作るようにしましょう(笑)
任意の名前で秘密鍵と公開鍵を作成
ターミナルを起動し、以下のコマンドで秘密鍵と公開鍵を作成します。
※$は省略の意味です(参照:ターミナルでのコマンド入力について)
$ ssh-keygen -t rsa
このとき、オプション -f をつけることで好きな名前で生成できます。
$ ssh-keygen -t rsa -f id_rsa_hoge
上記を実行すると、秘密鍵 id_rsa_hoge と公開鍵 id_rsa_hoge.pub が生成されます。
サーバー担当者さんへの連絡
作成した公開鍵 id_rsa_hoge.pub をサーバー担当者さんに送るとき、ファイルそのものを送っても良いと思いますが、その中身をテキストデータで渡す場合は、以下のコマンドでファイルの中身を表示してコピーできます。
ターミナルで公開鍵の中身を表示してコピーする
以下のコマンドを実行すると id_rsa_hoge.pub の中身を表示できます。
$ cat id_rsa_hoge.pub
以下のような内容が表示されるので、これをコピーして送りましょう。
ssh-rsa AAAAB3NzaC1yc2EAA [省略] wO+UYaFlcXtD/EgGo4crLE= nishiyama@hostname
なんか最後に名前が入ってる…?
最後のやつを消したい
上記でコピーした末尾に nishiyama@hostname というのがついてますよね。
これ、ついたままでも問題ないのですが、なんだか自分の情報が出ていくようでちょっと気になりますよね…
そんなときは、秘密鍵と公開鍵作成時のコマンドに -C "" のオプションをつけると良いです。
$ ssh-keygen -t rsa -f id_rsa_hoge -C ""
このオプションは本来、公開鍵の中にコメントを残すためのものでちゃんとした利用目的のあるものですが、ここを空("")にすることで、最後についてしまう nishiyama@hostname というのを消すことができます。
これで安心してサーバー担当者さんに情報を渡すことができますね。
なお、最初に作った秘密鍵と公開鍵に上書で作成もできると思いますが、普通にFinderから削除してもOKです。(何度でも作り直せます)
秘密鍵/公開鍵作成のコマンドと手順
というわけで、最初から知っていれば…という点を踏まえつつ、ここまでのコツを含めた秘密鍵と公開鍵の作成手順をまとめておきます。
1. ターミナルで秘密鍵を保存するフォルダ .ssh まで移動する
ターミナルを起動して、.ssh フォルダへ移動します。
$ cd .ssh
2. ls コマンドで移動したフォルダ内を表示、確認する
$ ls
3. 秘密鍵と公開鍵を作成する
$ ssh-keygen -t rsa -f id_rsa_hoge -C ""
なお、上記コマンドのあと、パスフレーズの入力を2回求められます。
このパスフレーズは、実際に秘密鍵を使用する際にも必要になるので、忘れないようにしてください。
4. 再度、ls コマンドで鍵が生成できているかを確認する
id_rsa_hoge と id_rsa_hoge.pub が生成されていればOKです。
$ ls
id_rsa_hoge id_rsa_hoge.pub known_hosts
5. cat コマンドで公開鍵の中身を表示してコピーする
$ cat id_rsa_hoge.pub
上記のコマンドで表示される公開鍵の内容をコピーしてサーバー担当者さんに送ります。
ssh-rsa AAAAB3NzaC1yc2EAA [省略] wO+UYaFlcXtD/EgGo4crLE=
以上で終了です、お疲れさまでした。
サーバーに公開鍵が設置されたら、FTPクライアントでSFTPによる鍵認証を試してみましょう!
しかしターミナルを使用したコマンドって、非エンジニアにとってはなかなかハードル高いですよね…
ワタシも理由のよくわからない苦手意識を持つ1人です(笑)
今回のこともすごく勉強になりました。