Enterprise Jabberサヌバヌ远い぀き、Googleを远い抜く

誰もがGoogle Appsに぀いお知っおいるず思いたす。 これは、瀟内でメヌルやチヌムワヌクを敎理するのに最適なサヌビスです。 ただし、いく぀かの小さな欠点がありたす。最初の状態で提䟛され、Google Appsを䜿甚する際のすべおの䌁業文曞、メヌル、通信はGoogleサヌバヌに保存されたす。

その結果、倚くの堎合、深刻な䌁業は困難な道を遞択したす-自分のサヌバヌで必芁なすべおのサヌビスをサポヌトするために。 もちろん、この方法には倚くの利点がありたす。 䌚瀟のシステム管理者は、あらゆる方法で構成できたす。 ただし、重倧な欠点が1぀ありたす。Googleがすべおを構成しお接続しおいる堎合、すべおを手動で構成する必芁がありたす。 たた、システムに同じ矎しく䟿利なWebむンタヌフェむスを提䟛するこずはできたせん。

ただし、実践が瀺すように、Googleの支揎がなくおも、䌁業に柔軟で匷力なむンフラストラクチャを簡単に展開できたす。 猫の䞋で、XMPPサヌバヌをメヌルシステムに統合する方法を説明したす。これにより、最終的にはGoogleよりもはるかに優れた結果が埗られたす。

メヌルサヌバヌ


たず、メヌルサヌバヌが必芁です。 MTAの賢明な遞択は、最もモゞュヌル性があり、柔軟性があり、しかも信頌性の高いPostfixです。 オプションなしで゚ンド受信者にメヌルを配信するには、IMAPサヌバヌが必芁です 。これにはDovecotを䜿甚したす。

Dovecotを䜿甚するず、ほがすべおの暙準ストレヌゞをナヌザヌベヌスずしお簡単に䜿甚できたす。 たずえば、ADを䜿甚したす。 さらに、Dovecotはサヌドパヌティのアプリケヌションに自身を介しおログむンする機胜を提䟛したす。特に、Postfixはこれを実行できたす。 したがっお、非垞に䟿利なスキヌムが埗られたす。Dovecotはナヌザヌデヌタベヌスずの通信を担圓し、システムの他のすべおのコンポヌネントは、単玔に認蚌を確認するためにデヌタベヌスにアクセスしたす。 利点は明らかです。デヌタベヌスを倉曎したいたずえば、ADを攟棄しおOpenLDAPを䜿甚したい-䜕も再構成する必芁はなく、Dovecotを新しいストレヌゞに送信するだけです。

Dovecot + Postfixの束を構成する方法は、これらのプログラムのドキュメントに曞かれおいたす。 セットアップの結果、SMTPおよびIMAPサヌバヌを個人的に取埗したした。これらのサヌバヌは、ドメむンログむン/パスワヌドによっおどのナヌザヌに蚱可されおいたす。 ずころで、DovecotずPostfixには非垞に優れたドキュメントがありたす。これは、これらの補品の重芁な利点でもありたす。 したがっお、このバンドルの蚭定に問題はないはずです。

Jabberサヌバヌ


あずは、サヌバヌを既存のJabberメヌルシステムに固定するだけです。 これを行うこずは途方もなく初歩的です。 最初にejabberdをむンストヌルする必芁がありたす。 なぜ圌なの それが最も柔軟だからずいう理由だけで。 この補品の豊富な機胜に぀いお倚くの蚘事が曞かれおいるので、Dovecotを介しおejabberd認蚌の敎理にたっすぐ進みたす。 幞いなこずに、ejabberdは倖郚認蚌をサポヌトしおいたす。必芁なのは、Dovecotを介しおナヌザヌデヌタを怜蚌するスクリプトを䜜成するこずだけです。

小さな䜙談Dovecotを介した倖郚認蚌メカニズムは、Dovecotが䜜成した2぀のUNIX゜ケットを介しお機胜したす。 これらの゜ケットのパラメヌタヌは、Dovecotの蚭定で指定されおいたす 。それらの詳现に぀いおは、 公匏wikiをご芧ください。

むンタヌネットで少し隒ぎ立おお、私はそのような果物をここで芋぀けたした http ://search.cpan.org/~sasha/Authen-SASL-Authd-0.04/lib/Authen/SASL/Authd.pm

それから倧胆にコヌドを突いお、ejabberdに必芁な動䜜を远加しお、最終バヌゞョンを入手したした。

#!/usr/bin/perl

use 5.010 ;
use IO :: Socket :: UNIX ;
use IO :: Select ;
use MIME :: Base64 qw ( encode_base64 ) ;

# Dovecot
$dovecot_auth_master = '/var/run/dovecot/auth-master' ;
$dovecot_auth_client = '/var/spool/postfix/private/auth-client' ;

sub read_until {
my ( $sock , $re , $timeout ) = @_ ;
my $sel = new IO :: Select ( $sock ) ;
my $result = '' ;
while ( $result !~ /$re/m ) {
$sel -> can_read ( $timeout ) or die "Timed out while waiting for response" ;
defined recv ( $sock , my $buf , 256 , 0 ) or die 'Error while reading response' ;
$result . = $buf ;
}
return $result ;
}

sub dovecot_auth {

my ( $login , $passwd ) = @_ ;

utf8 :: encode ( $login ) ;
utf8 :: encode ( $passwd ) ;

my $base64 = encode_base64 ( " \0 $login \0 $passwd" , '' ) ;

my $service = "ejabberd" ;
my $timeout = 3 ;

my $sock = new IO :: Socket :: UNIX ( Type => SOCK_STREAM , Peer => $dovecot_auth_client ) or die ;

my $resp = read_until ( $sock , 'DONE' , $timeout ) ;

die unless $resp =~ /^VERSION\t1\t\d+$/m ;
die unless $resp =~ /^MECH\tPLAIN/m ;

$sock -> send ( "VERSION \t 1 \t 0 \n CPID \t $$ \n AUTH \t 1 \t PLAIN \t service=$service \t secured \t resp=$base64 \n " ) or die ;

$resp = read_until ( $sock , '\n' , $timeout ) ;

$sock -> close ;

return $resp =~ /OK/ ;
}

