MastodonでLDAP認証を利用する

マストドンでは通常ローカルに認証情報を持つローカル認証を利用します。

joinmastodon.org

しかし特殊な状況では外部の認証サービスを利用して認証を行うことができます。 Mastodon v3.1.4ではLDAP, PAM, CAS, SAMLに対応しています。

LDAP認証は実装された当初はバグっていたのですがいつの間にか改修されて使えるようになっていました。 LDAP認証を使う人はほとんどいないと思いますが、設定は解説がないので解説してみます。

LDAP認証設定

設定値は.env.production.sampleにあります。

# LDAP authentication (optional)
# LDAP_ENABLED=true
# LDAP_HOST=localhost
# LDAP_PORT=389
# LDAP_METHOD=simple_tls
# LDAP_BASE=
# LDAP_BIND_DN=
# LDAP_PASSWORD=
# LDAP_UID=cn
# LDAP_MAIL=mail
# LDAP_SEARCH_FILTER=(|(%{uid}=%{email})(%{mail}=%{email}))
# LDAP_UID_CONVERSION_ENABLED=true
# LDAP_UID_CONVERSION_SEARCH=., -
# LDAP_UID_CONVERSION_REPLACE=_

LDAP_METHOD

simple_tlsstart_tls を選択できます。

実は LDAP_TLS_NO_VERIFYというパラメーターが存在しており、 LDAP_TLS_NO_VERIFY=trueとすることでSSL/TLSで暗号化されないLDAPを利用することができます。

LDAP_BASE

ベース DNを記載します。

LDAP_BIND_DN

バインド DNを記載します。今のところ匿名バインド(anonymous bind)は設定できません。

LDAP_UID

MastodonのユーザーIDと対応させるLDAP属性を指定します。 一般的にはcnでよいと思いますが、sAMAccountNameも使えるかもしれません。

LDAP_MAIL

メールアドレスが入っているLDAP属性を指定します。

LDAP_SEARCH_FILTER

LDAPの中からユーザーを探すときの検索フィルタを指定できます。 検索フィルタ自体の文法は RFC 4515を読んで頂くしかありません。

デフォルトでは

LDAP_SEARCH_FILTER=(|(%{uid}=%{email})(%{mail}=%{email}))

となっていますが、%{uid}LDAP_UIDで、%{mail}LDAP_MAILでそれぞれ置き換えられます。 %{email}はログイン時にユーザーの入力したメールアドレスになります。

デフォルトの設定例ではLDAP認証時に

(|(cn=%{hoge@example.com})(email=hoge@example.com))

がフィルタとして利用されることになります。

LDAP_UID_CONVERSION_ENABLED

マストドンのユーザー名(username)には利用できる文字の制限があります。

使える文字は以下のようになっています。

/[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i

そうするとLDAPには存在するが、マストドンでは使えない文字が登場することがあります。 その場合にいい感じに変換してくれる機能がLDAP_UID_CONVERSIONになります。

LDAP_UID_CONVERSION_SEARCHには、LDAPには存在するがマストドンでは使えない文字を指定します。 LDAP_UID_CONVERSION_REPLACEにはそれらの文字が登場したときにマストドン上でのユーザー名に置き換える文字を指定します。

デフォルトの例だとLDAP上のユーザー名の中に含まれる., -の3文字を_で置き換えるようになります。

例えばLDAP上にkazuki-hというユーザーがいた場合には、マストドン上でのユーザー名はkazuki_hになります。 マストドンのユーザー名で使える文字種は増えているので使う機会はあまりないかもしれませんね。

LDAP認証を有効にするとどうなる?

新規登録が必要なくなる

マストドンに登録していない状態でログインすると、LDAP認証が成功すればその時点でユーザーアカウントが作成されます。 新規登録を「誰も許可しない」設定にしている場合でもLDAP認証によるアカウント作成は行うことができます。 このとき認証メールは送信されません。

運用途中でLDAP認証を有効にした場合は?

途中でLDAP認証を有効にした場合は、ローカル認証とLDAP認証が両方有効になった状態になります。 まず最初にLDAP認証でパスワードの確認が行われ、LDAPが通らなかった場合はローカルでの認証が行われます。 既存のユーザーはLDAPのパスワードも、ローカルのパスワードも両方使うことができます。 またLDAPには存在しないユーザーも残しておくことができますし、新規に作成することもできます。