macからLinuxサーバに、公開鍵認証方式でSSH接続をする
SSHとは
SSHとは「Secure Shell」の略で、暗号や認証の技術を利用して安全にリモートコンピュータと通信するためのプロトコル*1。
パスワードやデータを暗号化して通信する点と、サーバーに接続する時に接続先が意図しないサーバーに誘導されていないか厳密にチェックするしくみから、telnetなどのプロトコルよりも安全にリモートコンピュータと通信することができる。
SSHの認証方式は2つ
パスワード認証方式
パスワード認証方式はデフォルトの認証方式で、ユーザー名とパスワードでログインする方式。
この認証方式だと、「パスワードを知っている」「サーバーにアクセス出来る手段がある」という条件が揃っていれば、誰でもサーバーにアクセスできてしまうので安全であるとは言い難い。
公開鍵認証方式
サーバー側に置く公開鍵とクライアント側に置く秘密鍵の2つの鍵(キーペア)を使用した接続方式。
公開鍵を持っているクライアント端末からだけログインすることができる。
これによりパスワード総当たりなどで不正ログインを試みられても、鍵がない端末からはログインできないため、鍵が盗まれない限り侵入されることはない。
公開鍵認証では、SSHログイン時にパスワードを入力するする必要はない。かわりに「パスフレーズ」というものを使用する。 一見パスワードと似ているが、これはサーバーへログインするためのものではなく、クライアントの秘密鍵にアクセスするための文字列である。
公開鍵認証のもう少し詳しいしくみが知りたい場合は「鍵交換方式による認証」に詳しく書いてある。
OpenSSHとは
SSHプロトコルを使用する為のソフトで、SSHクライアントとSSHサーバーの両方が含まれている。
公開鍵認証方式でSSH接続できるようにする
1.OpenSSHをインストール
# apt install ssh
2.OpenSSHの設定を変更する
OpenSSHの設定ファイルsshd_configを開き、設定を変更する。変更箇所は以下の2点。
- rootユーザーでのログインを禁止する
- 接続ポートを22以外に変更する
1) rootユーザーでのログインを禁止
rootユーザーは全ての操作が可能なスーパーユーザーなので、SSH接続を利用してrootでSSHサーバーに侵入されてしまうのは非常に危険である。 セキュリティの面を考えるとrootログインを禁止するのはほぼ常識である。
【サーバー側で操作】
sshd_configを開く。
# vi /etc/ssh/sshd_config
設定ファイルの「PermitRootLogin」を「no」に変更する。設定ファイルはrootユーザーじゃないと編集できないので、先にrootになるのを忘れないこと。
Debian9では最初開いた時に設定が#PermitRootLogin prohibit-password
とコメントアウトされているので、コメントアウトも外すのを忘れない。*2
PermitRootLogin no
参考:
逆に、SSHでrootログインを有効にしたいわって時には以下のサイトが参考になる。
SSH:rootでログインする場合: 個人的健忘録 from 2013
ただ前述した通り、よほどの理由がない限りやらないほうが良い。
(今回は「rootユーザーでSSH接続ができない」ということを確かめるために、あえてこの手順でrootユーザーでSSH接続可能な状態を作った。)
2) 接続ポートを22以外にする
SSHサーバーの初期設定は22番ポートを使用している。 ただ、このポート番号は一般的で広く知られているため、不正侵入のリスクが高い。全世界の22番ポートをくまなく調べ、セキュリティホールのあるサーバが無いかチェックしている無差別に22番ポートを攻撃するロボットもいるらしい。
ポート番号を22番から変更するだけでこういったリスクを避けることができるためぜひとも行っておく必要がある。
【サーバー側で操作】
同じく設定ファイルの「#Port 22」となっているところををコメントを外して、22以外の番号に変更する。ただしウェルノンポート*3は避けること。
Port 50001
ここまでできたら設定ファイルを保存し、以下のコマンドでSSHを再起動する(rootユーザーのままで実行)。再起動させないと反映されないので忘れないこと。
# /etc/init.d/ssh restart Restarting ssh (via systemctl): ssh.service.
ここまでで準備は完了。
3.クライアントでキーペアを作成
SSH接続のデフォルトはパスワード認証方式なので、公開鍵認証方式に変更し鍵認証でのみSSH接続できるように変更する。 パソコン側に置く秘密鍵と、サーバー側に置く公開鍵の2つが必要である。 公開鍵ファイルは、人に知られても良い(=公開しても良いから公開鍵)ファイルだが、秘密鍵ファイルは人に知られないようにすること!
やり方はここの手順通り。
【Mac側で操作】
1) キーペア(秘密鍵と公開鍵)を作る
キーペアの種類はいくつかあるようだが、ここではclient_rsaというRSA鍵を作成する。 キーペアの作成はssh-keygenコマンドを使用する。RSA暗号方式の鍵を作成するときは「-t rsa」オプションを、DSA暗号方式の鍵を作成するときは「-t dsa」オプションを付加する。
$ ssh-keygen -t rsa
実行すると以下のようにファイルが2つできる。前者が秘密鍵、後者が公開鍵。
2) 作成した公開鍵を Linux サーバに送る
公開鍵 id_rsa.pub をサーバに送付する。秘密鍵と公開鍵を間違って送付しないように注意!
公開鍵はサーバーに置き見られても良い鍵で、秘密鍵はクライアントに置きクライアントの中だけで秘密にすること。
公開鍵の送付はscpコマンドを使う。同時に、鍵の名前を authorized_keys としておく。
> scp -P 50001 ~/.ssh/id_rsa.pub {サーバのユーザ名}@{サーバのアドレス}:~/.ssh/authorized_keys
さくらのVPSのサーバーアドレスを指定するときは「XXXX.vs.sakura.ne.jp」まで指定する。最初「XXXX」だけでいいかと思っていたけど接続できなくてちょいハマりした。
3) 作成した公開鍵の権限を変更
いよいよ最後の設定。
【サーバー側で操作】
公開鍵の権限を変更して、所有者(つまり自分のアカウント)だけが読み書きできるようにする。
$ cd ~/.ssh/ $ chmod 600 authorized_keys
4.SSH接続してみる
1) 22番ポートで接続できないことを確認
2) rootでログインできないことを確認
以下のようにコマンドをうって接続してみて接続できないことを確認する。
$ ssh -p 50001 root@{サーバのアドレス}
3) 接続時にパスワードを求められないことを確認
以下のコマンドを実行。
ssh -p 50001 {ユーザー名}@{サーバーアドレス}
できました!