LinuxからUbuntu ServerにSSH接続したい
SSH接続するにはどうすればいいの?
SSH(Secure Shell)を使うと、あるコンピューター(クライアント)から別のコンピューター(サーバー)に、サーバーのアカウントでログインできます。クライアントからサーバーにログインする、と言われてもピンと来ない方が多いのではないでしょうか。
そこでこの記事では、ログインする操作を紹介しながら、以下のような疑問に答えます。
- クライアントからサーバーにログインするときに必要な情報とは
- デフォルト設定では、セキュリティが低いと聞きましたが、本当?
- 公開鍵と秘密鍵を使うと安全って聞いたけど、鍵はどこでどうやって作るの?
今回は、「Linux Mint 18.3 Xfceエディション(以降、Linux Mint)」から「Ubuntu Server 18.04 LTS(以降、Ubuntu Server)」に、SSHを利用して接続する際の具体的な操作を説明しています。
それでは、始めましょう。
SSH(Secure Shell)とは
SSH(Secure Shell)については、Wikipediaの説明が短くまとまっています。
- Secure Shell
- Secure Shell(セキュアシェル、SSH)は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。パスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化される。/ Wikipedia
この記事では、Linux MintとUbuntu Serverの間で安全に通信するためにSSHを使います。SSHを使うと、通信が暗号化されて盗聴に強くなります。
さらに、秘密鍵と公開鍵を使うと、パスフレーズ(パスワード)や秘密鍵をサーバーに送信せずに、認証が完了します。
SSHを使ってLinux MintからUbuntu Serverにログインするには
長い道のりになりますが、千里の道も一歩からです。少しずつ進んでみましょう。Linux MintからUbuntu Serverにログインするために必要な情報は、デフォルトでは以下のとおりです。
- Ubuntu Serverのアカウントと、そのパスワード
- Ubuntu ServerのIPアドレス
このうち、Ubuntu Serverのアカウントと、そのパスワードについては、自分でアカウントを作成したときにメモしておきましょう。
Ubuntu ServerでIPアドレスを確認する
IPアドレスの確認方法は、以下の記事で書いたとおり、NetworkManagerでしょう。
と思ったら、Ubuntu ServerにはNetworkManagerがインストールされておらず、勉強不足を痛感しました。
(1)以下のコマンドを入力します。
ip addr
実行結果を見ると、10.0.2.4/24のようです。
Linux MintからUbuntu Serverにsshでログインする
Linux MintからUbuntu Serverのアカウント「yazaki」に、sshコマンドでログインしてみましょう。
(1)Linux Mintで、「端末」を起動して、以下のコマンドを入力します。
ssh yazaki@10.0.2.4
「yazaki」はUbuntu Serverのアカウントで、「10.0.2.4」はUbuntu ServerのIPアドレスです。以下のように表示されますので何か入力したくなりますが、その前にUbuntu Serverで確認が必要です。
The authenticity of host '10.0.2.4 (10.0.2.4)' can't be established. ECDSA key fingerprint is SHA256:jjXyMlozEF8NMOjMTfstVsS1QWwtnd6bmiKgm+dRWJY. Are you sure you want to continue connecting (yes/no)?
「ECDSA key fingerprint is SHA256:」の後ろに続く文字列が、とても重要です。この文字列のことをECDSAキーのfingerprintと呼び、接続先のUbuntu ServerのECDSAキーのfingerprintと一致するか確認します。
(2)Ubuntu Serverで、以下のコマンドを入力します。
ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
Ubuntu ServerのECDSAキーのfingerprintが表示されます。先ほどのfingerprintと同じ文字列が表示されていることを確認しましょう。
fingerprintが一致していない場合は、手順(1)で指定したIPアドレスは、Ubuntu ServerのIPアドレスではない、ということです。sshコマンドでは、文字しか情報が無いため、このようにfingerprintを使って接続先をしっかり確認する仕組みになっています。
(3)fingerprintが一致していたら、Linux Mintで「yes」と入力し、Enterキーを押します。
(4)パスワードを入力する画面が表示されたら、Ubuntu Serverのアカウント「yazaki」のパスワードを入力し、Enterキーを押します。以下のように「yazaki@ubuntu-server:~$」と表示され、Ubuntu Serverのアカウント「yazaki」にログインできたことがわかります。
Last login: Fri Jun 15 06:48:46 2018 yazaki@ubuntu-server:~$
なお、Ubuntu Serverにログインするときから、通信内容はすべて暗号化されています。
(5)Linux Mintで「exit」と入力し、Enterキーを押します。以下のように「yazaki-mint@yazakimint-VirtualBox ~ $ 」と表示され、Ubuntu Serverからログアウトし、Linux Mintに戻ってきたことがわかります。
logout Connection to 10.0.2.4 closed. yazaki-mint@yazakimint-VirtualBox ~ $
セキュリティを高める
ここまでの操作では、Ubuntu Serverにログインするために、以下の情報が必要でした。
- Ubuntu ServerのIPアドレス
- Ubuntu Serverのアカウント「yazaki」と、そのパスワード
これは、デフォルト設定でセキュリティが低い状態です。少しでもセキュリティを高めるために、ログインに必要な情報を増やしましょう。
ここで紹介する操作が終わると、ログインするために以下の情報が必要になります。
- Ubuntu ServerのIPアドレス
- Ubuntu ServerのSSHサーバーが待つポート番号
- Linux Mintのアカウント「yazaki-mint」で作成した秘密鍵(ECDSA鍵:521ビット)と、そのパスフレーズ
さらにセキュリティを高めるには、Google Authenticatorを用いて二段階認証を行う方法もあります。二段階認証について詳しくは、以下のページをご覧ください。
参考:https://dev.classmethod.jp/cloud/aws/amazon-linux-ssh-two-step-authentication/
Ubuntu ServerのSSHサーバーが待つポート番号を変更する
初期設定では、Ubuntu ServerのSSHサーバーは、ポート番号「22」でSSH接続を待っています。そして初期設定どおりであれば、Linux Mintからログインする際にポート番号を指定する必要がないため、ここまでの手順でポート番号を省略していました。
ポート番号を知らなくても大丈夫な状態ですね。ここでは、初期設定を変更して、ログイン時にポート番号を指定するようにします。ポート番号は、1~65535番のうち、一般に使用されていない番号なら自由に使用できますので、Ubuntu Serverで適当な数を生成しましょう。
(1)Ubuntu Serverで、以下のコマンドを入力します。
cat /dev/urandom | tr -dc "[:digit:]" | fold -w 5 | grep “^[0-6]” | head -n 7 | sort
私が実行したときは以下のように表示されました。適当な数なので、コマンドを入力するたびにまったく違う数字が表示されます。
05491 08436 12957 23698 42452 62261 65955
この中から、1~65535番の中に含まれ、かつ以下のサイトに登録されていない番号を選びましょう。
引用元:https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
この記事では「23698」を選びました。
(2)以下のコマンドを入力します。
sudo vi /etc/ssh/sshd_config
(3)パスワードを入力する画面が表示されたときは、パスワードを入力します。viエディタが起動します。viエディタの操作を子細に書きますので、そのとおりに操作してください。カッコの中は、その直前に入力したコマンドの意味です。
(4)「gg」(ファイルの先頭に移動)と入力します。
(5)「/」(文字列検索)と入力し、続けて「Port」と入力して、Enterキーを押します。/etc/ssh/sshd_config内の「Port」が検索されます。
(6)「o」(次の行に空行を作って文字を挿入)と入力し、続けて「Port 23698」と入力します。
(7)Escキーを押し、「:w」と入力して、Enterキーを押します。編集内容が保存されます。
(8)「:q」と入力して、Enterキーを押します。viが終了します。
(9)以下のコマンドを入力します。
sudo service sshd restart
これで、Ubuntu ServerのSSHサーバーが待つポート番号が「23698」に変更されました。
改めてLinux Mintからログインしてみよう
ポート番号が変わったため、少しだけセキュリティが高くなりました。まずは、先ほどと同じコマンドでLinux MintからUbuntu Serverにログインできないことを確認しましょう。
(1)先ほどと同じ、以下のコマンドを入力します。
ssh yazaki@10.0.2.4
以下のように表示され、接続できなくなりました!
ssh: connect to host 10.0.2.4 port 22: Connection refused
他方、ポート番号を指定すれば、ログインできます。
(2)ポート番号「23698」を指定したコマンドを入力します。
ssh yazaki@10.0.2.4 -p 23698
(3)パスワードを入力する画面が表示されたら、パスワードを入力します。今度はUbuntu Serverのアカウント「yazaki」にログインできました。
Last login: Fri Jun 15 07:15:53 2018 from 10.0.2.15 yazaki@ubuntu-server:~$
これで、Ubuntu Serverに接続するために、ポート番号が必要になったことが確認できました。
公開鍵(ECDSA鍵:521ビット)を登録する
次は、Linux Mintのアカウント「yazaki-mint」で作成した秘密鍵(ECDSA鍵:521ビット)と、そのパスフレーズが必要な設定にします。Linux Mintで秘密鍵と公開鍵を作成しましょう。Ubuntu Serverでは鍵は作成しませんので、注意してください。
(1)Linux Mintで、以下のコマンドを入力します。
ssh-keygen -t ecdsa -b 521
鍵を保存するディレクトリとファイル名を入力する画面が表示されます。
Generating public/private ecdsa key pair. Enter file in which to save the key (/home/yazaki-mint/.ssh/id_ecdsa):
(2)鍵を保存するディレクトリとファイル名を入力して、Enterキーを押します。「/home/yazaki-mint/.ssh/id_ecdsa」のままでよければ、何も入力せずにEnterキーを押します。
秘密鍵のパスフレーズを入力する画面が表示されます。
Enter passphrase (empty for no passphrase):
(3)秘密鍵のパスフレーズを入力して、Enterキーを押します。
(4)確認のため、もう一度同じパスフレーズを入力して、Enterキーを押します。2つのファイル(秘密鍵と公開鍵)が作成され、以下のように表示されます。
Your identification has been saved in /home/yazaki-mint/.ssh/id_ecdsa. Your public key has been saved in /home/yazaki-mint/.ssh/id_ecdsa.pub. The key fingerprint is: SHA256:litiegr5GfKX1MM974FIClcJEBZ+GxxLEWM8XDtHml8 yazaki-mint@yazakimint-VirtualBox The key's randomart image is: +---[ECDSA 521]---+ | =*O+. . | | o ++= * | | . =.B . E | | . + + o | | . oo..S | | . o.o+ooo | |+ ..+.o.oo. | | = =+. . .. | | *+ .. | +----[SHA256]-----+
実行結果に表示されている「/home/yazaki-mint/.ssh/id_ecdsa」が秘密鍵です。
秘密鍵は、公開鍵を配置したサーバーにアクセスするときや、公開鍵を無くしたときなど、特別な場合にのみ使用します。私は、作成したディレクトリだけでなく、コンピューターからも移動・コピーしていません。
もう1つの「/home/yazaki-mint/.ssh/id_ecdsa.pub」(~/.ssh/id_ecdsa.pub)が公開鍵です。
公開鍵は、秘密鍵から再作成できますし、誰かに見せるために作成した鍵ですので、気軽にコピーしたり削除したりしても問題ありません。作成した公開鍵をUbuntu Serverのアカウント「yazaki」に登録します。
(5)以下のコマンドを入力します。
scp -P 23698 ~/.ssh/id_ecdsa.pub yazaki@10.0.2.4:~/id_ecdsa_yazaki-mint.pub
このコマンドは、以下のように動作します。
- Linux Mintで作成した公開鍵(~/.ssh/id_ecdsa.pub)をコピーします。
- 公開鍵のコピー先は、Ubuntu Server(IPアドレス:10.0.2.4、ポート番号:23698)のアカウント「yazaki」のホームディレクトリです。
- 公開鍵のファイル名を、コピー先では「id_ecdsa_yazaki-mint.pub」に変更します。
(6)以下のコマンドを入力します。
ssh yazaki@10.0.2.4 -p 23698
(7)パスワードを入力する画面が表示されたら、パスワードを入力します。Ubuntu Serverのアカウント「yazaki」にログインできました。
Last login: Fri Jun 15 07:15:53 2018 from 10.0.2.15 yazaki@ubuntu-server:~$
(6)続けて、以下のコマンドを1行ずつ入力します。Ubuntu Serverのアカウント「yazaki」のホームディレクトリに「.ssh」ディレクトリを作成したり、公開鍵の内容を「~/.ssh/authorized_keys」に追記したりします。
mkdir .ssh chmod 700 .ssh cat id_ecdsa_yazaki-mint.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
この4行は、アカウント「yazaki」に1つ目の公開鍵を登録するときのコマンドです。2つ目の公開鍵を追記する場合は、3行目のコマンドだけを実行します。
以上で、Linux Mintのアカウント「yazaki-mint」で作成した秘密鍵(ECDSA鍵:521ビット)を持っていて、そのパスフレーズを知っていると、Ubuntu Serverのアカウント「yazaki」にログインできるようになりました。
Linux Mintから接続してみよう
Linux MintからUbuntu Serverに接続できることを確認しましょう。
(1)以前と同じ以下のコマンドを入力します。
ssh yazaki@10.0.2.4 -p 23698
(2)秘密鍵(/home/yazaki-mint/.ssh/id_ecdsa)のパスフレーズを入力する画面が表示されたときは、パスフレーズを入力します。Ubuntu Serverのアカウント「yazaki」にログインできましたね。
(3)「exit」と入力し、Enterキーを押します。Linux Mintに戻ります。もう一度、Ubuntu Serverに接続しますが、今度は秘密鍵がない状態でログインしてみましょう。
(4)以下のコマンドを入力して、秘密鍵を隠します。
mv ~/.ssh ~/.ssh-org
(5)手順(1)と同じ以下のコマンドを入力します。
ssh yazaki@10.0.2.4 -p 23698
(6)初めてアクセスしたときのように、接続先のUbuntu ServerのECDSAキーのfingerprintを確認し、「yes」と入力して、Enterキーを押します。
The authenticity of host '[10.0.2.4]:23698 ([10.0.2.4]:23698)' can't be established. ECDSA key fingerprint is SHA256:jjXyMlozEF8NMOjMTfstVsS1QWwtnd6bmiKgm+dRWJY. Are you sure you want to continue connecting (yes/no)?
パスフレーズは聞かれず、パスワードを入力する画面が表示されます。
(7)Ubuntu Serverのアカウント「yazaki」のパスワードを入力します。秘密鍵を持っていなくても、パスワードを知っていればログインできてしまいました。これでは、セキュリティが高くなっていませんね…。
パスワードを無効にする
パスワードを知っていればログインできるのでは、秘密鍵の意味がありません。そこで、Ubuntu Serverのアカウント「yazaki」には、秘密鍵を持っていないとログインできないように設定して、本当にセキュリティを高めます。
(1)Ubuntu Serverで、以下のコマンドを入力します。
sudo vi /etc/ssh/sshd_config
(2)パスワードを入力する画面が表示されたときは、パスワードを入力します。
(3)「gg」(ファイルの先頭に移動)と入力します。
(4)「/」(文字列検索)と入力し、続けて「Password」と入力して、Enterキーを押します。
sshd_config内の「PasswordAuthentication」の行が検索されます。
(5)「o」(次の行に空行を作って文字を挿入)と入力し、続けて「PasswordAuthentication no」と入力します。
(6)Escキーを押し、「:w」と入力して、Enterキーを押します。編集内容が保存されます。
(7)「:q」と入力して、Enterキーを押します。
viが終了します。
(8)以下のコマンドを入力します。
sudo service sshd restart
Ubuntu Serverのアカウント「yazaki」のパスワードを知っていてもアクセスできなくなりました。
言いかえると、ここまでの設定で、Ubuntu Serverのアカウント「yazaki」にログインできるのは、Linux Mintのアカウント「yazaki-mint」で作成した秘密鍵(ECDSA鍵:521ビット)を持っていて、そのパスフレーズを知っている人だけになりました。
Linux Mintから接続してみよう
秘密鍵を持っていなければ、Linux MintからUbuntu Serverに接続できないことを確認しましょう。手順どおりに操作していれば、Linux Mintのアカウント「yazaki-mint」は、Ubuntu Serverのアカウント「yazaki」にログインするための秘密鍵を持っていない状態です。
(1)以下のコマンドを入力します。
ssh yazaki@10.0.2.4 -p 23698
以下のように、確かにログインできません!
Permission denied (publickey).
(2)隠していた秘密鍵を取り戻すために、以下のコマンドを入力します。
mv ~/.ssh-org ~/.ssh
(3)手順(1)と同じ以下のコマンドを入力します。
ssh yazaki@10.0.2.4 -p 23698
(4)秘密鍵(/home/yazaki-mint/.ssh/id_ecdsa)のパスフレーズを入力する画面が表示されたら、パスフレーズを入力します。
これで、秘密鍵を持っていてパスフレーズを知っている人だけが、Ubuntu Serverのアカウント「yazaki」にログインできることが確認できました。
まとめ
今回は、SSHとは何かを超簡単に説明し、Ubuntu Serverのアカウント「yazaki」に、Linux Mintのアカウント「yazaki-mint」から安全にアクセスする方法を説明しました。
様々な設定をした結果、Ubuntu Serverのアカウント「yazaki」にログインするには、以下の情報が必要になりました。
- Ubuntu ServerのIPアドレス
- Ubuntu ServerのSSHサーバーが待つポート番号
- Linux Mintのアカウント「yazaki-mint」で作成した秘密鍵(ECDSA鍵:521ビット)と、そのパスフレーズ
なお、Ubuntu Serverのアカウント「yazaki」と、そのパスワードを知っていても、SSHではログインできなくなっています。今回の設定では、Ubuntu Serverにアクセスするために最も複雑で大事な情報は、秘密鍵です。
この秘密鍵が漏洩しないように、しっかりと管理しましょう。#今回記事のために作成した秘密鍵は、誤りがないようにLinux Mintと一緒に削除しました。