CentOS7でのセキュリテイ強化 

#大前提
ここに書く事を全てやれば良いわけでは無いと思っている。
AWS,GCP,さくらクラウド等の環境でサービスを提供する場合や、
オンプレ環境でサービスを提供する場合でも、
セキュリティ強化の方法や設計思想は必ずしも同じではない。
何をどこまで、どのようにして、どのレベルで守るかは、
所属する組織や個人で適切に検討する必要がある。
例えば、WAFを導入すればセキュリティが高まると知りつつも、
金額が高いとゆう事で購入できなかったりもする。
セキュリティを高めた結果、運用に支障がでる場合も少なからずある。

#超重要
セキュリティを強化するために、あれこれ調査して設定する事も重要ですが、
設定した後に、正しく設定されていることを確認する事が最も重要です。

#SELinuxを無効にする
CentOS7の場合は、デフォルトでは有効(enforcing)
selinuxについて深い知見がある場合は、有効のままで良い
自分の場合は、有効にしていると色々と厄介なので無効にする

####一時的に無効にする
Permissiveになる
再起動すると有効になる

```
# setenforce 0
```

####永続的に無効にする
設定ファイルを編集し、OSを再起動し、確認をする

```
# vi /etc/selinux/config
SELINUX=disabled
# reboot
# getenforce
Disabled
```

#パッケージを定期的にアップデートする
全体的にアップデートする場合や、
特定のパッケージのみアップデート対象から除外する場合や、
特定のパッケージのみアップデートする等状況により異なる
稀にアップデートした事でカーネルが壊れて再起動すると
カーネルパニックが発生する場合もあるので、
必要に応じてOS再起動を検討する
許されるならOS再起動すると良い

全体的にアップデートする

```
# yum update
```

特定のパッケージを除外してアップデートする
/etc/yum.confに除外するパッケージを記述する方法もある

```
# yum update --exclude=パッケージ名
```

特定のパッケージのみアップデートする

```
# yum update パッケージ名
```

#sshのポート番号を変更する
ウェルノウンポート（0番～1023番）は設定しない。
エフェメラルポートは避ける
[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)
[エフェメラルポート](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%95%E3%82%A7%E3%83%A1%E3%83%A9%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88)

エフェメラルポートの範囲を変更できるが基本的にはデフォルトのままで良い
エフェメラルポートの確認

```
# cat /proc/sys/net/ipv4/ip_local_port_range
32768	60999
```

```
# vi /etc/ssh/sshd_config
Port 任意のポート番号
```

#一般権限のユーザー(仮にhoge)を作成し、パスワードを設定する

```
# useradd hoge
# passwd hoge
```

#公開鍵認証方式でのログイン設定をする

###接続元のクライアントマシンで公開鍵を作成する
仮に公開鍵として「id_rsa.pub」を作成したとする

```
ssh-keygen -t rsa
```

####接続先のサーバーに公開鍵を追加する
一般ユーザーでログインする用にクライアントマシンで作成した公開鍵を追加します
SCP等で公開鍵(id_rsa.pub)を接続先ユーザーのホームディレクトリにコピーしたとする

```
＄ cd
$ mkdir .ssh
$ chmod 700 .ssh/
$ cat id_rsa.pub >> .ssh/authorized_keys 
$ rm id_rsa.pub
$ chmod 600 .ssh/authorized_keys    
```

#sudoを可能にする
無闇にrootユーザーにならないで、root権限の必要なコマンドを実行可能にする
sudoでコマンドを実行することにより、ログに残るようにする
visudoで/etc/sudoersを編集する
可能であれば、sudoで実行するコマンドも制限すると良い
[CentOSでuserをsudo可能にする](https://qiita.com/Esfahan/items/a159753d156d23baf180)
[sudo のセキュリティ(ごく一部CentOS7対応)](https://qiita.com/KurokoSin/items/e96475c475ab59b5244f)

#rootユーザーでのSSHによるログインを無効にする

```
# vi /etc/ssh/sshd_config
PermitRootLogin no  
# systemctl restart sshd
```

# SSHでのパスワードに認証によるログインを禁止する
```
# vi /etc/ssh/sshd_config
PasswordAuthentication no
# systemctl restart sshd
```

#firewalldの設定
基本は全部閉じて、必要なもののみ開ける
[CentOS7でのFirewalld設定（ほぼコマンド例）](https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280)
[CentOS7のfirewalldをまじめに使うはじめの一歩（systemdも少し）](https://qiita.com/shrkw/items/8410e9cb65eb789a40e1#%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A33-%E7%8B%AC%E8%87%AA%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-rocket-)

```
# systemctl status firewalld.service
# firewall-cmd --state
running
# firewall-cmd --list-all-zones
```

#historyコマンド実行時のフォーマットをわかりやすくする
コマンドの実行日時を明確にする
何かあった時に時系列がすぐに理解できるのは重要

```
# /etc/profile.d/history.sh
HISTTIMEFORMAT='%F %T '
```

#時刻同期の設定を適切にする
何かあった時に時間がずれていると調査時に困る。
そもそも時間がずれている事に気づかない事もありうる。

###うるう秒対策

```
# vi /etc/chrony.conf
leapsecmode slew
maxslewrate 1000
smoothtime 400 0.001 leaponly
```

###動作確認をする
```
# systemctl status chronyd
# chronyc sources
# chronyc tracking
```

#不要サービスを無効化する
デフォルトのままだと、色々といらないものが動いているので、
一覧を表示して、不要と判断できるものは停止していく

```
systemctl list-unit-files --type=service
systemctl stop 不要なサービス
systemctl disable 不要なサービス
```

#fail2banを設定する
[CentOS7での fail2banのインストールと設定方法（with firewalld）](https://qiita.com/wmx/items/2ebedd5a16d27c07089b)

#ウイルス対策ソフトをインストールする
ソフトの動作要件を正しく理解する必要がある。
サーバーのリソースを使用することと、
アンチウイルスソフトが悪さをする事もあるので
コストやメリット＆デメリットを総合的に判断した上でインストールする
[Linuxサーバにアンチウィルス対策ソフトウェアをインストール](https://usado.jp/spdsk/2019/05/07/post-5161/)

#ファイル改ざん検知ツールをインストールする
ソフトの動作要件を正しく理解する必要がある。
サーバーのリソースを使用することと、
アンチウイルスソフトが悪さをする事もあるので
コストやメリット＆デメリットを総合的に判断した上でインストールする
[ファイル改ざん検知ツール AIDE](https://qiita.com/bezeklik/items/d144d77a3e54cd35c06b)

#自サーバー内からポートの空き状況を確認する

```
# yum -y install lsof
# lsof
# ss -nltu
```

#外部から対象サーバーのポートの空き状況を確認する

```
# yum -y install nmap
# nmap 対象サーバーのIPアドレス
```

#ログ監視
各種ログをメールで送る等して、毎日ログを確認する

```
yum -y install logwatch
```

#ホストの侵入検知（chkrootkit/rkhunter/maldetect）
ソフトの動作要件を正しく理解する必要がある。
サーバーのリソースを使用することと、
アンチウイルスソフトが悪さをする事もあるので
コストやメリット＆デメリットを総合的に判断した上でインストールする
[Linuxセキュリテイ対策　ホストの侵入検知（chkrootkit/rkhunter/maldetect）](https://qiita.com/Brutus/items/001ca6285acc9ebc57e1)