僕の考えたさいきょうのインスタンヌ

今1からセキュリティを考慮したEC2環境作るならどうするか？というのを考えて色々妄想したもの。
とりあえずオープンソースで考えてみたが、多すぎて業務用なら市販のパッケージとか使ったほうが良いのかもしれない。
それSecurityOnionで出k

※2022/01/08 脆弱性スキャン関係を修正
※2022/01/17 Wazuhログ集約関係を修正・追記, 詳細ページへのリンクを追加

## 前提
* Ubuntu 20.04LTS on AWS EC2
* Apache 2.4 + mod_php
* クライアント証明書使用可能 ←特殊条件

## 結論
* OSレベルアクセス制御: AppArmor
* WAF: ModSecurity
* アンチウイルス: ClamAV
* HIDS / EDR: Wazuh
* 脆弱性スキャン: Wazuh SCA
* SIEM: Wazuh + Elastic Stack
* NIDS: AWS Network Firewall + Amazon GuardDuty


### OSレベルアクセス制御: AppArmor
プログラムごとにファイルアクセス等の制限(強制アクセス制御 MAC)を行うLinuxモジュールで、ubuntuには最初から入っている。
万が一ApacheやPHPで任意コード実行されても変な場所へアクセスするのを外的に防いでくれるので、多層防御のために重要。
apache向けの設定は自分で書く必要あるが、結構簡単にできる。
ログは標準でwazuhが拾ってくれる。

