Archive

Archive for March, 2012

Имало едно време, една хакната машина…

Звучи като приказка, нали? Всъщност е реална история за това как трябваше да открия и да изтрия гаден “вирус” от един сървър.

При поредната проверка на пощата ми, чета писмо от datacenter-a, в който се намира една от машините ми. Там пишеше, че ако до няколко часа не разреша проблема с машината, тя ще бъде спряна. По-долу беше обяснено, че от нея има изключително много изходящи конекции, които flood-ят суича, към който е вързана машината.

И така, започна се…

В началото трябваше да намеря кой точно е процеса, предизвикващ въпросните конекции. Използвах ps auxw за да разгледам процесите, които в момента се изпълняваха на машината. На пръв поглед нямаше нищо необичайно – ftp, mysql, apache, ssh и още купчина други, с които няма да ви губя времето.
Но един от тях ми привлече вниманието, а именно /usr/local/apache2/bin/httpd. Нищо необичайно, нали? Всъщност проблема е, че моето apache се намира в друга директория… Ето и заподозреният 🙂

От тук нататък ще използвам прякорът “сивчо” за да не разкривам все пак за кой сайт става въпрос 🙂

Забелязах, че въпросният процес се изпълнява с потребител “сивчо“. Това означаваше точно две неща:
1. Машината ми не е root-ната. Тоест, мога да си я използвам без да е наложителна преинсталация.
2. Някой, някак е успял да хакне акаунта на “сивчо” – лесна парола или остарял РНР скрипт.

Първото ме успокои… пфу!

Започнах да разследвам “сивчо” и да видя какво е правил в последно време, но преди това заключих цялата му директория за всеки случай:

chmod 0 /home/сивчо

Използвах командата

find /home/сивчо/public_html -mtime -30 -o -ctime -30 -ls

за да разбера кои файлове е променял в последните 30 дни. Тук ударих на камък – няма нито 1 променен файл. Това означаваше, че скрипта не е писал по файлове, принадлежащи на “сивчо“… пълна мистерия…

Видях кой е Process ID на въпросния скрипт и отидох да го поразгледам. Нека кажем, че PID е 2012.
Влязох в директорията на процеса:

cd /proc/2012/

Исках да разбера, кой всъщност е файла, който се изпълнява зад този процес. А именно, на къде сочи exe файла. В случея – към root директорията “/“. Пак удрям на камък.
Исках да видя коя команда е използвана за да се стартира процеса, като погледа съдържанието на cmdline файла, но и той беше празен. Камък.
Погледнах в директорията fd, за да видя по кой файлове пише и чете процеса. Там имаше само сокети и apache error log файла. Това ме наведе на мисълта, че може би щях да мога да видя кои други файлове са се стартирали от потребител “сивчо” и евентуално да разбера точно в кой РНР файл е дупката за да я оправя или да предупредя клиента. Нямаше нищо. Погледнах и в лога на suPHP, но и там беше празно.

Отидох в /tmp/ директорията, която също се използваше от процеса. Там видях доста (десетина) скрити директории, принадлежащи на потребител “сивчо” и един странен .tgz файл, който при опит да разкомпресирам върна греша. Предположих, че това е самият “вирус”.

От тук нататък, изчерпан от идеи, реших да не се занимавам с ходене по следи от трохи, а просто да реша проблема. Убих процесите и изтрих скритите файлове и директории на “сивчо”. Това реши проблема, надявам се за постоянно. Все пак погледнах в /var/spool/cron/ да не би случайно там да има рестариращ процеса скрипт, но всичко беше наред.

Заключението ми е, че може би сам съм пренесал вируса от друг сървър при смяната на машините, която се случи преди известно време.

Брой конекции от клиентски IP-та?

Заглавието може би не е много точно, но идеята е, че с тази команда можете да видите от всяко IP колко отворени connection-и (връзки) има в момента към вашият сървър:

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Демонстрация:

blagomir@firefly:~$ netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
      1 173.194.34.73
      3 64.34.119.101

Цифрата е броя отворени конекции последвана от IP адреса.

Как да инсталираме SSL сертификат на Nginx сървър?

Първа стъпка разбира се е да имате сертификат 🙂 Копирайте файловете (.crt/.pem и .key) на вашата машина.

Редактираме nginx.conf, който ако сте инсталирали nginx от package management system се намира тук: /etc/nginx/nginx.conf

server {
 
   listen   443;
 
   ssl    on;
   ssl_certificate    /etc/ssl/certificate.crt; (или .pem)
   ssl_certificate_key    /etc/ssl/certificate.key;
 
   server_name bgtechblog.com;
   location / {
	root   /home/bgtechblog.com/root/;
	index  index.html;
   }
 
}

Последната стъпка е да рестартираме nginx за да приеме новите промени:

/etc/init.d/nginx restart

Лесно, нали?

Categories: How to ... ?, Nginx Tags: ,

Linux Increase The Maximum Number Of Open Files / File Descriptors

За да увеличим максималния брой на отворени файлове за определен процес, трябва да напишем следната команда:

sysctl -w fs.file-max=100000

Ако искаме настройката да е валидна и след рестартиране на машина във файла /etc/sysctl.conf добавяме следният ред:

fs.file-max = 100000

За да проверите дали всичко е наред и правилно запаметено, използвайте следната команда:

blagomir@firefly:~$ sysctl fs.file-max
fs.file-max = 100000
blagomir@firefly:~$

Possible PHP Error levels

Value	Constant	Description
1	E_ERROR	Fatal run-time errors. Execution of the script is halted
2	E_WARNING	Non-fatal run-time errors. Execution of the script is not halted
4	E_PARSE	Compile-time parse errors. Parse errors should only be generated by the parser.
8	E_NOTICE	Run-time notices. The script found something that might be an error, but could also happen when running a script normally
16	E_CORE_ERROR	Fatal errors that occur during PHP's initial startup.
32	E_CORE_WARNING	Non-fatal run-time errors. This occurs during PHP's initial startup.
256	E_USER_ERROR	Fatal user-generated error. This is like an E_ERROR set by the programmer using the PHP function trigger_error()
512	E_USER_WARNING	Non-fatal user-generated warning. This is like an E_WARNING set by the programmer using the PHP function trigger_error()
1024	E_USER_NOTICE	User-generated notice. This is like an E_NOTICE set by the programmer using the PHP function trigger_error()
2048	E_STRICT	Run-time notices. Enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code.
4096	E_RECOVERABLE_ERROR	Catchable fatal error. This is like an E_ERROR but can be caught by a user defined handle (see also set_error_handler())
8191	E_ALL	All errors and warnings, except level E_STRICT (E_STRICT will be part of E_ALL as of PHP 6.0)
Categories: PHP Tags: , ,

Just fun или от нямане какво да правя…

Не, не че няма какво да се прави, но прочетох в един блог това и ми стана интересно. Реших да изкопирам идеята, а именно да покажа в колко машини съм се логвал от 1 Януари 2012 до момента.

Как става това ли?

blagomir@firefly:~$ cat .ssh/known_hosts | wc -l
46

Отговор: 46

P.S. Като се замисля май не са чак толкова много…

Categories: Всичко друго Tags:

Failed to save scheduled backup : Deletion of old backups is only supported when a date-based destination is used, and strftime substitutions are enabled

Или как да направим разделени по година/месец/ден бекъпи във Virtualmin/Webmin.

При настройка на бекъпа, в “Destination and format” карето, избираме директорията, в която искаме да се прави бекъпа.
До тук всичко е супер, но ако искаме и бекъпите автоматично да се изтриват след Х дни, трябва да напишем директорията така:

/my_backups/%y/%m/%d