Установка и настройка Apache + MySQL-Server + PHP5 в OpenBSD

Чегото захотелось мне посмотреть как будет работать Drupal на OpenBSD. Даже незнаю с чего бы это … но всеже! Захотелось так захотелось. Темболее что задача нетакая уж сложная 🙂  Итак, вперед в консоль и с песней в колонках!

Для начала надо настроить apache потом php5, потом mysql-server ну и потом уже поставить Drupal на всю эту связку.

Начнем сначала:

apache — версия 1.3 поставляется с OpenBSD по дефолту, тоесть в системе он уже есть, надо только уговорить его запускаться. Для этого добавляем запись такого вида в /etc/rc.conf.local:

root@openek:~# echo 'httpd_flags=""' >> /etc/rc.conf.local
root@openek:~#

Все! При следующей загрузке у нас стартонет apache автоматом. Имейте также в виду что по умолчанию он будет chroot-иться в /var/www — не забывайте что мы попали в консоль системы где все секюрно от рождения. Главное не нарушить гармонию безопасности этого точно слаженного организма своими шальными рученками 😉 . Едем дальше!

php5 — можно поставить из пакетов или собрать самому. Машинка мне для экспериментов перепала неособо шустрая — поэтому решил ставить из пакетов (чтобы полдня не ждать пока соберется 🙂 ) Сделал вот так:

root@openek:~# pkg_add php5-core

В ответ на это через минуту получил ответ что мол пакет установлен, а для того чтобы php5 заработал в apache2 надо создать такой вот симлинк (я сделал именно так):

root@openek:~# ln -sf /var/www/conf/modules.sample/php5.conf /var/www/conf/modules/php5.conf

Учитывая что apache у нас работает в chroot /var/www и то что для работы с upload фалами PHP нужна директория tmp нужно ее создать. Делается очень просто:

root@openek:~# mkdir /var/www/tmp

И роздаем права 777 на нее:

root@openek:~# chmod 777 /var/www/tmp

В итоге после перезагрузки получил работающие apache и php5 🙂 В чем убедился используя простенький php скриптик который сделал вот так:

root@openek:~# echo '<?php phpinfo(); ?>' > /var/www/htdocs/test.php

После чего перешел браузером lynx по ссылке http://127.0.0.1/test.php вот так:

root@openek:~# lynx http://127.0.0.1/test.php

и увидел кучу инфы про php и apache. Короче работает! Совсем же просто 🙂 Аж поражает 😀

Дальше занялся базой данных.

mysql-server — поставил тоже из пакетов командочкой:

root@openek:~# pkg_add -v -i mysql-server

Рекомендации о том что делать после установки даны в файле /usr/local/share/doc/mysql/README.OpenBSD

Я не особый спец по части баз данных — поэтому сделал как там написано. Сначала утсановил дефолтную базу выполнив:

root@openek:~# /usr/local/bin/mysql_install_db

После этого рекомендуют настроить mysql — и главный конфиг для этого дела /etc/my.cnf Я там особо ничего не трогал — только поправил чтобы mysqld слушал подключения на 127.0.0.1 и путь к сокету 🙂
Важно!!!
Если хотим чтобы apache так и запускался в chroot /var/www то нужно изменить путь к сокету mysql-server (не исключаю возможность отделаться sym/hard линком — но у меня этот трюк не получился).
Для этого исправил вот этот кусочек в файле /etc/my.cnf :

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/run/mysql/mysql.sock

на вот такое …. точнее добавил четкое указание где слушать подключения (bind-address) и поменял путь к сокету для того чтобы apache мог спокойно работать в chroot напару с mysql-server

# The MySQL server
[mysqld]
bind-address  = 127.0.0.1
port          = 3306
socket        = /var/www/var/run/mysql/mysql.sock

Дальше (опять же все по доке) добавил в конец файла /etc/login.conf такие строчки:

mysql:\
    :openfiles-cur=1024:\
    :openfiles-max=2048:\
    :tc=daemon:

После этого выполнил от рута:

root@openek:~# cap_mkdb /etc/login.conf

И, наконец, добавил такие строчки в /etc/rc.local для автозапуска mysql-server при загрузке системы:

if [ -x /usr/local/bin/mysqld_safe ] ; then
 su -c mysql root -c '/usr/local/bin/mysqld_safe > /dev/null 2>&1 &'
 echo -n ' mysql-server'
fi

Ну и для того чтобы связать php5 и MySQL конечно же нужен пакетик php5-mysql. Ставим из пакетов:

