こんにちは、VOYAGE GROUP システム本部の @s-tajima です。
今回はVOYAGE GROUPが提供する多くのサービスをより安全に運用するために、LDAPサーバの監査体制を強化したお話です。
VOYAGE GROUPでは、 サーバにログインするためのシェルアカウントや、各種管理画面のアカウント等、様々なアカウントの統合管理のためのシステムとしてLDAPサーバ(OpenLDAPのslapd)を利用しています。つまり、このLDAPサーバに対して誤った操作や悪意のある操作が行われることで、それぞれのシステムに意図しない認証や認可が行われてしまうことになります。
そんな状況を予防, 検知するために、
- LDAPサーバに対する参照・更新の記録をすべてログに残す。(自動)
- ログの中身を確認し、必要なものがあれば通知する。(自動)
- 通知の内容を元に詳しい調査を行い、問題がないか確認する。(人力)
という環境を用意しました。 こんな環境を実現するために、どんなシステムを構築したかというのを紹介します。
Step1: LDAPサーバ(slapd)による監査ログの出力
slapdで扱えるログは大まかに分けて3種類あります。
それぞれのログの良い点/悪い点は以下の通りです。
- Log (通常rsyslog経由で出力される)
- [+] 1行毎に意味を持つログファイルベースで出力可能
- [-] LDAPのデータベースに対する参照・更新の内容が完全に出力されるわけではない
- AccessLog (Overlay)
- [+] LDAPのデータベースに対する参照・更新の内容が完全に出力される
- [-] この情報自体がLDAPのデータベースに記録されるので取り扱いが面倒
- AuditLog (Overlay)
- [+] 指定したファイルに出力可能
- [-] ただしフォーマットがldifなので複数行をまとめて扱ってはじめて意味のある情報になる
- [-] 出力されるのは更新の情報のみで、参照については出力されない
今回の要件だと、参照・更新の情報を完全に出力しておきたかっため、AccessLog を使うのが妥当そうだと判断しました。
Step2: sltdによる監査ログのS3への転送
VOYAGE GROUPで管理しているLDAPサーバは1台だけではないので、ログを出力したそのサーバ上で中身のチェックをするのではなく、どこか別の場所に転送し一箇所にまとめておくとその後の調査がしやすいです。しかし、ここで課題になるのがログの収集方法です。前述の通り、slapdのAccessLogはそれ自体がLDAPのデータベースに書き込まれていきます。
最初に思いついたのは、AccessLog用のLDAPデータベースをレプリケーション等で集約するためのLDAPサーバを用意することですが、実際にはすべてのLDAPサーバと直接通信することのできるサーバを用意するのが難しかったために断念しました。
そこで今回は、後述するAmazon Athenaによるクエリを利用することを目論んですべてのLDAPサーバのログをAmazon S3に転送することにしました。
これを実現するための方法はいくつか考えられますが今回は、
- AccessLog用のLDAPデータベースを
LDIF backend
にする。 - 出力されたLDIFファイルを読み込みJSONに変換(Athenaによるクエリのため)し、S3に転送する機能を持ったソフトウェアを作成する。
という方法をとりました。 このソフトウェアは、sltdという名前でVOYAGE GROUPのGitHubリポジトリにて公開しているので興味があればご覧ください。
Step3: AWS Athenaによる操作内容の通知
sltdによってS3に転送したログをAthenaにて集計し、特定の条件に合致するものがあればSlackに通知する仕組みを作りました。セキュリティの都合上、通知の条件については割愛しますが、以下のように通知されます。
最後に
最近では、Zero Trust Networks にかかれているような、LDAPサーバのような中央集権型のアカウント管理システムを使わずにすむように、オンデマンドでテンポラリなアカウントを発行するシステムの設計が便利そうではありますが、長い歴史を持つサービスを数多く運用しているとなかなかそのような環境に切り替えていくのは難しかったりします。
今回の監査体制の強化によって、今までよりも安心してLDAPサーバを運用できるようになりました。また、今まで限られたメンバーでのみ行っていたLDAPのデータの更新を、もう少し広い範囲に広げていくこともやりやすくなりました。
監査体制の構築はサービスを運用する上でとても大切な話だと思いますが、セキュリティ上の問題などもあるためか実運用に関する話をインターネットで見かけることがあまりないような気がしています。このような話に興味がある方は、是非 #ajiting でお話しましょう!