結局SSHってなんだっけ
はじめに
今回はLinuCの勉強をしている際に、改めてSSHの勉強をする機会があったのでついでに記事にしちゃいます。
普段よく使うsshですが、改めて勉強してみると知らないことがたくさんありました。
この記事ではSSHの全体的なお話をします。
前提
sshの具体的なコマンドや設定方法についてはあまり触れていません。
なぜSSHができた?
昔はTelnetやRloginなど、平文のプロトコルが使われていました。
しかし時代は進み、秘密にしないといけない情報がたくさん出てきました。
そんな秘密のやりとり時代に出てきたのが「SSH」です。
どうやって秘密にしてるの?
sshは秘密な情報を扱うプロトコルです。
秘密な情報を扱うには何が必要でしょうか、そう、暗号化です。
sshに使われる暗号化はいくつかあります。
暗号化 | 説明 |
---|---|
RSA | 難しい暗号化アルゴリズム |
ECDSA | 超超難しい暗号化アルゴリズム |
ED25519 | RSAの強化版 |
適当に書きましたが、よく使われるのはECDSAかED25519ということです。
詳しく知りたい方は「ssh 暗号化アルゴリズム」で調べてみてください、難しい説明がたくさんヒットすると思います。
普段sshを使っていて意識をすることはないと思いますが、実はちゃんと暗号化されてるよ〜って頭の隅に置いておいてください。
私たちの使ってるSSH
私たちの使っているSSHは恐らく大半がOpenSSHです。
OpenSSHはSSHをするための道具が一通り揃ったOSS(オープンソースソフトウェア)のことです。
例えば、Macや多くのLinuxディストリビューションではデフォルトでOpenSSHがインストールされています。
MacのTerminalからsshを使う場合は、基本的にこのOpenSSHを使用しています。
試しにTerminalでssh -V
としてみましょう。
$ ssh -V
OpenSSH_9.0p1, LibreSSL 3.3.6
OpenSSHのバージョンが表示されました。
代表的なOpenSSHのコンポーネントを挙げてみます。
主要コンポーネント | 機能説明 |
---|---|
ssh | SSHクライアント。リモートマシンに安全に接続するためのツール |
sshd | SSHデーモン。リモートマシンからのSSH接続を受け付けるサーバーサイドのプログラム |
scp | Secure Copy Protocol。リモートマシンとファイルを安全に転送するツール |
sftp | Secure File Transfer Protocol。安全なファイル転送プロトコル |
ssh-keygen | SSHキーペア(公開鍵と秘密鍵)を生成するツール |
ポートフォワーディング
sshの機能にポートフォワーディング機能というものがあります。
簡単にいうとポートを繋いでくれる機能です。
この機能は2つ種類があります。
- ローカルポートフォワーディング
- リモートポートフォワーディング
もう少し具体的に見てみましょう。
ローカルポートフォワーディング
「ローカル」ポートフォワーディングなので、例えば自宅のPCから会社のサーバーに接続するときなんかに使います。
以下は自宅から社内システムにSSHサーバー経由で接続する図です。
この図では自宅のPCでlocalhost:5000に接続すると、会社の社内システム(8080番ポート)に転送(フォワーディング)されています。
前提としてSSHサーバーと社内サーバーが接続できる必要はあります。
リモートポートフォワーディング
「リモート」ポートフォワーディングは、先ほどとは逆にリモートのサーバーから自宅PCのポートに転送する場合に使います。
これは例えば、自宅PC上でwebアプリケーションを公開した際に、外へ公開する時なんかに使います。
自分のPC上のwebアプリケーションにそのままアクセスさせてもいいですが、怖くないですか?
そんな時にリモートポートフォワーディング機能を使ってSSHサーバー経由でアクセスするようにします。
SSHサーバーを経由させることで、自宅PCの公開するポートを限定したり、セキュリティ的な面で恩恵が受けられます。
認証方法
sshには2種類の認証方法があります。
- パスワード認証
- 公開鍵認証
パスワード認証
これは、馴染み深いかと思います。
皆さんが普段使っているユーザー名とパスワードでの認証ですね。
しかし、これは推奨されていません。
パスワードは使い回しや、簡単なパスワードを設定しているなど、セキュリティが不十分だったりします。
ちなみに、デフォルトではパスワード認証になっています。
リモートサーバーに接続した後、
/etc/ssh/sshd_config
のPasswordAuthentication
をyesからnoに変更しましょう。
これでパスワード認証をオフにできます。
公開鍵認証
こちらは「秘密鍵」と「公開鍵」という2つの鍵を使って認証を行う方式です。
sshではこちらが推奨とされています。
公開鍵登録の流れ
まずはローカルで鍵を生成します。
鍵の生成にはssh-keygen
コマンドを使用します。
これで2つの鍵が生成されました。
鍵は[ファイル名].pub
と[ファイル名]
という二つのファイルが生成されます。
次に、公開鍵のみをssh接続するリモートサーバーに渡します。
これでリモートサーバーに公開鍵が渡されました。
この鍵を使ってsshのやり取りを行います。
まとめ
自分でSSHサーバーを立てることはまずないので、SSHサーバーがどのように使われているかを知るいい機会になりました。
今回は鍵を使ったデータ交換までは触れませんでした、詳しく知りたい方は参考資料のサイトをオススメします。
鍵交換におけるなんか腑に落ちない、という部分を詳しく解説して下さってます。
参考資料
Discussion