root@openek:~# pkg_add -v -i php5-mysql
parsing php5-mysql-5.2.10
Dependencies for php5-mysql-5.2.10 resolve to: mysql-client-5.0.83, php5-core-5.2.10
found libspec lib/mysql/mysqlclient.19.0 in package mysql-client-5.0.83
found libspec m.5.0 in /usr/lib
found libspec stdc++.47.0 in /usr/lib
php5-mysql-5.2.10: complete
--- php5-mysql-5.2.10 -------------------
You can enable this module by creating a symbolic
link from /var/www/conf/php5.sample/mysql.ini to
/var/www/conf/php5/mysql.ini.

ln -fs /var/www/conf/php5.sample/mysql.ini \
/var/www/conf/php5/mysql.ini

root@openek:~#

И для того чтобы заставить работать php5-mysql делаем как нас просят:

root@openek:~# ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini

После этого я перезагрузил машинку командой

root@openek:~# shutdown -r now

Ну вот связка Apache + PHP5 + MySQL готова принимать мой любимый CMS Drupal 🙂

В процессе установки Drupal-овский интсаллер порекомендовал поставить еще и php5-mbstring. Опять же поставил без особых трудностей из пакетов. Вот так:

root@openek:~# pkg_add -v -i php5-mbstring

Потом сделал симлинк для того чтобы включить модуль в PHP5

root@openek:~# ln -fs /var/www/conf/php5.sample/mbstring.ini /var/www/conf/php5/mbstring.ini

И наконец, перегрузил apache для того чтобы применить изминения 🙂

root@openek:~# apachectl restart

Дальше можно просто устанавливать Drupal. Как это делается — прекрасно описано в INSTALL.txt файле который есть в архиве с Drupal — такчто розписывать установку самомго CMS — нету смысла.

P.S. Данная статья сгодится также любому кто захочет подготовить сервер к установке таких web-движков как WordPress, Joomla, DLE и тд.

Дерзайте! Всем удачи 🙂

Автомаунт samba-шар в зависимости от сети

В силу мобильности своей электронно — вычислительной железки (владею ноутбуком Dell Inspiron 1420) приходится втыкаться в разного рода сети. Восновном рабочую и домашнюю. В зависимости от того куда воткнулся — нужно монтировать те или иные сетевые диски. Например на работе сетка 10.0.1.0/24, а дома — 192.168.13.0/24. Адрес и там и там получаю по DHCP. Соответственно и samba-сервера и шары и параметры монтирования совсем уж разные. Привести монтирование сетевых ресурсов к общему знаменателю неполучилось както 🙂 (может нешарю???) В итоге родилась мысль написать некий скриптик который при загрузке будет определять в какой сети я нахожусь и монтировать автоматом шары этой сетки.
Алгоритм примерно такой:

  • Получили адрес: Если это адрес домашней сети -> мотировать домашние samba-диски
  • Если это адрес из рабочей сети -> монтировать рабочие samba-диски
  • Если адрес не получили -> ничего не монтировать!

Задача совсем несложная для тех кто хоть чуток розбирается в bash. Вот что накалякал я:

#!/bin/bash
## // script for avtomount my home samba shares
## // writed by black_13 *31.01.2010*
IM_HOME=`ifconfig eth0 |grep 192.168.13`
IM_WORK=`ifconfig eth0 |grep 10.0.1`
if [[ -z ${IM_HOME} ]]; then
  echo 'Im not home! Nothing to mount from network :)'
else
  mountpoint -q /media/samba || mount.cifs //black/public /media/samba/ -o credentials=/root/.smb
  mountpoint -q /media/privat || mount.cifs //black/private /media/privat/ -o credentials=/root/.smb
fi
if [[ -z ${IM_WORK} ]]; then
  echo 'Im not in Work! Nothing to mount from network :)'
else
  mountpoint -q /media/samba || mount.cifs //server.work/DiskP /media/samba/ -o credentials=/root/.smb_work
  mountpoint -q /media/master || mount.cifs //samba.work/master /media/master/ -o credentials=/root/.smb_work
fi

Авторизационные данныя для доступа к шарам содержатся в файлах /root/.smb и /root/.smb_work для дома и работы соответственно. Формат содержания предельно прост:

laptop ~ # cat /root/.smb
username=home_user
password=my_passw_home
laptop ~ #

Немножко о логике скрипта, хоть все понятно и непосвященным 🙂
Если переменная IM_HOME содержит ip с сетки 192.168.13 — значит я дома и монтируем мои домашние шары. Если же она ничего не содержит — то просто выводим «Im not home! Nothing to mount from network :)» Со вторым случаем тоже самое. Если переменная IM_WORK не пуста — то монтируем диски с работы. Иначе выводим что велено echo.

Для старта этого скриптика при старте системы …. в Gentoo надо в конфиг /etc/conf.d/local.start добавить такое:

laptop ~ # cat /etc/conf.d/local.start
# /etc/conf.d/local.start
# This is a good place to load any misc programs
# on startup (use &>/dev/null to hide output)
### for avtomount samba shares if i'm home or work ###
/root/bin/home_samba_avtomount.sh
laptop ~ #

