composer auditコマンドを使ってComposerパッケージの脆弱性をチェック、CodeBuildを利用して毎日チェック結果を通知する

# 概要説明
Composer2.4リリースにより、新しいauditコマンドが追加され、Composerパッケージの脆弱性チェックがいままでより便利になりました。
そして脆弱性チェックを毎日自動実行し、結果を通知することで脆弱性の対応が素早くできます。
今回はPHPのライブラリ管理ツール「Composer」について、既知のセキュリティ脆弱性をチェックするauditコマンドを紹介し、CodeBuildを利用し毎日チェック結果をslackに通知する方法を共有したいと思います。

# auditコマンド
Packagist.orgのapiに従って、脆弱性をチェックし、リストアップします。
成功した場合は0、そうでない場合は最大255件まで結果として返します。
auditコマンドは3つのオプションがあります。
- --no-dev：require-devパッケージはチェックしない
- --format (-f)：出力の形式を指定できます。デフォルトはtable、「plain」、「json」、「summary」も指定できます。 
- --locked: vendorフォルダの内容に関係なく、ロックファイルからパッケージをチェックします。

>コード参考情報
[Composerドキュメント
](https://getcomposer.org/doc/03-cli.md#audit)

## auditコマンドを実行してみる
環境は以下になります
```
PHP 8.0.8
Composer 2.5.2
laravel-admin 1.8
```
実行結果は以下になります。laravel-adminの脆弱性が1件リストされてます。
```
composer audit

Found 1 security vulnerability advisory affecting 1 package:
+-------------------+----------------------------------------------------------------------------------+
| Package           | encore/laravel-admin                                                             |
| CVE               | CVE-2023-24249                                                                   |
| Title             | laravel-admin has Arbitrary File Upload vulnerability                            |
| URL               | https://github.com/advisories/GHSA-g857-47pm-3r32                                |
| Affected versions | <=1.8.19                                                                         |
| Reported at       | 2023-02-27T21:30:30+00:00                                                        |
+-------------------+----------------------------------------------------------------------------------+
```
脆弱性がない場合の実行結果はこのように
```
No security vulnerability advisories found
```

# CodeBuild
[CodeBuild](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/getting-started.html)の全体的な設定は省きます。buildspecファイル、通知設定を紹介いきたいと思います。
### buildspecファイル
buildspec.ymlファイルを作成し、ルートディレクトリ直下におきます。
これでbuildフェーズ中にcomposer auditコマンドが実行されます。
```buildspec.yml
version: 0.2
phases:
  install:
    runtime-versions:
      php: 8.0
  build:
    commands:
      - composer audit
```
>コード参考情報
[CodeBuildドキュメント
](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/getting-started-cli-create-build-spec.html)

### 毎日ビルドの自動実行
ビルドプロジェクトの画面にて、トリガー作成を進みます。
![スクリーンショット 2023-03-23 211912.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/3c6a22d0-ec69-0b98-1cf4-26ca472ad6df.png)
トリガー作成画面では、トリガーの名称や頻度などを選べます。
頻度は毎時、毎日、毎週、カスタムを設定できます。こちらはカスタムのcron式にしました。毎日14時の実行になります。
![スクリーンショット 2023-03-23 212233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/d8511f0b-6f5f-6926-d3bc-ff25980a2cd0.png)

### slackへの通知設定
ビルドプロジェクトの設定画面から通知ルールの作成ができます。
![スクリーンショット 2023-03-23 220710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/d4211858-5d2b-eac7-9084-5cf72b39a077.png)
通知をトリガーするイベントはビルド成功と失敗時にします。
composer auditコマンドがCodebuildでの実行結果について
   - 脆弱性が検知された時はCodeBuildのbuild stateがFAILEDになります。
   - 脆弱性がない時はCodeBuildのbuild stateがSUCCEEDEDになります。
![スクリーンショット 2023-03-23 220745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/d8558a71-a6d8-257a-fc84-3fc1205c4ab0.png)
最後通知するターゲットについて、[AWS Chatbot(Slack)](https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/slack-setup.html)にします。
Chatbotの設定について省きますが、設定が済んでいれば、ChatbotがサポートしているAWSサービスから簡単にslackへの通知ができます。
![スクリーンショット 2023-03-23 220809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/3c4298de-8ace-16c8-7772-9a8c298067ce.png)
### 結果確認
最後にSlackへの通知結果を確認しましょう。
   - Codebuild失敗の通知がくる時（脆弱性が検知された時）
![スクリーンショット 2023-03-23 222243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/ad422cef-b633-9d4d-ebb5-c1cfd6b8bee3.png)
通知のリンクからビルドログを確認することで、検知された脆弱性の詳細を把握できます。
![スクリーンショット 2023-03-23 223811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/ab4a3116-6bb7-df05-cda4-6580cc4213d6.png)
   - Codebuild成功の通知がくる時（脆弱性がない時）
![スクリーンショット 2023-03-23 224020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916958/2d4c9149-772e-d71a-22f8-61b9db8fb84c.png)

# まとめ
composer auditコマンドの登場により、Composerパッケージの脆弱性チェックが簡単になりました。
Codebuildなど自動ビルドを工夫することで、脆弱性チェックと結果通知を自動化することができます。