【OTRS】エージェント認証をActive Directory認証に対応させてみた(ユーザー自動追加あり)
はじめに
こんにちは植木和樹@上越妙高オフィスです。ひさびさにOTRSネタです。 クラスメソッドではAWSからの通知メールや、各種監視ツールからの通知メールの管理にOTRSを利用しています。
これまでOTRSへのユーザー(エージェント)登録は個別DB(MySQL)で行ってきましたが、ID統合して一元管理を進めるためにActive Directory認証に対応させてみました。
設定自体は簡単だったのですが、いろいろコツがあったので備忘録として書き留めておきたいと思います。
環境
- OTRS 5.0.11 (近日中にOTRS6へバージョンアップ予定)
- Active Directory = Windows Server 2012
ADによる認証設定
ADによる認証は公式ドキュメントに記載があるため、環境に合わせて設定すればOKです。
OTRS からアクティブディレクトリを参照して作業者ログインを行う - OtterHub - OTRS Community Wiki
OTRSをインストールしたディレクトリ(RPMでインストールした場合は /opt/otrs)以下にあるファイルKernel/Config.pm のLoad関数内にページに記載された設定を追加します。
追加する設定は、大きく次の2点になります。
$Self->{'AuthModule'} = 'Kernel::System::Auth::LDAP';
ユーザー認証時にLDAP(AD)サーバーを利用するための設定です。
ただしユーザー情報が空の場合、この設定だけだとログインできません。OTRS側にユーザー情報がないためです。
事前にOTRS側にADと同じユーザー名(sAMAccountName)で作成しておくか、次のAuthSyncModule設定を使って、ADからユーザーを自動追加する必要があります。
$Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
LDAP(AD)のユーザー情報を元に、OTRSにユーザーを作成するための設定です。
ユーザーの認証が成功した際、OTRS側にユーザー情報がない場合にはここの設定に従ってADからユーザー情報(姓、名、メールアドレス)を取得してくれます。
設定のコツ
AD認証をするだけであれば上記だけで良いのですが、実際の運用だといくつかの課題がありました。
OTRSローカル認証(root@localhost)ができなくなる
公式ページの解説だと認証は すべて ADで行われることになります。するとOTRSの初期セットアップ時に作成されたroot@localhostユーザーでもログインできなくなってしまいます。
管理者ユーザーはローカル認証しつつ、エージェントはAD認証させたいため一手間加えてみました。 まずはAD(LDAP)で認証を行い(AuthModule1)、もしユーザーがなければローカル(DB)認証を行うようになります(AuthModule2)。
Kernel/Config.pm
$Self->{'AuthModule2'} = 'Kernel::System::Auth::DB'; $Self->{'AuthModule1'} = 'Kernel::System::Auth::LDAP';
AuthModuleの設定は、末尾に1〜10までの数字を入れた設定も読み込んでくれます。認証時はこの数字の順序で行われます。Kernel/System/Auth.pmの64行目を抜粋するとこんな感じです。
Kernel/System/Auth.pm
64 for my $Count ( '', 1 .. 10 ) { 65 66 my $GenericModule = $ConfigObject->Get("AuthModule$Count");
なおLDAP(AuthModule1)用の設定は、各設定キーの末尾に対応した番号("1")を付与する必要があります。
Kernel/Config.pm
$Self->{'AuthModule::LDAP::Host1'} = ''servername.companyname.local'; $Self->{'AuthModule::LDAP::BaseDN1'} = 'dc=companyname,dc=local'; $Self->{'AuthModule::LDAP::UID1'} = 'sAMAccountName';
サーバー設定などを2度設定しなければならない(DRY)
AuthModuleによるLDAP認証設定と、AuthSyncModuleによるユーザー同期設定は同じ設定になるはずです。サンプルだとLDAPサーバー名など同じ設定を2度繰り返して記載しています。
実害はないのですが、ちょっと気持ち悪いので1箇所にまとめてしまいましょう。値そのものでなく、前段で設定された変数名を参照するにします。
Kernel/Config.pm
$Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP'; $Self->{'AuthSyncModule::LDAP::Host'} = $Self->{'AuthModule::LDAP::Host1'}; $Self->{'AuthSyncModule::LDAP::BaseDN'} = $Self->{'AuthModule::LDAP::BaseDN1'}; $Self->{'AuthSyncModule::LDAP::UID'} = $Self->{'AuthModule::LDAP::UID1'}; $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = $Self->{'AuthModule::LDAP::SearchUserDN1'}; $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = $Self->{'AuthModule::LDAP::SearchUserPw1'};
エラーメッセージと対処方法
Login failed! Your user name or password was entered incorrectly.
AD(LDAP)による認証に失敗しています。httpdサーバーのエラーログ(Apacheだと /var/log/httpd/error_log)にメッセージが出力されているので原因調査のヒントになるかもしれません。
- 接続先ホストが間違っている
- 検索ユーザー(AuthModule::LDAP::SearchUserDN)が誤っている
- ユーザーが指定のグループに所属していない(AuthModule::LDAP::GroupDN)
Panic, user authenticated but no user data can be found in OTRS DB!! Perhaps the user is invalid.
AD(LDAP)による認証は成功したが、OTRS側のユーザー情報に誤りがある場合に出力されます。
- ユーザーの同期設定(AuthSyncModule)に誤りがあり、正しくユーザー作成できていない
- OTRS側でユーザーのステータスを「無効」にしている
残課題
このままだとユーザー名とパスワードが平文でネットワークを流れます。 OTRSのLDAP認証モジュールは内部で Net::LDAP モジュールを使っているため、AuthModule::LDAP::Params に scheme => 'ldaps' を指定すれば LDAP over SSLで通信できるはずです。
AD側のLDAPS対応とあわせて確認が必要ですね。
まとめ
本日はOTRSのActive Directory認証対応についてご紹介しました。
OTRSを利用させたい担当者には、ADユーザーをAuthModule::LDAP::GroupDNで指定したグループに所属させればOKです。 またOTRSログインを不可としたい場合は、ADユーザーを無効にするか、ADグループから外すか、またはOTRS側でユーザーを無効にすればOKです。
なおOTRSのユーザー情報はADでは管理できません。ユーザーに管理者権限を与えたり、言語を変更したりする作業は、これまで通りOTRS側で行ってください。