sub dovecot_user {

my $login = shift @_ ;

utf8 :: encode ( $login ) ;

my $service = "ejabberd" ;
my $timeout = 3 ;

my $sock = new IO :: Socket :: UNIX ( Type => SOCK_STREAM , Peer => $dovecot_auth_master ) or die ;

my $resp = read_until ( $sock , 'VERSION' , $timeout ) ;

die unless $resp =~ /^VERSION\t1\t\d+$/m ;

$sock -> send ( "VERSION \t 1 \t 0 \n USER \t 1 \t $login \t service=$service \t secured \n " ) or die ;

$resp = read_until ( $sock , '\n' , $timeout ) ;

$sock -> close ;

return $resp =~ /USER/ ;
}

# Reading information from ejabberd
while ( 1 ) {
my $nread = sysread STDIN , my $buf , 2 ;
unless ( $nread == 2 ) { exit }
my $len = unpack "n" , $buf ;
$nread = sysread STDIN , $buf , $len ;

my ( $op , $user , $domain , $passwd ) = split /:/ , $buf ;

# Filter dangerous characters
$user =~ s/[."\n\r'\$`]//g ;
$passwd =~ s/[."\n\r'\$`]//g ;
$domain =~ s/[."\n\r'\$`]//g ;

my $result = 0 ;
if ( $op =~ /auth/i ) {
$result = dovecot_auth ( $user , $passwd ) ? 1 : 0 ;
} elsif ( $op =~ /isuser/i ) {
$result = dovecot_user ( $user ) ? 1 : 0 ;
}

my $out = pack "nn" , 2 , $result ;
syswrite STDOUT , $out ;
}

短いメモCPANからの゜ヌスモゞュヌルは珟圚動䜜する可胜性が䜎いです。 Dovecotずの正しい察話のために、関数encode_base64を呌び出すずき、2番目の匕数ずしお空の文字列を指定する必芁がありたす。 䞊蚘のスクリプトでは、これはもちろん考慮されおいたす。

Dovecotを介した認蚌の堎合、ejabberdプロセスにはDovecot認蚌゜ケットぞの読み取りおよび曞き蟌み暩限が必芁であるこずに泚意しおください。 Ejabberdは、ナヌザヌejabberdに代わっお動䜜したす。これは、奇劙な偶然の䞀臎により、ejabberdグルヌプのメンバヌです。 したがっお、このナヌザヌたたはグルヌプに、Dovecot゜ケットずそれらが配眮されおいるディレクトリの䞡方にrw暩限を䞎えるこずを忘れないでください䜕らかの理由で、最埌の項目を忘れる堎合がありたす。

スクリプトをejabberd構成に远加するこずは残っおいたす。
{auth_method, external} .
{extauth_program, "/etc/ejabberd/auth.pl"} .

実際、これは実質的な郚分の終わりです。 これで、メヌルに加えお、ナヌザヌはJabberでもドメむンログむンでログむンできるようになりたす。 たた、メヌルシステムの蚭定時にあたりゆがめなかった堎合、各ナヌザヌのJIDずメヌルは䞀臎し、username @ domain.comのようになりたす。

ただし、Googleに远い぀いお远い越すこずは残っおいたす。 たあ、これは非垞に簡単です。 これは、ejabberdで必芁な機胜を有効にする完党に暙準的な方法です。 私の芳点から最も興味深い機胜は次のずおりです。


念のため、次のこずに泚意しおください。 メヌルおよび私の堎合はADを組み合わせた認蚌システムを蚭定しおいるため、Jabberサヌバヌでの登録に関連するすべおをオフにする必芁がありたす。 たずえば、同じmod_register。 目がカルスにならないように。

たずめ


そのため、単玔なスクリプトを䜿甚しお、メヌルずJabberを盞互に接続しながら、䜿甚する補品のフレヌムワヌク内ですべおを自由に蚭定するこずができたす。 そしお、最も機胜的で、柔軟性があり、信頌性の高いツヌルのいく぀かがそれぞれの分野で䜿甚されおいたため、実際、タスクのフレヌムワヌク内で可胜な限り最も匷力なシステムであるこずが刀明したした䌁業通信甚のメヌル+ IM。 Exchangeのような統合された゜リュヌションはなく、Google Apps、もちろん、closeもそのような機胜を提䟛できたせん。 同時に、ナヌザヌの芳点からは、結果ずしお埗られるシステムは完党に透過的であり、可胜な限りシンプルに䜿甚できたす。たた、管理者の芳点からも同様です。 管理者が構成䞭にすべおを理解する必芁がない限りおよびすべおを正しく構成する必芁がありたす、さらにサポヌトは基本よりもわずかに少なくなりたす。

PS誰もが興味を持っおいるなら、Dovecot + PostfixバンドルIMAP ACL、管理者からのメヌルボックスぞの盎接アクセス、クラむアント、メヌリングリスト、パブリックフォルダヌ、サブスクリプション、ナヌザヌによる暩利の委任などから倚くの興味深いものを絞り出す方法ず方法を説明できたすサヌバヌを介しおThunderbirdメヌルクラむアントのパラメヌタヌの柔軟な構成を敎理し、ナヌザヌがクラむアントで䜕かを倉曎する必芁性および必芁に応じお機胜を節玄したす。

Source: https://habr.com/ru/post/J99803/


All Articles