レポート課題22日目・180分T3情報工学2_[学生番号]_[氏名].pdf
2日目 ファイアウォールとSSH
サーバーの門番(ファイアウォール)を立てて必要な窓口だけを開け、Windowsから安全に遠隔操作できるように、パスワードの代わりに「鍵」でログインする仕組みを作ります。
この日のゴール
- ファイアウォール(ufw)が有効で、外から入ってくる通信は22番(SSH)だけが通る
- Windowsのターミナルから、パスワードを使わずに鍵でUbuntuへログインできる
- パスワードでのSSHログインと、rootでのSSHログインが禁止されている
- WindowsとUbuntuの間で、scpを使ってファイルをやり取りできる
この日に出てくる主な言葉:
2日目からは作業区分ラベルに Windows 11 ターミナル(SSH接続) が加わります。WindowsのターミナルからSSHで入ったUbuntuの操作のことで、指導書は「以降はこちらを優先」としています。
ファイアウォールの考え方
ファイアウォールは、サーバーの入口に立つ門番です。外から来た通信の宛先ポートを見て、許可リストにあるものだけを通し、それ以外は門の前で止めます。Ubuntuではufwというツールで設定します。
通信が届くには、2つの条件がそろう必要があります。1つは門が開いていること(ファイアウォールが許可している)、もう1つは窓口に係の人がいること(そのポートでサービスが待ち受けている)です。手順2と3では、この2つを別々のコマンドで確かめます。考察のヒント「門が開いている(ufwの許可)」と「窓口に人がいる(待ち受け)」の2つがそろって初めて通信が届きます。課題1の「不要なポートを開けたままにする危険」は、門が開いているうえに、その先で弱点のあるプログラムが待ち受けている状態として説明すると、論理的に書けます。
鍵でログインする仕組み
SSHでは、パスワードの代わりに公開鍵認証でログインできます。まず鍵ペア(2つで1組の鍵)を作ります。
たとえるなら、印鑑と印鑑登録
秘密鍵は家にしまってある「実印」、公開鍵は役所に登録した「印影(はんこを押した跡)」です。サーバー(役所)は印影しか持っていませんが、書類に押されたはんこが登録済みの印影と合うかは確かめられます。そして印影をいくら眺めても、印鑑そのものは作れません。公開鍵暗号では、この「作れない」ことが数学的に保証されています。
パスワード認証では、正しいパスワードを知っていれば誰でもログインできます。推測されたり、ほかのサービスで使い回したものが漏れたり、自動で何万通りも試されたり(総当たり攻撃)すると破られます。鍵認証なら、秘密鍵のファイルを持っていない限りログインできません。そのうえでパスワード認証を無効にすると、鍵を持たない人はそもそも挑戦すらできなくなります。考察のヒント課題2では「攻撃者は何を手に入れればログインできるか」を比べると違いが明確になります。パスワード認証ではパスワードそのもの、鍵認証では手元の秘密鍵のファイルです。サーバーにはどちらの方式で何が置かれているか(公開鍵は盗まれても困らない)にも触れられます。
全体の流れ
| 手順 | 場所 | 内容 |
|---|---|---|
| 1 | Ubuntuサーバー ターミナル | ufwで22番を許可し、ファイアウォールを有効にする |
| 2 | Ubuntuサーバー ターミナル | 許可の一覧と、待ち受けているポートを確かめる |
| 3 | Windows 11 ターミナル | Windowsから、22番・80番・443番につながるか試す |
| 4 | Windows 11 ターミナル | パスワードでSSHログインしてみる |
| 5 | Windows 11 ターミナル | 鍵ペアを作る |
| 6 | Windows 11 ターミナル ⇄ Windows 11 ターミナル(SSH接続) | 公開鍵をサーバーに登録し、鍵でログインできることを確かめる |
| 7 | Windows 11 ターミナル(SSH接続) | パスワードでのログインを禁止する |
| 8 | Windows 11 ターミナル | scpでファイルを送受信する |
指導書では手順1〜7の番号がすべて「1.」で表示され、scpの演習だけが「2.」になっています(番号の自動付与の都合と思われます)。このガイドでは上のように通し番号を振りました。
手順の解説
スクリーンショット(エビデンス)を撮るところ。マウスを乗せると撮るタイミングが表示され、押すとページ下のエビデンス一覧の該当項目へ移動します。考察を書くときに知っておきたいこと。マウスを乗せる(スマホでは押す)とヒントが表示されます。
ファイアウォールを設定する
まだSSHは使えないので、Proxmoxのコンソールで操作します。先に22番の許可を登録し、それからファイアウォールを有効にします。
sudo ufw allow 22/tcp
sudo ufw enablesudo ufw管理者の権限でufwにallow許可せよ22/tcpTCPの22番宛ての通信をufw enable を打つと Command may disrupt existing ssh connections. Proceed with operation (y|n)?(今のSSH接続が切れるかもしれないが続けるか)と聞かれるので、y と答えます。Firewall is active and enabled on system startup と出れば有効になり、次に起動したときも自動で有効になります。
ufwを有効にすると、初期状態では「外から入ってくる通信はすべて拒否、中から外へ出ていく通信はすべて許可」になります。許可を登録したポートだけが、例外として通れます。
順番が大事
SSHで遠隔操作している最中に、22番を許可しないまま ufw enable すると、自分の接続まで遮断され、戻れなくなります。今日はコンソールで操作しているので大丈夫ですが、「許可してから有効にする」という順番は覚えておきましょう。
説明文とコマンドの食い違い
指導書の説明文には「SSH(22/tcp)と後続の実験で利用するHTTP(80/tcp)を許可し」とありますが、示されているコマンドは22番の許可だけで、手順3でも「未許可の80/tcpと443/tcpには接続できない」ことを確かめる流れになっています。このガイドはコマンドのとおり22番だけを許可する前提で説明します。80番を許可するかどうかは授業で確認してください。
設定を確かめる
sudo ufw status numbered
sudo ss -tulnufw status numbered は、門番の許可リストを番号つきで表示します。エビデンス1の撮影ポイント撮影ポイント エビデンス1手順2で sudo ufw status numbered を実行した直後。Status: active と、22/tcp の ALLOW IN だけが並んでいることが分かるように撮る。エビデンス一覧の項目へ移動 ↓
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 22/tcp (v6) ALLOW IN Anywhere (v6)Status: active は有効であること、22/tcp ALLOW IN Anywhere は「どこからでも、22番宛てに入ってくる通信を許可」という意味です。(v6) はIPv6という新しい形式のアドレス向けの同じ規則です。
ss -tuln は、サーバーの中でどのポートを待ち受けているかを表示します(ssのオプションの意味)。
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.54:53 0.0.0.0:*
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.54:53 0.0.0.0:*
tcp LISTEN 0 4096 *:22 *:**:22や0.0.0.0:22- どの宛先アドレスでも22番で待ち受けている。これがSSHの窓口
127.0.0.53:53など- Ubuntuが自分用に使っている名前の問い合わせの係。127で始まるアドレスは自分自身にしか届かないので、外からは使えない
ここで大事なのは、ufwの許可リストと待ち受けの一覧が別のものだということです。前者は「門が開いているか」、後者は「窓口に人がいるか」を表しています。
Windowsから通信できるか試す
外から見たときに、許可したポートにはつながり、許可していないポートにはつながらないことを確かめます。Windowsのターミナルで次の3つを実行します。エビデンス6の撮影ポイント撮影ポイント エビデンス6手順3で Test-NetConnection を22番・80番・443番の順に実行し終えた時点。3つの TcpTestSucceeded(True と False)を見比べられるように撮る。1画面に収まらなければ分けて撮り、図の番号も分ける。エビデンス一覧の項目へ移動 ↓
Test-NetConnection 192.168.100.xxx -Port 22
Test-NetConnection 192.168.100.xxx -Port 80
Test-NetConnection 192.168.100.xxx -Port 443ComputerName : 192.168.100.107
RemoteAddress : 192.168.100.107
RemotePort : 22
InterfaceAlias : イーサネット
SourceAddress : 192.168.xx.xx
TcpTestSucceeded : True最後の行 TcpTestSucceeded が True なら接続成功、False なら失敗です。80番と443番では、しばらく待たされたあとに警告(TCP connect to … failed)が出て False になるはずです。待たされるのは、ufwが断りの返事もせずに黙って通信を捨てるため、Windows側が返事を待ち続けるからです。考察のヒント80番と443番は、今はサーバーの中で何も待ち受けていないので、ファイアウォールがなくてもつながりません。「つながらなかった」ことをファイアウォールの効果だと言い切れるかは、手順2の2つの一覧(許可リストと待ち受け)を見比べて考えます。考察のヒント「しばらく待たされてから失敗」と、すぐに断られる Connection refused は、失敗のしかたが違います。前者は門(ufw)で黙って捨てられた、後者は門は通ったが窓口に誰もいなかった、という違いで、結果の読み取りの深さを示せます。
パスワードでSSHログインしてみる
22番が開いていることが確かめられたので、WindowsからSSHでサーバーに入ってみます。
ssh t3admin@192.168.100.xxxsshSSHで接続するt3adminこのユーザーとして@区切り192.168.100.xxxこのサーバーに初めて接続するサーバーでは、次のように聞かれます。
The authenticity of host '192.168.100.107 (192.168.100.107)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?「このサーバーとは初対面ですが、本物ですか?」という確認です。サーバーにも固有の鍵があり、その指紋(フィンガープリント)がWindows側に記録され(known_hosts)、次回からは同じサーバーかどうかを自動で確かめてくれます。yes と最後まで打って Enter を押します。考察のヒント鍵認証が「利用者が本人か」をサーバーが確かめる仕組みなのに対し、この指紋の確認は「サーバーが本物か」を利用者が確かめる仕組みです。確かめる向きが2つあることに触れると、SSHの安全性の考察が深まります。
続けてUbuntuのパスワードを(見えないまま)入力し、プロンプトが t3admin@t3lab-XX:~$ に変われば、あなたは今、Windowsの窓からサーバーを操作しています。確認できたら exit で抜けます。
exit鍵ペアを作る
WindowsのPCの中に、秘密鍵と公開鍵の組を作ります。指導書には2つの方法が書かれていますが、どちらも最後は同じ ssh-keygen コマンドで作ります。保存先のフォルダ .ssh がまだないと失敗することがあるので、先にフォルダを作る「方法2」の書き方が確実です。
New-Item -ItemType Directory -Force -Path $env:USERPROFILE\.ssh
ssh-keygen -t ed25519 -C "t3-lab" -f $env:USERPROFILE\.ssh\id_ed25519
Get-ChildItem $env:USERPROFILE\.ssh\id_ed25519*$env:USERPROFILE は、Windowsの自分のユーザーフォルダ(C:\Users\あなた)を表す環境変数です。途中で次のように聞かれます。
Enter passphrase (empty for no passphrase):- 秘密鍵のファイルにかける合言葉(パスフレーズ)。入力は見えません。何も打たずに Enter を押すと合言葉なしになる。どちらにするかは授業の指示に従う
Enter same passphrase again:- 確認のため、同じものをもう一度
… already exists. Overwrite (y/n)?- 同じ名前の鍵がすでにある、という確認。基本は n。y にすると古い鍵は消え、その鍵を登録してあるサーバーには入れなくなる
最後の Get-ChildItem で、id_ed25519(秘密鍵)と id_ed25519.pub(公開鍵)の2つが表示されれば完成です。エビデンス2の撮影ポイント撮影ポイント エビデンス2手順5で鍵を作った直後。ssh-keygen の結果(Your identification has been saved in …)と、続けて実行した Get-ChildItem の2つのファイル名が1枚に入るように撮る。確認コマンドで鍵を作り直すと上書きを聞かれるので、この時点で撮っておく。エビデンス一覧の項目へ移動 ↓
秘密鍵は誰にも見せない
拡張子のない id_ed25519 が秘密鍵です。レポートに中身を載せたり、AIに貼り付けたり、USBメモリで人に渡したりしてはいけません。.pub の付いた公開鍵は、見られても問題ありません。
公開鍵をサーバーに登録する
作った公開鍵をサーバーに運び、「この鍵ならログインしてよい」という名簿(authorized_keys)に書き加えます。この段階ではまだパスワード認証を残しておき、パスワードでログインして作業します。Windowsとサーバーを行ったり来たりするので、下の表で場所を確かめながら進めます。
| 小手順 | 場所 | やること |
|---|---|---|
| 6-1 | Windows 11 ターミナル | パスワードでサーバーに入る |
| 6-2 | Windows 11 ターミナル(SSH接続) | 鍵の置き場所 ~/.ssh と名簿 authorized_keys を作り、権限を絞る |
| 6-3 | Windows 11 ターミナル(SSH接続) | exit でWindowsに戻る |
| 6-4 | Windows 11 ターミナル | scpで公開鍵のファイルをサーバーへ送る |
| 6-5 | Windows 11 ターミナル | もう一度パスワードで入る |
| 6-6 | Windows 11 ターミナル(SSH接続) | 送った公開鍵を名簿に追記し、送ったファイルは消す |
| 6-7 | Windows 11 ターミナル(SSH接続) | exit でWindowsに戻る |
| 6-8 | Windows 11 ターミナル | 秘密鍵を指定して入り、パスワードなしで入れることを確かめる |
6-1 パスワードでサーバーに入る
ssh t3admin@192.168.100.xxx6-2 置き場所と名簿を作る
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys700 は「所有者だけが中に入れる」、600 は「所有者だけが読み書きできる」というパーミッション(権限)です(権限の計算機)。SSHのサーバーは、名簿がほかの人にも書き換えられる状態だと、他人が勝手に鍵を足せてしまうため、その名簿を信用しません。考察のヒント名簿の権限を絞るのは、他人が勝手に鍵を書き足せないようにするためです。「守る仕組みそのものも守る必要がある」という視点は、セキュリティの考察で使えます。
6-3 いったんWindowsに戻る
exit6-4 公開鍵のファイルを送る
scp $env:USERPROFILE\.ssh\id_ed25519.pub t3admin@192.168.100.xxx:~/id_ed25519.pubscpSSHの仕組みでコピーする$env:USERPROFILE\.ssh\id_ed25519.pub送り元(Windowsの公開鍵)t3admin@192.168.100.xxx:~/id_ed25519.pub送り先(サーバーのホームに同じ名前で)送り先の ユーザー名@IPアドレス: の後ろがサーバー側の場所です。パスワードを聞かれるので入力します。
bash(推奨)の書き方でエラーになったら
指導書の scp ~/.ssh/id_ed25519.pub … は、Windows 11 標準の PowerShell 5.1 では ~ が自分のフォルダに置き換わらないまま渡され、「ファイルが見つからない」エラーになることがあります(PowerShellの注意)。上の $env:USERPROFILE を使う書き方なら確実です。
6-5 もう一度パスワードで入る
ssh t3admin@192.168.100.xxx6-6 名簿に追記する
cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys
rm ~/id_ed25519.pubcat でファイルの中身を出し、>> で名簿の末尾に追記します。> 1つだと上書きになるので注意します(リダイレクト)。追記したら、運んできたファイルは用済みなので消します。cat ~/.ssh/authorized_keys で、ssh-ed25519 AAAA… t3-lab のような1行が入っていることを確かめられます。
6-7 Windowsに戻る
exit6-8 鍵でログインする
ssh -i $env:USERPROFILE\.ssh\id_ed25519 t3admin@192.168.100.xxx-i は「この秘密鍵を使う」という指定です。既定の名前(id_ed25519)で作った場合は、-i 以降を省いて ssh t3admin@192.168.100.xxx だけでも自動で使われます。
こうなればOK
Ubuntuのパスワードを聞かれずにプロンプトが t3admin@t3lab-XX:~$ になります。手順5で合言葉(パスフレーズ)を設定した場合は Enter passphrase for key … と聞かれますが、これは手元の鍵の合言葉で、サーバーのパスワードとは別物です。
パスワードでのログインを禁止する
鍵でログインできることを確かめたら、SSHのサーバーの設定ファイルsshd_configを書き換えて、鍵以外のログインを受け付けないようにします。手順6-8で鍵でログインした状態から始めます。
今の接続は最後まで切らない
設定を間違えると、新しくログインできなくなります。今つながっているSSHの画面は「命綱」として開いたままにし、確認はWindowsのターミナルで新しいタブを開いて行います(指導書の小手順10)。うまくいかなければ、命綱の画面から設定を直します。
書き換える前に、元のファイルのコピーを取っておくと安心です。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_configファイルの中から次の4つの項目を探し(nanoでは Ctrl+W で検索)、行頭に # があれば消して、値を次のようにします。
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no| 項目 | 値 | 意味 |
|---|---|---|
PubkeyAuthentication | yes | 公開鍵認証を使う |
PasswordAuthentication | no | パスワード認証を使わない |
KbdInteractiveAuthentication | no | キーボードで答えを打ち込む別方式の認証も使わない(パスワード認証の抜け道になりうる) |
PermitRootLogin | no | rootでのSSHログインを禁止する |
このファイルでは、同じ項目が何度も書かれていると最初に書かれた値が使われます。ファイルの末尾に同じ項目を書き足すのではなく、もともとある行を直すようにします。保存したら、書式の確認と再起動をします。
sudo sshd -t
sudo systemctl restart ssh
sudo systemctl status sshsshd -t は、設定ファイルに書き間違いがないかを調べる命令で、何も表示されなければ問題なしです。エラーが出たら、表示された行を直してからもう一度実行します。status で active (running) を確かめます。エビデンス3の撮影ポイント撮影ポイント エビデンス3手順7で設定を保存したあと、sudo sshd -t(何も表示されない)と sudo systemctl status ssh(active (running))を続けて実行した直後。2つのコマンドが1画面に入るように撮る。エビデンス一覧の項目へ移動 ↓
最後に、Windowsのターミナルで新しいタブを開き、鍵でログインできることを確かめます。エビデンス4の撮影ポイント撮影ポイント エビデンス4手順7の最後、パスワード認証を禁止したあとで、Windowsのターミナルの新しいタブから ssh -i … を実行し、パスワードを聞かれずにプロンプトが t3admin@t3lab-XX:~$ に変わった時点。打ったコマンドの行も写るように撮る。エビデンス一覧の項目へ移動 ↓
ssh -i $env:USERPROFILE\.ssh\id_ed25519 t3admin@192.168.100.xxx設定したのに、パスワードでも入れてしまう場合
Ubuntuの sshd_config の先頭には、/etc/ssh/sshd_config.d/ の中の追加の設定ファイルを読み込む行があります。インストーラーが作ったファイル(50-cloud-init.conf など)に PasswordAuthentication yes が書かれていると、「最初の値が使われる」決まりにより、そちらが優先されることがあります。実際に効いている値は次のコマンドで確かめられます。
sudo sshd -T | grep -Ei 'passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|permitrootlogin'
ls /etc/ssh/sshd_config.d/パスワード認証が本当に止まっているかは、Windowsから ssh -o PubkeyAuthentication=no t3admin@192.168.100.xxx(わざと鍵を使わずに接続)を試し、Permission denied (publickey) と断られるかどうかで確かめられます。考察のヒント鍵認証を設定しても、パスワード認証が残っていれば、攻撃者はそちらを狙えます。守りの強さはいちばん弱い入口で決まります。わざと鍵を使わずに接続して断られた画面は、「禁止できている」ことを示す結果として使えます。追加の設定ファイルを書き換えるかどうかは、教員に相談してください。
scpでファイルを送受信する
WindowsからサーバーへファイルをSSHの仕組みで送り(アップロード)、サーバーからWindowsへ受け取ります(ダウンロード)。
まず、送るための sample.txt を作ります(指導書には作り方が書かれていません)。Windowsのターミナルで、今いるフォルダ(プロンプトに表示されている場所)に作られます。
Set-Content -Path .\sample.txt -Value "hello from windows"
scp .\sample.txt t3admin@192.168.100.xxx:~/sample_from_win.txt
scp t3admin@192.168.100.xxx:~/sample_from_win.txt .\sample_from_server.txt
Get-Content .\sample_from_server.txt2行目が「Windows → サーバー」、3行目が「サーバー → Windows」です。scp 送り元 送り先 の順は変わらず、サーバー側だけに ユーザー名@IPアドレス: が付きます。鍵認証を設定したので、パスワードは聞かれません。エビデンス5の撮影ポイント撮影ポイント エビデンス5手順8で2つの scp を実行し終えた直後。送信と受信の両方の行(100% と表示される転送の結果)と、Get-Content で中身を表示した結果が1枚に入るように撮る。エビデンス一覧の項目へ移動 ↓
サーバー側でも届いていることを確かめます。
ls -l ~/sample_from_win.txt結果と考察のための確認コマンド
指導書では、最後に次のコマンドで設定をまとめて確かめます。
sudo ufw status numbered
sudo sshd -t
sudo systemctl status ssh
ls -l ~/sample_from_win.txtTest-NetConnection 192.168.100.xxx -Port 22
ssh -i $env:USERPROFILE\.ssh\id_ed25519 t3admin@192.168.100.xxx確認のために ssh-keygen を打ち直すときは「n」
指導書の確認コマンドには、鍵を作る ssh-keygen … がもう一度含まれています。同じ名前の鍵はすでにあるので Overwrite (y/n)? と聞かれます。ここで y と答えると鍵が作り直され、サーバーに登録した公開鍵と合わなくなります。パスワード認証も禁止してあるので、SSHではログインできなくなります。エビデンス2の画面は手順5で撮っておき、確認では n と答えてください。
もし上書きしてしまったら、Proxmoxのコンソール(SSHではないので鍵は不要)からログインし、新しい公開鍵を登録し直します。
エビデンス(スクリーンショット6点)
課題を考えるための材料
課題1ファイアウォールの設定で、ポート22(SSH)を許可した理由を説明せよ。また、不要なポートを開放したままにすることの危険性を考察せよ。
問いの分解
前半は「なぜ22番だけは開ける必要があったのか」、後半は「開けっぱなしにすると何が危ないのか」の考察です。
知っておくとよい事実
- 22番はSSHの決まった番号で、2日目以降の作業はすべてSSHを通して行う
- 開いているポートの先では、必ず何かのプログラムが動いている。そのプログラムに脆弱性があれば、そこが侵入口になる
- インターネットにつながったサーバーには、開いているポートを探して回る自動の通信(ポートスキャン)が日常的に届く
- 開いている入口の総量を攻撃対象領域と呼び、それを小さくすることが防御の基本とされる
考える観点
- 22番を許可しなかったら、この実験では何ができなくなったか
- 手順2で見た「待ち受け」と「許可」の違いを使うと、「開いている」状態をどう説明できるか
- 実験用に一時的に動かしたサービス(3日目の練習用Webサーバーなど)を止め忘れた場合、何が起きうるか
課題2パスワード認証を禁止し、鍵認証のみに制限するセキュリティ上の理由は何か。
問いの分解
「鍵認証を使う理由」だけでなく、「パスワード認証を禁止する理由」まで含めて問われています。
知っておくとよい事実
- パスワードは、推測・使い回し・のぞき見・漏えい・総当たり攻撃によって破られることがある
- 鍵認証では、通信路に流れるのは毎回変わる問題への署名だけで、秘密鍵もパスワードも送られない(図2)
- サーバーには公開鍵しか置かれていないため、サーバーの中身が盗み見られても、そこからログインに使える情報は得られない
- 秘密鍵にパスフレーズをかけると、「鍵ファイルを持っていること」と「合言葉を知っていること」の二重の守りになる
- 鍵認証を設定しても、パスワード認証が残っていれば、攻撃者はパスワードのほうを狙える
考える観点
- 守りの強さは、いちばん弱い入口で決まるのではないか
- 手順7の確認(わざと鍵を使わずに接続して断られる)は、何を証明しているか
- 鍵認証の弱点はないか(秘密鍵のファイルが盗まれたら、など)。それをどう補うか