Ну вот и все 🙂 Теперь если я включаю ноут в домашней сети — получаю подмонтированные домашние сетевые диски. Если же сеть окажется рабочей — получаю примонтированными рабочие самбовые шары. Очень удобно. Кстати повесить срабатывание скрипта лучше на поднятие интерфейса — тоесть по if-up. Такчто если охота — то так и сделайте.
Ну вот и все. Рукам даем свободу от ввода километровых команд, а мозгам отдых и силы на будущие открытия. Наслаждаемся 😉

OpenBSD — Настраиваем named в режиме Forwarding

Все что нам нужно для нормальной работы named в OpenBSD присутствует сразу после установки. Ничего я не доустанавливал — только чуток подправил конфиг «под себя» и named заработал как миленький 🙂

Сразу оговорюсь, что нужды у меня были весьма скромные — просто заставить работать named в режиме forwarding на DNS-сервера провайдера (в данном случае Cyfra).

Все что касается named в OpenBSD находится в директории /var/named. Переходим под root и идем туда:

root@gw:~# cd /var/named/
root@gw:/var/named#

Теперь смотрим что у нас тут есть:

root@gw:/var/named# ls -l
total 24
drwxr-xr-x  2 root  wheel  512 Mar 17 18:52 dev
drwxr-x---  2 root  named  512 Feb 14 00:16 etc
drwxr-xr-x  2 root  wheel  512 Jul 10  2009 master
drwxrwxr-x  2 root  named  512 Jul 10  2009 slave
drwxr-xr-x  2 root  wheel  512 Jul 10  2009 standard
drwxrwxr-x  2 root  named  512 Jul 10  2009 tmp
root@gw:/var/named#

Думаю понятно каждому что для настройки named надо идти в директориб etc — так и делаем:

root@gw:/var/named# cd etc/
root@gw:/var/named/etc#

Смотрим что за конфиги у нас тут есть:

root@gw:/var/named/etc# ls -l
total 28
-rw-r-----  1 root  named  1561 Jul 10  2009 named-dual.conf
-rw-r-----  1 root  named  1348 Jul 10  2009 named-simple.conf
-rw-r-----  1 root  named  1472 Feb 14 00:15 named.conf
-rw-r-----  1 root  named    77 Jan 16 09:35 rndc.key
-rw-r--r--  1 root  wheel  3002 Jul 10  2009 root.hint
root@gw:/var/named/etc#

Итак видим главный конфиг — named.conf Открываем его для редактирования любимым редактором, мне нравится vim:

root@gw:/var/named/etc# vim named.conf

И добавляем то что нам нужно для того чтобы named смог:

  • работать в режиме forwarding
  • принимал запросы от нашего сервера и клиентов из внутрисети

У меня после внесенных правок конфиг приобрел такой вид:

root@gw:/var/named/etc# cat named.conf
// $OpenBSD: named-simple.conf,v 1.9 2008/08/29 11:47:49 jakob Exp $
//
// Example file for a simple named configuration, processing both
// recursive and authoritative queries using one cache.

// Update this list to include only the networks for which you want
// to execute recursive queries. The default setting allows all hosts
// on any IPv4 networks for which the system has an interface, and
// the IPv6 localhost address.
// Для удобства создаем группу в которую входит сам сервер и клиенты внутрисети
acl clients {
127.0.0.1;
192.168.100.0/24;
};

options {
version "";     // Удаляем данные об версии named в ответах

listen-on    { 192.168.100.2; 127.0.0.1; }; // "слушаем запросы" только тут
listen-on-v6 { none; }; // Отрубаем IPv6

empty-zones-enable yes;
allow-query { clients; }; // Розрешаем запросы для нашей группы clients
allow-recursion { clients; }; // Розрешаем рекурсивные запросы для clients
forward first; // Запросы перенаправляем на DNS сервера провайдера Cyfra
forwarders { 62.80.160.130; 62.80.160.140; }; // Cyfra-вские DNS - servers
};

logging {
category lame-servers { null; };
};

// Standard zones
//
zone "." {
type hint;
file "etc/root.hint";
};

zone "localhost" {
type master;
file "standard/localhost";
allow-transfer { localhost; };
};

zone "127.in-addr.arpa" {
type master;
file "standard/loopback";
allow-transfer { localhost; };
};

zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
type master;
file "standard/loopback6.arpa";
allow-transfer { localhost; };
};

include "/etc/rndc.key";

// Master zones
//
//zone "myzone.net" {
//      type master;
//      file "master/myzone.net";
//};

// Slave zones
//
//zone "otherzone.net" {
//      type slave;
//      file "slave/otherzone.net";
//      masters { 192.0.2.1; [...;] };
//};
root@gw:/var/named/etc#

