木曜日, 11月 18, 2010
木曜日, 9月 09, 2010
RootKit Hunterのインストール(CentOS)
rpmbuildコマンドがなければ、はじめにインストールする。
$ su
Password:
# yum install rpm-build
rkhunterのソースコードをダウンロードし、RPMパッケージを作成する。
# wget http://sourceforge.net/projects/rkhunter/files/rkhunter/1.3.6/rkhunter-1.3.6.tar.gz/download
# rpmbuild -ta rkhunter-1.3.6.tar.gz
作成されたRPMパッケージをインストールする。
# cd /usr/src/redhat/RPMS/noarch
# rpm -ivh rkhunter-1.3.6-1.noarch.rpm
rkhunterの使いかたは
# rkhunter -c
以上
月曜日, 9月 06, 2010
Perlワンライナー:.batファイルでドラッグ&ドロップ
Perlワンライナー:特定のアドレスを含むメールファイル
$ perl -0777 -ne 'split(/\n\n/, $_);print $ARGV . "\n" if ($_[0] =~ /\nFrom: (.+?)\n[A-Z]/ism and $1 =~ /hoge@foo\.bar/ism)' *
vsftpdのFTPES対応設定
Red Hat Enterprise Linux 4 ES で vsftpd が稼働している前提。
RHEL4 up2date -> CentOS4 yum
Red Hat Enterprise Linux 4.8 のRPMパッケージの更新を Red Hat のリポジトリを参照する up2date コマンドから CentOS 4.8 のリポジトリを参照する yum コマンドで行えるよう変更する。
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/centos-release-4-8.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/python-elementtree-1.2.6-5.el4.centos.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/python-sqlite-1.1.7-1.2.1.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/python-urlgrabber-2.9.8-2.noarch.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/sqlite-3.3.6-2.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/yum-metadata-parser-1.0-8.el4.centos.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/yum-2.4.3-4.el4.centos.noarch.rpm
$
$ su
Password:
#
# rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-4
#
# rpm -ivh --force centos-release-4-8.i386.rpm
#
# rpm -ivh python-elementtree-1.2.6-5.el4.centos.i386.rpm \
python-sqlite-1.1.7-1.2.1.i386.rpm \
python-urlgrabber-2.9.8-2.noarch.rpm \
sqlite-3.3.6-2.i386.rpm \
yum-metadata-parser-1.0-8.el4.centos.i386.rpm \
yum-2.4.3-4.el4.centos.noarch.rpm
あとは
# yum check-update
# yum update
でRPMパッケージを更新。
デフォルトの設定で kernel 関連パッケージは上書きしないでインストールされるようになっているが、kernel 関連パッケージを更新対象から除外したい場合は
/etc/yum.conf
の [main] に
exclude=kernel*
を追記する。
以上
Perlモジュールのインストールでperllocal.podへ記録をしない方法
Perlモジュールのインストールは
$ perl Makefile.PL
$ make
$ make test
$ su
Password:
# make install
とするが、perllocal.podファイルにインストール記録をしないようにするには最後の1行を
# make pure_install
とすればよい。
checkinstallでPerlモジュールのRPMパッケージを作成する際、これを忘れるとパッケージのインストールのときにperllocal.podが重複してインストールできなくなる。
以上
Squid でブラウザによるアクセス制限
プロキシサーバ(Squid)にアクセスしてきたブラウザがIEの6か7だったらOKにする場合、
/etc/squid/squid.conf に
acl msie browser -i MSIE.(6|7)\.0
http_access deny !msie
のように記述し、squid のサービスを再起動する。
この際、エラーメッセージをカスタマイズする場合は、/etc/squid/squid.conf に
acl msie browser -i MSIE.(6|7)\.0
deny_info ERR_BROWSER_DENIED msie
http_access deny !msie
のように記述し、エラーメッセージ用ディレクトリに ERR_BROWSER_DENIED というファイルを置く。
Debian の場合、エラーメッセージ用ディレクトリは
/usr/share/squid/errors/English
以上
Tripwire の定時チェック
例えば、/usr/local/sbin に
#!/bin/sh
/usr/sbin/tripwire --check --email-report
/usr/sbin/tripwire --init -P XXXXXXXX
のようなシェルスクリプトを tripwire.sh という名前で作成して実行権限を与え、スーパーユーザの crontab で
0 3 * * * /usr/local/sbin/tripwire.sh > /dev/null 2>&1
のように設定する。
※ XXXXXXXX はTripwireインストール時に設定したローカルパスフレーズ。
Tripwireのインストール
1. ソースからRPMファイル作成
http://sourceforge.net/projects/tripwire/files/
からソースファイルをダウンロード。
展開したディレクトリに移動し
$ ./configure --prefix=/usr --sysconfdir=/etc/tripwire
$ vi install/install.cfg
(途中略)
#TWDB="/${prefix}/lib/tripwire"
TWDB="/var/lib/tripwire"
(途中略)
#TWMAILMETHOD=SENDMAIL
#####################################
# SMTP options
#
# TWSMTPHOST selects the SMTP host to be used to send reports.
# SMTPPORT selects the SMTP port for the SMTP mail program to use.
#####################################
TWMAILMETHOD=SMTP
TWSMTPHOST="localhost"
TWSMTPPORT=25
(途中略)
$ make
$ su
Password:
# checkinstall --fstrans=no -R "make install"
2. インストール
# rpm -ivh tripwire-2.4.1.2-el4.i386.rpm
# mkdir /var/lib/tripwire /var/lib/tripwire/report
3. 設定ファイル(/etc/tripwire/twcfg.txt)変更
# /usr/sbin/twadmin -m F -c tw.cfg -S site.key twcfg.txt
4. ポリシーファイル(/etc/tripwire/twpol.txt)変更
# /usr/sbin/twadmin -m P -S site.key twpol.txt
5. 初期化
# /usr/sbin/tripwire --init
※5でエラーが出たら、3または4からやり直し。
Rhinoで実行スクリプト
Rhinoはじめ、必要なJARファイルにCLASSPATHはとおっている前提。
Javaが /usr/local/java にインストールされているとして、つぎの内容を例えばsample.jsとして保存し、実行権限をつける。
----- (sample.js ここから) -----
#!/usr/local/java/bin/java org.mozilla.javascript.tools.shell.Main
importPackage( java.lang );
importPackage( java.sql );
var db_host = arguments[0];
var db_name = arguments[1];
var driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
var url = "jdbc:sqlserver://" + db_host + ":1433;DatabaseName=" + db_name;
var user = "user";
var passwd = "passwd";
var sql = "SELECT site_id FROM sites WITH (NOLOCK)";
Class.forName( driver );
var conn = DriverManager.getConnection( url, user, passwd );
var stmt = conn.createStatement();
var rs = stmt.executeQuery(sql);
while ( rs.next() ) {
print( rs.getString( "site_id" ) );
}
conn.close();
----- (sample.js ここまで) -----
そして
$ ./sample.js db_host db_name
のように実行する。
上の例は、MSのJDBCドライバを使ってSQL Serverに問い合わせている。
実行時の引数は、「arguments」という配列で取得可能。
起動はJRubyより速いかも。
以上
Postfix 自ホストでunknown userになるメールを他へ転送
同一ドメイン(hoge.com)内の他のマシン(192.168.1.1)のaliasesに
foo: bar@hogehoge.com
という転送設定の記述があるが、自ホストのaliasesにはfooの記述もなく、fooというユーザもない場合、自ホストから
foo@hoge.com
宛てにメールを送るには、main.cf につぎの2行を追加して再起動。
fallback_transport = smtp:[192.168.1.1]
local_recipient_maps =
これは、自ホストでunknown userになるメールを他へ転送する設定。
以上
PHPでSSH
OSは、Red Hat Enterprise Linux ES 4 (32bit) が前提。
http://dag.wieers.com/rpm/packages/libssh2/
から
libssh2-0.17-1.el4.rf.i386.rpm
libssh2-devel-0.17-1.el4.rf.i386.rpm
を取得してインストール。
http://pecl.php.net/package/ssh2
から
ssh2-0.11.0.tgz
を取得し、そのファイルのあるディレクトリで
# pear install ./ssh2-0.11.0.tgz
# chmod 755 /usr/lib/php4/ssh2.so
すでにユーザfooがssh接続できるとして
# mkdir /etc/httpd/.ssh
# cp /home/foo/.ssh/* /etc/httpd/.ssh
# chown -R apache:apache /etc/httpd/.ssh
# chmod 700 /etc/httpd/.ssh
そして、
/etc/php.ini
に
extension=ssh2.so
という行を追加する。
最後にApacheを再起動する。
以上。
suEXEC
Apache の httpd.conf に
SuexecUserGroup foo foo
というディレクティブを追加する。foo は、そのマシンのログインアカウント。
# service httpd restart
cgi-bin ディレクトリの下に bar というディレクトリを作成し、
# chown foo:foo bar
# chmod 701 bar
bar の下に hoge.cgi を置き
# chown foo:foo bar/hoge.cgi
# chmod 700 bar/hoge.cgi
hoge.cgi から呼び出すプログラムは
/usr/local/bin
に置く。
suEXEC下でのnagios
suEXECの設定をしたApacheでは、nagiosのWebツールがうまく動作しない。
そこで、nagiosのCGIのファイルをApacheのCGIのディレクトリ下にコピーし、設定を変更する。
/etc/httpd/conf/httpd.confに
SuexecUserGroup foo foo
という記述があるとして
# mkdir /var/www/cgi-bin/nagios
# cp /usr/lib/nagios/cgi/*.cgi /var/www/cgi-bin/nagios
# chown -R foo:foo /var/www/cgi-bin/nagios
# chmod 701 /var/www/cgi-bin/nagios
# chmod 700 /var/www/cgi-bin/nagios/*.cgi
# vi /etc/httpd/conf.d/nagios.conf
#ScriptAlias /nagios/cgi-bin "/usr/lib/nagios/cgi"
ScriptAlias /nagios/cgi-bin "/var/www/cgi-bin/nagios"
#
(以下省略)
以上
Perl CGI::Application::Plugin::ValidateRMをcpanでインストール
テストでこけてインストールできないので、
http://osdir.com/ml/lang.perl.modules.cgi-appplication/2007-09/msg00040.html
を参考に
~./.cpan/build/CGI-Application-Plugin-ValidateRM-2.2/t/forward.t
をつぎのように変更する。
===(ここから)===
use Test::More tests => 4;
use strict;
$ENV{CGI_APP_RETURN_ONLY} = 1;
{ package MyForward::Test; use base 'CGI::Application'; use
CGI::Application::Plugin::ValidateRM;
sub setup { my $self = shift; $self->start_mode('legacy_process');
$self->run_modes([qw/legacy_process legacy_form/]); }
sub legacy_form { my $self = shift;
Test::More::is($self->get_current_runmode, 'legacy_process', "if
::Forward is not loaded, current_rm is not updated");
# $self->header_type('none'); return "legacy form output HUH"; }
$self->header_type('none');
return ($HTML::FillInForm::VERSION <= 1.06) ? "legacy form output HUH" : "legacy form output"; }
sub legacy_process { my $self = shift; my ($results, $err_page) =
$self->check_rm('legacy_form', { required => 'fail' }); return
$err_page if $err_page; return 'legacy process completed'; }
my $app = MyForward::Test->new(); my $out = $app->run();
Test::More::is($out, 'legacy form output', "form is returned");
}
SKIP: {
package MyForward::TestForward;
use base 'CGI::Application';
use CGI::Application::Plugin::ValidateRM;
eval { require CGI::Application::Plugin::Forward; };
if ($@) {
Test::More::skip "CGI::Application::Plugin::Forward required", 2;
}
sub setup {
my $self = shift;
$self->start_mode('forward_process');
$self->run_modes([qw/forward_process forward_form/]);
}
sub forward_form {
my $self = shift;
Test::More::is($self->get_current_runmode, 'forward_form',
"if ::Forward is loaded, current_rm is updated");
$self->header_type('none');
# return "forward form output HUH";
return ($HTML::FillInForm::VERSION <= 1.06) ? "forward form output HUH" : "forward form output"; }
sub forward_process {
my $self = shift;
my ($results, $err_page) = $self->check_rm('forward_form', { required => 'fail' });
return $err_page if $err_page;
}
my $app = MyForward::TestForward->new();
my $out = $app->run();
Test::More::is($out, 'forward form output', "form is returned");
}
===(ここまで)===
そして
# make test
# make install
PersistentPerl
Perlスクリプトをメモリに常駐させることができる。
http://daemoninc.com/PersistentPerl/
http://perldoc.jp/docs/modules/PersistentPerl-2.21/PersistentPerl.pod
インストールした後、Perlスクリプトの先頭行を
#!/usr/bin/perperl -w
のように変更するだけ。
Perl 更新日付が指定日数より前のファイルを圧縮
OSの文字コードがUTF-8のLinux上のSambaサーバで管理しているディレクトリ下のファイルが対象。
===(compress_files.pl ここから)===
#!/usr/bin/perl -w
use File::Find::Rule;
use Encode qw/ from_to /;
#use warnings;
use strict;
# 処理対象ディレクトリパスと日数
my $dir_path = $ARGV[0] if $ARGV[0];
my $days = $ARGV[1] if $ARGV[1];
unless ( $days ) { exit; }
# 指定日数分前のtime
my $days_before = time - 60 * 60 * 24 * $days;
# ログ
my $log_path = '/tmp/compress_files.log';
system( "/usr/bin/touch", $log_path ) unless ( -e $log_path );
# 対象ファイルのパスを取得
my @files = File::Find::Rule->file()
->mtime( "<$days_before" ) ->in( $dir_path );
# 圧縮・削除処理
open OUT, ">> $log_path" or die "Cannot open file: $!\n";
foreach my $file_path ( @files ) {
if ( $file_path =~ /.+\.zip$/ ) { next; }
my $compress_path = $file_path . '.zip';
if ( $file_path =~ /^(.+)\/(.+?)$/ ) {
print $file_path . "\n";
print OUT $file_path . "\n";
my $dir_path = $1;
my $file_name = $2;
my $cp_file_name = $file_name;
from_to( $cp_file_name, 'utf8', 'cp932' );
my $compress_name = $file_name . '.zip';
chdir $dir_path;
system( "/bin/cp", "-p", $file_name, $cp_file_name );
my( $owner, $group, $date, $time ) = (split( / /, `/bin/ls -l $file_name`))[2,3,5,6];
my( $year, $mon, $day ) = split( /-/, $date );
my( $hour, $min ) = split( /:/, $time );
system( "/usr/bin/zip", $compress_name, $cp_file_name );
system( "/bin/chown", "$owner:$group", $compress_name );
system( "/usr/bin/touch", "-m", "-t", "$year$mon$day$hour$min", $compress_name );
system( "/bin/rm", $file_name, $cp_file_name );
}
}
close OUT;
exit;
===(compress_files.pl ここまで)===