Mail formlardan gönderilen e-maillerin izlenmesi ve kontrolü

Web sayfalarının bir çoğunda mail form kullanılıyor.Bu scriptlerde bulunabilecek bir açık sunucunuz üzerinden onbinlerce spam gönderimine sebep ve sizin karalistelere girmenize sebep olabilir.Aşağıda kurulumu anlatılan script form maillerden gönderilen her mailin logunu yazmakta ve sizin belirteceğiniz alıcı sayısına göre maili engellemektedir.Scriptin bir kısmı anonim alıntıdır,ilaveler bulunmaktadır.

Öncelikle php betiğinin çalışması için gerekli paketleri sistemimize kuruyoruz.Redhat,Centos kullanıyorsanız şu komutla ilgili paketleri kurabilirsiniz;

yum install php-pear-Auth-SASL.noarch php-pear-Mail.noarch php-pear-Mail-Mime.noarch php-pear-Net-SMTP.noarch php-pear-Net-Socket.noarch

Kurulum bittikten sonra aşağıdaki scripti fmmgw.php adıyla sisteminizde uygun bir yere veya /usr/local/bin altına kopyalayın.

#!/usr/bin/php
<?php
ini_set(‘include_path’, ‘/usr/share/pear’);
//—CONFIG
$config = array(
‘host’ => ‘localhost’,
‘port’ => 25,
‘auth’ => FALSE,
);
$logDir      = ‘/var/log’;
$logFile     = ‘mail_proxy.log’;
$failPrefix  = ‘fail_’;
$EOL         = “\n”; // change to \r\n if you send broken mail
$defaultFrom = ‘”hostadresiniz.alanadiniz.com Webserver” <fmmgw@alanadiniz.com>’;
//—END CONFIG

if (!$log = fopen(“{$logDir}/{$logFile}”, ‘a’)) {
die(“ERROR: cannot open log file!\n”);
}

require(‘Mail.php’); // PEAR::Mail
if (PEAR::isError($Mailer = Mail::factory(‘SMTP’, $config))) {
fwrite($log, ts() . “Failed to create PEAR::Mail object\n”);
fclose($log);
die();
}