Чтобы управлять named-ом с помощью утилитки rndc — необходимо вставить такой вот код в конфиг:

include "/etc/rndc.key";

Иначе rndc будет ругаться на отсутствие ключа.

С настройкой закончили 🙂 Ну какбы! Непомешает и проверить правильность конфига. Для проверки конфига named есть специальный скриптик — named-checkconf. Использовать его очень просто:

root@gw:~# named-checkconf /var/named/etc/named.conf
root@gw:~#

Если в ответ на такую команду тишина — значит все путем, конфиг не содержит синтаксических ошибок и может быть использован. Это не означает что он будет работать так как вы задумали, но дает уверенность что named с ним запустится 🙂

Запускаю named командочкой:

root@gw:/var/named/etc# named -4

Для того чтобы он автоматически запускался при старте сервера добавляем в /etc/rc.conf.local такую строчку:

root@gw:/var/named/etc# grep -i named /etc/rc.conf.local
### Enable Named ###
named_flags="-4"
root@gw:/var/named/etc#

Вот и все 🙂 Как видите — проще простого. Работает исправно и стабильно — пока глюков не наблюдал 🙂

Всем удачи!

Панель Управления через runas

Винда есть винда. Все по-дурацкому просто, и как всегда — окольными путями. Может и можна както по-красивому это сделать — но я незнаю как. В данном случае мне нужен был доступ к «Принтеры и Факсы» для установски http принтера. Но делал я все это через «Панель Управления», поэтому данный совет может быть использован и при необходимости просто попасть в нее для решения других задач.

Вот как сделал я:

  • Под обычным юзером зашел в C:\Program Files\Internet Explorer\
  • Правой кнопкой на IEXPLORE.EXE -> Запустить от имени -> Ввел Админские авторизационные даные
  • Открылся IE6 из под Админа 🙂
  • В адресной строке ввел: C:\
  • Открылся диск С
  • Потом в той же адресной строке выбрал уже в выпадающем меню «Панель Управления»
  • Ну там уже  «Принтеры и факсы» — из под Админа

Дальше установил http принтер купсовый 🙂 Все работает!
P.S. Проверено и 100% работает на IE6. А вот на IE8 такой трюк у меня не прокатил — надеюсь хоть с IE7 работает (пока негде проверить).
Удачи и вам в этом деле 🙂

Настройка PF — nat + firewall

Статья из серии статей о настройке сервера для небольшого офиса на OpenBSD.

Захотелось вот настроить на старенькой машинке маршрутизатор для небольшой дружественной компании. Парк машин (читай, количество клиентов) около 20-30 штук. Такчто особой вычислительной мощи от компа и не требуется. Конечно же вопрос о выборе системы тоже обдумывался. Самым весомым аргументом в выборе было личное любопытство к пакетному фильтру PF. Вот чтото захотелось мне его пощупать. Много всякого слышал о pf, кто хвалит, кто ругает … почитал немного в инете разные тематические форумы, посмотрел как люди делают … и тд.- вот и загорелся желанием и сам опробовать в действии сей продукт. Да и начальник о pf лестно отзывался — мол просто настраивается и работает стабильно. Ну ладно, раз так — значит буду пробовать! Но тут еще засада с выбором OS, pf то есть в нескольких операционках! Точнее во всех семейства BSD 🙂 Правда, после того как я узнал что PF был разработан как сетевой фильтр именно для OpenBSD, выбор был сделан именно в пользу опёнка.
Как, что и куда крутить — инфы в инете скопилось навалом. Но всеже с самого начала очень рекомендую почитать на официальном сайте OpenBSD очень хорошее FAQ по PF Львиная часть, кстати, на русском 🙂 Почитали? Тогда начнемс!

Итак, что имеем вначале:

  • весьма скромная железка в духе Celeron 1GHz, RAM 256M, HDD 40G
  • установил на нее OpenBSD 4.6 — тоесть с OS тоже понятно 🙂
  • набор политик безопасности
  • соображения по обеспечению оптимальной работы с каналом internet
  • машину внутри сети с windows для которой нужны будут некоторые «плюшки»
  • желание разобраться с новым для меня инструментом — PF

Для простоты изложения назову основных участников конфигурации:

gw — наш сервер с OpenBSD
win2k3 — виндосервер внутри сети на который админам надо дать доступ из инета
clients — остальные клиенты внутри сети
admins — ip или DNS адреса машин админов (дом/работа) которым нужен доступ на gw
Что хотим получить:

— Политики:

  • «натим» только нужные нам протоколы — tcp,udp,icmp
  • по smtp пускаем общаться с сервером провайдера только gw и win2k3
  • по smtp clients могут общаться только с gw
  • для admins необходимо пробросить RDP и VNC порты на win2k3
  • максимально закрыться от доступа со стороны internet
  • подбирающих пароли к ssh  — банить (желательно средствами pf)
  • предусмотреть защиту от DDoS

