こんにちは、サイオステクノロジーの藤原です。
OpenLDAPで監査ログを取得するためのオーバーレイAudit Logging overlay(auditlog)を使ったので、使用方法と注意点を残しておきます。
Audit Logging overlay(auditlog)とは
auditlogは、指定したバックエンドデータベースに加えられた変更記録を保存するオーバーレイです。
DITに対する操作(エントリの追加、変更、削除)のログをLDIF形式で保存できます。
ログは操作者やタイムスタンプなどが追加されて、指定したディレクトリに出力されます。
前提条件
- CentOS 7.8
- OpenLDAP 2.4.44
- 監査対象DIT: fig.1参照
- rootdn: “cn=Manager,dc=example,dc=com”
- バックエンドデータベース: hdb
fig.1 監査対象DIT
auditlogの設定
auditlogを使用するために設定ツリーを変更します。
以下の3手順で設定します。
- ディレクトリの作成
- auditlogのロード
- auditlogの適用
ディレクトリの作成
監査ログを格納するディレクトリを作成します。
ディレクトリは/var/log直下に作成します。
$sudo mkdir -p /var/log/openldap/
slapdがディレクトリにログを作成できるように所有者を変更します。
$sudo chown -R ldap:ldap /var/log/openldap/
auditlogのロード
オーバーレイのロードを管理するエントリ”cn=module{0},cn=config”が存在しているか確認します。
$sudo ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=module{0},cn=config
検索結果
- 存在する -> A.エントリ”cn=module{0},cn=config”の変更へ
- 存在しない -> B.エントリ”cn=module,cn=config”の作成へ
A.エントリ”cn=module{0},cn=config”の変更
エントリにolcModuleLoad属性を追加します。
$sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: auditlog.la modifying entry "cn=module{0},cn=config"
B.エントリ”cn=module,cn=config”の作成
$sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// dn: cn=module,cn=config cn: module objectClass: olcModuleList olcModulePath: /usr/lib64/openldap olcModuleLoad: auditlog.la adding new entry "cn=module,cn=config"
auditlogの適用
バックデータベースのエントリの下にオーバーレイのエントリを追加します。
olcAuditLogFileには、
ログを格納するディレクトリのパス(/var/log/openldap)+ ファイル名(auditlog.ldif)
を指定します。
olcAuditLogFileで指定したldifファイルにログが書き込まれます。
$sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// dn: olcOverlay=auditlog,olcDatabase={2}hdb,cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcAuditLogConfig olcOverlay: auditlog olcAuditlogFile: /var/log/openldap/auditlog.ldif adding new entry "olcOverlay=auditlog,olcDatabase={2}hdb,cn=config"
※このオーバーレイのエントリは削除することができないので注意しましょう。後述しますが、これを削除するためには設定ツリーごと削除、再構築する必要があります。
私の環境で削除を試みましたが、
ldap_delete: Server is unwilling to perform (53)
というエラーが出て削除できませんでした。(泣)
調べてみたところ、OpenLDAPの公式ページにこのようなスレッドを見つけました。
cn=config does not support delete operations. This will probably be supported in OpenLDAP 2.5.
cn=configは削除操作をサポートしていません。これはOpenLDAP 2.5でサポートされるでしょう。
と書いてあります。
次のバージョンに期待ですね。
ということでオーバーレイを消したいときはどうすれば良いのでしょうか。
先ほどのスレッドにこのような記述がありました。
slapcat -n0, edit LDIF, remove old configDB and reimport.
オーバーレイを消すためには設定ツリーのバックアップをとり、バックアップしたldifを編集、既存の設定ツリーを削除、再構築する必要があります。
詳しく説明すると長くなりそうなので、別の記事として書こうと思います。
以上でauditlogの設定は終わりです。
次はDITを操作して、どのようなログが出力されるかを見てみようと思います。
ログを見てみよう
fig.1で示したDITに対してエントリを追加、変更、削除し、ログを確認します。
ログのテンプレート
DITを操作(追加、変更、削除)した際、ログは以下のようなテンプレートに従って出力されます。
# 操作 記録時のUNIX時刻 操作されたデータベースのdn バインドdn 接続元ip connection番号 操作されたエントリのdn 操作 //・・・ // 詳細 //・・・ # end 操作 記録時のUNIX時刻
エントリの追加
操作:
$sudo ldapadd -W -D cn=Manager,dc=example,dc=com dn: cn=user004,ou=users,dc=example,dc=com objectClass: person cn: user004 sn: shiro userPassword: Password004 adding new entry "cn=user004,ou=users,dc=example,dc=com"
ログ:
$cat /var/log/openldap/auditlog.ldif # add 1597707613 dc=example,dc=com cn=Manager,dc=example,dc=com IP=[::1]:37988 conn=1001 dn: cn=user004,ou=users,dc=example,dc=com changetype: add objectClass: person cn: user004 sn: shiro userPassword:: UGFzc3dvcmQwMDQ= structuralObjectClass: person entryUUID: bd7e6bf2-752e-103a-923c-25b41e619199 creatorsName: cn=Manager,dc=example,dc=com createTimestamp: 20200817234013Z entryCSN: 20200817234013.234238Z#000000#000#000000 modifiersName: cn=Manager,dc=example,dc=com modifyTimestamp: 20200817234013Z # end add 1597707613
エントリの追加時は、エントリの追加操作の詳細に加えて、作成者や変更者、変更時間などの属性が付与され記録されます。
エントリの変更
操作:
$sudo ldapmodify -W -D cn=Manager,dc=example,dc=com dn: cn=user003,ou=users,dc=example,dc=com changetype: modify replace: sn sn: goro modifying entry "cn=user003,ou=users,dc=example,dc=com"
ログ:
$cat /var/log/openldap/auditlog.ldif # modify 1597708852 dc=example,dc=com cn=Manager,dc=example,dc=com IP=[::1]:39962 conn=1025 dn: cn=user003,ou=users,dc=example,dc=com changetype: modify replace: sn sn: goro - replace: entryCSN entryCSN: 20200818000052.377920Z#000000#000#000000 - replace: modifiersName modifiersName: cn=Manager,dc=example,dc=com - replace: modifyTimestamp modifyTimestamp: 20200818000052Z - # end modify 1597708852
エントリの変更時は、エントリの変更操作の詳細に加えて、変更者や変更時間の属性も更新され記録されます。
エントリの削除
操作:
$sudo ldapdelete -W -D cn=Manager,dc=example,dc=com cn=user001,ou=users,dc=example,dc=com
ログ:
$cat /var/log/openldap/auditlog.ldif # delete 1597709207 dc=example,dc=com cn=Manager,dc=example,dc=com IP=[::1]:40868 conn=1026 dn: cn=user001,ou=users,dc=example,dc=com changetype: delete # end delete 1597709207
エントリの削除時は、エントリの削除操作の詳細のみが記録されます。
まとめ
今回はOpenLDAPでAudit Logging overlay(auditlog)を使用する方法と注意点をまとめました。
auditlogでは、DITに加えられた変更(エントリの追加、変更、削除)について詳細なログを取得することができました。
しかしながら、auditlogでは、DITに検索をかける場合のログなどを残すことができません。
rsyslogを使って検索などのログを取得する方法についてはこちらから。