この記事では、ActiveDirectoryから従業員の姓と名のデータを自動的に取得し、Lightsquidレポートに挿入する方法について説明します。
目的:インターネットにアクセスした各Active Directoryユーザーの名前と姓を示すLightsquidを介したレポートの出力を提供する(今後、ADでこのフィールドは「表示名」に対応し、LDAPクエリでは変数displayNameが参照する) )
ソースデータ:
- -ntlm認証でカスタマイズされ、正しく動作するSquid 3.3.8
- -次の行がSquid構成に存在します。
logfile_rotate N debug_options rotate=M
NとMは、Squidが作成できるログファイルの最大数です。
logfile_rotate-access.logの場合、debug_options-cache.logの場合 - -構成され、正しく動作するApache 2.4.7
- -Lightsquid 1.8()が正しく構成され動作する
- -Lightsquid構成には、変数$ lang = "ru"があります。
解決策:
最初に、名前データをActiveDirectoryからLightsquidに転送するメカニズムについて説明し、次にその実装を示します。
名前に関する情報は、ドメインユーザーのプロパティの[表示名]フィールドに表示されます。 ADから情報を取得するには、LDAPクエリを介して情報を操作する必要があります。 同時に、承認されたドメインユーザーに代わってのみ対話できます。 LightsquidはPerlで記述されているため、これらのクエリを完了するにはNet :: LDAPモジュールが必要です。 また、ADからレポートに情報を自動出力するには、squidからのログインの単純な受信をLDAPクエリに置き換える必要があります。
最初に、LDAPクエリを実行するために使用される、最も制限された権限を持つADのアカウントを作成する必要があります。 これを行うには、Active Directoryユーザーとコンピュータースナップインを起動し、新しいユーザーを作成します。 目的を表す名前を付けてください。 たとえば、LightSquidAgent。 次に、新しいGPOを作成し、そのプロパティ(または既存のオブジェクトのプロパティ)を入力します。 次に、コンピューターの構成-> Windowsの構成->セキュリティの設定->ローカルポリシー->ユーザー権利の割り当て。 [ネットワークからコンピューターへのアクセスを拒否する]オプションで、LightSquidAgentと入力します。 [ローカルログインの拒否]オプションで、LightSquidAgentも入力します。
次に、PerlでNet :: LDAPモジュールをインストールします。 bashまたは同様のコマンドシェルを実行して実行する
。 cpanインタープリターに入った後、実行しますperl -MCPAN -e shell
。 次に、インストーラーは自動構成を実行するかどうかを尋ねます。 Enterキーを押すだけです。 最後に表示されるはずですinstall Net::LDAP
。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; }
客観的な批判を歓迎します