LightSquid + Active Directoryバンドル

私はsquidプロキシサーバーでLightSquidログアナライザーを使用しますが、ある日、統計をコンピューターの形式(実際の名前)にしたかったのです。構成したくなかったので、Active Directoryから名前を自動的に取得することにしました。 猫の下で詳細を尋ねます。



Active Directoryを使用していますが、最小限の変更で、スクリプトは通常のLDAPでも動作するはずです。

LightSquidのインストールについては説明しませんが、非常に簡単です。Googleがお手伝いします。 IPをホスト名に変換するために、lightsquid.cfg構成ファイルで次の行で説明されているDNSを使用します。



$ ip2name = "dns";



パーサーはrealname.cfgおよびgroup.cfgファイルを再読み取りし、そこからホストにバインドされているユーザーの実際の名前を取得します。 ファイル形式は次のとおりです。



realname.cfg:

「ホスト名」「本名」



group.cfg:

「ホスト名」「グループ番号」「グループ名」



何が必要ですか?



ADホスト、ホストに関連付けられているユーザーの名前、ユーザーが含まれるグループから取得する必要があります。 次に、すべてを適切な形式で構成ファイルに書き込みます。



これを行う実際のスクリプトは次のとおりです。



#!/usr/local/bin/perl # # ldap2lightsquid (c) Roman Melko <romanmelko@gmail.com> # Description: Synchronize users and computers of LightSquid with LDAP server # Requirements: Should run periodically # Version: 2012030601 # License: BSD # use strict; use Net::LDAP; my $domain = "example.ua"; # Domain is supposed to have 2 levels my @parts = split(/\./,$domain); my $domain0 = $parts[1]; my $domain1 = $parts[0]; my $user = "<username>"; # LDAP user my $password = "<password>"; # LDAP password my $cfgpath = "/usr/local/etc/lightsquid/"; # depends on OS my $realname = "$cfgpath/realname.cfg"; my $group = "$cfgpath/group.cfg"; # departments OU my @units = ( "MGT", "OPR", "PRO", "Sales "); # computers OU my @pcunits = ( "Developer servers", "Servers", "Workstation OPR", "Workstations PRO", "Workstations Sales", "Workstations Telemarketing" ); my @dep = ("no in group"); my $ldap = Net::LDAP->new("$domain") or die "$0"; $ldap->bind("CN=$user,DC=$domain1,DC=$domain0", password=>$password); my $base_path = "OU=<some path>,OU=<some path>,DC=$domain1,DC=$domain0"; # base LDAP path, change to yours my $num = @units; my $pcnum = @pcunits; my $attrs = "sn, givenname, department, samaccountname"; my $filter = "(objectcategory=CN=Person,CN=Schema,CN=Configuration,DC=$domain1,DC=$domain0)"; my $pcattrs = "cn, managedBy"; my $pcfilter = "(objectcategory=CN=Computer,CN=Schema,CN=Configuration,DC=$domain1,DC=$domain0)"; my $count; my $results; my %department_id = (); my %department_name = (); sub get_host_info { for (my $i=0; $i<$count; $i++) { my $entry = $results->entry($i); my $hostname = join(".",lc($entry->get_value('cn')),$domain); my @tmp_array = split(/,/,$entry->get_value('managedBy')); @tmp_array = split(/=/,$tmp_array[0]); my $fullname = $tmp_array[1]; if(!$fullname) { next; } print(REALNAME "$hostname\t$fullname\n"); print(GROUP "$hostname\t$department_id{$fullname}\t$department_name{$fullname}\n"); } } sub get_user_info { for (my $i=0; $i<$count; $i++) { my $entry = $results->entry($i); my $depnum = @dep; my $depid = $depnum; $depid++; foreach $depnum (0 .. @dep) { if ($entry->get_value('department') eq $dep[$depnum]) { $depid = $depnum; } } if ($depid > $depnum) { $dep[$depid] = $entry->get_value('department'); } if (length $depid < 2) { $depid = "0".$depid; } my $name = $entry->get_value('givenname'); my $surname = $entry->get_value('sn'); $name =~ s/^\s+//; $name =~ s/\s+$//; $surname =~ s/^\s+//; $surname =~ s/\s+$//; my $fullname = join(" ",$name,$surname); $department_id{$fullname} = $depid; $department_name{$fullname} = $entry->get_value('department'); } } open (REALNAME, ">", $realname) or die $!; open (GROUP, ">", $group) or die $!; # Getting real names and departments foreach $num (0 .. @units) { my $base = 'OU='.$units[$num].','.$base_path; $results = $ldap->search(base=>$base,filter=>$filter,attrs=>$attrs); $count = $results->count; if ($count > 0) { get_user_info(); } } # Getting pc names and owners, writing results to conf files foreach $pcnum (0 .. @pcunits) { my $base = 'OU='.$pcunits[$pcnum].',OU=Resources,'.$base_path; $results = $ldap->search(base=>$base,filter=>$pcfilter,attrs=>$pcattrs); $count = $results->count; if ($count > 0) { get_host_info(); } } # Closing connection to LDAP and files $ldap->unbind; close (REALNAME); close (GROUP); exit 0
      
      







重要なポイント:

-ADの各ホストでは、管理対象フィールドに入力する必要があるため、ホストはユーザーにバインドされます。

-ADの各ユーザーでは、部門フィールドに入力する必要があります。そのため、ユーザーはグループにアタッチされます(これまでのところ、同じ名前の多くのグループに所属できるユーザーが1人いるため、実際のグループに到達していません)。

-独自のデータを入力する必要のあるユニットとpcunits。

-スクリプトは、たとえばcronで定期的に実行する必要があります。

-ADでスクリプトにアクセスするユーザーはADのルートにいる必要があります。そうでない場合は、許可されません。

-標準のLDAPデータベースであるスモークマナでスクリプトを機能させるために、血圧に違いがあります。



All Articles