はじめに
FLINTERS 3年目データエンジニアの三浦です。
この記事はFLINTERSブログ祭りの記事です。弊チームでは #今期の振り返りを統一テーマに設定しました。
この記事では今期社内のセキュリティレベル向上のために行ったConfluenceに残された認証情報の整理を通して得たCQLの知識について共有できればと思います。若干テーマとの関連が無理矢理なのはご容赦ください(笑)
背景
弊社ではドキュメント作成・共有ツールとしてConfluenceを使用しています。
今回課題となったのはまだセキュリティの意識が低い時代に作成されたドキュメントの中に、さまざまなサービスへの認証情報がベタ書きされているものがあるということです。
もちろんアクセス制限はかけているのですが、何があるかわからないのでそのような危ないものは一刻も早く削除しておきたいところ。 過去に作成されたドキュメントは膨大なので手作業では難しく、そこでCQLを使用することにしました。
CQLとは
CQL (Confluence Query Language) は Confluence 用に開発されたクエリ言語で、マクロの一部や Confluence 検索で使用できます。Confluence 検索と CQL を活用するマクロにより、検索クエリを構築するためのフィールドを追加し、検索結果を絞り込むのに必要なだけフィルターを増やせます
ConfluenceにはCQLという独自の言語があり、CQLを使うことで、ページ、ブログ投稿、コメント、添付ファイルなど、さまざまなコンテンツ要素を簡単にフィルタリングし、特定の条件に一致するデータを高速に見つけることができます。
Confluenceには検索のAPIも用意されているので、これらを組み合わせることで効率的に認証情報が書かれているページを見つけようということです。
実装
ドキュメントを参考に、search APIを叩いて結果を取得します。
CQLはドキュメントを参考に、今回はtypeとtext、そして対象spaceを指定しました。
var baseURL = 'https://atlassian.net/wiki'; // ConfluenceのURLを適宜設定 var searchQuery = encodeURIComponent('type=page and (text ~ "password" or text ~ "認証情報") and space="space name"'); // 検索条件を var username = 'example@example.com'; // Confluenceのユーザー名を設定 var token = '???'; // 取得したパーソナルアクセストークンを設定 var options = { 'method': 'get', "muteHttpExceptions" : true, 'headers': { 'Authorization': 'Basic ' + Utilities.base64Encode(username + ':' + token), 'Accept': 'application/json' } }; var response = UrlFetchApp.fetch(`${baseURL}/rest/api/search?cql=${searchQuery}&limit=5&excerpt=indexed_unescaped`, options); var json = JSON.parse(response);
これだけで検索は可能なのですが、search APIには1度に取得できる件数に上限があり、全てを取得するにはページングの処理が必要です。
ページングの処理を行うには、_links.nextのURLを使って次のページを次々取得していきます。
while (true) { if (json._links.next !== undefined) { var nextLink = json._links.next; var nextResponse = UrlFetchApp.fetch(`${baseURL}${nextLink}`, options); var json = JSON.parse(nextResponse); }
プロジェクトを通じての成果とまとめ
CQLを活用した結果、認証情報が含まれる約40件のページを特定し、無事にすべてを削除することができました。
これにより、セキュリティリスクが大幅に低減され、会社全体の情報セキュリティが向上しました。このプロジェクトを通じて、CQLの有用性を改めて実感し、今後も様々なプロジェクトで活用していきたいと思います。
他にもAPIを使うと定期的に議事録のベースを作成してくれたり、何かと便利機能がたくさんあることがわかったので活用していきたいですね。