110.3 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
110 セキュリティ |
Objective: |
110.3 暗号化によるデータの保護 |
Lesson: |
1 of 2 |
はじめに
今日のシステム管理では、暗号化してデータを保護することが非常に重要です。リモート接続する場合は特にそうです。telnet、rlogin、FTP といった方法は安全ではありませんが、SSH(Secure SHell、安全なシェル)プロトコルは安全に利用できるよう設計されています。SSHでは、公開鍵暗号を使ってホストとクライアント(ユーザー)の両者をそれぞれ認証し、すべてのやり取りを暗号化します。さらに、SSHトンネル で接続すると、暗号化されたSSH接続を通して暗号化されていないプロトコルでのデータの送受信ができます。SSHプロトコルの現在推奨されているバージョンは2.0です。SSHプロトコルを使用して接続できる OpenSSH というフリーでオープンなソフトウェアがあります。
このレッスンでは、OpenSSH クライアントの基本設定と、OpenSSH サーバーのホスト鍵について説明し、SSHトンネルにも触れます。以下の2台のマシンを想定して話を進めます。
マシンの役割 | OS | IPアドレス | ホスト名 | ユーザー |
---|---|---|---|---|
クライアント |
Debian GNU/Linux 10 (buster) |
|
|
|
サーバー |
openSUSE Leap 15.1 |
|
|
|
OpenSSHクライアントの基本設定と使い方
OpenSSHのサーバーとクライアントは別々のパッケージではありますが、両方を一気にインストールするのが普通です(訳注:ssh
という名前のメタパッケージをインストールすると両方を一気にインストールできますが、それが見つからなければ openssh-server
と openssh-clients
(openssh-client
)をそれぞれインストールしてください)。ssh
コマンドに続けて、リモートマシンでのユーザー名と@でつなげたIPアドレスないしホスト名を指定して実行すると、SSHサーバーとのリモートセッションを確立します。初回接続時には次のようなメッセージが表示されます。
carol@debian:~$ ssh ina@192.168.1.77 The authenticity of host '192.168.1.77 (192.168.1.77)' can't be established. ECDSA key fingerprint is SHA256:5JF7anupYipByCQm2BPvDHRVFJJixeslmppi2NwATYI. Are you sure you want to continue connecting (yes/no)?
yes
と入力してエンターキーを押すと、リモートマシンのユーザーのパスワードの入力を求められます。正しいパスワードを入力してエンターキーを押すと、警告メッセージが表示されてリモートホストにログインできます。
Warning: Permanently added '192.168.1.77' (ECDSA) to the list of known hosts. Password: Last login: Sat Jun 20 10:52:45 2020 from 192.168.1.4 Have a lot of fun... ina@halof:~>
この一連のメッセージについて説明します。192.168.1.77
のリモートサーバーへの初回接続なので、ローカルマシンはそのサーバーの真正性をデータベースに照らし合わせて確認することができません。そこで、リモートサーバーの公開鍵に SHA256
ハッシュ関数を適用して生成した ECDSA key fingerprint(ECDSA鍵指紋)
を提示します。yes
とエンターキーを入力してそのサーバーへの接続を許可すると、そのサーバーの公開鍵が known hosts(既知のホスト) データベースに追加されます。次回からは、このデータベースと照らし合わせてサーバーの真正性を確認できます。known hosts(既知のホスト) の公開鍵のリストは ~/.ssh
ディレクトリ内にある known_hosts
ファイルに保存されています。
ina@halof:~> exit logout Connection to 192.168.1.77 closed. carol@debian:~$ ls .ssh/ known_hosts
.ssh
ディレクトリと known_hosts
ファイルは、初めてリモート接続を確立した時に作られます。~/.ssh
が、ユーザー固有の設定と認証情報を格納するデフォルトのディレクトリです。
Note
|
1行の |
ローカルホストとリモートホストで同じユーザー名を使うなら、SSH接続をする際にユーザー名を指定せずにすみます。たとえば、debian
にユーザー carol
としてログインしていて、halof
にユーザー carol
として接続するなら、ssh 192.168.1.77
あるいは(名前解決ができるなら)ssh halof
と入力して実行するだけでよいです。
carol@debian:~$ ssh halof Password: Last login: Wed Jul 1 23:45:02 2020 from 192.168.1.55 Have a lot of fun... carol@halof:~>
halof
と同じIPアドレスである別のリモートホストに接続しようとしたら(LANでDHCPを使っているとあり得ることです)、中間者 攻撃の可能性があるという警告が表示されます。
carol@debian:~$ ssh john@192.168.1.77 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:KH4q3vP6C7e0SEjyG8Wlz9fVlf+jmWJ5139RBxBh3TY. Please contact your system administrator. Add correct host key in /home/carol/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /home/carol/.ssh/known_hosts:1 remove with: ssh-keygen -f "/home/carol/.ssh/known_hosts" -R "192.168.1.77" ECDSA host key for 192.168.1.77 has changed and you have requested strict checking. Host key verification failed.
この場合は 中間者 攻撃ではありませんので、新しいホストの公開鍵指紋を .ssh/known_hosts
に追加しても安全です。警告文に示されているように、ssh-keygen -f "/home/carol/.ssh/known_hosts" -R "192.168.1.77"
を実行して 問題となっている 鍵を削除します(-f ファイル名
を指定せずに実行すると ~/.ssh/known_hosts
から鍵を削除するので、-f
オプションを省略して ssh-keygen -R 192.168.1.77
でも構いません)。そうすると、同じIPアドレスである別のリモートホストに接続できます。
SSH公開鍵認証
ログイン時にパスワードではなく公開鍵を使うようにSSHクライアントを設定できます。そのほうがはるかに安全なので、SSHでリモートサーバーに接続する方法としては、公開鍵認証が望ましいです。そのためにはまずクライアント側のマシンで鍵ペアを作成します。ssh-keygen
コマンドで -t
オプションに続けて暗号方式を指定します。ここではecdsa(Elliptic Curve Digital Signature Algorithm、楕円曲線デジタル署名アルゴリズム)にします。鍵ペアを保存するパス(デフォルトの ~/.ssh/
にしておくと便利です)とパスフレーズを尋ねられます。パスフレーズはオプションで、なくても鍵ペアを作成できますが、パスフレーズを設定することが強く推奨されます。
carol@debian:~/.ssh$ ssh-keygen -t ecdsa Generating public/private ecdsa key pair. Enter file in which to save the key (/home/carol/.ssh/id_ecdsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/carol/.ssh/id_ecdsa. Your public key has been saved in /home/carol/.ssh/id_ecdsa.pub. The key fingerprint is: SHA256:tlamD0SaTquPZYdNepwj8XN4xvqmHCbe8g5FKKUfMo8 carol@debian The key's randomart image is: +---[ECDSA 256]---+ | . | | o . | | = o o | | B * | | E B S o | | o & O | | @ ^ = | | *.@ @. | | o.o+B+o | +----[SHA256]-----+
Note
|
鍵ペアを作成するときに、 |
先に示したコマンドを実行すると、~/.ssh
ディレクトリに2つのファイルが作成されます。
carol@debian:~/.ssh$ ls id_ecdsa id_ecdsa.pub known_hosts
id_ecdsa
-
秘密鍵です。
id_ecdsa.pub
-
公開鍵です。
Note
|
非対称暗号(公開鍵暗号)では、公開鍵と秘密鍵には数学的な関連があり、一方の鍵で暗号化されたものは他方の鍵でしか復号できません。 |
次に、接続したいリモートホストのユーザーの ~/.ssh/authorized_keys
ファイルに、先ほど作成した公開鍵を追加します(~/.ssh
ディレクトリが存在しなければ、公開鍵を追加する前にそのディレクトリを作成しなければなりません)。公開鍵を追加するには、USBメモリを使う、SSHでファイルを転送する scp
コマンドを使うなど、いろいろな方法がありますが、ここでは公開鍵の中身を cat
で出力して、ssh
にパイプでつなげ、cat
で ~/.ssh/authorized_keys
ファイルに追記します。
carol@debian:~/.ssh$ cat id_ecdsa.pub |ssh ina@192.168.1.77 'cat >> .ssh/authorized_keys' Password:
公開鍵をリモートホストの authorized_keys
ファイルに追加してから新たに接続するときに、パスフレーズの有無に応じて次の2通りのシナリオが考えられます。
-
鍵ペアの作成時にパスフレーズを設定しなかったなら、
ssh
コマンドを実行すると自動的にログインできます。これは便利ですが、状況によっては安全ではありません。carol@debian:~$ ssh ina@192.168.1.77 Last login: Thu Jun 25 20:31:03 2020 from 192.168.1.55 Have a lot of fun... ina@halof:~>
-
鍵ペアの作成時にパスフレーズを設定したなら、
ssh
の接続時に毎回パスフレーズを入力しなければなりません。SSHのパスワード認証と似ているように見えますが、公開鍵とパスフレーズの2層でセキュリティを担保しているので、より安全です。しかし、利便性に関しては、接続時に毎回パスワードを入力しなければならないSSHパスワード認証と同じ煩わしさがあります。これは不便に感じますが、パスフレーズを設定していない秘密鍵が流出したら、その秘密鍵を使って、ペアになる公開鍵が追加されているどのサーバーにでも接続できてしまうので、パスフレーズを設定したほうがよいのです。carol@debian:~/.ssh$ ssh ina@192.168.1.77 Enter passphrase for key '/home/carol/.ssh/id_ecdsa': Last login: Thu Jun 25 20:39:30 2020 from 192.168.1.55 Have a lot of fun... ina@halof:~>
セキュリティと利便性を両立させる方法があります。SSH認証エージェント(ssh-agent
)を使うのです。認証エージェントがシェルを立ち上げて、そのセッションの最中はパスフレーズで解読された秘密鍵をメモリに保持することで、公開鍵認証を行うという仕組みです。詳しく見てみましょう。
-
ssh-agent
で新しいBashシェルを立ち上げます。carol@debian:~/.ssh$ ssh-agent /bin/bash carol@debian:~/.ssh$
-
ssh-add
で秘密鍵をメモリの安全な領域に追加します。鍵ペアの作成時にパスフレーズを設定していたら(セキュリティのためにはパスフレーズを設定することが推奨されます)、ここで入力を求められます。carol@debian:~/.ssh$ ssh-add Enter passphrase for /home/carol/.ssh/id_ecdsa: Identity added: /home/carol/.ssh/id_ecdsa (carol@debian)
以後は公開鍵が追加されているどのリモートサーバーにも、パスフレーズを入力せずにログインできます。コンピュータの起動時に上記のコマンドが実行されるようにしておくと、コンピュータをシャットダウンをするまで(あるいは手動で鍵をアンロードするまで)秘密鍵がメモリに保持されます(訳注:ログイン時に自動的に
ssh-agent
が実行されるディストリビューションもあります)。
ssh-keygen
で指定できる4種類の公開鍵暗号方式のアルゴリズムを紹介して、この節を締めくくります。
RSA
-
Ron Rivest、Adi Shamir、Leonard Adlemanという3名の考案者の名前から命名された方式で、1977年に公表されました。現在でも安全だとされており、広く用いられています。鍵の最小サイズは1024ビットです(デフォルトは3072ビットです)。
DSA
-
Digital Signature Algorith(デジタル署名アルゴリズム) です。安全ではないと判明したので、OpenSSH 7.0から非推奨になっています。DSAの鍵は1024ビットごとのサイズになります。
ecdsa
-
DSAを改良したものでより安全だと考えられている、Elliptic Curve Digital Signature Algorithm(楕円曲線デジタル署名アルゴリズム) です。楕円曲線暗号を使用します。ECDSAの鍵のサイズは、256ビット、384ビット、521ビットという楕円曲線のサイズのいずれかです。
ed25519
-
EdDSA
(Edwards-curve Digital Signature Algorithm、エドワーズ曲線デジタル署名アルゴリズム)を実装したものです。強力なCurve25519を用いています。4種類の暗号方式の中で最も安全だとされています。Ed25519の鍵のサイズは256ビットに固定です。
Note
|
|
OpenSSHサーバーのホスト鍵の役割
OpenSSHのグローバル設定ディレクトリは、/etc/ssh
です。
halof:~ # tree /etc/ssh /etc/ssh ├── moduli ├── ssh_config ├── ssh_host_dsa_key ├── ssh_host_dsa_key.pub ├── ssh_host_ecdsa_key ├── ssh_host_ecdsa_key.pub ├── ssh_host_ed25519_key ├── ssh_host_ed25519_key.pub ├── ssh_host_rsa_key ├── ssh_host_rsa_key.pub └── sshd_config 0 directories, 11 files
moduli
とクライアントの設定ファイル(ssh_config
)とサーバーの設定ファイル(sshd_config
)を除けば、OpenSSHサーバーのインストール時に作成された、4種類の暗号方式アルゴリズムに対応する鍵ペアがあります。先述したように、サーバーはこれらの ホスト鍵 をクライアントの要求に応じて提示します。ファイル名は次のパターンになっています。
- 秘密鍵
-
ssh_host_
+ アルゴリズム +_key
(例:ssh_host_rsa_key
) - 公開鍵(または公開鍵指紋)
-
ssh_host_
+ アルゴリズム +_key.pub
(例:ssh_host_rsa_key.pub
)
Note
|
公開鍵に暗号学的ハッシュ関数を適用して鍵指紋を作成します。鍵指紋は鍵自体よりも短いので、鍵を管理する際に扱いやすいです。 |
秘密鍵ファイルのパーミッションは 0600
、すなわち rw-------
で、所有者(root
)だけが読み書き可能です。公開鍵ファイルは所有グループとその他も読み取り可能です(0644
、すなわち rw-r--r--
)。
halof:~ # ls -l /etc/ssh/ssh_host_* -rw------- 1 root root 1381 Dec 21 20:35 /etc/ssh/ssh_host_dsa_key -rw-r--r-- 1 root root 605 Dec 21 20:35 /etc/ssh/ssh_host_dsa_key.pub -rw------- 1 root root 505 Dec 21 20:35 /etc/ssh/ssh_host_ecdsa_key -rw-r--r-- 1 root root 177 Dec 21 20:35 /etc/ssh/ssh_host_ecdsa_key.pub -rw------- 1 root root 411 Dec 21 20:35 /etc/ssh/ssh_host_ed25519_key -rw-r--r-- 1 root root 97 Dec 21 20:35 /etc/ssh/ssh_host_ed25519_key.pub -rw------- 1 root root 1823 Dec 21 20:35 /etc/ssh/ssh_host_rsa_key -rw-r--r-- 1 root root 397 Dec 21 20:35 /etc/ssh/ssh_host_rsa_key.pub
-l
オプションと -f
オプションに続けて鍵ファイルのパスを指定して ssh-keygen
を実行すると、鍵指紋を確認できます。
halof:~ # ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key 256 SHA256:8cnPrinC49ZHc+/9Ai5pV+1JfZ4WBRZhd3rDOsc2zlA root@halof (ED25519) halof:~ # ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub 256 SHA256:8cnPrinC49ZHc+/9Ai5pV+1JfZ4WBRZhd3rDOsc2zlA root@halof (ED25519)
-v
オプションを加えると、ランダムアートも見ることができます。
halof:~ # ssh-keygen -lv -f /etc/ssh/ssh_host_ed25519_key.pub 256 SHA256:8cnPrinC49ZHc+/9Ai5pV+1JfZ4WBRZhd3rDOsc2zlA root@halof (ED25519) +--[ED25519 256]--+ | +oo| | .+o.| | . ..E.| | + . +.o| | S + + *o| | ooo Oo=| | . . . =o+.==| | = o =oo o=o| | o.o +o+..o.+| +----[SHA256]-----+
SSHトンネル
OpenSSHは非常に強力な転送機能を備えています。転送元のポートをSSHプロセスを通じてトンネル化・暗号化して、転送先のポートにリダイレクトします。この仕組みは、ポートトンネリング や ポート転送(ポートフォワーディング) と呼ばれます。次のような大きな利点があります。
-
ファイアウォールをう回してリモートホストのポートに接続できます。
-
外部からプライベートネットワーク内のホストに接続できます。
-
データの受け渡しを暗号化できます。
ポート転送は、ローカルポート転送とリモートポート転送の2つに大別されます。
ローカルポート転送
ローカルホストのポート番号を指定して、そこに送られたトラフィックを接続先のホストに転送します。接続先のホストでは、そのトラフィックを最終的な宛先として指定されたホストの指定されたポートに宛てて送信します。例えば、ローカルホストの 8585
ポートから、接続先サイト halof
を経由して、www.gnu.org
の 80
番ポート(http)に転送するには、このようにします。
carol@debian:~$ ssh -L 8585:www.gnu.org:80 ina@halof Enter passphrase for key '/home/carol/.ssh/id_ecdsa': Last login: Thu Jun 25 20:39:30 2020 from 192.168.1.55 Have a lot of fun... ina@halof:~>
順に説明します。-L
オプションに続けて、接続を待ち受けるローカルポート 8585
を指定します。続く www.gnu.org:80
は、最終的な宛先ホストとポート番号を示します。ローカルポート 8585
への接続が開かれると、そのトラフィックはローカルホストと接続先のリモートホストhalofのssh接続を通して転送され、halofから www.gnu.org:80
への接続が開かれます。ウェブブラウザで http://localhost:8585
に接続すると、halofを経由して www.gnu.org
に転送されます。ローカルマシンで lynx
(昔からあるテキストベースのウェブブラウザ)を使って試してみましょう。
carol@debian:~$ lynx http://localhost:8585 (...) * Back to Savannah Homepage * Not Logged in * Login * New User * This Page * Language * Clean Reload * Printer Version * Search * _ (...)
ポート転送だけを行いたければ、次のようにします。
carol@debian:~$ ssh -L 8585:www.gnu.org:80 -Nf ina@192.168.1.77 Enter passphrase for key '/home/carol/.ssh/id_ecdsa': carol@debian:~$ carol@debian:~$ lynx http://localhost:8585 (...) * Back to Savannah Homepage * Not Logged in * Login * New User * This Page * Language * Clean Reload * Printer Version * Search * _ (...)
次の3点に注意してください。
-
-N
オプションを指定したため、halof
にログインせずポート転送を行います。 -
-f
オプションを指定し、SSHをバックグラウンドで実行しています。 -
ina@192.168.1.77
で、ホストhalof
上の ユーザーina
を指定しています(ina@halof
でも構いません)。
リモートポート転送
リモートポート転送(リバースポート転送)では、リモートサーバーの指定したポートに到達したトラフィックが、ローカルホストで実行しているSSHプロセスへと転送され、最終的な宛先として指定されたホストの指定されたポート(外部のホストではなくローカルホストのポートを指定しても構いません)へと送られます。たとえば、プライベートネットワーク外から、halof
(192.168.1.77
)で実行しているSSHサーバーのポート 8585
を経由して、ローカルホストで実行しているApacheウェブサーバー(ポート 80
)にアクセスできるようにするなら、次のコマンドを実行します。
carol@debian:~$ ssh -R 8585:localhost:80 -Nf ina@192.168.1.77 Enter passphrase for key '/home/carol/.ssh/id_ecdsa': carol@debian:~$
halof
のポート 8585
に接続すると、Debian
のApache2のデフォルトホームページを目にすることになります。
carol@debian:~$ lynx 192.168.1.77:8585 (...) Apache2 Debian Default Page: It works (p1 of 3) Debian Logo Apache2 Debian Default Page It works! This is the default welcome page used to test the correct operation of the Apache2 server after installation on Debian systems. If you can read this page, it means that the Apache HTTP server installed at this site is working properly. You should replace this file (located at /var/www/html/index.html) before continuing to operate your HTTP server. (...)
Note
|
ダイナミックポート転送という、3つ目のより複雑なポート転送がありますが、このレッスンでは扱いません。ダイナミックポート転送では、SOCKSプロキシーとしてポート番号を限定しないTCP通信を転送します。 |
X11転送
ポート転送の説明を終えたので、X11転送(X11トンネル)の話をして締めくくります。X11転送では、リモートホストの X Window System をローカルマシンに転送します。ssh
コマンドで -X
オプションを指定します。
carol@debian:~$ ssh -X ina@halof ...
これで firefox
ウェブブラウザのようなグラフィカルアプリケーションを、リモートマシンで立ち上げられるようになります。リモートマシンではローカルホストのX Windowサーバーに接続するためのリバーストンネルが作成され、シェルにはそのトンネルを使用するための DISPLAY
環境変数がセットされます。これにより、リモートサーバーで実行されたアプリケーションは、ローカルマシンのディスプレイを使って入出力を行います。
-x
オプションを指定して新しいSSHセッションを開始すると、X11転送 は無効化されます。firefox
を起動しようとすると、以下のようなエラーになります。
carol@debian:~$ ssh -x ina@halof carol@192.168.0.106's password: (...) ina@halof:~$ firefox (firefox-esr:1779): Gtk-WARNING **: 18:45:45.603: Locale not supported by C library. Using the fallback 'C' locale. Error: no DISPLAY environment variable specified
Note
|
ローカルポート転送、リモートポート転送、X11転送に関係する設定のディレクティブは、それぞれ、 |
演習
-
クライアントマシンにユーザー
sonya
としてログインし、リモートサーバーhalof
で、SSHに関連する以下の課題を実行してください。-
リモートホストでユーザー
serena
として~/.ssh
の中身を一覧表示するコマンドを実行し、ローカルマシンのターミナルに戻ってきてください(1行のコマンドで実行してください)。 -
リモートホストにユーザー
serena
としてログインしてください。 -
リモートホストにユーザー
sonya
としてログインしてください。 -
ローカルマシンの
~/.ssh/known_hosts
ファイルからhalof
に属している鍵をすべて削除してください。 -
クライアントマシンで、256ビットの
ecdsa
鍵ペアを作成してください。 -
クライアントマシンで、256ビットの
ed25519
鍵ペアを作成してください。
-
-
以下のステップを、SSH認証エージェント を使ってSSH接続をする適切な順番に並べ替えてください。
-
クライアント側で
ssh-agent /bin/bash
を実行して 認証エージェント の新しいBashシェルを起動します。 -
クライアント側で
ssh-keygen
を実行して鍵ペアを作成します。 -
クライアント側で
ssh-add
を実行して秘密鍵をメモリの安全な領域に追加します。 -
リモートホストでログインしたいユーザーの
~/.ssh/authorized_keys
ファイルにクライアントの公開鍵を追加します。 -
リモートホストでログインしたいユーザーの
~/.ssh
を作成します(~/.ssh
が存在していない場合)。 -
リモートサーバーに接続します。
正しい順序は次のとおりです。
Step 1:
Step 2:
Step 3:
Step 4:
Step 5:
Step 6:
-
-
ポート転送 の種類ごとに、関係するオプションとディレクティブを書き込んでください。
種類 オプション ディレクティブ ローカル
リモート(リバース)
X
-
ssh -L 8888:localhost:80 -Nf ina@halof
コマンドをクライアントマシンのターミナルに打ち込んで実行しました。クライアントマシンのブラウザでhttp://localhost:8888
に接続しました。何が表示されますか?
発展演習
-
SSHのディレクティブに関して、次の問いに答えてください。
-
root
ログインを許可する/etc/ssh/sshd_config
のディレクティブは何ですか? -
SSH接続できるアカウント(ユーザー)を指定する
/etc/ssh/sshd_config
のディレクティブは何ですか?
-
-
クライアントとサーバーで同じユーザーを使っている場合に、SSH公開鍵認証ができるようにクライアントの公開鍵をサーバーに簡単に追加できるコマンドは何ですか?
-
リモートサーバー
halof
で実行しているSSHプロセスを通じて、非特権ポート(番号が1024以上のポート)である、8080でwww.gnu.org
、8585でwww.melpa.org
のウェブサイトに接続する、ローカルポート転送を1行のコマンドで実行してください。リモートサーバーではユーザーina
を使ってください。-Nf
オプションを指定します。
まとめ
このレッスンでは、SSH(Secure Shell) プロトコルを利用してサーバーとクライアントの間の通信を暗号化する OpenSSH の説明をしました。以下の事柄を学びました。
-
リモートサーバーへのログイン
-
リモートコマンド実行
-
鍵ペアの作成
-
公開鍵認証
-
セキュリティと利便性を両立させるための 認証エージェント の利用
-
OpenSSH がサポートしている公開鍵暗号方式のアルゴリズム(
RSA
、DSA
、ecdsa
、ed25519
) -
OpenSSH ホスト鍵の役割
-
ローカルポート転送、リモートポート転送、X11転送
このレッスンでは、次のコマンドについて説明しました。
ssh
-
リモートマシンにログインしてコマンドを実行します。
ssh-keygen
-
認証鍵を生成、管理、変換します。
ssh-agent
-
OpenSSHの認証エージェントです。
ssh-add
-
認証エージェントに秘密鍵を追加します。
演習の解答
-
クライアントマシンにユーザー
sonya
としてログインし、リモートサーバーhalof
で、SSHに関連する以下の課題を実行してください。-
リモートホストでユーザー
serena
として~/.ssh
の中身を一覧表示するコマンドを実行し、ローカルマシンのターミナルに戻ってきてください(1行のコマンドで実行してください)。ssh serena@halof ls .ssh
-
リモートホストにユーザー
serena
としてログインしてください。ssh serena@halof
-
リモートホストにユーザー
sonya
としてログインしてください。ssh halof
-
ローカルマシンの
~/.ssh/known_hosts
ファイルからhalof
に属している鍵をすべて削除してください。ssh-keygen -R halof
-
クライアントマシンで、256ビットの
ecdsa
鍵ペアを作成してください。ssh-keygen -t ecdsa -b 256
-
クライアントマシンで、256ビットの
ed25519
鍵ペアを作成してください。ssh-keygen -t ed25519
-
-
以下のステップを、SSH認証エージェント を使ってSSH接続をする適切な順番に並べ替えてください。
-
クライアント側で
ssh-agent /bin/bash
を実行して 認証エージェント の新しいBashシェルを起動します。 -
クライアント側で
ssh-keygen
を実行して鍵ペアを作成します。 -
クライアント側で
ssh-add
を実行して秘密鍵をメモリの安全な領域に追加します。 -
リモートホストでログインしたいユーザーの
~/.ssh/authorized_keys
ファイルにクライアントの公開鍵を追加します。 -
リモートホストでログインしたいユーザーの
~/.ssh
を作成します(~/.ssh
が存在していない場合)。 -
リモートサーバーに接続します。
正しい順序は次のとおりです。
Step 1:
クライアント側で
ssh-keygen
を実行して鍵ペアを作成します。Step 2:
リモートホストでログインしたいユーザーの
~/.ssh
を作成します(~/.ssh
が存在していない場合)。Step 3:
リモートホストでログインしたいユーザーの
~/.ssh/authorized_keys
ファイルにクライアントの公開鍵を追加します。Step 4:
クライアント側で
ssh-agent /bin/bash
を実行して 認証エージェント の新しいBashシェルを起動します。Step 5:
クライアント側で
ssh-add
を実行して秘密鍵をメモリの安全な領域に追加します。Step 6:
リモートサーバーに接続します。
-
-
ポート転送 の種類ごとに、関係するオプションとディレクティブを書き込んでください。
種類 オプション ディレクティブ ローカル
-L
AllowTcpForwarding
リモート(リバース)
-R
GatewayPorts
X
-X
X11Forwarding
-
ssh -L 8888:localhost:80 -Nf ina@halof
コマンドをクライアントマシンのターミナルに打ち込んで実行しました。クライアントマシンのブラウザでhttp://localhost:8888
に接続しました。何が表示されますか?halof
のウェブサーバーのホームページが表示されます。localhost
というのは、リモートサーバーから見たlocalhost
になります。
発展演習の解答
-
SSHのディレクティブに関して、次の問いに答えてください。
-
root
ログインを許可する/etc/ssh/sshd_config
のディレクティブは何ですか?PermitRootLogin
-
SSH接続できるアカウント(ユーザー)を指定する
/etc/ssh/sshd_config
のディレクティブは何ですか?AllowUsers
-
-
クライアントとサーバーで同じユーザーを使っている場合に、SSH公開鍵認証ができるようにクライアントの公開鍵をサーバーに簡単に追加できるコマンドは何ですか?
ssh-copy-id
-
リモートサーバー
halof
で実行しているSSHプロセスを通じて、非特権ポート(番号が1024以上のポート)である、8080でwww.gnu.org
、8585でwww.melpa.org
のウェブサイトに接続する、ローカルポート転送を1行のコマンドで実行してください。リモートサーバーではユーザーina
を使ってください。-Nf
オプションを指定します。ssh -L 8080:www.gnu.org:80 -L 8585:www.melpa.org:80 -Nf ina@halof