Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

さくら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