— Некоторые соображения по оптимизации работы всех клиентов с каналом доступа в internet:

необходимо настроить QoS для того чтобы, при всем желании один или пара клиентов, не смогли «занять весь канал» закачкой какогото фильма, не давая остальным отправить/почитать почту.

Главный конфигурационный файл pf в OpenBSD находится обычно тут: /etc/pf.conf

Вот что я туда накалякал:

root@gw:~# cat /etc/pf.conf
#
# Remember to set net.inet.ip.forwarding=1 and/or net.inet6.ip6.forwarding=1
# in /etc/sysctl.conf if packets are to be forwarded between interfaces.
INET_IF = "tun0"
LAN_IF = "rl0"
NAT_PROT = "{tcp, udp, icmp}"
WIN_2K3 = "192.168.0.10"
CYFRA_SMTP = "smtp.uatele.com"
ICMP_TYPE = "{echoreq, unreach}"
####   <== We need some Tables ==> ####
table <admins> const {99.55.66.22, 66.44.88.22, 93.51.57.66}
table <rfc1918> const {127.0.0.0/8, 192.0.2.0/24, 172.16.0.0/12, 169.254.0.0/16, 0.0.0.0/8, 240.0.0.0/4}
table <bruteforce> persist

set skip on lo0         # Skip All Rules For lo Interface
set block-policy return # Policy for icmp
set timeout { frag 10, tcp.established 3600 } # timeout policy for TCP sessions
set loginterface $INET_IF
set loginterface $LAN_IF

altq on $INET_IF cbq bandwidth 4Mb queue \
{ main, smtp, admin, ssh, ack, icmp }
  queue main  bandwidth 63% priority 2 cbq(default borrow red)
  queue smtp  bandwidth 10% priority 3 cbq(borrow red)
  queue admin bandwidth 8%  priority 4 cbq(borrow red)
  queue ssh   bandwidth 8%  priority 5 cbq(borrow red)
  queue ack   bandwidth 6%  priority 6 cbq(borrow red)
  queue icmp  bandwidth 4%  priority 0 cbq
#altq on $INET_IF bandwidth 960Kb hfsc queue { ack, dns, admin, ssh, main, mail, icmp }
#  queue ack        bandwidth 30% priority 8 qlimit 500 hfsc (realtime 20%)
#  queue dns        bandwidth  5% priority 7 qlimit 500 hfsc (realtime  5%)
#  queue admin      bandwidth 10% priority 6 qlimit 500 hfsc (realtime  7%)
#  queue ssh        bandwidth 10% priority 6 qlimit 500 hfsc (realtime 10%) {ssh_login, ssh_bulk}
#   queue ssh_login bandwidth 50% priority 6 qlimit 500 hfsc
#   queue ssh_bulk  bandwidth 50% priority 5 qlimit 500 hfsc
#  queue main       bandwidth 30% priority 5 qlimit 500 hfsc (realtime 20% default)
#  queue mail       bandwidth 10% priority 3 qlimit 500 hfsc (realtime  5%)

#  queue icmp       bandwidth  5% priority 2 qlimit 500 hfsc (realtime  5%)
##### <== Main Rule For NAT ==> #####
nat on $INET_IF proto $NAT_PROT from $LAN_IF:network to any -> ($INET_IF)

##### <== Redirect VNC and RDP to WIN2K3 ==> #####
rdr pass on $INET_IF proto tcp from  to ($INET_IF) port {5900, 3389} -> $WIN_2K3
#####<== By Default Block All ==> #####
block log on { $INET_IF, $LAN_IF } all
#block in quick log from urpf-failed                             # PF Spoofing proteCt!!!
#antispoof log quick for { lo0, $INET_IF, $LAN_IF } inet # PF Spoofing protect IPv4
block log quick from <bruteforce>                              # Block ssh bruteforcers

##### <== Block Not Routable  Networks ==> #####
block drop in quick log on $INET_IF from <rfc1918> to any
block drop out quick log on { $INET_IF , $LAN_IF } from any to <rfc1918>

