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/08/05更新)
「テレワーク7割」支援 プロジェクト管理「My Redmine」を無料提供 10月末まで
政府による「テレワーク7割」要請への対応を支援。2020年8月中に「My Redmine」の無料お試しにお申し込みのお客様を対象に、10月末まで無料提供します。
IPアドレス制限をセルフサービス化・無料化 新機能「IPアドレスフィルター」8月4日提供開始
My Redmine Gen.2(ジェネレーション2)をご利用のお客様を対象に、IPアドレスによるアクセス制限をお客様ご自身で設定できる新機能「IPアドレスフィルター」の提供を開始します。
新機能「チケットパネル」 プロジェクトの状況を視覚的に捉え、ドラッグ&ドロップで直感的に操作
新機能「チケットパネル」がMy Redmineで使えるようになりました。カード形式でステータスごとにチケットを表示し、プロジェクトの進捗状況が一目で分かります。
「はじめてのRedmine使いこなし術」電子書籍を出版
Redmineの便利な機能を紹介する電子書籍で出版しました。書籍は無料でダウンロードできます。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け