Lesson 4
リモートサーバーへの安全な接続
目次
Lesson 4
Chapter 1
リモートサーバーへの安全な接続
Lesson3の最終Chapterでは、VirtualBoxで二つのCentOSサーバーを起動し、片方のサーバーからもう片方のサーバーへSSHでリモート接続しました。 今後も様々な場面で、SSHで遠方のサーバーと通信を行うことが発生するでしょう。 その際に重要な事項として挙がるのが、通信における安全性の問題です。
通信の安全性を確保するにあたっては、大きく二つの観点があります。
内容 | 説明 |
---|---|
通信経路の 暗号化 |
悪意のある第三者に通信を傍受された場合においても、その内容を容易に識別出来ないようにする。 |
ユーザー認証 | 接続元のクライアントが本人であることの確証が持てるようにする。 |
以降では、上記の観点に即して、通信を安全にする仕組みについて解説していきます。

Lesson 4
Chapter 2
通信経路の暗号化(TelnetとSSH)
TelnetとSSHについてLesson3で簡単に触れましたが、今回は先ほど挙げた「通信経路の暗号化」という観点に着目して、再度解説していきます。
Telnetでは通信データが全て平文で送られるため、悪意のある第三者が通信内容を傍受すると、容易に通信内容を識別出来てしまいます。 対してSSHでは通信を暗号化するため、たとえ悪意のある第三者が通信内容を傍受しても、容易に通信内容を識別することは出来ません。
上図のTelnetの場合において、通信が傍受されてしまうとどうなるでしょうか? 例えば、開発者がサービスを展開するサーバーに、リモートからログインする場合を考えて下さい。 Telnetでは悪意のある第三者は、平文でPW(パスワード)を入手できます。そのため本人に成りすましてサーバーに接続し、サービスに対して悪意のある変更を加えることが出来てしまいます。
対してSSHの場合においては、たとえ通信が傍受されたとしても、PWは暗号化されて分からなくなっています。 傍受した内容は、傍受者にとって意味不明な文字の羅列のように見えるため、それを用いてサーバーに不正なアクセスをすることは出来ません。
より安全なSSH
以上のようにSSHは通信経路を暗号化しているという点で、Telnetより強いセキュリティが担保された接続方法といえます。 そのため、現在ではTelnetはほとんど利用されず、SSHが主流で使用されているのです。

Lesson 4
Chapter 3
ユーザー認証(パスワード認証方式)
Chapter1ではSSHにおいて通信の安全性を確保するための二つの観点を挙げ、Chapter2において一つ目の観点である「通信経路の暗号化」に着目して説明しました。 Chapter3(そして続くChapter4)では、SSH接続において、もう一つの観点である「ユーザー認証」(接続元のクライアントが本物であるか)に着目して説明します。
ユーザー認証の意義とはどのようなものなのでしょうか? 例えば、童話の「赤ずきん」を思い出してください。赤ずきんの家へ、おばあちゃんに成りすましたオオカミが訪れますが、赤ずきんはそれがオオカミであることに気づかず、家のドアを開けてしまいます。 ユーザー認証とは、このような場合に、訪問者が本物なのか、偽物なのかを見分けるための技術です。
パスワード認証方式
ユーザー認証の方法としては、まず「パスワード認証方式」が挙げられます。 これは、サーバーにアクセスする際にあらかじめ設定したパスワードを入力し、正しければ認証成功とする方法です。
Lesson3で皆様がVirtualBox上のサーバー間でSSH接続した時も、パスワードを求められたと思います。 LinuxではSSHの際デフォルトでパスワード認証方式によってユーザー認証されるようになっています。
しかし、パスワードを用いたユーザー認証には欠点があります。 それはパスワードが、名前や生年月日など他者から容易に推測されやすい値で設定されがちであるという点が挙げられます。 例えば、「山田太郎」さんというユーザーがCentOSのユーザーを作成する際に、ユーザー名とパスワードを共に「yamadatarou」と設定する場合などが当てはまります。 このような場合は容易に本人なりすましによる不正ログインが行われてしまいます。