##### <== For Redirected Ports ==> #####
pass out quick on $LAN_IF proto {tcp,udp} from <admins> to $WIN_2K3 port {5900, 3389}
##### <== Rules for 25 PORT ==> #####
pass in quick log on $LAN_IF inet proto tcp from $WIN_2K3 to $CYFRA_SMTP port 25 queue (smtp, ack)
pass in quick log on $LAN_IF inet proto tcp from $LAN_IF:network to $INET_IF port 25 queue (smtp, ack)
pass in quick log on $INET_IF inet proto tcp from { $CYFRA_SMTP <admins> } to $INET_IF port 25 queue (smtp, ack)
block in quick log on $LAN_IF inet proto tcp from any to ! $LAN_IF port 25
block out quick log on $INET_IF proto tcp from $INET_IF to ! $CYFRA_SMTP port 25
##### <=== For LanNetwork ===> #####
pass in on $LAN_IF from $LAN_IF:network to any
##### <=== For PFStat ===> #####
pass in on $INET_IF inet proto tcp from <admins> to port 80 queue (admin, ack)
##### <=== VPN RULES ===> #####
pass in on $INET_IF inet proto tcp from <admins> to port pptp queue (admin, ack)
pass in on $INET_IF proto gre from <admins> to any queue (admin, ack)
pass out on $LAN_IF inet from 192.168.0.200/30 to $LAN_IF:network queue (admin, ack)
pass out on $LAN_IF inet from tun to $LAN_IF:network
##### <== SSH RULES ==> #####
pass in quick on $INET_IF inet proto tcp from <admins>  to $INET_IF port 22 queue (ssh, ack) modulate state
pass in on $INET_IF inet proto tcp from any to $INET_IF port 22 queue (ssh, ack) synproxy state \
(max-src-conn 10, max-src-conn-rate 5/30, overload <bruteforce> flush global)

##### <== Pass OUT ==> #####
pass out on $INET_IF inet to any queue (main, ack) modulate state
##### <== Pass ICMP ==> #####
pass log inet proto icmp all icmp-type $ICMP_TYPE queue icmp
root@gw:~#

Понятие о том что здесь написано приходит после прочтения FAQ по PF . А вообще, благодаря очень простому синтаксису и принципу работы, правила pf читаются очень легко 🙂

Более подробно остановлюсь, разве что, на ssh правилах. Последнее время розвелось много всяких паскудных ботов, которые подбирают пароли для входа по всему чем можно войти 😀 Приходится както защищаться от километровых failed — ов в логах 🙂 Вот один из вариантов для ssh:

#####<== SSH RULES ==> #####
pass in quick on $INET_IF inet proto tcp from <admins>  to $INET_IF port 22 queue (ssh, ack) modulate state
pass in on $INET_IF inet proto tcp from any to $INET_IF port 22 queue (ssh, ack) synproxy state \
(max-src-conn 10, max-src-conn-rate 5/30, overload  flush global)

Первое правило — пропускаем тех кто в таблице admins без всяких там приколов.

Второе — пропускаем из инета на порт 22 всех но с ограничениями:

  • max-src-conn 10 — не более 10 state с одного ip
  • max-src-conn-rate 5/30 — не более 5 соединений в течении 30 секунд

Все кто превысил данные лимиты, помещаются в таблицу bruteforce и блокируются правилом

block log quick from <bruteforce>             # Block ssh bruteforcers

Для очистки этой таблицы использую такую вот командочку, которую засунул в cron и выполняю раз в час:

admin@gw:~$ sudo crontab -l |grep -i brute
#### <- For clean entries from table SSH BRUTEFORCES older than 1 hour ! -> ####
59      *       *       *       *       /sbin/pfctl -t bruteforce -T expire 86400
admin@gw:~$

В процессе отладки наш лучший друг, товарищ и брат — tcpdump, который может слушать как реальные интерфейсы, так и интерфейс pflog0 на котором видно те пакеты, которые логируются (слово log в правиле какраз для этого). Использование снифера с такими опциями:

root@gw:~# tcpdump -n -e -ttt -i pflog0
tcpdump: listening on pflog0, link-type PFLOG
Mar 16 22:12:22.963961 rule 1/(match) block in on rl0: 0.0.0.0.68 > 255.255.255.255.67: xid:0x52525230 secs:39663 flags:0x8000 [|bootp] [ttl 1]
^C
1 packets received by filter
0 packets dropped by kernel
root@gw:~#

очень информативно рассказывает о судьбе пакетов. В данном примере мы видим что пакет заблочен (block) первым правилом (rule 1) на внутресетевом интерфейсе (rl0) ну и source/destination пакета — 0.0.0.0.68 > 255.255.255.255.67 (в конце после четвертого октета, после точки, показан номер порта источника/назначения соответственно)

Ну вот какбы и все 🙂 Пакетики натятся, клиенты довольные сидят в инете 🙂 А админы пьют пиво и закусывают рыбкой …. все удачи!

Настройка GPRS модема Wavecom M1306B для Киевстар в Linux

Никаких особых «фишек». Все просто и лаконично.

Создаем конфиги с таким содержимым:

[root@test ~]# cat /etc/ppp/peers/gprs
/dev/ttyS0 115200
nobsdcomp
nodeflate
connect '/usr/sbin/chat -v -f /etc/ppp/chat-gprs'
noauth
noipdefault
usepeerdns
defaultroute
#debug
#nodetach
persist
## new ###
novj
crtscts
modem
lock
user igprs