// get headers/body
$stdin = fopen(‘php://stdin’, ‘r’);
$in = ”;
while (!feof($stdin)) {
$in .= fread($stdin, 1024); // read 1kB at a time
}

list ($headers, $body) = explode(“$EOL$EOL”, $in, 2);

$recipients = array();
$headers = explode($EOL, $headers);
$mailHdrs = array();
$lastHdr = false;
$recipFields = array(‘to’,’cc’,’bcc’);
foreach ($headers AS $h) {
if (!preg_match(‘/^[a-z]/i’, $h)) {
if ($lastHdr) {
$lastHdr .= “\n$h”;
}
// skip this line, doesn’t start with a letter
continue;
}
list($field, $val) = explode(‘: ‘, $h, 2);
if (isset($mailHdrs[$field])) {
$mailHdrs[$field] = (array) $mailHdrs[$field];
$mailHdrs[$field][] = $val;
} else {
$mailHdrs[$field] = $val;
}
if (in_array(strtolower($field), $recipFields)) {
if (preg_match_all(‘/[^ ;,]+@[^ ;,]+/’, $val, $m)) {
$recipients = array_merge($recipients, $m[0]);;
}
}
}
if (!isset($mailHdrs[‘From’])) {
$mailHdrs[‘From’] = $defaultFrom;
}

$recipients = array_unique($recipients); // remove dupes

if(count($recipients)>2) die(“HATA”);

// send
if (PEAR::isError($send = $Mailer->send($recipients, $mailHdrs, $body))) {
$fn = uniqid($failPrefix);
file_put_contents(“{$logDir}/{$fn}”, $in);
fwrite($log, ts() .”Error sending mail: $fn (“. $send->getMessage() .”)\n”);
$ret = 1; // fail
} else {
fwrite($log, ts() .”Mail sent “. count($recipients) .” recipients.\n”);
$ret = 0; // success
}
fclose($log);
return $ret;

//////////////////////////////

function ts()
{
return ‘[‘. date(‘y.m.d H:i:s’) .’] ‘;
}

?>

Log dosyanızı elle oluşturun

touch /var/log/mail_proxy.log

Son olarak php.ini dosyanızda ilgili alanı şu şekilde değiştirin.

sed -i -e ‘s:;sendmail_path = /usr/sbin/sendmail -t -i:sendmail_path = /usr/local/bin/fmmgw.php:g’ php.ini

veya nano,vi gibi bir editor ile php.ini dosyanızda

sendmail_path

satırını bulup karşısına

/usr/local/bin/fmmgw.php

yazarak dosyanızı kaydedin.

Apache web servisini resetleyin.

Gönderilen mailleri anlık izlemek için

tail -f /var/log/mail_proxy.log

yazıp inceleyebilirsiniz.

Plesk Linux Sunucularda büyük log dosyalarını bulmak

Kontrol edilmediğinde siz hiç farkına varmadan sunucunun disk alanını bitirebilecek log dosyaları oluşabilir.Örneğin plesk hosting panelde tüm vhostların error log dosyalarını şu şekilde sıralatabilirsiniz

Selection_013

Farklı sistem veya ispconfig,cpanel,directadmin gibi farklı yazılımların kurulu olduğu sunucularda dosya yolları farklılık gösterebilir.Yukarıda verdiğimiz örnek 9.x serisi Linux için olan Plesk sürümleri için geçerlidir.

Komut şu şekilde;

find /var/www/vhosts/*/statistics/logs/error_log -exec ls -la {} \; | awk ‘{print $5 $9}’ | sort -n

Eğer tüm error log ları silmek isterseniz yine yukarıdaki sisteme göre şöyle bir söz dizimi işinize yarayacaktır.

find /var/www/vhosts/*/statistics/logs/error_log -exec rm {} \;

Güncel Not:

Plesk 12.x ve Onyx de log dosyaları hem statistics/logs hem de webdizini/logs altında görünmektedir.Bu dosyalar dosya sisteminden hard (sembolik) link ile bağlanmıştır.Yani aslında aynı dosyadır.Bu durumda komutu şu şekilde uygulayabilirsiniz;

find /var/www/vhosts/logs/error_log -exec ls -la {} \; | awk ‘{print $5 $9}’ | sort -n

 

Joomla ve WordPress Hosting

En basit haliyle uyum problemleri ya bileşen eksikliğinden ya da dosya sistemi üzerine yazma haklarından ortaya çıkar.Bu sadece hazır scriptlere mahsus bir durum da değildir esasında.Joomla’nız,  wordpress’iniz ya da elinizdeki varolan ve kullanmak istediğiniz herhangi bir yazılım ,eğer hosting alanında dosya oluşturabiliyor veya silebiliyorsa,kullandığı tüm bileşenler serverda destekleniyorsa güzel güzel çalışır.

Bu uyumluluğun var olup olmadığını anlamanın iki basit yolu vardır.

Konu php bileşenleri ise;örneğin php-xml php-mbstring gibi,

Satın aldığınız hostinginizde phpinfo.php adıyla bir dosya oluşturun.ismin önemi yok.uzantısı php olsun yeter.ve içine şunları yazın

<?php
phpinfo();
?>

Daha sonra alanadınızla birlikte bu dosyanın tam yolunu tarayıcınızın adres satırına yazarak çağırın.Karşınıza tam da şu şekilde bir ekran gelecektir.(Eğer phpinfo() fonksiyonu birşekilde kapatılmamışsa!)

Karşınıza gelen bu upuzun sayfada sırasıyla hangi php bileşenlerin yüklü olduğunu görebilir,kullanmak istediğiniz scriptin gereksinimleriyle karşılaştırabilirsiniz.

Eğer konu yazma izinleri ile ilgili ise aynı dosyada üçüncü satıra dikkat etmenizi tavsiye ederim.Örneğimizde,bu satırda CGI/FastCGI yazmaktadır.Burada sadece CGI,Apache2 Handler,ISAPI extension hatta php/FPM de yazabilirdi.

Apache2 Handler yazıyorsa başınız yazma izinleriyle dertte demektir.Dosyaları webden yüklemeniz için yazma izinlerini ve dosya sahipliklerini değiştirtmek zorunda kalacaksınız.Daha sonra da bu dosyaları silmek istediğinizde hosting firmanıza telefon veya çağrı açmak zorunda kalacaksınız.ISAPI’ de de aynı durum sözkonusu.

Bu tip sorunlarla karşılaşmamak için barındırma hizmeti satın almadan önce firmayla görüşüp hangi hosting kontrol paneli kullandıklarını sormanızda fayda var.Plesk ise php/fastcgi,cpanel ise phpsuexec,directadmin ise suphp kullanıp kullanmadıklarını sorun.Alacağınız yanıt evet ise joomla veya wordpress bu bakımdan sorunsuz çalışabilir manasına gelecektir.

Plesk Linux 9.5.x Microupdate Güncelleme

# $PRODUCT_ROOT_D/admin/sbin/autoinstaller --select-product-id plesk --select-release-current --reinstall-patch --install-component base

Ubuntu 10 Plesk 9.5.4 Atmail Problemi

Problem : Ubuntu Linux 10 üzerinde koşturan  Parallels Plesk 9.5.4 yazılımına dahil edilmiş olan atmail webmail istemcisinin,sistemde doğru şekilde çalışmamasının hatta giriş bile yapılamaması

Problemin kaynağını /var/log/atmail/error.log dosyasında anlık olarak görebiliyoruz.atmail istemcisi gereksinim duyduğu javascript dosyalarının pathleri doğru klasörlere yönlendirildiği halde (/etc/apache2/conf.d/zzz_atmail_vhost.conf dosyasında ) bu dosyaları /usr/share/javascript klasörü altında aramaktadır.

Sebebi Ubuntu’nun Apache konfigurasyonunda bir aliastan kaynaklanmaktadır.Sorundan ziyade çakışma olan dosya ve içeriği şu şekildedir.

/etc/apache2/conf.d/javascript-common.conf
Alias /javascript /usr/share/javascript/

<Directory “/usr/share/javascript/”>
Options Indexes FollowSymLinks MultiViews
</Directory>

Bu yönlendirmeyi kontrollü bir şekilde iptal ederek/değiştirerek veya /var/www/atmail/javascript dizini altındaki tüm dosya ve klasörleri /usr/share/javascript altında atarak problemi giderebilirsiniz.

Web Sunucu Güvenliği İpuçları

Linux web sunucularda temp dizini güvenliği

Web sunucunuzdaki geçici işlemler için dosya oluşturulan dizin /tmp dizinidir.Bir web sunucusunda genelde /tmp dizini üzerine tüm kullanıcılar yazma okuma izinlerine sahip oluyor.Böylece herkesin yazabildiği ve okuyabildiği bir alan güvenlik riskini arttırıyor.

Bu riski bir nebze düşürmek için /tmp dizinini ayrı bir partition olarak bağlamalı ve için kod çalıştırılamaz şekilde ayarlamalısınız.

Eğer işin bu kısmını düşünmeden sunucu kurmuşsanız ve diskinizde boş alan yoksa aşağıdaki linux/unix işletim sistemlerine özgü raw disk image mount alternatifini kullanabilirsiniz.

Önce tmp bölümün ne kadar alana gereksinim duyduğuna karar verin ve bunun için diskinizdeki boş alanı kontrol edin

Ssh üzerinden root kullanıcısı ile bağlıyken şu komutu verin;

 

[root@localhost ]# df -h

 

/dev/sda1 214G 130G 74G 64% /

 

 

Burada / dizininde 74 Gb boş alan olduğunu görüyoruz.Bize tahminen 15 gb tmp dizini yeterli olabilir.

Şimdi disk imajı oluşturma ve sisteme bağlama aşamasındayız.Önemli servislerinizi (mysql,apache vb.) durdurup /tmp dizin içeriğinizi bir yere yedekleyin .Daha sonra aşağıdaki komutları sırasıyla yazın.

dd if=/dev/zero of=/usr/tmpMnt bs=1024 count=15000000

 

/sbin/mke2fs /usr/tmpMnt

 

/usr/tmpMnt is not a block special device.
Proceed anyway? (y,n) y

 

 

 

Bu komutları sırasıyla uyguladığınızda artık /usr altında 15 gb ‘lık tmpMnt dosyanızın olduğunu görebilirsiniz.Imajı sisteme tmp olarak bağlayalım;

mount -o loop,noexec,nosuid,rw /usr/tmpMnt /tmp

 

Bu komuttan sonra hiçbir hata çıkmadıysa disk imajı tmp olarak bağlanmış demektir.Daha önce başka bir yere almış olduğunuz dosyaları şimdi /tmp ‘e tekrar aktarıp servislerinizi çalıştırabilirsiniz.

Ayarların her açılışta yüklenmesi için,

nano ile /etc/fstab dosyasını açıp alttaki satırı dosyanın en altına yazın.

/usr/tmpMnt /tmp ext2 loop,noexec,nosuid,rw 0 0

 

Not 1: Bu işlemler sonucunda /tmp dizinin izinleri değişmiş olabilir.

chmod 1777 /tmp çalıştırın.

Not 2: /usr/tmpMnt yolu zorunlu değildir.İstediğiniz klasörde istediğiniz isimle imaj dosyasını oluşturabilirsiniz.Yeterki fstabdaki isimler doğru olsun.

Not 3: Herşey bittikten sonra mount komutu ile /tmp dizinin doğru bağlandığına emin olun.

 

 

 

 

 

 

 

 

Proftpd güvenlik açığı ve güncellemesi

Geçtiğimiz günlerde  ftp sunucu yazılımı proftpd ‘de yüksek öncelikli bir güvenlik açığı tespit edildi.Açık sadece centos plesklerin dışında başka dağıtımlarda da bulunuyor.

Sürümü güncellemek için aşağıdaki ekran görüntülerindeki adımları sisteminizde uygulayın.

veya aşağıdaki adımları uygulayayın;

Atomic depolarını sunucumuzdaki yum paket yöneticisine ekliyoruz..

wget -q -O – http://www.atomicorp.com/installers/atomic |sh

Daha sonra bu /etc/yum.repos.d/atomic.repo dosyasını bir text editorle açıyoruz..

nano /etc/yum.repos.d/atomic.repo

ve aşağıdaki işaretli alanın değerini 1 yapıp dosyayı kaydediyoruz.

# Almost Stable, release candidates for [atomic]
# Note these are not supported by anyone. -Scott
[atomic-testing]
name = CentOS / Red Hat Enterprise Linux $releasever – atomicrocketturtle.com – (Testing)
mirrorlist = http://www.atomicorp.com/mirrorlist/atomic-testing/centos-5-$basearch
enabled = 1
priority = 1
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY.art.txt
gpgcheck = 1

daha sonra

yum upgrade psa-proftpd

veya

yum upgrade psa-proftpd-xinetd (plesk 8.6 versiyonları için geçerli)

olarak proftp yi güncelleyiniz.