Active DirectoryからLightsquidにユーザー名を自動的にインポートする

企業内でSquidプロキシサーバーを管理する多くの人々は、従業員によるインターネット使用の統計を定期的に管理者に示す必要があります。 統計を提供するために、Squidに加えて、SARG、Lightsquidなどのログアナライザーがインストールされています。 同時に、組織には多くの場合ディレクトリサービス(Active Directoryを想定)があり、すべての従業員がアカウントを持ち、プロキシサーバーでの承認はアカウントに基づいています。 当然、管理者にとっては、レポートを見るとき、名前と姓で従業員を識別する方が便利です。 驚くべきことに、多くのフォーラムやITポータルでは、ログアナライザーの構成ファイルに名前を入力して、この問題を手動で解決することが提案されています。 このソリューションには欠点があります-従業員を登録/解雇する場合、構成を編集する必要があります。

この記事では、ActiveDirectoryから従業員の姓と名のデータを自動的に取得し、Lightsquidレポートに挿入する方法について説明します。



目的:インターネットにアクセスした各Active Directoryユーザーの名前と姓を示すLightsquidを介したレポートの出力を提供する(今後、ADでこのフィールドは「表示名」に対応し、LDAPクエリでは変数displayNameが参照する) )




ソースデータ:






解決策:


最初に、名前データをActiveDirectoryからLightsquidに転送するメカニズムについて説明し、次にその実装を示します。



名前に関する情報は、ドメインユーザーのプロパティの[表示名]フィールドに表示されます。 ADから情報を取得するには、LDAPクエリを介して情報を操作する必要があります。 同時に、承認されたドメインユーザーに代わってのみ対話できます。 LightsquidはPerlで記述されているため、これらのクエリを完了するにはNet :: LDAPモジュールが必要です。 また、ADからレポートに情報を自動出力するには、squidからのログインの単純な受信をLDAPクエリに置き換える必要があります。



最初に、LDAPクエリを実行するために使用される、最も制限された権限を持つADのアカウントを作成する必要があります。 これを行うには、Active Directoryユーザーとコンピュータースナップインを起動し、新しいユーザーを作成します。 目的を表す名前を付けてください。 たとえば、LightSquidAgent。 次に、新しいGPOを作成し、そのプロパティ(または既存のオブジェクトのプロパティ)を入力します。 次に、コンピューターの構成-> Windowsの構成->セキュリティの設定->ローカルポリシー->ユーザー権利の割り当て。 [ネットワークからコンピューターへのアクセスを拒否する]オプションで、LightSquidAgentと入力します。 [ローカルログインの拒否]オプションで、LightSquidAgentも入力します。



次に、PerlでNet :: LDAPモジュールをインストールします。 bashまたは同様のコマンドシェルを実行して実行する
 perl -MCPAN -e shell
      
      



。 cpanインタープリターに入った後、実行します
 install Net::LDAP
      
      



。 次に、インストーラーは自動構成を実行するかどうかを尋ねます。 Enterキーを押すだけです。 最後に表示されるはずです
 LDAP module was installed successfully
      
      







その後、レポートを生成するコードを編集できます。 LightSquidがインストールされているフォルダーに移動し、ip2nameフォルダーに移動して、ip2name.squidauthファイルを開きます。 次のようになります。

 #contributor: esl #specialy for squid with turned on user authentication #simple version sub StartIp2Name() { } sub Ip2Name($$$) { # $Lhost,$user,$Ltimestamp my $Lhost=shift; my $user =shift; $user =URLDecode($user); #decode user name return $user if ($user ne "-"); return $Lhost; } sub StopIp2Name() { } #warning !!! 1;
      
      





UPD:ユーザー名のキャッシュに関するLightsquidの作成者の推奨事項が考慮されています。


UPD2:権限のないユーザーを認識するときにスクリプトがフリーズするバグを修正


UPD3:ドメインコントローラーが利用できない場合、およびLightSquidAgentアカウントでログインできない場合にスクリプトがフリーズするバグを修正


ファイルヘッダーで、必要な関数が含まれる名前空間を登録し、3つの新しい変数を宣言する必要があります。

 #contributor: esl #specialy for squid with turned on user authentication #simple version use strict; use warnings; use Net::LDAP; use Encode; my $ldap; my $message; my %hDisplayName;
      
      







空のStartIp2Name定義を、ドメインコントローラーへの接続が確立されている私たちのものに置き換えます


 sub StartIp2Name() { my $server = "ldap://ourserver.domain.com"; $ldap = Net::LDAP->new( $server ); return if(!defined $ldap); $message = $ldap->bind(q(domain\LightSquidAgent), password => "passwd"); }
      
      







Ip2Name関数の定義を置き換えます。この関数のバージョンは、従業員の名前によってドメインコントローラーから取得されます。


条件ステートメントのブランチでは、繰り返されるログインのスキップが提供され、各ユーザーに対して1つのLDAP要求のみが行われます。


代わりに

 sub Ip2Name($$$) { # $Lhost,$user,$Ltimestamp my $Lhost=shift; my $user =shift; $user =URLDecode($user); #decode user name return $user if ($user ne "-"); return $Lhost; }
      
      





挿入する

 sub Ip2Name($$$) { # $Lhost,$user,$Ltimestamp my $Lhost=shift; my $user =shift; $user =URLDecode($user); #decode user name return $Lhost if ($user eq "-"); return $user if (!defined $ldap); return $user if ($message->code()); if (!defined $hDisplayName{$user}) { my $result = $ldap->search( base => "dc=domain,dc=com", filter => "(&(objectCategory=person)(objectClass=user)(sAMAccountName=" . $user . "))", ); my $first_entry = $result->entry(0); if (!defined $first_entry) { return $Lhost; } my $pure_displayName = $first_entry->get_value("displayName"); $pure_displayName =~ s/ /_/g; Encode::from_to($pure_displayName, 'utf-8', 'windows-1251'); $hDisplayName{$user}=$pure_displayName; } return $hDisplayName{$user}; }
      
      







最後:StopIp2Name関数で、ドメインコントローラーから切断します。


 sub StopIp2Name() { return if (!defined $ldap); $message = $ldap->unbind; }
      
      







客観的な批判を歓迎します



All Articles