Lesson 4
Chapter 4
ユーザー認証(公開鍵認証方式)
Chapter3では、ユーザー認証の方法としてパスワード認証方式があるが、容易にパスワードを発見される可能性がある等の欠点があることをご説明しました。 Chapter4では、SSH接続におけるもう一つのユーザー認証方法である、公開鍵認証方式についてご紹介します。
公開鍵と秘密鍵
公開鍵認証方式とは、公開鍵と秘密鍵を用いて認証を行うものです。 公開鍵と秘密鍵とは、実体としては単なるファイルですが、それを用いてデータを暗号化することが出来るものです。 ただし、公開鍵を用いて暗号化したデータは秘密鍵でしか復号化出来ず、秘密鍵を用いて暗号化したデータは公開鍵でしか復号化出来ないという特徴があります。
公開鍵認証方式
具体的な公開鍵認証方式の手順としては、まずクライアントはあらかじめ秘密鍵と公開鍵を作成し、公開鍵をSSH接続先のサーバーに登録しておきます。
クライアントからの接続要求時に、サーバーは認証用のデータをクライアントへ送信します。
クライアントはSSH接続時に、データをハッシュ関数で変換し、さらにそれを秘密鍵で暗号化したうえで、サーバーへ送信します。 なお、手順中ハッシュ関数で変換された時点の値をハッシュ値と呼びます。
サーバー側では受信した暗号化済みデータを、秘密鍵でハッシュ値に復号化します。 また同時にクライアントと同じハッシュ関数を使い、もとのデータをハッシュ値に変換します。
サーバーは二つのデータを比較し、一致していた場合、認証をOKと判断します。
公開鍵認証方式では、正しい鍵のペアを所持していないと認証が成功しません。 そのため、パスワードを推測されうるパスワード認証方式よりもなりすましが難しく、セキュリティが高い認証方式だと言えます。
ハッシュ関数とは?
ハッシュ関数とは、元のデータを特定の計算手順によって、別の値に変換する関数のことを言います。
電子証明書によるさらなるセキュリティの向上
以上が公開鍵認証方式でしたが、上記中、クライアントがサーバー側に公開鍵を登録する手順があったと思います。 その時に、「今登録された公開鍵は本当に怪しくない人物によって登録されたのか?」とさらに疑いをかけることも可能です。 そのような場合に、さらなる信頼性を担保するためのものが「電子証明書」による証明です。
「電子証明書」とは、公開鍵に電子署名をすることにより公開鍵の作成元(クライアント)が怪しい人物ではないことを証明するためのものです。 電子証明書は「認証局」と呼ばれる第三者機関が発行します。 この電子証明書があることにより、「本人であるというさらなるお墨付き」を得たうえでの認証が可能となります。

