使用しているプロダクトのセキュリティ情報をGASで収集してみた

#なぜかアドベントカレンダー2019に向かって記事を書いている…
弊社はクラウド上でプロダクトを提供していて開発を内製化している。
だからこの弊社のアドベントカレンダー2019も硬軟取り混ぜてプログラミングに関する様々なネタが投稿されている…が私は現役でプログラミングをしていないしプログラミングに関与していない。
だが枠がある以上は書く（キッパリ）
では何を書くか？
このままでは与太話で終わってしまいそうになるが…
そうだ「セキュリティ」の観点なら少しは書けるかもしれない。
#セキュリティって何？
あちらこちらで「セキュリティ」って使われるけど恐らく使う人も聞く人もそれぞれ自分の思う「セキュリティ」の範囲が違うと思う。
IT界隈に限ってもエンドポイントセキュリティを「セキュリティ」としている人もいればオフィスの入退室や「クリーンデスク」などの環境を含めたものを「セキュリティ」と言っている方もいるだろうと思う。
自社の「セキュリティ」の話をする前にそれぞれの認識を合わせておいた方が良いと思う。
ここでは**プロダクトの脆弱性情報**を取り扱うことを主題にしています。
#ところで（無理やり）Qiitaの記事の導入部
弊社のサービスはクラウドで提供しているのでGCPやAWSなどの利用に関するセキュリティの情報はそれぞれのプロバイダから得られるが（ [Amazon Inspector](https://aws.amazon.com/jp/inspector/ "AWS Inspector")や[Vuls](https://vuls.biz/ "Vuls")って便利ですね！）、マネージドサービスを使用していない場合や個々人が使用しているプロダクト（みなさんエディタはお好きなものを使ってますよね？）などの情報は個別に集めるしかない。
メールマガジンを購読したり各プロダクトが提供する情報を個別に見るしかないのだが…面倒だ、実に面倒だ。
#そこで（無理やり）Qiitaの記事の本題へ
実際にいくつかのプロダクトの情報を集めてみた
役に立ちそうなのはそれぞれのプロダクトのWebサイトやメールマガジンの他には
- [IPA メールニュース配信](https://www.ipa.go.jp/security/ "IPA")
- [JPCERT メーリングリスト](https://www.jpcert.or.jp/announce.html "JPCER") 
- [JVN](http://jvn.jp/ "JVN")
などが広く情報を提供してくれるので便利だろう
もっとインフラの管理などをされている方など専門的に情報が知りたい場合には
- [CWE](https://cwe.mitre.org/index.html "CWE")
- [CVSS](https://www.ipa.go.jp/security/vuln/CVSS.html "CVSS")
も参考にしてみてください（釈迦に説法）
・
・
・
が、メールでしか情報を提供していないプロダクトやメール配信をしていないプロダクトなど情報提供にはルールがないことを改めて確認したに過ぎなかった（やれやれ…）
なので割り切ってメールの情報とWebサイトの情報をGAS（Google Apps Script）で一元的に取り扱ってチャットへ投稿することにしてみた。
#（ごく簡単な）方針
本当に簡単なルールだけ決めてスタートしてみた。
- 1日に一回、決まったタイミングで処理を実行する
- 投稿すべき記事があった場合だけチャットに投稿をする
- 投稿はタイトルと要約を転載し、詳細は記事中のURLから確認をする
たったこれだけｗ
##メール配信記事の処理
兎にも角にも**着信したメールを処理すれば良いだけ**なのであまり深くは考えない（確信！）
幸いにもメールシステムがGmailなのでGASとの連携は何の問題もありません。
面倒な手続きも最初にGASと連携するために「Gmailの承認」を得るだけ！
気にしたことは着信しているメールが処理済みか否かの判断だけ、これについてはGmailの恩恵をうけた。
**プロダクトごとに受信メールにラベルを添付して、
チャットへの投稿が終わったら処理済みのラベルに貼り替える**、ただこれだけです。

```GAS:GASでGmailのラベルを付与
GmailApp.getUserLabelByName(strPostlabel).addToThreads(myThreads);
```

```GAS:GASでGmailのラベルを削除
GmailApp.getUserLabelByName(strPreLabel).removeFromThreads(myThreads);
```
##Webサイト更新情報の処理
多くのWebサイトの情報は過去の情報も併せて記載されているので既にチャットへ投稿した記事を改めて投稿しないようにIndexが必要…これもGoogleスプレッドシートにIndexをすれば問題は解決です。
※多くは投稿日がIndexに使えますね
##実際の投稿
メールもWebサイトもHTMLで情報が提供されることが多いのでタグで必要な情報を絞り込んで情報の単位ごとに分割、再構成します。

見た目のイメージは、例えばAWSの情報提供は[こんな感じ](https://alas.aws.amazon.com/alas2.html "AWS2") そのSourceは↓です。
![スクリーンショット 2019-11-27 15.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531961/7bb09ce6-21b4-2a05-698a-f9bb725aa9c1.png)
こんな感じで投稿します
![スクリーンショット 2019-11-28 13.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531961/4847b904-026b-a0b4-8312-5348ddf5d280.png)
まずはテーブルを、リストを処理して行単位に分割して…例えばこんな風に…

```GAS:GAS
var aryBody = strContent.replace(/\n|\r|\t/gm,'').replace(/<link/gm,'<').match(/<li.*?li>/gm);
```
行単位に分割できれば要らないタグを削除して整形するだけです、こんな風に。

```GAS:GAS
var strTitle = aryBodyTable[i].toString().replace(/<span>.*?<.span>|<.*?>|.para;/gm,'');
```
本文が長いものは折りたたんでいます。
IPAの情報だとこんな感じでチャットに投稿されます
![スクリーンショット 2019-11-27 15.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531961/fe0e693e-1c51-bae0-71a8-95f676c9a76c.png)
担当者がタイトルをみて自分の興味のあるものだけ目を通してくれればそれで良いと思います。
#運用してみて
個人で使っているものを除いて考えても結局使われているプロダクトが多過ぎて一元管理が難しいこと…Wordpress１つとってもそのプラグインの情報まではなかなか追いきれない。
せめて一元管理が出来ていればと思うのだがその一方でサービス提供の迅速化や文書メンテナンスコストを考えるとやむなしかとも思う。
**つまるところIPAの情報やJPCERTの情報も織り交ぜてチャットで広く情報を共有してそれぞれの担当者が気づいてくれるのが望ましいのか**とも思った。
…担当者個人のリテラシーや力量にも依るけどね。

あと、GASの自動処理は”時間帯”が選べるのだけどあくまでも”時間帯”が選べるだけで自動実行する時間を指定できるわけではありません。
08時〜09時（AM）で指定してみたところ多少のブレは見られますがほぼ毎日08:45に処理が実行されています。
時間は指定できないけど一定のルールで処理が実行されるようです。
※日付ベースのタイマーを選択すると1時間枠が24示されますのでその中から選択します。
[GAS ダッシュボード](https://script.google.com/home "ダッシュボード") の各スクリプトの右端に隠れている”トリガー”で自動実行の条件を設定できます、念の為。