[root@test ~]#

Читать полностью

Настройка fetchmail для сбора почты

Так уж сложилось исторически что у меня около 10 email адресов. Потихоньку-помаленьку в силу разных нужд и обстоятельств заводились то один то второй 🙂 Так насобиралось их уже немерено с разными login/password, на разных серваках … запоминать все эти данные уже стало трудновато, а следить то за почтой надо. Вобщем после очередной переустановки ОС настраивать MUA (читай почтовый клиент) на все эти ящики было совсем лениво. Поэтому решил подумать как же все это настроить по фэн-шую … чтобы почта собиралась гдето в одном месте. Ведь клево будет — настраиваеш только одну учетку в MUA на которую сыпется вся почта из всех ящиков. Придумать удалость только 2 пути решения:

  1. На одной из web-mail настроить сбор почты из других аккаунтов (такое поддерживает gmail)
  2. На своем собственном домашнем сервере настроить сбор почты всех учеток средствами fetchmail и потом роздать в локальную домашнюю сеть по IMAP (настроить dovecot)

Я выбрал второй вариант — итак, настраиваем fetchmail!

Начальные данные:

  • внешний ip домашнего сервера — 123.123.123.123 ;
  • внутренний ip домашнего сервера — 192.168.0.1 ;
  • пользователь на домашнем сервере для которого будем качать всю почту — user ;
  • на домашнем сервере установлен Debian ;

Из под root делаем 2 вещи:

  • Устанавливаем fetchmail
black:~# apt-get install fetchmail
  • Добавляем в /etc/rc.local такую строчку для автозагрузки fetchmail:
su - user -c "fetchmail -k"

Прим: ключик -k (keep) нужен если вы не хотите чтобы сообщения удалялись с сервера. (Оставлять копии сообщений на сервере). Если ненужно — можете убрать!

Дальше делаем уже из под пользователя user:

  • правим конфиг fetchmail-а (который находится в хомяке пользователя) ~/.fetchmailrc до такого состояния:
set daemon 300
#
poll mail.miha.net.ua proto pop3
user "user_131" with pass "11223344" is user here;
poll mail.mazzza.net.ua proto pop3
user "mysorka" with pass "bellstore" is user here;
poll mail.best.ua proto pop3
user "funbmw" with pass "my_password_here" is user here;
poll pop3.mail.ru proto pop3
user "user...11" with pass "mail_pass" is user here;
poll freemail.ukr.net proto pop3
user "lamer" with pass "lamers_pass" is user here;
poll freemail.ukr.net proto pop3
user "user99" with pass "users" is user here;
poll pop.gmail.com proto pop3 port 995
user 'user_23@bigmir.net' with pass "bigmir_pass" is user here ssl;
poll pop.gmail.com proto pop3 port 995

user 'Bestuser.ua' with pass "megagmailpass" is user here ssl;

Как видите, настройка проще простого!

set daemon 300 — одначает что процесс демонизируется и проверяет новую почту каждые 5 минут (300 секунд)

Вот запись для учетки на некоем сервере mail.miha.net.ua:

который дает мне почту по pop3 для пользователя user_131 с паролем 11223344

is user here — означает что в нашей системе почта предназначена пользователю user

Проще не придумаеш 🙂

С серверами у которых подключение по ssl чуть сложнее — но тоже неособо:

имея учетку на gmail мы легко тянем из нее почту используя данные:

  • порт подключения — 995
  • защищенное соединение ssl — да
  • пользователь — Bestuser.ua
  • пароль — megagmailpass

Ну вот и закончилась настройка 🙂

Теперь просто в консоли из под пользователя user запускаем fetchmail -k чтобы запустить сбор почты. При следующей загрузке системы он запустится автоматически, мы же его добавили в автозапуск 😉

Про настройку dovecot расскажу какнибудь позже … потому что я там несколько игрался с sieve — поэтому статейка тоже немаленькая получится :). Накрайняк если нужно быстро поднять IMAP сервер — нужно просто поставить dovecot.

black:~# apt-get install dovecot-imapd

Он сразу же после установки готов к роздаче почты ( с авторизацией для реальных системных пользователей на сервере)  на 100 %

Всем удачи 🙂

Задачу решили — можно и пива попить!

BMW E36 — Мануалы

Нашел вот на просторах огромного инета сервис-мануалы на BMW E36 1991-2000 годов выпуска. Формат PDF, качество вполне сносное. Вобщем, может комуто еще понадобится — угощайтесь наздоровье!

BMW E36 Manual RU

Скачать: Bmw e36 Руководство по ремонту

Размер: ~67МБ

