なんとなくな知識で普段サーバーと繋いでいるので、プロトコルについて調べました。
ファイル転送プロトコル - FTP、FTPS、SFTP、SCP
こちらをはじめに見ました。
ファイル転送プロトコルについて(FTP、FTPS、SFTP、SCP)
ファイル転送プロトコルは主に以下の4つがあります。
- FTP:「File Transfer Protocol」
暗号化されていない - FTPS:「File Transfer Protocol over SSL/TLS」
FTPがSSL/TLSで暗号化されている - SFTP:「SSH File Transfer Protocol」
SSHで暗号化されている - SCP:「Secure Copy Protocol」
SSHで暗号化されていてSFTPよりも通信速度が早い
FTPについて
ファイル転送プロトコルといえば、のFTPについて調べました。
FTPとは? ファイル転送の仕組みとデメリット、FTPSとSFTPの違いについて | 物理サーバ愛が止まらないホスティング事業者のブログ | ベアメタルブログ
コネクション
コネクションとは、サーバーとクライアントの間で確立される通信経路のことを指します。FTPの通信においては、「制御用コネクション」(コントロールコネクション)と、「データ転送用コネクション」(データコネクション)の2つのコネクションを確立する必要があります。
表にするとこうなります。
コネクション | FTPサーバのポート番号 | 特徴 |
---|---|---|
コントロールコネクション | 21 | ファイルの転送方法などの命令と応答など |
データコネクション | アクティブモード:20、パッシブモード:サーバーが指定したポート | 転送されるデータの送受信 |
VSCodeでFTPを使う際、ポート番号を20にしたら繋がりませんでした。
コントロールコネクションの21にしたら繋がりました。
これは通信で最初に使われるコントロールコネクションのポート番号を指定するものと思われます。
ちなみに後述するFTPSもこの2つのコネクションを確立して通信します。
一方でSFTPは1つのコネクションを使い、またFTPとは根本的に通信方式が異なるそうです。
「SFTP」という名前なのに誤解されそうな名前...。
アクティブモード・パッシブモード
さらにアクティブモード・パッシブモードについて調べました。
モードの違いについては、データコネクションをFTPクライアント/FTPサーバ、どちらから接続要求を行うかによって決まります。
モード | 接続要求の開始 | 特徴 |
---|---|---|
アクティブモード | サーバー | ファイアーウォールの設定などでうまく接続できない場合がある |
パッシブモード | クライアント | データコネクションのサーバーのポート番号がぎりぎりで決まる |
それぞれのモードの通信の流れは、参考記事の図を見ると頭に入ります。
なお、データ転送モード(ASCIIモード・バイナリモード)については割愛します!
SCPについて
一番言葉で聞き馴染みのないSCPについて調べました。
「SFTP?FTPS?なにが違う?」 https://academy.gmocloud.com/keywords/20170308/4155
SFTPとの違いはファイルの転送が再開できないことや、SFTPより通信が高速であると言われています。また、フォルダの転送はできませんが、フォルダをzipやtar形式で圧縮して転送することは可能です。
SCPは、ファイル管理や削除もできないそうです。
一度に大きな容量をアップロード・ダウンロードする際などに、通信が切れてファイルの転送が途中で止まってしまうことがあります。
SFTPの場合は、通信再開時に転送できなかった分を続きから転送することができます。
SCPの「ファイルの転送が再開できない」ということは、途中まで転送できたのに、通信再開時に転送できた分を含めてまたイチから送ることになります。
そしてまた通信が切れてしまったら...と思うと永遠に全てを転送することはできないように思えてしまいます。
一長一短ですね。
以前 scp
コマンドの代わりに rsync
コマンドを教えてもらった事がありました。
scp の代わりとしての rsync コマンドとそのオプション – ラボラジアン
【rsync】差分同期の仕組みとオプション, ログの見方(フォーマット) | SEの道標
rsync(アールシンク)「remote synchronization」だそうです。
rsyncでSSHを使うこともできるそうですが、SCP同様、コピー、同期の意味合いが強い印象です。
rsyncがプロトコルなのかどうかも、rsyncを使った繋ぎ方によって変わるようです。
後述するSSHのように、時にアプリケーションだったりします。
プロトコルと言われているものもいろいろあるのですね。
転送はするけれども保存はしないプロトコル - HTTP、HTTPS
ダウンロードで,FTPとHTTPの違いは何? | 日経クロステック(xTECH)
HTTPはファイル転送は行っているものの、目的が「転送」ではなく「配布」であるとありました。
- HTTP:「HyperText Transfer Protocol」
ウェブサーバーとブラウザで通信する - HTTPS:「HyperText Transfer Protocol over SSL/TLS」
SSL/TLSで暗号化されているところをHTTPで通信する
HTTPは,Webページのコンテンツをサーバーから読み出すのに使われる。Webブラウザは,WebサーバーにあるHTMLファイルや画像ファイルなどをダウンロードし,パソコンのハードディスクやメモリーに一時的にためたものを表示している。
ソフトウエアなどをHTTPでダウンロードする場合で違うのは,Webブラウザで表示するか表示せずに保存するかというユーザーからの見え方だけ。しくみはまったく同じだ。
ウェブページの画像を保存する場合は、表示のために「一時的にためたもの」を保存用としてさらに端末の別の場所に保存している、ということなのかなと思いました。
ブラウザに表示なしで、ボタンを押してすぐにPDFをダウンロードしたりする場合も、例えば
<a href="./file/sample.pdf" download="sample.pdf">ダウンロード</a>
このようなテキストリンクがあったとしたら、リンクのパスは相対パスでも https://
から始まるので、HTTP(S)を使っているのでしょう。
HTTP、HTTPSはファイル転送プロトコルではあるけれども、目的が他のプロトコルと異なるため、少し立ち位置が違うみたいです。
暗号化に関わるプロトコル - SSL/TLS、SSH
どちらも暗号化した通信をするプロトコルですが、ざっくりした2つの違いは
です。
5分で読める!SSHとSSLとは?それぞれの違いを分かりやすく解説 - Pimlusメディア
言い換えると、ご自身のコンピュータから不特定多数のサーバー、すなわちサイトへアクセスする場合に利用されるのがSSLであり、一方、ご自身のコンピュータから特定のサーバーへアクセスし、遠隔操作する際に利用されるのがSSHです。
SSL/TLS
SSL(Secure Sockets Layer)とTLS(Transport Layer Security)をまとめて表記した形が「SSL/TLS」です。
2022年現在多く使われているのはTLSの方のようです(SSLは安全ではないそうです)。
SSL/TLSはそれぞれ同じ枠組みの中にあり、SSLがバージョンアップを重ねてTLSに至ったものの、SSLが一般化したことから現在ではSSL/TLSと表記されることが多くなっています。
とのことなので、断りがない場合は以降SSLとTLSを同じと捉えて「SSL」と書きます。
暗号化通信であるSSLには、「公開鍵暗号」や「共通鍵暗号」が使われています。
(ハイブリッド暗号方式)
SSLの流れとしては、
電子署名や秘密鍵・公開鍵、CSRなどを使って、サーバー側から「認証局お墨付き、ドメインを保証するサーバー証明書」を送ってもらい、
最初は端末のルート証明書と検証して通信先のドメインを確認します。
そこからやっとSSLの暗号化通信がスタートします。
HTTPSの場合は、SSLで暗号化された通信路をHTTPでやり取りするイメージです。
その後は、共通鍵を使って通信するデータを暗号化して送信、受け取り側は共通鍵を使って復号してやり取りします。
SSLって何?意味や仕組みをわかりやすく解説! | さくらのSSL
ここで少し気になったルート証明書について調べてみました。
https://wa3.i-3-i.info/word16604.html
↑すごく分かりやすくて感動しました。
サーバー証明書/中間CA証明書/ルート証明書の違いとは? | さくらのSSL
さくらサーバーのコラムには
ルート証明書は端末やWebブラウザなどにあらかじめ組み込まれており、Windows Update等で更新されます。
とあります。
詳しくはまたの機会に調べます。
FTPSについて
FTPSもSSLが使われていますが、ファイル転送で「不特定多数への」というのはよろしくない気がします。
FTPSの接続方法について調べたところ、FTPを使うのでサーバー情報やユーザー名・パスワードが必要で、不特定多数ではない事がわかりました。
そりゃそうだ。
この言葉に囚われすぎていたようです。
FTPSの接続方式にはexplicit(明示的な)方式とimplicit(暗黙的な)方式があり、
「implicit」は
とあります。
【vsftpd】FTPをSSL/TLSで暗号化する設定 - Qiita
FTPSではFTP同様2つのコネクション ー ポートを使う点などから、セキュリティ面ではSFTPの方が優れていると言われます。
SSH
SSH(Secure Shell)です。
暗号によって保護された通信を通じて遠隔操作を行う1アプリケーション、またはプロトコルを指します。
SSHもプロトコルの1つですが、ファイル転送プロトコルではありません。
コマンドラインの ssh
コマンドでサーバーにアクセスすると、たしかに遠隔操作という感じがしました。
gitでpullやpushをする時にSSHを使う方法もありますが、その場合もファイル「転送」が目的ではないようです。
HTTPSと同じようなものかもしれませんが(機能はあるけどその仲間には入らない、みたいな)...すごく気になりますがここでは割愛します。
SSHでサーバーと繋ぐ方法は「パスワード認証」と「公開鍵認証」があります。
現在は公開鍵認証が推奨されています。
しかし下記の記事を見ると、一概に「パスワード認証は危ない」「公開鍵認証がいい」とは言えないようです。
SSHの通信の流れについても、こちらの記事の図を見て覚えた方が良さそうです。
FTPではつながるのにSFTPではつながらない原因
ファイル転送のFTP設定の際、プロトコルを「SFTP」に切り替えるとつながらない、ということがありました。
ずっと原因が分からず、そういうものなのだろう、と思っていました。
いろいろ見てみると、サーバー会社、契約プランによって可能な接続方法は異なるということが分かりました。
本当に“そういうもの”でした...。
エックスサーバーではSFTPのパスワード認証ではつながらない(2022年6月現在)のでFTPでつないでいました。
今思うととても危険なことをしていました!
そこで鍵認証でSSH、SFTP接続を試してみます!
☆続きはこちらの記事に書きました。
暗号化についてもう少し理解を試みる
できればもう少し調べて暗号化について知っておきたいものです。
暗号化のタイミング・対象
一口に「暗号化」と言っても何を暗号化するのか、という対象があります。
ぱっと調べて出てきたのは以下の2つです。
通信の暗号化:SSL
「HTTPの教科書」という本には暗号化について以下のように書かれています。
1つは通信を暗号化する方法です。
SSL等によって安全な通信路を確立してから、その通信路を使ってHTTPの通信を行います。
コンテンツの暗号化:盗聴を守ることはできても、改ざんやなりすましの危険性がある
もう1つは、通信しているコンテンツの内容自体を暗号化してしまうことです。
コンテンツの暗号化を有効にするためには、クライアントとサーバーがコンテンツの暗号化や復号の仕組みを持っていることが前提となりますので、ユーザーが普段使うブラウザとWebサーバーという図式では利用することは難しいでしょう。
SSL通信のところで「データの暗号化・復号」が出てきましたが、もしかしてSSLもコンテンツの暗号化をやっているということなのでしょうか??
え、HTTPSの転送なのにファイルも暗号化するんですか???
ファイル(データ)を暗号化しないで通信するHTTPSの方法もあるのですね。
「転送」という言葉が引っかかります。
暗号化の方法
2つの暗号方式が出てくるのでまとめました。
共通鍵暗号方式
またの名を秘密鍵暗号方式。 通信し合う者同士で同じ鍵を使い、そのため第三者に鍵が渡ると危険なので、「共通」「秘密」という名前がついている。
公開鍵暗号方式
通信相手に渡す公開鍵と、自分だけが持ち、人に知られてはいけない秘密鍵を使った暗号方式。
公開鍵と秘密鍵はペアになっている。
「RSA(Rivest Shamir Adleman)」も「公開鍵暗号方式」で使われる暗号化の1つだそうです。
どちらにも「秘密」が出てきますね。軽く混乱します。
公開鍵暗号に関して誤解がいろいろとあるようです。
【分かった部分】
「電子署名」は、現実の「印鑑」での喩えに非常にマッチしている。
→ 「はんこ」が秘密鍵、「印影のサンプル」が公開鍵、また「印影のサンプル」の載った「印鑑登録証明」が公開鍵証明書に相当
イメージです。
印影のサンプルというところが一筋縄ではいかないですね。
分かっていないかも。
さいごに
今回はどんどん沼にハマってしまいました。
いろいろな記事を読んでいくと、正しいと思っていたことがひっくり返されたり、何度もスタート地点に立ち返ったり。
一体何を学んだのか。
書く側としても、記事のほとんどが正しくないことを書いているかもしれないという恐ろしさを感じました。
難しいです><
お気をつけください。
おしまい。