ejabberd:外部認証プログラム

LDAP認証を使用しejabberdノート 、ejabberdサーバーをセットアップしてLDAPに接続するための主要なポイントについて説明しました。 残念ながら、標準のLDAP認証モジュールの機能では不十分でした。 ただし、ejabberdでは、この目的で独自のプログラムを含む外部プログラムを使用できます。





だから。 前回この構成に落ち着いた時:

 {auth_method、ldap}、%認証方法-LDAP
 {ldap_servers、["ldap.company.local"]}、%LDAPサーバーアドレス
 {ldap_port、389}、%そのポート
 {ldap_base、 "ou = people、dc = company、dc = local"}%ユーザーアカウントのベースDN


これで、LDAPアカウントを持つすべてのユーザーがサーバーを使用できるようになりました。 これは私にはあまり適していません。この機会を従業員にだけ与えたいです。 すべての従業員は従業員グループに属しています(cn =従業員、ou =グループ、dc =会社、dc =ローカル)。



一見、 ldap_filterパラメーターで目標を達成できます。 しかし、これは初めてです。 私が見つけたすべての例(およびそれらの多くを検討しました)では、 アカウントオブジェクトのmemberOf属性が使用されているか、意味が似ています。 残念ながら(OpenLDAPに基づく)構成では、そのような属性はありませんでした。



LDAPフィルターガイドとejabberd機能を何時間も勉強した後、私は自分の認証プログラムを試すことにしました。



外部プログラムの接続



これは非常に簡単に行われます:

 {auth_method、external}。
 {extauth_program、 "/ path / to / program / program_name"}。


ここで、 /path/to/program/program_name



、認証プログラムへのパスです。



プログラム装置



すべてが非常に簡単です。 プログラムは無限ループで実行され、標準入力から要求を読み取り、結果を標準出力に書き込みます。



要求と応答の前には、要求/応答の長さを含む2バイトがあります。



要求は次のとおりです。



応答として、プログラムは要求が正常に完了した場合は1を送信し、失敗した場合は0を送信する必要があります。



参照資料







簡単な例



以下は、外部PHP認証プログラムの簡単な例です。 PHPが使用されたのは、LDAPサーバーを操作するための既製のライブラリが既にあったためです。



 #!/ usr / local / bin / php
 <?php
 'ldap3w.php'が必要です。
 $ ldap = new LDAPConnection();

 while(true){
         $ length = @fgets(STDIN、3);
         $ length = @unpack( 'n'、$ length);
         $ length = $ length [1];
         if($ length> 0){
                 $ result = false;
                 $ account = false;

                 $ data = @fgets(STDIN、$ length + 1);
                 $ data = explode( ':'、$ data);

                スイッチ($データ[0]){
                        ケース「auth」:
                                 $ account = $ ldap-> getAccount($ data [1]、$ data [3]);
                        休憩;
                        ケース「isuser」:
                                 $ account = $ ldap-> getAccount($ data [1]);
                        休憩;
                 }

                 if($アカウント){
                         $グループ= $アカウント->メンバーシップ();
                         $ result = in_array( 'employees'、$ groups);
                 }

                 $ result = @pack( 'nn'、2、intval($ result));
                 @fputs(STDOUT、$結果);
         }
 }





All Articles