четверг, 1 августа 2013 г.

ScriptFormatter 1.0.3

Обновлен плагин для программы Fiddler2. При помощи этого плагина  Вы можете  преобразовать минимизированный код в читаемый вид, дешифровать закодированные участки кода, расшифровать закодированный код.

Изменения:
Исправлены проблемы безопасности при дешифровке скрипта.
Добавлен вывод ошибок в лог Fiddler2

Настройки плагина (Tools -> Script Formatter options) 

Контекстное меню сессии
Пример работы:
Скрипт до обработки
var hex="\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x64\x21";
var unic="\u0048\u0065\u006C\u006C\u006F\u0020\u0077\u006F\u0072\u0064\u0021";
var base="SGVsbG8gd29yZCE=";
var hex1="\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x64\x21";
var unic2="\u0048\u0065\u006C\u006C\u006F\u0020\u0077\u006F\u0072\u0064\u0021";
var base3="SGVsbG8gd29yZCE=";
eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0 1(2,3){4"5 "+"6"+"!!!"}',7,7,'function|hello|a|b|return|Hello|world'.split('|'),0,{}));
eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0 1(a){3 2+"5"+a}0 4(b){3 1("6 7"+b)}4("8 9 c");',13,13,'function|Foo||return|Boo|px|Hello|word|My|script|||awesome'.split('|'),0,{}));

Скрипт после обработки
var hex = "Hello word!";
var unic = "Hello word!";
var base = "Hello word!";
var hex1 = "Hello word!";
var unic2 = "Hello word!";
var base3 = "Hello word!";
function hello(a, b) {
    return "Hello " + "world" + "!!!"
}
function Foo(a) {
    return 2 + "px" + a
}
function Boo(b) {
    return Foo("Hello word" + b)
}
Boo("My script awesome");

суббота, 27 июля 2013 г.

Установка MariaDB на Debian Wheezy

Для начала добавим репозитарий:
echo "" >> /etc/apt/sources.list
echo "# MariaDB 5.5 repository list" >> /etc/apt/sources.list 
echo "# http://mariadb.org/mariadb/repositories/" >> /etc/apt/sources.list
echo "deb http://mirrors.n-ix.net/mariadb/repo/5.5/debian wheezy main" >> /etc/apt/sources.list
echo "deb-src http://mirrors.n-ix.net/mariadb/repo/5.5/debian wheezy main" >> /etc/apt/sources.list
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

Список репозитариев можно получить под свою локацию на сайте MariaDB.

Обновляем список пакетов:
aptitude update

Устанавливаем:
aptitude install mariadb-server mariadb-client php5-mysql

Во время установки нас попросит ввести пароль для пользователя root. Расширение для php устанавливаем только в том случае, если мы ставили сам php. (Установка php рассмотрена в предыдущей статье).

среда, 24 июля 2013 г.

Установка и настройка nginx+php-fpm на Debian Wheezy

В данной статье, будет показано как поставить Nginx + php5-fpm на Debian Wheezy и настроить безопасную конфигурацию.

Установка NGINX.

Скачиваем и распаковываем исходные файлы:
cd /usr/src/
wget http://nginx.org/download/nginx-1.4.2.tar.gz
tar zxf nginx-1.4.2.tar.gz
rm -f nginx-1.4.2.tar.gz
cd nginx-1.4.2

Устанавливаем библиотеки необходимые для сборки:
aptitude install libpcre3-dev make libssl-dev libgeoip-dev checkinstall

Создаем конфигурацию:
./configure \
  --prefix=/usr \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --pid-path=/var/run/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=www-data \
  --group=www-data \
  --with-http_ssl_module \
  --with-http_gzip_static_module \
  --with-http_geoip_module \
  --http-log-path=/var/log/nginx/access.log \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --without-http_ssi_module \
  --without-http_userid_module \
  --without-http_uwsgi_module \
  --without-http_scgi_module \
  --without-http_memcached_module \
  --without-http_limit_conn_module \
  --without-http_limit_req_module \
  --without-http_empty_gif_module \
  --without-http_browser_module \
  --without-http-cache \
  --without-mail_pop3_module \
  --without-mail_imap_module \
  --without-mail_smtp_module \
  --without-http_geo_module \
  --with-pcre

