Vaddyとseleniumを使ってRedmineの脆弱性チェックを自動化


坂本です。普段、土日休みはお出かけして過ごしていたのですが、自粛期間ではU-NEXTとNetflixを契約して海外ドラマをみて過ごしていました。楽しみにしていたイベントがすべて中止になってしまって残念ですが、新しい趣味ができたことはとても嬉しく思っています!

さて、今回はRedmineの脆弱性チェックを自動化したお話をしようと思います。

ファーエンドテクノロジーではオープンソースのプロジェクト管理ソフトウェアRedmineの開発への協力の一つとして、定期的な脆弱性検査を独自に行っています。Redmineをお使いの方々とRedmineのクラウド版で弊社が提供するサービス「My Redmine」のお客様により安心してRedmineをお使いいただくためです。また、脆弱性検査以外にも不具合検出の取り組みを行っています。

Vaddyを使った脆弱性チェックの流れ

Redmineの脆弱性チェックには、Web脆弱性診断ツール「VAddy」を利用し、以下の流れで行なっています。

1. クロールの作成

まず、クロールを作成します。Vaddyツールに検査用サーバーを登録しておき、Vaddyを介してRedmineにアクセスすることでクロールが溜まっていく仕組みです。具体的には、「開始URL」にアクセスしたあとRedmineの画面でチケット作成や編集などの操作を行い、最後に「終了URL」にアクセスします。開始URLアクセス後から終了URLにアクセスするまでの操作がクロールとなります。

2. クロールのScan

クロールを作成したら、次はScanの作業です。Vaddy画面で実行するクロールを選択し、Scan実行ボタンをクリックすることでVaddyが脆弱性チェックを行なってくれます。Scan実行時間はクロールの大きさによって変わり、クロールの量が多ければ多いほど脆弱性チェックの時間はかかります。

自動化

この脆弱性チェックを行なった当初は「クロール作成」から「Scan実行」まで手作業で行ない、私の普段の業務は脆弱性チェックにかなり時間をかけていたのが課題でした。少しでも手間を省くため、脆弱性チェックを自動化することにしました。

1. クロールの作成を自動化

まず、「クロール作成」のRedmineの操作部分を自動化しようと考えました。ここで使ったツールがseleniumです。seleniumで書いたrubyのコードを実行することで自動でブラウザが立ち上がり、Redmineの操作を自動で行なってくれます。また、人間が手作業で行うのはどうしても「漏れ」が生じてしまいがちですが、コード化することでその漏れを防ぎ、かつ高速にクロールを作成することができました。

これについては以前セミナーで発表した資料がありますので、こちらをご覧になってください。
ブラウザが自動で動くseleniumを使ってみました 〜Ruby編〜

2. Labelの自動付与

作成したクロールにはLabelをつけることができます。私はRedmineの機能ごとにクロールを分けているため、「〇〇crawler(月/日)」とし日付も入れています。Labelの自動付与はVaddyの機能としてあり、開始URLに「label」というパラメータを付与することで簡単に実現できました。

公式ブログ( VAddyのクロール時にラベルを付与できるようになりました - クラウド型脆弱性診断ツール VAddyブログ )でわかりやすく紹介されています。

3. Scanを自動化

Scanは実行したいクロールのLabelを指定して実行します。Scanの自動化については、Vaddy側でgo-vaddyコマンド( cronで検査を定期実行 – VAddyサポートサイト )が配布されているため、それを活用しました。

export VADDY_TOKEN=""
export VADDY_USER=""
export VADDY_PROJECT_ID=""

# labelを検索するためのキーワードを実行順にarrayに入れる
array=("Api" "Authentication" "My_account" "Administration" "Administration_group" "Administration_settings" ...省略)

# arrayの要素が含まれているラベルを検索し、最新のクロールデータ で実行
for crawl in ${array[@]}
do
        echo "Scan ${crawl} crawl data"
        export VADDY_CRAWL=$crawl
        ./go-vaddy/bin/vaddy-linux-64bit
done

実行するとコンソールに出力されます。実行するCrawlIDも表示されるので、どのクロールが実行されているのか目で見て確認できます。

シェルスクリプト化

Vaddyのクロール作成やScanの他にも、データベース初期化や最新版Redmineに更新するなど行う必要があります。そのため、1つのシェルスクリプトをVaddy検査用サーバーに置いてそれを実行することで脆弱性チェックを自動化することができました。

今後行うこと

実は自動化にはまだ足りない作業がいくつかあります。

エラー時の通知機能

seleniumを実行すると、たまにエラーになる時があります。Redmineはどんどん新しい機能が追加されているため、seleniumのコードを定期的にメンテナンスする必要があります。そのため、seleniumのコードとRedmineが一致せず指定した時に「この要素はありません」と言われることがごく稀にあるため、エラーが出た時には通知する機能を追加する必要があります。

シェルスクリプト実行の自動化

シェルスクリプトを実行すれば脆弱性チェックは自動化されますが、そのシェルスクリプトを実行するのはまだ自動化できていません。これについてはcronなどを設定して、完全に脆弱性チェックを自動化したいと思います。

自動化してみて

今回、業務でRedmineの脆弱性チェックの自動化を行ってみて、seleniumという新しいツールのことを学べたり、rubyのコードを書いてみたりと幅広く学ぶことができたと思います。自動化しておくことで作業の手間がなくなり、とても楽になったなと感じています。自動化できるものについてはどんどん自動化していき、業務効率化して行こうと思いました。


My Redmine

こちらの記事もオススメです!
OSC 2019 島根でのプレゼン発表へ向けての準備と工夫したところ
OSC 2019 島根でプレゼン。スライド作成で工夫したところを紹介します。
オンライン相談会をMy Redmineと予約システム(RESERVA)で管理しています
オンライン相談会の開催に関するタスクをMy Redmineで管理している例を紹介しています。
1Passwordファミリーで家族のパスワード使い回しを防止
1Passwordのファミリープランに変更して、家族も使えるようにしました。
Redmine未リリースの新機能についての記事を連載中です
Redmine公式サイトから最新機能を3つピックアップし、日本語で解説する連載記事を毎月書いています。
AWS SAM(Step Functions + Lambda)を利用して複数のウェブサイトのレスポンスチェックをした話
サーバレスで色々なバッチ処理が簡単に実装できます。
ファーエンドテクノロジーからのお知らせ(2020/10/16更新)
My Redmineで二要素認証(ワンタイムパスワード)が使えるようになります
二要素認証が、My Redmineにおいて利用できるようになります。対応予定時期は2020年12月以降です。
RubyWorld Conference 2020 (12/17 オンライン開催) にGoldスポンサーとして協賛
12月17日(木)にオンラインで開催される「RubyWorld Conference 2020」にGoldスポンサーとして協賛しています。
働き方改革の取り組みに伴う営業時間変更のお知らせ
2020年10月1日より営業時間を8時30分〜17時00分に変更いたします。
webサポート窓口の対応時間変更のお知らせ(10月1日から)
2020年10月1日から「webサポート窓口」の対応時間を8時30分~17時00分に変更します。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け