作業をする際は SSH でサーバーにアクセスをしますが、認証は基本的に「公開鍵認証」を使用しています。
完全ローカル環境の場合は「パスワード認証」にすることもありますがパスワード認証はいつかはクラッキングされるのではという不安があります。
公開鍵認証方式だと何が安全なのか?
「パスワード認証」はとにかくパスワードがバレたら終わりです。
しかし「鍵認証」方式の場合は
- パスフレーズをクラッキングされたとしても、鍵ファイルを盗まれなければセーフ
- 鍵ファイルを盗まれても、パスフレーズをクラッキングされなければセーフ
という二重の安心があります。
ようは、物理的にファイルさえ盗まれなければ、最悪指の動きからパスフレーズを盗まれたとしてもセキュリティは担保されます。
SSH 公開鍵認証方式の図解
時々どのような構成になっていたのかすぐに出てこない場合があるので図解にしてみました。
ちなみに以下の図を見ると確実に SSH 公開鍵認証の構成が思い描けるので、SSH の設定で迷ったら何度も見てほしいと思います。
今回は SSH クライアントが Windows なのでサーバー側で ssh-keygen コマンドを使って「鍵(公開鍵・秘密鍵)」を作ります。
実は
- サーバー側で「鍵(公開鍵・秘密鍵)」を作ってもOK
- クライアント側で「鍵(公開鍵・秘密鍵)」を作ってもOK
です。
しかし通常サーバー側で「鍵(公開鍵・秘密鍵)」を作成します。
サーバー側で「鍵(公開鍵・秘密鍵)」を作成する場合
その理由はサーバーにアクセスするクライアントが多数いる場合、「管理が効率的で楽」だからです。
1つだけ「鍵」を作ればOKです。
そして「公開鍵」をクライアントに配れば作業完了です。
クライアントが増えたとしてもすでにある「公開鍵」を配ればOKです。
クライアント側で「鍵」を作る場合
クライアントごとに「鍵」を作成してサーバーに「公開鍵」を配る方式です。
クライアントの数が増えると管理が大変、というか管理できなくなります。
サーバー上に置く公開鍵も増えますし、どの鍵がどのクライアントなのかもそのうち分からなくなるでしょう。
セキュリティ的にも危険です。
しかし今回はサーバーにアクセスするクライアントが1台のみ、クライアントは「Windows」で「ssh-keygen」コマンドが使えないのでクライアントで作成します。
※「Teraterm」や「PuTTY」などでクライアント側から簡単に鍵を作成することができますが、今回はその方法を取りませんでした。
クライアント側とサーバ側のどちらに秘密鍵を配置するのか
先ほど鍵を作るのは「サーバ側」「クライアント側」のどちらでも可能という話をしましたが、では、「クライアント側」と「サーバ側」のどちらに秘密鍵を配置するのか正解なのでしょうか?
そもそも SSH で鍵認証を使うということは、公開鍵認証(公開鍵認証方式)を使うということです。
公開鍵認証では以下の2つの鍵を利用します
- 公開鍵(Public Key)
- 秘密鍵(Private Key)
どちらに秘密鍵を配置し、どちらに公開鍵を配置するかは、「どちら側を認証したいのか?」によって変わってきます。
一般的な企業の場合は、データセンターにWebサーバーやAPサーバーやDBサーバーを置いています。(最近はクラウドに置いているケースが多くなっていますが。)
メンテナンスの為にエンジニアがサーバーにログインして作業をします。
この場合は、「このWebサーバーは本物だろうか?認証してもいいだろうか?」という発想にはなりません。
むしろWebサーバー側の方が「このクライアントは本当に従業員のエンジニアからのアクセスなんだろうか?いつもとIPアドレスが違うし、アクセス元の場所も本社ではないような気がするけど信用してもいいだろうか?」という発想になります。
その為、クライアント側に「秘密鍵」を配置し、サーバー側に「公開鍵」を配置する形になります。
ただ、思ったのが、「鍵の配置を逆にするとどうなるのか?」です。
【逆の場合】クライアント側に公開鍵を配置し、サーバー側に秘密鍵を配置した場合
クライアント側に公開鍵を配置し、サーバー側に秘密鍵を配置した場合です。
一応これでも「暗号化」はできそうです。
でもサーバー側に「秘密鍵」があるということは、「公開鍵」は複数のクライアント側に配布されていると思うので簡単に入手できそうです。
簡単に「公開鍵」が入手できると結局サーバにアクセスできてしまうので、やはり一般的な企業の場合はクライアントPC側に秘密鍵を配置して、公開鍵をサーバーに配布する形になるのかなと思います。
SSHはクライアント側に秘密鍵、サーバー側に公開鍵を配布する
SSHの場合は、以下の形式が良さそうです。
- クライアント側 ← 秘密鍵を配置
- サーバー側 ← 公開鍵を配置
SSL/TLS通信の場合はサーバー側に秘密鍵を配置する
SSHではなく、SSL/TLS 通信の場合は、インターネット経由でお客様がWebサーバーにログインしてクレジットカード情報などを入力するのでサーバー側に秘密鍵を配置し、公開鍵をクライアント側に配布します。
近年はフィッシングサイトによるクレジットカード情報やパスワード情報を詐取するケースが多いので、本当にこのサーバーを信用してもいいのかを判断するための「サーバー証明書」をサーバーに配置しています。
サーバーだけでなくクライアント側も信用してもいいのか判断するために「クライアント証明書」を配置するケースもあります。
お客様から鍵認証でつながらないと連絡があったが、この場合はどっちか?
では、突然お客様より電話が掛かってきて「鍵認証でつながらないんだけど、どうなってるの?」と連絡が来たとしましょう。
この場合、クライアント側に秘密鍵を配置しているのか?サーバー側に秘密鍵を配置しているのでしょうか?
正解は「この情報だけでは分からないのでお客様にヒアリングをする必要がある」です。
以下の情報が入手できればある程度原因を推測できそうです。
- どこからどこにアクセスしようとしているのか?(ホスト名、IPアドレス)
- どのサービスを使っているのか?(HTTPS?SSH?FTP?)
- 鍵をどのように配置しているのか?どのファイルなのか?
今回の場合(サーバー側で鍵を作る方法)の構成図
今回の場合は下図のようになります。
サーバー側で「ssh-keygen」コマンドを使って鍵(公開鍵・秘密鍵)を作成します。
作成したら公開鍵の中身を「authorized_keys」に入れて、秘密鍵は SSH クライアントである Windows マシンに保存します。
以下、サーバー側でのコマンドです。
アカウントは「test」アカウントです。
[test@SAKURA_VPS ~]$ mkdir ~/.ssh [test@SAKURA_VPS ~]$ chmod 700 ~/.ssh/ [test@SAKURA_VPS .ssh]$ |
この後「id_rsa」を Windows マシンに保存します。
Teraterm で SSH 公開鍵認証方式(パフフレーズ付き)でのログインマクロを作る
Teraterm のマクロを使ってワンクリックでログインできるように設定すると日々の運用管理作業が楽になります。
ファイルの中身は以下のようになっています。
;; 接続先サーバ・ユーザ名・鍵・パスフレーズ設定 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; パスフレーズを暗号化ファイルにする
;; ①コマンド組立て
;; ②サーバ接続 ;; ③マクロ終了 |
上記内容を「さくらVPS.ttl」など名前を付けて保存後、ファイルをダブルクリックすると自動的にリモートサーバーにログインします。
非常に便利なので試してみてください。
コメント