В конфигурации указывается какие модули использовать. Подробнее об опциях включения отключения модулей можно посмотреть в wiki.

Теперь собираем и устанавливаем:
make
checkinstall

Создаем необходимые для работы каталоги:
mkdir -p /var/tmp/nginx/client
mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/sites-enabled
mkdir -p /var/log/nginx

Скачиваем дополнительные скрипты:
wget https://dl.dropboxusercontent.com/u/98786051/nginx/nginx -O /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults

wget https://dl.dropboxusercontent.com/u/98786051/nginx/ngxdissite -O /usr/sbin/ngxdissite
wget https://dl.dropboxusercontent.com/u/98786051/nginx/ngxensite -O /usr/sbin/ngxensite
chmod +x /usr/sbin/ngx*

Установка php-fpm

Добавляем репозитарий dotdeb.org:
echo "" >> /etc/apt/sources.list
echo "#php-fpm" >> /etc/apt/sources.list
echo "deb http://packages.dotdeb.org wheezy all" >> /etc/apt/sources.list
echo "deb-src http://packages.dotdeb.org wheezy all" >> /etc/apt/sources.list
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add -

Устанавливаем:
aptitude update
aptitude install php5-fpm
mkdir -p /var/log/php5-fpm

Настройка php-fpm

Редактируем файл /etc/php5/fpm/php-fpm.conf
;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;
[global]
pid = /var/run/php5-fpm.pid
error_log = /var/log/php5-fpm/error.log
log_level = warning
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 5s
daemonize = yes
;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;
include=/etc/php5/fpm/pool.d/*.conf

Создаем файл /etc/php5/fpm/pool.d/domain.ru.conf:
[domain.ru]

listen = /tmp/domain.ru.sock
listen.backlog = -1
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
user = www-data
group = www-data

pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
request_slowlog_timeout = 20
slowlog = /var/log/php5-fpm/www-slow.log
chdir = /

php_admin_value[open_basedir] = /usr/share/php5:/tmp:/home/domains/domain.ru/www
php_admin_value[disable_functions] = dl,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

Стартуем сервис:
service php5-fpm start

Настройка nginx

Редактируем файл /etc/nginx/nginx.conf
user  www-data;
worker_processes  8; # Ставим число по количеству ядер

timer_resolution 100ms;
worker_rlimit_nofile 8192;
worker_priority -5;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '"$status" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    server_tokens off; #Отключаем вывод версии сервера

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;
    gzip_min_length 1100;
    gzip_disable "msie6";
    gzip_buffers 64 8k;
    gzip_comp_level 4;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_types text/plain application/xml application/x-javascript text/css text/xml text/javascript;
    gzip_vary on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Создаем файл /etc/nginx/sites-available/domain.ru
server {
    listen 200.200.200.200:80;
    server_name domain.ru;
    set $host_path "/home/domains/domain.ru";
    root   $host_path/www;
    set $yii_bootstrap "index.php";
    charset utf-8;
    client_max_body_size 20m;
    error_log /var/log/nginx/domain.ru/error.log;
    access_log /var/log/nginx/domain.ru/access.log main;

    #На ститческий контент устанавливаем кеширование и отключаем запись в лог
    location /static{
        expires           max;
        access_log        off;
    }

    location /assets{
        expires           max;
        access_log        off;
    }

    #Перенаправление всех запросов в Yii
    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    #Защищаем папки
    location ~ ^/(protected|framework|themes/\w+/views) {
        deny  all;
    }

    #отключаем обработку запросов фреймворком к несуществующим статичным файлам
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        access_log        off;
        expires           max;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    #Блокируем прямой доступ к следующим типам файлов
    location ~* ^.+\.(inc|sql|dat|ini|conf|cfg|log)$ {
        deny  all;
    }

    location ~ .php$ {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #позволяем yii перехватывать запросы к несуществующим PHP-файлам
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
                set $fsn $fastcgi_script_name;
        }

        fastcgi_pass   unix:/tmp/domain.ru.sock;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;
        #PATH_INFO и PATH_TRANSLATED могут быть опущены, но стандарт RFC 3875 определяет для CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
        fastcgi_intercept_errors        on;
        fastcgi_ignore_client_abort     on;
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }
    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }
    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }
    ## Disable viewing .htaccess & .htpassword
    location ~ /\.ht {
            deny  all;
    }

 #Блокируем доступ к папкам SVN
    location ~ /.svn/ {
        deny all;
    }

    location ~ /.cvs/ {
        deny all;
    }
}

В данном примере показана настройка сайта, работающего на фреймворке YII.

Включаем сайт
ngxensite domain.ru
service nginx reload

Проверяем

Создаем файл /home/domains/domain.ru/www/test.php с содержимым
<?php
phpinfo();
?>

Открываем в браузере http://domain.ru/test.php
Если все нормально настроено, то увидим

воскресенье, 21 июля 2013 г.

Блокируем страны в iptables

Для блокировки трафика с конкретных стран существует модуль ядра xt_geoip.ko.
Приступим к его установке.
Скачиваем и распаковываем исходники:
cd /usr/src/ 
wget http://garr.dl.sourceforge.net/project/xtables-addons/Xtables-addons/1.47/xtables-addons-1.47.1.tar.xz
tar xfJ xtables-addons-1.47.1.tar.xz
rm xtables-addons-1.47.1.tar.xz
cd xtables-addons-1.47.1

Увеличим максимальное количество стран для одного правила.
sed -i "s#XT_GEOIP_MAX = 15#XT_GEOIP_MAX = 50#g" ./extensions/xt_geoip.h

Устанавливаем необходимые для сборки пакеты:
aptitude install checkinstall pkg-config iptables-dev libtext-csv-xs-perl

Устанавливаем заголовки текущего ядра:
aptitude install linux-headers-$(uname -r)

Собираем модуль:
./configure
make
checkinstall

Включаем модуль xt_geoip.ko:
modprobe xt_geoip

Проверяем:
root# lsmod|grep geoip
xt_geoip               12591  0
x_tables               19118  8 ip_tables,iptable_filter,iptable_nat,xt_tcpudp,xt_limit,ipt_LOG,xt_state,xt_geoip

Скачиваем и устанавливаем базы GeoIP:
/usr/local/libexec/xtables-addons/xt_geoip_dl
mkdir /usr/share/xt_geoip -p
/usr/local/libexec/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip ./GeoIPCountryWhois.csv

На этом установка и настройка модуля закончена.

Примеры использования:
Блокируем трафик с Китая:
iptables -A INPUT -m geoip --source-country CN -j DROP

Разрешаем трафик со стран России и Украины:
iptables -A INPUT -m geoip --source-country RU,UA -j ACCEPT

суббота, 20 июля 2013 г.

Добавляем дополнительный IP Debian Wheezy

Допусти хостер нам выдал два IP-адреса: 212.100.100.50, 212.100.100.51.

Для добавления нового IP, нужна отредактировать файл /etc/network/interfaces

Набираем:
nano /etc/network/interfaces

И видим:
allow-hotplug eth0
iface eth0 inet static
        address 212.100.100.50
        netmask 255.255.255.0
        network 212.100.100.0
        broadcast 212.100.100.255
        gateway 212.100.100.1
        dns-nameservers 178.162.151.41 217.20.116.1 217.20.116.1
        dns-search localdomain

Теперь нам надо добавить второй IP. Добавляем в файл следующий блок:
#Additional IP
auto eth0:0
iface eth0:0 inet static
address 212.100.100.51
netmask 255.255.255.0
network 212.100.100.0
broadcast 212.100.100.255

Выходим из редактирования нажатием Ctrl+X и подтверждаем изменения.
Если нужно еще добавить IP адреса, добавляем такой же блок изменяя номер виртуального интерфейса, следующий интефейс будет eth0:1, eth0:2 и т.д.

Теперь подымаем новый интерфейс:
ifup eth0:0

Проверяем все ли нормально:
ifconfig
 

понедельник, 15 июля 2013 г.

ScriptFormatter 1.0.2

Обновление плагина для программы Fiddler2. При помощи этого плагина  Вы можете  преобразовать минимизированный код в читаемый вид, дешифровать закодированные участки кода, расшифровать закодированный код.

Изменения:
Исправлены ошибки.
Добавлена функция дешифровки кода.
Автоматически измененные сессии выделяются зеленым цветом.
Настройки плагина (Tools -> Script Formatter options) 

Контекстное меню сессии
Пример работы:
Скрипт до обработки
var hex="\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x64\x21";
var unic="\u0048\u0065\u006C\u006C\u006F\u0020\u0077\u006F\u0072\u0064\u0021";
var base="SGVsbG8gd29yZCE=";
var hex1="\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x64\x21";
var unic2="\u0048\u0065\u006C\u006C\u006F\u0020\u0077\u006F\u0072\u0064\u0021";
var base3="SGVsbG8gd29yZCE=";
eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0 1(2,3){4"5 "+"6"+"!!!"}',7,7,'function|hello|a|b|return|Hello|world'.split('|'),0,{}));
eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0 1(a){3 2+"5"+a}0 4(b){3 1("6 7"+b)}4("8 9 c");',13,13,'function|Foo||return|Boo|px|Hello|word|My|script|||awesome'.split('|'),0,{}));

Скрипт после обработки
var hex = "Hello word!";
var unic = "Hello word!";
var base = "Hello word!";
var hex1 = "Hello word!";
var unic2 = "Hello word!";
var base3 = "Hello word!";
function hello(a, b) {
    return "Hello " + "world" + "!!!"
}
function Foo(a) {
    return 2 + "px" + a
}
function Boo(b) {
    return Foo("Hello word" + b)
}
Boo("My script awesome");

пятница, 5 июля 2013 г.

The PROPFIND response did not include the requested properties

После обновления клиента Tortoise SVN c 1.7.* до 1.8.0 при любых действиях с репозитраием начала вылазить ошибка "The PROPFIND response did not include the requested properties". Долгий поиск решение ни к чему не привел. Единственно было найдено сообщение, что проблема связана с сервером Nginx и с тем, что он не поддерживает Chunked-encoded запросы.
Я полез на сайт nginx и обнаружил, что поддержка данных запросов была добавлена в версии 1.3.9.
Решение простое: нужно обновить на сервере nginx до версии 1.3.9+. После обновления svn-клиент начал нормально работать.

вторник, 12 февраля 2013 г.

ScriptFormatter 1.0.1

Обновление плагина для программы Fiddler2, с помощью которого Вы с легкостью сможете привести минимизированный код в читаемый вид, дешифровать закодированные участки кода.

Изменения:
Исправлены ошибки.
Добавлена функция URLDecode.
Добавлено контекстное меню для сессии.

  Настройки плагина (Tools -> Script Formatter options)

Контекстное меню сессии

Пример работы:
Скрипт до обработки
var hex="\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x64\x21";
var unic="\u0048\u0065\u006C\u006C\u006F\u0020\u0077\u006F\u0072\u0064\u0021";
var base="SGVsbG8gd29yZCE=";
var hex1="\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x64\x21";
var unic2="\u0048\u0065\u006C\u006C\u006F\u0020\u0077\u006F\u0072\u0064\u0021";
var base3="SGVsbG8gd29yZCE=";
function hello(a,b){return"Hello "+"world"+"!!!"};
eval(unescape("%61%6C%65%72%74%28%22%68%65%6C%6C%6F%20%77%6F%72%6C%64%21%21%21%22%29%3B"));

Скрипт после обработки
var hex = "Hello word!";
var unic = "Hello word!";
var base = "Hello word!";
var hex1 = "Hello word!";
var unic2 = "Hello word!";
var base3 = "Hello word!";
function hello(a, b) {
    return "Hello " + "world" + "!!!"
};
eval(unescape("alert("hello world!!!");"));