Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

さくらVPS上にBottle鯖を立てる その3:秘密鍵を入れたマシン以外で入れないようにする

shuzo-kino.hateblo.jp
のシリーズ第三弾。
今回は秘密鍵を入れたマシン以外で入れないようにします。
これで実害を喰らう可能性は相当低くなりますね。

実際のところ

以降、IPは160.16.xxx.xxx、ユーザはubuntuであるとします。

まずはログインできるかお試し。
ここは特に問題ないはず。

local$ ssh ubuntu@160.16.xxx.xxx
ubuntu@160.16.xxx.xxx's password: 
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-62-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

SAKURA Internet [Virtual Private Server SERVICE]

Last login: Thu Aug 17 23:32:09 2017
remote$ 

秘密鍵を送り込む

ローカルPCから、scpコマンドで公開鍵を送り込みます。
".ssh"下のid_rsa.pubを使ってます。
ない人はググって作って下さい(投げやり

local$ scp ~/.ssh/id_rsa.pub ubuntu@160.16.xxx.xxx:~/
ubuntu@160.16.xxx.xxx's password: 
id_rsa.pub                 100%  426     8.4KB/s   00:00    

リモート環境にログインし、

$ mkdir .ssh
remote:~$ chmod 700 .ssh/
remote:~$ cat id_rsa.pub >> .ssh/authorized_keys
remote:~$ chmod 600 .ssh/authorized_keys 
remote:~$ ls -la .ssh/
total 12
drwx------ 2 ubuntu ubuntu 4096 Aug 17 23:37 .
drwxr-xr-x 4 ubuntu ubuntu 4096 Aug 17 23:37 ..
-rw------- 1 ubuntu ubuntu  426 Aug 17 23:37 authorized_keys
remote:~$ cat .ssh/authorized_keys 
ssh-rsa A...r shuzo_kino@local

ログアウトし、ローカルマシンから再度ログインしてみます。

$ logout
Connection to 160.16.xxx.xxx closed.
 $ ssh ubuntu@160.16.xxx.xxx
Enter passphrase for key '/Users/shuzo_kino/.ssh/id_rsa': 
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-62-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

SAKURA Internet [Virtual Private Server SERVICE]

Last login: Thu Aug 17 23:37:00 2017 from yyy.yyy.yyy.yyy
ubuntu@tk2-215-17048:~$

設定ファイルを書き換える

無事にパスワード付きでログインできる状態を確立したら、
その後は秘密鍵のみでログインするように設定しなおします。
設定ファイルなので管理者権限で入ります。

$ sudo -s
[sudo] password for ubuntu: 
root:~#

ssh設定ファイルのディレクトリへ行き、sshd_configを弄ります。
エディタは好みで。
私はnanoをつかいました。

root:~# cd /etc/ssh/
root:/etc/ssh# cp -p sshd_config sshd_config.bak
root:/etc/ssh# nano sshd_config

差分はこんな感じ。
上から順に

  • ルートでのログインを可能にするか
  • パスワード認証によるログインを可能にするか
  • PAM*1認証を有効にするか

一番最後のは認証周りとアプリケーションを分離するのに有効なAPIらしいのですが、
私はテンで分からないので無効。

root:/etc/ssh# diff sshd_config sshd_config.bak
28c28
< PermitRootLogin no
---
> PermitRootLogin prohibit-password
52c52
< PasswordAuthentication no
---
> PasswordAuthentication yes
88c88
< UsePAM no
---
> UsePAM yes

終わったら、sshのリスタート。

root:/etc/ssh# service ssh restart
【蛇足】OpenSSH 7.0系から変わったこと

参考にしていた書籍はUbuntu14系だったため、OpenSSH自体も少し以前のものでした。
2015年に登場したOpenSSH 7.0ではPermitRootLoginについて、少し変更が入っています。
mag.osdn.jp

「PermitRootLogin」オプションについてデフォルト値が従来の「yes」から「prohibit-password」に変更されたほか、新たな設定値として「prohibit-password」を指定できるようになった。さらに、PermitRootLoginの値が「without-password」および「prohibit-password」に設定されていた場合、すべてのインタラクティブな認証を禁止し、公開鍵もしくはホストベース、GSSAPIによる認証のみが有効になるよう変更された。

今回のように、横からの攻撃から防御したい場合これまで通りnoで良いかと。

*1:Pluggable Authentication Module