Формат: PDF

Издано: Москва

Год издания: 1997

Язык: русский!


BMW E36 Service-Manual EN

Скачать: BMW 3 Series E36 Service Manual

Размер:  ~93МB

Формат: PDF

Издано: Cambridge Massachusetts

Год издания: 1999

Язык: английский

.

.

.

Revista Tecnica - BMW 3 Series E36

.

.

Скачать: Revista Tecnica del automovil BMW Serie 3 E36

Размер: ~ 55MB (111 страниц)

Формат: PDF

Издано: ANETO-ETAI

Год издания: 2000

Язык: испанский

Автомобиль-мечта!

Авто моей мечты … что сказать? Пока просто кину несколько картинок 🙂 Сейчас, правда, только мечтаю — но уверен что скоро буду счастливым обладателем такого вот чуда Баварского производства 90-х годов.

Большие рядные 6-ти цилиндровые движки …. ммммм … это просто круть! Особенно M52 с VANOS. Кажись в самом конце выпуска этой модельке еще удалось ухватить двигатель M52TU ( с Double Vanos) — но насчет этого неуверен на 100%. Вобщем — мечта!

Скрываем информацию про Apache2 и версию PHP

Если ктото из вас читал хоть какую-нибудь книгу или статью о взломе, тот знает, что первым делом злоумышленник пытается собрать максимально возможное количество информации о жертве, и только потом, учитывая эти данные, принимает решение про алгоритмы и инструменты для своего «черного дела».

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

Итак, смотрим (на приглашение сервера после успешного конекта надо ввести команду «HEAD / HTTP/1.0» и 2 раза Enter):

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 09:56:18 GMT
Server: Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny6 with Suhosin-Patch
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=ffffebc04d32c2e035055dd5259b2d19; expires=Tue, 23 Mar 2010 13:29:38 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 09:56:18 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Как видите, информации даже через чур много, и это настрораживает. Наш собственный web server радостно готов рассказать кому угодно не только о себе но и о названии/версии системы в которой он работает. Короче, предатель еще тот 😀 Ну чтож ….  вразумить его не делать это довольно легко!

Делаем следующее:

  • переходим под root:
black:~$ su -

Enter password:
  • открываем любимым редактором главный конфигурационный файл apache2:
black:~# vim /etc/apache2/apache2.conf

конфиг довольно большой …. листаем в самый конец

  • добавляем пару вот таких опций:
### Hide Version of Apache ###
ServerTokens ProductOnly
ServerSignature Off

названия опций довольно красноречиво рассказывают о себе 🙂

  • перезагружаем apache2 одной из команд (кому что больше нравится):
black:~# apache2ctl restart

или так:

black:~# /etc/init.d/apache2 restart

И снова пробуем спросить заголовки у apache2 с помощью telnet

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 09:57:57 GMT
Server: Apache
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=81a8530d7e6a33847a5542ac544dfa74; expires=Tue, 23 Mar 2010 13:31:17 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 09:57:57 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Ну вот …. так то гораздо лучше, web server теперь просто и лаконично говорит что он apache … и все! Лишнее,  правда, еще болтает php. Ну тогда давайте и его уговорим не болтать все подряд про наш супер секюрный сервак 🙂

  • опять же из под root на web сервере открываем конфиг /etc/php5/apache2/php.ini любимым редактором:
black:~# vim /etc/php5/apache2/php.ini
  • ищем опцию:
expose_php = On
  • и присваиваем ей значение Off … тоесть редактируем до такого состояния:
expose_php = Off
  • сохраняем, выходим с редактора
  • перезапускаем apache2
black:~# apache2ctl restart

снова пробуем прочитать заголовки telnet-ом

black@laptop ~ $ telnet my.web.server.com 80
Trying 123.123.123.123...
Connected to my.web.server.com.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 28 Feb 2010 10:36:40 GMT
Server: Apache
Set-Cookie: SESSd41d8cd98f00b204e9800998ecf8427e=b37412aa627d01ed985f36207276cef2; expires=Tue, 23 Mar 2010 14:10:00 GMT; path=/
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Sun, 28 Feb 2010 10:36:40 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

Connection closed by foreign host.
black@laptop ~ $

Красота! Про php теперь вообще молчок 🙂  Вот то чего я и добивался … ээээх кайф!

На последок скажу, что многие считают подобные меры предосторожности излишними, мол что такого если и подсмотрят … всеравно же софтина очень надежная и секюрность ее проверена годами! Но я всегда руководствуюсь иным принципом — «Безопасности много не бывает!» Поэтому, надеюсь помог тому кто действует по схожим принципам, а тем кто не заморачивается — может задумаются, делов то на минуту 🙂 А какерам досадно 🙂

Засим спешу откланяться! Всем удачи и супер-пупер секюрности!