別記事に分けた → [AppArmorインストール、設定、プロファイル作成等](https://qiita.com/hoogee/items/7f96f2d533b5cf9576cd)



### WAF: ModSecurity
WAF(Web Application Firewall)は色々あるがクライアント証明書が使える選択肢は少なく、とりあえずApacheモジュールとして動作するModSecurityを選択。
aptで入れて、OWASP ruleを導入するだけ。
ただしシグネチャ型で不安もあり、今回は条件から無理だが可能ならScutumなんかも使うのが良さそう。
WAFに掛かった結果はWazuhに集約する。/var/log/apache2/error.logに出るログを標準で拾ってくれる。modsecurity.conf-recommendedを使えばerror.logに出してくれるので特に設定を弄る必要はない。
ただしcomplain modeではlevel 0のアラートしかでないので、検知したい場合はwazuh manager側でレベル設定を変える必要がある。→ [ドキュメント](https://documentation.wazuh.com/current/learning-wazuh/replace-stock-rule.html)

```
#インストール
sudo apt install libapache2-mod-security2
sudo a2enmod security2
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf #設定ファイル設置
sudo systemctl restart apache2

#OWASP rule導入
#最新版は都度確認 https://coreruleset.org/installation/
mkdir /tmp/owasp; cd /tmp/owasp
wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.tar.gz
tar xvf v3.3.2.tar.gz
cp coreruleset-3.3.2/crs-setup.conf.example coreruleset-3.3.2/crs-setup.conf #設定ファイル設置
sudo mkdir /etc/apache2/modsecurity-crs/
sudo mv coreruleset-3.3.2/ /etc/apache2/modsecurity-crs/
sudo vi /etc/apache2/mods-enabled/security2.conf
#  /usr/shareからの読み込みをコメントアウトして、以下を追加(バージョン番号要確認)
#        IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-3.3.2/crs-setup.conf
#        IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-3.3.2/rules/*.conf
sudo apache2ctl -t #異常無いか確認
sudo systemctl restart apache2

```

### アンチウイルス: ClamAV
これは・・・いるのか・・・？と思いながらも諸事情から一応。
とりあえず有名なClamAVを選択。デーモンとして常駐実行、都度読み込んで実行の二種類の方法がある。
いずれでもメモリを1.5-2GB位使うので注意が必要。
デーモンだと常にメモリを大量に食うため、リアルタイムスキャンしないならアクセスの少ない時間に都度実行のほうが良いと思う。(リアルタイム性は後述のWazuhのファイル改ざん検知やrootkit scan等で担保)
ウイルス検出はWazuhで集約する。

```
#都度実行でのインストール (デーモン無し。自動定義アップデータは含まれる)
sudo apt install clamav
sudo systemctl start clamav-freshclam.service #アップデータ起動
mkdir -p /home/hogehoge/clamav/infected #隔離フォルダ作成

#cronで以下のような感じの処理を定期実行
/usr/bin/clamscan \
    --exclude-dir=^/proc/ \  #  procやsysなども無差別に見に行こうとするので除外指定が必要
    --exclude-dir=^/sys/ \
    --exclude-dir=^/dev/ \
    --exclude-dir=^/home/hogehoge/clamav/infected \  #隔離フォルダ
    --infected \ #感染してるファイルのみ表示(サマリは出る)
    --move=/home/hogehoge/clamav/infected \  #感染ファイルは隔離フォルダに移動する指示
    --recursive / | logger -i -t clamd  # ← clamdっぽくsyslogにログ記録
```

※スクリプト修正。詳細は[clamscanの結果をwazuhで取り込む方法](https://qiita.com/hoogee/items/26077efaf963567a76a2)を参照


### HIDS/EDR: Wazuh
ファイル改ざん監視だけならAIDE、またもっとリッチなOSSEC、有名なtripwireなどあるが、超多機能&
活動がアクティブ&ドキュメントが充実している[Wazuh](https://wazuh.com)を選択した。
IDS/EDRとして多数の機能がある上、更にSIEMまで統合しており、Apache, ClamAVやAppArmorのログ等も含めて管理できる。更に公式から[多数のルールが提供されている](https://documentation.wazuh.com/current/user-manual/ruleset/getting-started.html)。
出来ることが多い反面、何をするか設定する必要もあるが、マニュアルがよく整備されており読めばなんとかなりそう。

* ファイル改ざん監視(FIM)
* 侵入検知(rootkitスキャン、システムコール監視など)
* 脆弱性スキャン 設定監査(Security Configuration Assessment)
* 検知後のアクション実行
* agentをグループ分け出来るので複数サービスを纏めて扱える(それぞれでHost建てる必要なし)
* ログデータ収集(SIEM)
* 他(把握しきれてない

Wazuhホスト(Manager+Elastic Stack)と監視対象のサーバーに入れるAgentの構成になるが、ありがたいことにホストは[AMIが公式から提供されており](https://documentation.wazuh.com/current/amazon-machine-images/amazon-machine-images.html)、何も考えずに作れる。
また公式で[Wazuh Cloud](https://wazuh.com/cloud/)としてManagerをSaaSで提供してくれているので、面倒になったらこれに切り替えて楽できそうなのも良い。開発にも金入るので実運用するならさっさと切り替えたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508490/768933ae-af0a-51b6-dc63-887fd6465654.png)

Wazuhインストール、設定は巨大なので別エントリに書く


参考
[Wazuhを利用した 大統一サーバ監査基盤](https://speakerdeck.com/pyama86/wazuhwoli-yong-sita-da-tong-sabajian-cha-ji-pan)

### 脆弱性スキャン: Wazuh SCA
定義データに基づいてシステムの脆弱性や問題のある設定をスキャンしてくれる。(外部からではなくシステム内部でのスキャン)
WazuhのSCA(Security Configuration Assessment)というモジュールでやってもらえる。
CIS Benchmarksの定義ファイルも同梱してくれているが、現時点ではubuntu 20用は準備中とのことで、共通的に使えるdebian系の定義ファイルを使うことになる。それでもデフォルトからだと大量に指摘出されて泣く。

詳細はWazuhと一緒に別エントリに書く。

※当初OpenSCAPと書いていたが、[ここ](https://github.com/wazuh/wazuh/issues/3787)や[ここ](https://github.com/wazuh/wazuh/issues/8531)を見るとSCAに移行を進めているようなので修正

### SIEM: Wazuh + Elastic Stack
Agentから集めたログをElastic Stack(Elasticsearch + Kibana + Wazuhプラギン)で綺麗に表示してくれる。

難しいこと考えずに小綺麗な画面で出してくれるのは本当に素晴らしい。
他のソフト用のルールをout of the boxで使えるよう多数同梱してくれるのも助かる。
詳細はWazuhと一緒に別エントリに


### NIDS: AWS Network Firewall + Amazon GuardDuty
インスタンスそのものではないけどこれも必要なので検討。
NIDS(Network based Intrusion Detection System)
とてしはSnortやSuriticaなどが有名のようだけど、AWS Network Firewallがsuriticaルールをそのまま使えるらしい。
NIDS用にインスタンス建てて管理するのは面倒なのでこいつに任せる。
また通常のNIDSと違うAWS特有の面はGuardDutyに見てもらう。
更にWazuhにもAWS用ルールがある模様。