VPS上のサーバーでセキュリティを確保するために行っていること (2019年7月時点)

最近会社で聞かれて答えたことをまとめてみました。

VPS上に構築したサーバーで、セキュリティを確保するためにどんなことを行っているか、です。

# とりあえず図で書いてみる

とりあえず図で書いてみました。これがあれば、説明はほとんどいらないかもしれません。

![VPN構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381550/2b9ae5f2-627b-e865-d7ac-a392fe6a33ca.png)

# Unix系OSの場合

## 実施している内容

まず、外部接続可能なサービスはSSHに限定しています。
他のサービスは、SSHログイン後のポート転送を必須としています。

SSHは、LISTENポート番号の変更と公開鍵認証を行っています。
より厳重にするには、接続元を制限するほうが望ましいと思います。
しかし、そこまでは制限していません。

また、VPSがファイヤウォール機能を提供していることがあります。
その場合は、そのファイヤウォール機能も併用しています。

## 補足

### SSHのポート番号変更

過去の経験上、SSHのポート番号変更の効果は非常に高いです。どの番号に変更するかで違いはあるかもしれません。ただ、変更するまで多発していたログインの試みは、変更でピタッと止みました。

Linuxでは、ログインに失敗したときのログを "lastb" コマンドで確認できます。ログイン成功が "last" で、ログイン失敗が "lastb" です。

SSHのポート番号を変更する前の "lastb" の出力結果を、接続元IPアドレスを伏せた形で例示してみます。同じ日の約30分のログの抜粋です。[Whois](https://ja.asuka.io/whois)で確認すると、接続元は中国の政府系の病院でした。頻発していたこのようなアクセスが、ポート番号変更後は全くありません。

```
# lastb
　　　　：
root     ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:20 - 02:20  (00:00)
user     ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:19 - 02:19  (00:00)
　　　　：
root     ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:18 - 02:18  (00:00)
root     ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:16 - 02:16  (00:00)
postgres ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:14 - 02:14  (00:00)
postgres ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:14 - 02:14  (00:00)
test     ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:13 - 02:13  (00:00)
test     ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:13 - 02:13  (00:00)
　　　　：
oracle   ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:11 - 02:11  (00:00)
oracle   ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:11 - 02:11  (00:00)
ftptest  ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:10 - 02:10  (00:00)
ftptest  ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 02:10 - 02:10  (00:00)
　　　　：
jenkins  ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 01:57 - 01:57  (00:00)
jenkins  ssh:notty    xxx.xxx.xxx.xxx   xxx xxx xx 01:57 - 01:57  (00:00)```
　　　　：
```

### 接続元制限

できるならやっておくほうがいいでしょう。
ただ、私の利用環境では接続元を固定化できないため、やっていません。
Android+[Termux](https://termux.com/)+ポータブルWifiといった環境で接続することがあるためです。

自宅や会社FreeWifiなど、接続元が限定しているなら接続元制限をしておく価値はあると思います。

### SSH以外のサービス

SSH以外のサービスには、外部から直接接続できないようにしています。
方法は、ファイヤウォールによる制限と、LISTENアドレスによる制限です。

そのため、SSHポート転送を用いた接続を必須としてあります。

個人のみでの利用、第三者向けに提供しているサービスがないため、このような方法を取っています。サービスを利用する前にSSHするだけなので、それほど使い勝手が悪いと思っていません。

### ファイヤウォールによる制限

OSが持つiptablesやufwなどのファイヤウォールを使用しています。また、VPSがファイヤウォール機能を提供している場合、それも併用しています。

許可するポートは、SSHポートのみです。

## Windowsの場合

## 実施している内容

こちらもUnix系OSの場合と同様です。

但し、インターネット側からの接続はフルクローズとしてあります。
VPSが提供するLAN側からのRDPのみを許可してあります。
そのため、Unix系OSからのSSHポート転送でのみ接続可能となっています。

加えて、VPN経由でインターネットに接続するようにしています。

### 補足

#### リモートデスクトップ

以前は[リバースコネクションを利用した構成](https://qiita.com/szly/items/407615693bcc3359d36d)を使っていました。
しかし、以下のメッセージが表示されるようになってしまいました。

![リモートデスクトップ接続-進行中のコンソールセッション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381550/7d47074f-e73d-7121-2af0-d6c9ecb3bc7c.png)

どうも解決できなかったので、今は上に書いた方法を使っています。

調べたところ、自分自身への接続を試みると表示するメッセージだそうです。確かに前の構成だと、自分自身に接続する形となります。ただ、それだと以前はうまくいっていた説明がつきません。むー。

#### VPN

構成上、Unix系OSが全ての砦になっています。Unix系OSの出入り口を極力知られないようにする必要があります。そのため、Windowsからインターネットへの通信は、WUnix系OSを通過させないようにしています。

Windows自身を守るものがVPS提供のファイヤウォールだけでは心許ないと考えています。そのため、VPNを張るようにしています。

#### リモートデスクトップのポート番号

VPNとファイヤウォールで保護されているとはいえ、Windows UpdateやVPS設定の誤りなどで無防備になってしまうかもしれません。そのため、ポート番号を変更してあります。

```
REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber
```

#### その他

Windows自身にリバースコネクションを張らせるような手口には気を付けないといけません。しかし、それはVPSに限った話ではありません。一般的なWindowsクライアントのセキュリティが、上記とは別に必要です。