Lesson 4
Chapter 5
安全に接続できるプロトコル
今まで、通信経路の暗号化と、ユーザー認証という観点から、SSHを中心にリモートサーバーへの安全な接続について解説をしてきました。 Chapter5では、安全に接続できるプロトコルについて、SSH以外のものを含めてご紹介します。
プロトコルとは?
プロトコルとは、異なるコンピュータ間で通信を行うために定めた手順や規格を指します。 例えば人間同士でお互いにコミュニケーションをとる場合を考えます。 まず何語を使うかを決めなくてはいけません。また、会話でやり取りをするのか、メールでやり取りをするのか等も決めなくてはいけません。 それと同じくコンピュータにおいても、事前に約束事を決めておき、それに則って通信やファイルの転送を行っているのです。
FTP
ファイル転送プロトコルの一つです。インターネット黎明期から使用されているため歴史が長いですが、 送信データを暗号化しないため、セキュリティー面で問題があります。 本Chapterのテーマである「安全に接続できる」プロトコルではないのですが、歴史が長く以降登場するプロトコルに大きな影響を与えたため、特別に紹介しました。
TLS(SSL)
主にブラウザとサーバー間で通信を行う際に使用され、データを暗号化する安全な通信プロトコルです。 インターネットでhttp通信とhttps通信という言葉を聞いたことがあると思いますが、http通信をTLSで暗号化したものがhttps通信です。
FTPS
FTPを元とするファイル転送プロトコルで、TLSを用いて、送信データを暗号化しています。 ブラウザとサーバー間のファイル転送の場面でよく用いられます。
SSH
SSHに関しては既に説明してますが、復習として紹介します。 SSHは、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコルです。 パスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化されます。
SCP
FTPを元とするファイル転送プロトコルで、SSHを用いてデータを暗号化する安全なファイル転送プロトコルです。 通信データはすべて暗号化された状態となります。 また公開鍵認証で、クライアントがサーバーに公開鍵を送付する際にも使われます。 ただし、ファイル転送をしている際に何らかの理由で中断となった場合、再開はできません。 後に出てくるSFTPと比べると、高速での転送が可能です。
SCPでファイルを転送してみましょう。基本書式は以下になります。
scp <オプション> <ファイル> <転送先サーバー>:<ファイル格納先>
ではChapter2でSSH接続した時のように、VirtualBoxで二つのCentOSサーバーを立ち上げ、以下を実行してください。 ただし、IPアドレスは皆様それぞれの環境で確認したアドレスを使用してください。 また、以下のvboxuserとは筆者の環境での転送先サーバーのホームディレクトリ名であるため、vboxuserの部分についても皆様の環境に合わせて適宜変えてください。
$ echo sendfile >> sendfile.txt
scp ./sendfile.txt 192.168.56.102:/home/vboxuser/
実行すると、転送先サーバーでのパスワードを求められるため、入力して「enter」キーを押してください。 転送先サーバーでsendfileと記載されたsendfile.txtが格納されていることを確認できると思います。 以上がSCPの使い方となります。
SFTP
SCPと同じく、FTPを元とするファイル転送プロトコルで、SSHを用いてデータを暗号化する安全なファイル転送プロトコルです。 通信データは全て暗号化された状態となります。 また公開鍵認証で、クライアントがサーバーに公開鍵を送付する際にも使われます。 ファイル転送をしている際に何らかの理由で中断となった場合でも再開可能である点が、SCPと異なります。
SFTPでファイルを転送してみましょう。 SFTPでは以下の基本書式から転送先サーバーにログインし、その後転送を行います。
scp <オプション> <転送先サーバー>:<転送先ディレクトリ>
SCPで転送したときと同じようにVirtualBoxで二つのCentOSサーバーを用意し、以下を実行してください。 IPアドレスと、以下コマンド中のvboxuserの部分は、皆様の環境に合わせて入力してください。
$ echo sendfile2 >> sendfile2.txt
$ scp 192.168.56.102:home/vboxuser/
sftp>
sftp>
というマークがでたら、無事転送先サーバーにログインし、ログイン先でシェルの実行やファイル転送が行えるようになっています。
試しに以下を実行してみてください。
sftp> ls
animal.txt
転送元のサーバーではなく、転送先のサーバーにログインしていることを確認できると思います。 筆者の場合、転送先サーバーにはanimal.txtというファイルが格納されていました。
ここで、先ほど転送元サーバーで作成したsendfile2を転送してみます。
SFTPでファイルを転送するには、sftp> put <ファイル名>
とします。
sftp> put ./sendfile2
これでsendfile2が転送されました。
次に、転送先サーバーに元々格納されてあったanimal.txtを転送元のサーバーに送ってみましょう。
その場合、sftp> get <ファイル名>
という書式で実現することが出来ます。
sftp> get ./animal.txt
本当にanimal.txtは転送されたでしょうか?
以下のようにexit
を実行しSFTPを終了してください。
sftp> exit
これで元のサーバーに戻れたので、lsコマンドを実行してください。animal.txtが転送されているのが分かると思います。
$ ls
animal.txt sendfile.txt sendfile2.txt
終わりに
以上でLesson4を終わります。今回はLesson3で学んだSSHについて、より安全に接続するという観点で学習を深めていきました。 次のLesson5では「標準入出力」について学びます。これを理解することで、Lesson3で学んだシェルのコマンドに加え、より高度なシェルの操作を出来るようになります。 次回のLessonも頑張っていきましょう。
