SSHとは
Secure Shell(セキュアシェル)の略称でリモートコンピュータと通信するためのプロトコル。認証部分を含めネットワーク上の通信がすべて暗号化される。
ネットワークに接続された機器の通信を暗号化することで、安全に操作できる仕組みを提供する。
標準で22番ポートを用いて接続を確立する。ローカルホスト、リモートホスト間で、接続を行ってきたユーザが正規のユーザか否か、パスワードを問い認証を行ったり、公開鍵・秘密鍵のペアで演算処理を行い認証し通信を確立する。
・パスワード認証方式
あらかじめ設定したパスワードを入力して接続する。設定は簡単に行えるがパスワード流出の危険があり安全性は低い。
・公開鍵認証方式
公開鍵・秘密鍵のペアの鍵ファイルを用いて接続する。安全性は高いが設定の手間がかかる。
接続環境を整えて接続に至るまで:
1.ローカルホスト側で公開鍵・秘密鍵のペアを生成する。
2.リモートホスト側に、ローカルホストの公開鍵情報を持たせる。
3.ローカルホストからリモートホストにログインを試行。
4.リモートホストはランダムなデータ(チャレンジ)を公開鍵で暗号化してローカルホストに送信する。
5.ローカルホストは受信した暗号を秘密鍵で復号し、復号結果をリモートホストに送信する。
6.リモートホストは復号結果が正しければ、ローカルホストのログインを許可する。
機能のインストール
$ sudo apt update
$ sudo apt install openssh-server
sshの機能(サービス)がActiveであるか確認する。
$ sudo systemctl status ssh
システム起動時に、sshの機能が自動起動するか確認する。
$ sudo systemctl is-enabled ssh
enabledであれば良い。
リモートホスト、ローカルホストともにSSHの機能を有していないと接続できない。
公開鍵・秘密鍵を生成するコマンド
書式: $ ssh-keygen -t rsa b 4096
書式: $ ssh-keygen -t ecdsa b 384
書式: $ ssh-keygen -t ed25519
| アルゴリズム | 内容 |
|---|---|
| RSA | 公開鍵暗号の代表的な方式で、鍵長が長くなるほど安全性が高くなる。推奨は2048bit以上で、それ以下だと脆弱性がある。 鍵長を増やせば十分な安全性をかっくほできるが鍵のサイズが大きくなり計算負荷が高くなってしまう。(4096bit以上) |
| ECDSA | RSAよりも短い鍵で、同等の安全性を確保できる。計算速度が速いため、認証処理が高速に行われる。 鍵サイズは256bit、384bit、512bitの3種類。 |
| ED25519 | ED25519はECDSAよりもさらに高速で安全。鍵サイズは固定で256bit。 |
sshクライアント・サーバが古くて対応していないといった特殊な理由がない限り、ED25519を選択するのがベストである。
公開鍵・秘密鍵生成時のログ:
LinuxでもWindowsでも、ユーザのホームディレクトリ直下に .ssh というディレクトリが生成され、そこに鍵ファイルが格納される。
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519): ← Enterキーを押下する
Enter passphrase (empty for no passphrase): ← 特に必要なければパスフレーズなしでそのままEnterキーを押下
Enter same passphrase again: ← 同上
Your identification has been saved in /home/user/.ssh/id_ed25519 ← 秘密鍵の保管場所が示される
Your public key has been saved in /home/user/.ssh/id_ed25519.pub ← 公開鍵の保管場所が示される
The key fingerprint is:
SHA256:英数字の長い文字列でバレてはいけなさそうなもの user@localhost
The key's randomart image is: 以下、バレてはいけなさそうなもの
+--[ED25519 256]--+
| EEEE..E |
| EEEE.EE.E. |
| EEEE.E.E |
| EEEE.EE.EEE |
| EEE.E.E.E...E |
| EEE.EE.E.EEEEEE.|
| EEEE.EE.EE |
| EEEEE |
| EEE.E |
+----[SHA256]-----+
公開鍵を設置する
リモートホストにローカルホストの公開鍵情報を設置する。
ローカルホストユーザのホームディレクトリ直下に生成された .ssh ディレクトリ内の、 id_ed25519.pub の内容をコピーする。
リモートホスト側にパスワード認証方式でログインする。
$ ssh リモートホストのユーザ名@リモートホストのIPアドレスまたはドメイン名
初めて接続する場合、接続を維持するか問われるのでyesと入力しリモートホストにログインする。
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-124-generic x86_64)
The authenticity of host 'リモートホストのIP (リモートホストのIP)' can't be established.
ED25519 key fingerprint is SHA256:英数字の長い文字列が表示される.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
色々メッセージが表示され待機画面になる。
user@hostname:~$
現在ユーザのホームディレクトリにいる状態なので、ここで ls -la コマンドを入力し、.ssh ディレクトリがあるか調べる。無ければ mkdirコマンドで .ssh ディレクトリを作成する。
$ ls -la
drwxr-xr-x 2 user user 4096 Mar 27 23:25 .ssh
viテキストエディタにて、.sshディレクトリ内に authorized_keys というファイルを作成し id_ed25519.pub(公開鍵)の内容を記述する。
$ vi ./.ssh/authorized_keys
iキーでインサートモードに切り替え、id_ed25519.pub(公開鍵)の内容を入力後、エスケープキーでコマンドモードに切り替え :wq と入力しEnterキーを押す。(記述内容をファイルに書き込み保存、終了する)
authorized_keysのアクセス権をリモートホストユーザのみにする。
$ chmod 600 ./.ssh/authorized_keys
アクセス権を確認する。
$ ls -la ./.ssh/authorized_keys
実行結果:
-rw------- 1 user user 81 Mar 27 01:39 ./.ssh/authorized_keys
一旦 exit と入力し、SSH接続を終了したのち、再度SSH接続を行う。-i オプションを付けて、ダブルクオートで 秘密鍵 までのファイルパスを記述する。相対パスでも可。
$ ssh -i "/home/user/.ssh/id_ed25519" リモートホストのユーザ名@リモートホストのIPアドレスまたはドメイン名
パスワードを問われずにすんなりログインできれば成功。
パスワードを問われる場合は authorized_keys の内容の確認と、正しいディレクトリに配置されているか確認する。
パスワードを問われずにログインできたら、パスワード認証方式を無効化する。
設定ファイルの編集と適用
設定ファイル: /etc/ssh/sshd_config
主な変更箇所(抜粋):
テキストエディタで#を取るとパラメータが有効になり、#を付けるとコメントアウトされ無効化される。
・使用するポートを指定する。標準では22。安全性を考慮し標準とは異なる番号を設定・使用することもある。
Port 22
・接続してくるホストの公開鍵が使用する暗号アルゴリズムを指定する。
HostKey /etc/ssh/ssh_host_ed25519_key
・rootでのログインを無効にする。
PermitRootLogin no
・SSH接続の試行回数は3回まで。
MaxAuthTries 3
・SSHセッションの接続数は5セッションまで。
MaxSessions 5
・公開鍵認証方式でのログインを有効化する。
PubkeyAuthentication yes
・接続してくるホストの公開鍵情報が記録されたファイルの位置を指定する。
AuthorizedKeysFile .ssh/authorized_keys
・パスワード認証方式を無効化する。
PasswordAuthentication no
・パスワード空欄での認証を無効化する。
PermitEmptyPasswords no
・キーボードインターフェースによる認証を無効化する。
KbdInteractiveAuthentication no
設定ファイルの編集を済ませたらサービスのsshdを再起動する。
$ sudo systemctl restart sshd
正常にsshdが起動したか確認する。
$ sudo systemctl status sshd
activeであれば良い。以上。