セキュリティを意識して、自宅サーバーを強固にしよう

## **はじめに**

やっとうちもWiMAXから光回線に乗り換えて、自作サーバーにグローバルIPが振られる日が近づいてきたので見直しも兼ねてまとめ。

外部IPを利用するサーバー、出来る限り強固なセキュリティ対策を行いましょう。
「ログインされても自分は重要な情報持っていないから大丈夫だよ」と思っている方がいるかもしれませんが、自分に被害が無くてもそのサーバーを経由して別の重要なサーバーへ攻撃をかけれれるかも:scream:

用途によって様々ですが、出来る限り強固なセキュリティ対策を心がけましょう。

ここではLinuxのサーバー機でのセキュリティ対策を記載します。

## **サーバー設定の前に: 最新事情を気にしよう**

### **Twitterで情報収集**

少なくとも自分が利用して外部から参照できるパッケージについては、脆弱性ニュースを確認するようにしましょう。
これはセキュリティ関係の仕事をしている知り合いに教えてもらった手ですが、Twitterのセキュリティに詳しい方やまとめアカウントのTwitterをフォローしておくだけでも自然とツイートに情報が流れてくるので便利です。結構頭に残るもんですよね:smile:

例えば私は以下のアカウントをフォローしています:+1:
[セキュリティ・トレンド bot](https://twitter.com/sec_trend)
[IPA （JVNiPedia）](https://twitter.com/JVNiPedia)
[セキュリティ最新ニュース](https://twitter.com/ashitaplanningk)
[辻 伸弘さん](https://twitter.com/ntsuji)
[上原 哲太郎さん](https://twitter.com/tetsutalow)

### **脆弱性があるパッケージはアップデート**

脆弱性が上がっているような古いパッケージはアップデートするような癖付けをしないといけないですね。

## **iptablesやfirewalldによるファイヤーウォール設定**

まずは入口を塞いでしまいます。出来る限り強固にして、必要最小限のポートやIPだけ外部に出られるようにしましょう。
私はサーバーの都合でiptablesによるファイヤーウォール設定を行いました。

## **攻撃対策**

世の中に沢山詳しい人がいるので、参考にしながら攻撃対応や国外IP拒否をしましょう:clap:
⇒大量のルール設定により、iptablesでめっちゃメモリを食うようになります。kernelへの負荷も上がるのでご利用は計画的に！
iptablesだと先にDrop設定をしてから、後でAcceptするような手順で設定しないと、IPアドレスを受け入れてしまうので注意です。

参考元：例えば
[iptablesの設定ファイルをシェルスクリプトを利用して動的に作成](https://oxynotes.com/?p=6401)
[iptablesの設定でサーバー攻撃対策と海外からのアクセスを制限](http://falsandtru.hatenablog.com/entry/iptables-firewall)
[俺史上最強のiptablesをさらす](https://qiita.com/suin/items/5c4e21fa284497782f71)

投稿主のスクリプトを置いてます:
[ここに各種。日々精進](https://github.com/developer-kikikaikai/linux_router/tree/master/script)
[スクリプトの説明](https://qiita.com/developer-kikikaikai/items/0d8ea1c057302ad26ea9#iptables%E3%81%AB%E3%82%88%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AE%E8%A8%AD%E5%AE%9A)

## **許可ポートへのセキュリティ対策**

ちょっとでも対策がわかるものを記載

### **ssh**

オートログイン出来ないと、設定変更もつらいですよね。でもフルオープンは危険すぎます。
自分の運用だとこんな感じに対策してます。

- ローカルのみのIFを許可, 外部からは見えないようにする。
- ポートは変える
- 特定の鍵でのログインのみ許容

**ローカルのみのIFを許可, 外部からは見えないようにする**

外からアクセスなんてしないのでローカルのみのIFを許可。iptablesのif指定とsshd_configの設定で締め出します。iptablesは後で。sshd_configは以下のようにListenAddressを対象ローカルIFに指定してしまいます。

```config:sshd_config
ListenAddress 192.168.1.1
```

**ポートをデフォルトから変える**

そこまで効果ないかもですが。こちらで指定されています。変えましょう。

```config:sshd_config
Port 22
```

既存プロトコルで利用されているポートや、非公式ながら予約されているポートがありますので注意です。
[TCPやUDPにおけるポート番号の一覧](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7)

上記2つのiptablesのコマンド設定はこんな感じ

```
##local ssh
LOGIN=`cat /etc/ssh/sshd_config | grep '^#\?Port ' | tail -n 1 | sed -e 's/^[^0-9]*\([0-9]\+\).*$/\1/'`
iptables -A INPUT -p tcp -i ${LANIF} --dport $LOGIN -j ACCEPT
```

**特定の鍵でのログインのみ許容**

パスワードログインだと心もとないので、鍵によるログインにします。鍵にも強度があるので、以下を参考に鍵も強固なssh-ed25519にします。
[どうせなら、SSHDでrsaキーの拒否をしてみないか?](https://qiita.com/hirotaka-tajiri/items/2e482fe05cd957cff9f1)

以下を追加し、公開鍵はログインユーザーの.ssh/authorized_keysに追加します。

```config:sshd_config
PubkeyAcceptedKeyTypes=ssh-ed25519
```

```shell:公開鍵追加
cat 公開鍵 >> ユーザーフォルダ/.ssh/authorized_keys
```

注意としては、autorized_keysは権限に注意です。755にしないといけないみたい。それでもだめならホームディレクトリの権限も疑ってみてください。
[SSHでどうしても鍵認証できないときに見るもの](https://qiita.com/fukusuke/items/6eb9f8593a296a95798c)

ここまで設定して、鍵を使ったログインが出来たらPasswordAuthentication を無効化します。:+1:

```config:sshd_config
#PasswordAuthentication yes
PasswordAuthentication no
```

### **HTTP系**

HTTPサーバーを立てる方はHTTPSによるセキュリティ対策をしましょう。

参考になったらいいな。[あなたのサーバーは大丈夫？安全なHTTPS設定の確認方法・検証ツール](https://qiita.com/developer-kikikaikai/items/0b00b05f1d54244d35b2)

## **最後に**

情報収集とセキュリティ対策、しっかりせねばいけませんね。精進します。
後絵文字使って記事書くの楽しい:moyai:

絵文字の参考:[qiita / git / trello / slack 他にも沢山使える絵文字技](https://qiita.com/nakoro/items/1effbb0e188a8c1d1d85)