czwartek, 29 stycznia 2009

Logowanie ruchu sieciowego

Jeśli mamy router na Linux'ie możemy sobie poradzić czymś takim:

tcpdump -i eth1 -t -q tcp[tcpflags]=tcp-syn | awk -v TIME="date +'%Y:%m:%d.%T'" 'function Time(t){ TIME | getline t; close(TIME); return t }{print Time() " " $2 " > " $4}' >> net.log

Z pliku tworzonego w powyższy sposóp np. możemy wyciągnąć listę miejsc z którymi nawiązano połączenie:

cat net.log | grep SPRAWDZANY_HOST | awk '{print $4}' | sort | uniq -c

Ewentualnie możemy odfiltrować za pomocą grep'a: np. grep -v "http\|pop3" albo grep -v "google\|gadu"

środa, 28 stycznia 2009

IPSec - tutorial

Wartościowy materiał dotyczący IPSec

Linux full backup & restore w praktyce 2

Sytuacja wyjściowa - mamy serwer na FC6.
Chcemy go zwirtualizować do środowiska testowego w ramach Virtual PC 2007.


Konfiguracja dysków/partycji:

------------------------------------------------------------------------

#fdisk -l

Disk /dev/hda: 10.1 GB, 10110320640 bytes
255 heads, 63 sectors/track, 1229 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 1229 9767520 8e Linux LVM

#df -H

System plików rozm. użyte dost. %uż. zamont. na
/dev/mapper/VolGroup00-LogVol00
9,2G 3,0G 5,8G 34% /
/dev/hda1 104M 17M 82M 18% /boot
tmpfs 131M 0 131M 0% /dev/shm

#lvm
lvs Display information about logical volumes
lvm> lvs


LV VG Attr LSize Origin Snap% Move Log Copy%
LogVol00 VolGroup00 -wi-ao 8,78G
LogVol01 VolGroup00 -wi-ao 512,00M


dumpconfig Dump active configuration
lvm> dumpconfig


devices {
dir="/dev"
scan="/dev"
filter="a/.*/"
cache="/etc/lvm/.cache"
write_cache_state=1
sysfs_scan=1
md_component_detection=1
}
activation {
missing_stripe_filler="/dev/ioerror"
reserved_stack=256
reserved_memory=8192
process_priority=-18
mirror_region_size=512
mirror_log_fault_policy="allocate"
mirror_device_fault_policy="remove"
}
global {
umask=63
test=0
activation=1
proc="/proc"
locking_type=1
fallback_to_clustered_locking=1
fallback_to_local_locking=1
locking_dir="/var/lock/lvm"
}
shell {
history_size=100
}
backup {
backup=1
backup_dir="/etc/lvm/backup"
archive=1
archive_dir="/etc/lvm/archive"
retain_min=10
retain_days=30
}
log {
verbose=0
syslog=1
overwrite=0
level=0
indent=1
command_names=0
prefix=" "
}

#vgdisplay

--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 9,31 GB
PE Size 32,00 MB
Total PE 298
Alloc PE / Size 297 / 9,28 GB
Free PE / Size 1 / 32,00 MB
VG UUID auUAps-FNGc-LzyH-nrlD-kIGs-DBEl-zneb6r

# lvdisplay

--- Logical volume ---
LV Name /dev/VolGroup00/LogVol00
VG Name VolGroup00
LV UUID RPJr3U-bMrm-R0dk-TrYi-QHYU-q0qd-tlRVIu
LV Write Access read/write
LV Status available
# open 1
LV Size 8,78 GB
Current LE 281
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0

--- Logical volume ---
LV Name /dev/VolGroup00/LogVol01
VG Name VolGroup00
LV UUID rRaoSO-38zd-q2mU-Od5y-tCV2-CsWx-TL3M2r
LV Write Access read/write
LV Status available
# open 1
LV Size 512,00 MB
Current LE 16
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:1

#cat /etc/fstab

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0

------------------------------------------------------------------------

Przede wszystkim przygotowujemy zrzuty plików naszego systemu który chcemy przenieść:

tar cvpjf /root/backup/backup_all.tar.bz2 --exclude=/proc --exclude=/boot --exclude=/lost+found --exclude=/root/backup/backup_all.tar.bz2 --exclude=/mnt --exclude=/sys /
tar cvpjf /root/backup/backup_boot.tar.bz2 /boot

Tak przygotowane obrazy udostępniamy przez SSH maszynie docelowej.

Do całego procesu "przywracania" serwera w wirtualnym środowisku użyjemy Sidux'a.

Podczas odpalania naszego LiveCD w parametrach uruchomieniowych dopisujemy ' xmodule=vesa' celem zapewnienia kompatybilnosci z naszym środowiskiem testowym w postaci VirtualPC 2007.

Opdalamy terminal na prawach root'a

Przygotowujemy nasz dysk wirtualny z VirtualPC za pomocą fdiska.

Zakładamy dwie partycje podstawowe :

/dev/sda1 - 100MB - docelowo na ext3 - ustawiamy flagę BOOT
/dev/sda2 - reszta miejsca - docelowo na Linux LVM

czyli pierwsza partycja:

#fdisk /dev/sda
>n
>1
>+100M
>a
>1

druga partycja:

>n
>2
>
>
>t
>2
>8e

>w

Upewniamy się że wszystko OK:

#fdisk -l /dev/sda

Następnie:

pvcreate /dev/sda2
vgcreate VolGroup00 /dev/sda2
lvcreate -L 15G -n LogVol00 VolGroup00
lvcreate -L 512M -n LogVol01 VolGroup00

Formatujemy:

mkfs.ext3 /dev/mapper/VolGroup00-LogVol00

mkswap /dev/mapper/VolGroup00-LogVol01
swapon /dev/mapper/VolGroup00-LogVol01

Podłączamy naszą partycję docelową dla plików:
mkdir /mnt/dysk
mount /dev/mapper/VolGroup00-LogVol00 /mnt/dysk

Podłączamy nasze źródło plików:
mkdir /mnt/backup
sshfs root@host:/root/backup /mnt/backup

Rozpakowujemy pliki:
tar xvpfj /mnt/backup/backup_all.tar.bz2 -C /mnt/dysk/

Podłączamy naszą partycję docelową boot:
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot

Rozpakowujemy pliki:
tar xvpfj /mnt/backup/backup_boot.tar.bz2 -C /mnt/

Odmontowujemy backup co by nas nie korciło:
umount /mnt/backup

Odtwarzamy katalogi wyłączone z backupowania:
cd /mnt/dysk
mkdir proc
mkdir lost+found
mkdir mnt
mkdir sys

Zmianie delikatnie uległa struktura dysków, zatem musimy się ewentualnie przyjrzeć plikom
/boot/grubmenu.lst
/etc/fstab
/etc/mtab
/etc/blkid/blkid.tab
/etc/blkid/blkid.tab.old
/etc/lvm/.cache

W związku z wystąpieniem błędu "fsck.ext3 Unable to resolve 'LABEL=/boot'" koniecznym okazało się wykonanie poleceń:

e2label /dev/hda1 /boot
tune2fs -L /boot /dev/hda1

Prawdopodobnie jedno z powyższych jest zbędne :)
Równie prawdopodobna jest konieczność utworzenia na dysku /dev/mapper/VolGroup00-LogVol00 katalogu /boot

Odmontowujemy wszystkie podłączone zasoby i reboot

Ustawiamy ponownie GRUB'a na dysku /dev/sda1

- odpalamy LiveCD
- w bootmenu - 2x ESC
- wciskamy 'c' - linia komend grub'a
- root (hd0,0)
- setup (hd0)
- halt

Odłączamy obraz LiveCD i bootujemy się z naszego wirtualnego dysku. Żeby nic się nie mieszało w naszej infrastrukturze odłączamy sieć dla wirtualnej maszyny.

Wskazówka: przy problemach z grafiką parametr grub'a 'vga=769' powoduje uruchomienie w rozdzielczosci 640x40x8bit.
Wskazówka#2: przy problemach z zalogowaniem się, parametr grub'a 'single' powoduje uruchomienie w trybie linux single user

Potencjalne problemy:

1) podczas logowania w CLI jest dokonywana autoryzacja, ale nie startuje nam bash i wracamy do logowania:

Last login Thu Aug 30 19:17:23 on tty1
audit (1188526650.254:17): avc: denied {entrypoint} for pid=2575 comm= "login
" name="bash" dev=dm-0 ino=107315213 scontext= user_u: system_r: hotplug_t: s0 tcont
ext= system_u: object_r: file_t: s0 tclass= file
login: no shell: Permission denied.
login: couldn't exec shell script: Permission Denied

Wskazówka: http://forums.fedoraforum.org/showthread.php?p=857325

Przyczyny:

Archiving Files with star
http://docs.fedoraproject.org/selinux-user-guide/f10/en-US/sect-Security-Enhanced_Linux-Maintaining_SELinux_Labels_-Archiving_Files_with_star.html

The UnOfficial SELinux FAQ
http://www.crypt.gen.nz/selinux/faq.html

Rozwiązanie nieeleganckie:
wyłączenie SELinuxa w /etc/selinux/config poprzez ustawienie dyrektywy SELINUX=disabled

Rozwiązanie bardziej eleganckie (prawdopodobnie):
pierwotna archiwizacja plików przez polecenie:
#star -xattr -H=exustar -c -f output.tar [files]

2) inne sposoby wgrania bootmanager'a:

Następnie przełączamy się do nowego środowiska:

mount --bind /dev/ /mnt/dysk/dev/
mount -t proc proc /mnt/dysk/proc/

Podmieniamy główny system plików na tą partycję:
chroot /mnt/dysk/ /bin/bash

W zależności od posiadanego bootmenedżera:

nano /etc/lilo.conf
Po czym:
lilo -v

lub

nano /boot/grub/menu.lst
grub-install --no-floppy --recheck /dev/sda1

exit
reboot

Jeśli komputer nie wystartował, ponownie uruchamiamy LiveCD:
mkdir /mnt/dysk
mount /dev/sda1 /mnt/dysk
grub-install --no-floppy --recheck --root-directory=/mnt/dysk /dev/sda1

------------------------------------------------------------------------

Garść wiedzy:

Tutaj tutorial dotyczący przebudowy partycji:
http://www.unixy.pl/forum/viewtopic.php?p=6427

I niejako przy okazji dotyczący przywracania GRUB'a
http://www.szarp.com.pl/howto/howto/html/grub-rescue.html

Deaktywacja LVM'a:
http://forums13.itrc.hp.com/service/forums/questionanswer.do?admit=109447627+1233063550888+28353475&threadId=1046794

PLD+LVM mini HOWTO:
http://bilbo.sgw.art.pl/doku.php?id=lvm

Jak ustawić LVM, jak robić snapshoty oraz automatycznie powiększać LVM
http://devrandom.pl/2008/12/lvm/

Tu jeszcze o narzędziach dotyczących dysków:
http://blog.oddied.net/2008/05/13/tutorial-od-uuid-do-label-w-ubuntu/

Instalacja PHPList

1. Miejsce docelowe \\NASZSERWER\HTDOCS\PHPLIST
2. Kopiujemy z paczki zawartość public_html\lists
3. Tworzymy bazę danych
phplist z utf8_bin
phplist / naszehasło

Żeby nie pojawił się błąd:

Database error 1071 while doing query Specified key was too long; max key length is 1000 bytes
http://forums.phplist.com/viewtopic.php?=&p=27451

w structure.php ustawiamy
"user_blacklist_data" => array(
"email" => array("varchar(233) not null unique","Email"),

4. Ustawiamy config.php
$language_module = "polish.inc";
$database_host = "localhost";
$database_name = "phplist";
$database_user = "phplist";
$database_password = 'naszehasło';
$installation_name = 'PHPlist';
$table_prefix = "phplist_";
$usertable_prefix = "phplist_user_";
$pageroot = '/phplist';
$adminpages = '/phplist/admin';

5. http://naszserwer/phplist/admin/
Wybieramy Initialise database

6. http://naszserwer/phplist/admin/?page=setup
wykonujemy pozostałe wstępne czynności konfiguracyjne
a. nowe hasło superadmina - HasłoSU

7. utworzenie nowej skrzynki pocztowej
newsletter@naszadomena.pl

adduser -d /home/naszpodkatalog/newsletter -g naszagrupa -m -p HasłoNews newsletter
/etc/mail/virtusertable - dodajemy użytkownika newsletter
makemap hash virtusertable < virtusertable

8. konfigurujemy config.php podając namiary na serwer SMTP i POP3 (dla bounces)
$bounce_mailbox_host = 'pop.naszserwer.pl';
$bounce_mailbox_user = 'newsletter';
$bounce_mailbox_password = 'HasłoNews';

define("PHPMAILERHOST",'smtp.naszserwer.pl');
$phpmailer_smtpuser = 'newsletter';
$phpmailer_smtppassword = 'HasłoNews';

9. Ustawiamy na 0 dyrektywę define ("TEST",0); by sprawdzić czy wiadomości są dostarczane

10. Plik polish.inc - zmieniamy kodowania na utf-8

piątek, 23 stycznia 2009

Newsletter dla całej firmy

Aktualnie poszukuję rozwiązania umożliwiającego gromadzenie bazy danych email klientów z podziałem na grupy, jednocześnie pozwalającego na wysyłanie newsletterów (najlepiej w HTML'u). Kandydaci:

Krishanletter, PHPList (instrukcja) oraz dyskusja.

Druga ścieżka: Exchange o ile da się podpiąć klientom spoza domeny / LDAP o ile klienci mogą edytować wpisy.

HTML Url Encoding Reference

... jak w temacie ...

czwartek, 22 stycznia 2009

Linux full backup & restore w praktyce

Potrzebne będą: Sidux oraz podstawowa wiedza. Ewentualne drugie źródło wiedzy.
Przy problemach z uruchamianiem Sidux'a (np. w VirtualPC 2007) przydatna będzie lista opcji startowych

BT3, kismet, airodump-ng i TP-Link TL-WN551G

Edytujemy /usr/local/etc/kismet.conf
Dodajemy gdzieś na początku linię:
source=madwifi_ag,wifi0,AtherosABG

Tryb klienta karty przestawiany poleceniami:

wlanconfig ath0 destroy
wlanconfig ath0 create wlandev wifi0 wlanmode sta

Airodumpa uruchamiamy poleceniem:
airodump-ng --write /naszkataloggdzies/naszplik --channel x --ivs wifi0

Połączmy naszą kartę ze sprawdzanym AP'kiem:
aireplay-ng -1 0 -e SSID -a MAC_AP -h MAC_NASZEJ_KARTY wifi0

MAC'a naszej karty uzyskamy m.in. poprzez:
macchanger -s ath0

Minitutorial: włam na WLAN

środa, 21 stycznia 2009

BackTrack 3 - instalacja na dysku twardym

Przede wszystkim ściągamy LiveCD.
Następnie bootujemy BT3 (osobiście dla tego przypadku preferuję tryb tekstowy).
Logujemy się oczywiście ...

cfdisk
czyli zakładamy partycję na / oraz na swapa. Ustawiamy bootowalną. Reboot ...

Nową partycję formatujemy w ReiserFS (u mnie /dev/hda1):
mkreiserfs /dev/hda1

Różne inne sztuczki:

umount /dev/hda*
cd /
mkdir mnt/backtrack
mount /dev/hda* /mnt/backtrack

mkswap /dev/hda2
swapon /dev/hda2 (ewentualnie swapoff/swapon)

mkdir /mnt/backtrack/boot/
cp --preserve -R /{bin,dev,home,pentest,root,usr,etc,lib,opt,sbin,var} /mnt/backtrack/

Trochę potrwa i miejsca też zeżre :)

mkdir /mnt/backtrack/{mnt,proc,sys,tmp}
mount --bind /dev/ /mnt/backtrack/dev/
mount -t proc proc /mnt/backtrack/proc/
cp /boot/vmlinuz /mnt/backtrack/boot/

chroot /mnt/backtrack/ /bin/bash
nano /etc/lilo.conf

Wpisujemy co poniżej:

lba32
boot /dev/hda
prompt
timeout=60
change-rules
reset
vga=791
image = /boot/vmlinuz
root = /dev/hda1
label = backtrack3_final

Po czym:
lilo -v
exit
reboot

Przerobiłem na własnej skórze na podstawie poniższych:
http://kin.calvin.free.fr/blog/?p=16
http://forums.remote-exploit.org/showthread.php?t=14751

Problem - odbiorca wiadomości z Outlooka otrzymuje załącznik "Untitled Attac.dat" zamiast np. wpisu z kalendarza

Przyczyna:

MailScanner na serwerze poczty analizuje wiadomości między innymi poprzez "głęboką" analizę wysyłanych załączników.
Outlook wszelkie informacje własne "wymieniane z innymi Outlookami" wysyła w postaci załącznika winmail.dat.
Plik ten ma format archiwum TNEF i na serwerze poczty może być rozpakowany w celu sprawdzenia zawartości.
Jak wierzę, w zależności od konfiguracji programu, załącznik może być złożony z powrotem i zamieszczony jako nowy załącznik.
W naszym przypadku powodowało to dostarczenie "nieczytelnego" pliku i brak oczekiwanege rezultatu.
Należało w pliku konfiguracyjnym MailScanner'a zmienić dyrektywę "Use TNEF Contents" z "replace" na "no"
W kwestii wiary - mam nadzieję, że poniższa konfiguracja nie obniża bezpieczeństwa. Problem na pewno rozwiązuje.


# Expand TNEF attachments using an external program (or a Perl module)?
# This should be "yes" unless the scanner you are using (Sophos, McAfee) has
# the facility built-in. However, if you set it to "no", then the filenames
# within the TNEF attachment will not be checked against the filename rules.
Expand TNEF = yes

# When the TNEF (winmail.dat) attachments are expanded, should the
# attachments contained in there be added to the list of attachments in
# the message?
# If you set this to "add" or "replace" then recipients of messages sent
# in "Outlook Rich Text Format" (TNEF) will be able to read the attachments
# if they are not using Microsoft Outlook.
#
# no => Leave winmail.dat TNEF attachments alone.
# add => Add the contents of winmail.dat as extra attachments, but also
# still include the winmail.dat file itself. This will result in
# TNEF messages being doubled in size.
# replace => Replace the winmail.dat TNEF attachment with the files it
# contains, and delete the original winmail.dat file itself.
# This means the message stays the same size, but is usable by
# non-Outlook recipients.
#
# This can also be the filename of a ruleset.
Use TNEF Contents = no

# Some versions of Microsoft Outlook generate unparsable Rich Text
# format attachments. Do we want to deliver these bad attachments anyway?
# Setting this to yes introduces the slight risk of a virus getting through,
# but if you have a lot of troubled Outlook users you might need to do this.
# We are working on a replacement for the TNEF decoder.
# This can also be the filename of a ruleset.
Deliver Unparsable TNEF = no

poniedziałek, 19 stycznia 2009

Jak nie powinna wyglądać domena?

www.obwodnicapolnocnaaglomeracjitrojmiejskiej.pl

Nie daj Boże być w potrzebie połączenia się ze stroną z telefonu komórkowego :)

sobota, 17 stycznia 2009

Squid - jak wyczyścić cache

squid stop

albo lepiej

squid -k kill

cd /var/spool/squid
rm -rf *
squid -z

squid start

czwartek, 15 stycznia 2009

Symfony - dzień drugi

Opisujemy strukturę bazy danych w pliku config/schema.yml
Następnie tworzymy bazę: mysqladmin -uroot -pmYsEcret create jobeet

Wywołujemy polecenie:
php symfony configure:database "mysql:host=localhost;dbname=jobeet" root mYsEcret
które tak na prawdę zapisuje informacje o dostępie do bazy w pliku config/databases.yml co możemy wszak wykonać ręcznie :)

Wykonujemy polecenie: php symfony propel:build-sql
które przygotowuje dla nas skrypty SQL tworzące strukturę naszej bazy danych. Wyniki przechowywane w katalogu data/sql/ - tutaj data/sql/lib.model.schema.sql

Ostatecznie wywołujemy: php symfony propel:insert-sql
które tworzy naszą bazę danych. Należy uważać (choć jest stosowny alert) - wykonanie tego polecenia usuwa dotychczasowe tabele.

Na marginesie: opis polecenia uzyskamy przez zastowanie parametru help np. php symfony help propel:insert-sql

Generujemy klasy PHP mapujące naszą relacyjną bazę danych na obiekty: php symfony propel:build-model
W wyniku powyższego w katalogu lib/model/ tworzone są skrypty zawierające po cztery klasy na każdą z tabel naszej bazy danych.
Np. dla tabeli jobeet_job:
- JobeetJob - obiekt tej klasy to pojedyńczy rekord tabeli
- BaseJobeetJob - klasa z której dziedziczy klasa JobeetJob. Za każdym wywołaniem propel:build-model klasa ta jest nadpisywana, więc wszystkie modyfikacje muszą znajdować się w ramach JobeetJob
- JobeetJobPeer - klasa zawierająca statyczne metody zwracające kolekcje rekordów
- BaseJobeetJobPeer - analogicznie dla klasy BaseJobeetJob

Edycja kolumn dla rekordów odbywa się poprzez wywoływanie metod get/set:
$job = new JobeetJob();
$job->setPosition('Web developer');
$job->save();
echo $job->getPosition();
$job->delete();

Definiowanie kluczy obcych (złączeń?) odbywa się poprzez linkowanie obiektów:
$category = new JobeetCategory();
$category->setName('Programming');
$job = new JobeetJob();
$job->setCategory($category);

Wracając do głównego wątku, dwa powyższe kroki oraz inne użyteczne wyniki można uzyskać prościej i bez konieczności potwierdzenia poprzez:
php symfony propel:build-all --no-confirmation

Jedną z zalet Symfony jest ponoć brak konieczności korzystania z instrukcji require / include. Koszt jaki trzeba za to udogodnienie ponieść jest niewielki, ale trzeba pamiętać że za każdym razem gdy dodamy nową klasę należy wyczyścić cache frameworka. Ponieważ wygenerowaliśmy sporo klas, wykonajmy:

php symfony cache:clear
lub w skrócie:
php symfony cc

Potrzebujemy jeszcze wstępnie wypełnionych tabel. Do tego celu możemy zastosować "skrypty" YAML umieszczane w katalogu data/fixtures/ oraz zadanie propel:data-load

Kiedy potworzymy już odpowiednie pliki wywołujemy: php symfony propel:data-load

Ewentualni zakładamy combo: propel:build-all-load wykonuje nam akcje propel:build-all oraz propel:data-load

Podział obowiązujący w ramach naszego dzieła: projekt -> aplikacje -> moduły
gdzie moduł to zestaw kodu PHP realizujący jakieś pojedyńcze zadanie np. zestaw operacji jakie użytkownik może wykonać na obiekcie reprezentującym zestaw danych z bazy.

Poznawany framework potrafi automatycznie generować moduły umożliwiające podstawowe operacje na danych z bazy w ramach wskazanego modelu:

php symfony propel:generate-module --with-show --non-verbose-templates frontend job JobeetJob

Powyższe utworzyło moduł job w ramach aplikacji frontend application dla modelu danych JobeetJob. W katalogu apps/frontend/modules/job/ utworzone zostały podkatalogi: actions/ oraz templates/

Plik actions/actions.class.php zawiera definicje wszystkich możliwych akcji dla modułu job:

index wyświetla rekordy tabeli
show wyświetla pola i ich wartości dla wskazanego rekordu
new wyświetla formularz do założenia nowego rekordu
create tworzy nowy rekord
edit wyświetla formularz do edycji istniejącego rekordu
update aktualizuje rekord w oparciu o wprowadzone dane
delete usuwa rekord z bazy

W dosłownym tłumaczeniu (zrozumienie zostawiam sobie na później):

Symfony potrzebuje tekstowej reprezentacji kategorii. Reprezentacja obiektu PHP jest definiowana przy pomocy metody magicznej__toString() i powinna być zdefiniowana dla każdej klasy modelu np. dla JobeetCategory:

// lib/model/JobeetCategory.php
class JobeetCategory extends BaseJobeetCategory
{
public function __toString()
{
return $this->getName();
}
}

A gdy już założę własną Firmę ...

... to być może skorzystam z potencjału poniższych:

http://ifirma.pl/index.php/home/poznaj-serwis/o-systemie-ifirmapl/mozliwosci-ifirma-pl

http://www.mikrofirmy.pl/

środa, 14 stycznia 2009

Hyper-V w kontekście mapowania portów COM -> Named Pipe

http://www.ravichaganti.com/blog/?p=65

Z tego co wyczytałem, na dzień dzisiejszy nie ma możliwości zamapowania fizycznego portu hosta na port w maszynie wirtualnej :(

wtorek, 13 stycznia 2009

Symfony - dzień pierwszy

Przygotowanie środowiska testowego: Debian 4.0r6 + XAMPP 1.7

wget http://heanet.dl.sourceforge.net/sourceforge/xampp/xampp-linux-1.7.tar.gz
tar xvfz xampp-linux-1.7.tar.gz -C /opt

Uruchamianie serwerów poprzez: /opt/lampp/lampp start
Ewentualne podstawowe zabezpieczanie: /opt/lampp/lampp security

W pliku .bashrc użytkownika na którym pracujemy dodajemy linię:
export PATH=$PATH:/opt/lampp/bin/

Następnie przechodzimy do instalacji Symfony:

mkdir -p /home/sfprojects/jobeet
cd /home/sfprojects/jobeet
mkdir -p lib/vendor
cd lib/vendor
wget http://www.symfony-project.org/get/symfony-1.2.2.tgz
tar zxpf symfony-1.2.2.tgz
mv symfony-1.2.2 symfony
rm symfony-1.2.2.tgz
cd ../..
php lib/vendor/symfony/data/bin/check_configuration.php

No i na pierwszy ogień należy w /opt/lampp/etc/php.ini ustawić:
short_open_tag = Off
magic_quotes_gpc = Off
register_globals = Off

I restart serwerów:
/opt/lampp/lampp stop
/opt/lampp/lampp start

Ponowne sprawdzenie:
php lib/vendor/symfony/data/bin/check_configuration.php

Nieźle, ale do pełni szczęścia doinstalujemy Alternative PHP Cache (APC)
Przede wszystkim potrzebujemy paczki developerskiej dla XAMMP'a:
wget http://garr.dl.sourceforge.net/sourceforge/xampp/xampp-linux-devel-1.7.tar.gz
tar xvfz xampp-linux-1.7.tar.gz -C /opt
apt-get install autoconf

Np. w katalogu domowym użytkownika:

wget http://pecl.php.net/get/APC-3.0.19.tgz
tar xvf APC-3.0.19.tgz
cd APC-3.0.19/
/opt/lampp/bin/phpize
./configure
make
make install

W pliku /opt/lampp/etc/php.ini dodajemy poniższe linie:

extension="apc.so"
apc.enabled="1"
apc.shm_size="30"

Ponowny restart serwerów (stop/start) i oby ostatecznie sprawdzamy po stronie konsoli:

cd /home/sfprojects/jobeet/
php lib/vendor/symfony/data/bin/check_configuration.php

Powinno już być bez błędów / ostrzeżeń. Ewentualnie upewniamy się poprzez wywołanie: "php -m" czy moduł APC został załadowany.

Następnie sprawdzamy check_configuration.php poprzez wywołanie z poziomu przeglądarki. Wystarczy skopiować plik i wywołać poprzez wpisanie odpowiedniego URL'a. Jeśli wszystko jest OK zobaczymy coś na kształt:

********************************
* *
* symfony requirements check *
* *
********************************

php.ini used by PHP: /opt/lampp/etc/php.ini


** Mandatory requirements **

OK requires PHP >= 5.2.4
OK php.ini: requires zend.ze1_compatibility_mode set to off

** Optional checks **

OK PDO is installed
OK PDO has some drivers installed: sqlite, pgsql, mysql, sqlite2
OK PHP-XML module installed
OK XSL module installed
OK can use token_get_all()
OK can use mb_strlen()
OK can use iconv()
OK can use utf8_decode()
OK has a PHP accelerator
OK php.ini: short_open_tag set to off
OK php.ini: magic_quotes_gpc set to off
OK php.ini: register_globals set to off
OK php.ini: session.auto_start set to off

Sprawdzamy wersję Symfony:
php lib/vendor/symfony/data/bin/symfony -V

Generujemy szkielet naszego projektu:
php lib/vendor/symfony/data/bin/symfony generate:project jobeet

Powyższe tworzy skrót 'symfony' dzięki czemu mniej wklepujemy w linii komend.
Projekt = zbiór aplikacji korzystających z tego samego modelu danych.

Generujemy szkielet aplikacji 'frontend'
php symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend

W pliku konfiguracyjnym dla projektu config/ProjectConfiguration.class.php zmieniamy linię z require_once na:
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
co zapewni nam lepszą przenośność projektu na inne serwery.

Aby nasz projekt był widoczny z przeglądarki, na warsztat bierzemy plik /opt/lampp/etc/httpd.conf i na samym końcu dodajemy:

# Ta linia może wystąpić tylko raz
NameVirtualHost 10.0.0.14:8080

Listen 10.0.0.14:8080


DocumentRoot "/home/sfprojects/jobeet/web"
DirectoryIndex index.php

AllowOverride All
Allow from All


Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf

AllowOverride All
Allow from All



Adres 10.0.0.14 wynika tylko stąd, że środowisko Debian+Symfony jest uruchamiane jako maszyna wirtualna, natomiast sprawdzanie aplikacji odbywać się będzie w ramach fizycznego systemu operacyjnego.

Restartujemy serwery i sprawdzamy jak chula: http://10.0.0.14:8080/index.php/
Następnie sprawdzamy jak działa nasze środowisko developerskie: http://10.0.0.14:8080/frontend_dev.php/ - nie działa.
Komunikat "You are not allowed to access this file. Check frontend_dev.php for more information." otrzymaliśmy z powodu łączenia się z innej maszyny. Edytujemy ten plik, wpisując zamiast 127.0.0.1 adres IP maszyny z której sprawdzać będziemy działanie naszego projektu.

Teoretycznie całe środowisko jest już gotowe. Warto jednak (zgodnie z tutorialem) poświęcić jeszcze 10 min na zapoznanie się z atakami XSS oraz CSRF, a także poznać zagadnienie wersjonowania aplikacji, co też teraz uczynię.

Przede wszystkim należy znaleźć hosting. Z braku doświadczenia wybrałem http://xp-dev.com/. Zakładamy konto np. 'repo'. Logujemy się. W menu Subversion wybieramy Create a new repository. Nadajemy nazwe np. 'jobeet'
Nasze repozytorium znajduje się pod adresem: https://svn.xp-dev.com/svn/repo_jobeet

Przydałby się jakiś klient: apt-get install subversion

I pobierzmy testowo (check out?) nasze puste repozytorium do katalogu jsr:
svn co https://svn.xp-dev.com/svn/repo_jobeet jsr
Jeśli wszystko jest OK, możemy skasować katalog jsr.

Następnie tworzymy standardową strukturę katalogów repozytorium:

svn mkdir -m "utworzona domyslna struktura katalogow" https://svn.xp-dev.com/svn/repo_jobeet/trunk https://svn.xp-dev.com/svn/repo_jobeet/tags https://svn.xp-dev.com/svn/repo_jobeet/branches

Checkout'ujemy pusty katalog trunk/:
cd /home/sfprojects/jobeet
svn co https://svn.xp-dev.com/svn/repo_jobeet/trunk/ .

Czyścimi cache i log:
rm -rf cache/* log/*

Ustawiamy na wszelki wypadek uprawnienia:
chmod 777 cache/ log/

Importujemy katalogi i pliki:
svn add *

Ustawiamy ignorowanie cache:
svn propedit svn:ignore cache
Otworzy się edytor. Wpisujemy * by ignorowana była cała zawartość i zapisujemy.
Podobnie dla katalogu log:
svn propedit svn:ignore log

I ostatecznie importujemy do repozytorium nasz projekt:
svn import -m "import poczatkowy" . https://svn.xp-dev.com/svn/repo_jobeet/trunk

poniedziałek, 12 stycznia 2009

Sendmail - naprowadzenie na założenie nowego konta

/etc/mail/virtusertable
makemap hash virtusertable < virtusertable

wtorek, 6 stycznia 2009

Podstawowe typy ataków na strony WWW

google.pl + SQL Injection | Cross Site Scripting (XSS) | Header Tampering | Path Traversal

Do poznania jest także narzędzie: http://sqlninja.sourceforge.net/sqlninjademo1.html

Hyper-V Manager - Access Denied - o co chodzi?

Jeżeli korzystamy z Windows Hyper-V Server 2008 i chcemy nim zarządzać z poziomu Visty przez snap-in do MMC, a uzyskujemy poniższy komunikat w ramach Hyper-V Managera:

HYPER-V MANAGER ACCESS DENIED UNABLE TO ESTABLISH COMMUNICATION BETWEEN

rozwiązanie znajdziemy tutaj: http://blog.augustoalvarez.com.ar/category/virtualization/

a w skrócie chodzi o to co poniżej (w ramach Visty):

Now that the server is properly configured for remote management, you have to run a simple procedure to fix this common error:

a. On “Run” insert “DCOMCNFG“. Click OK
b. Expand “Component Services“, expand “Computers“. Right click on “My Computer” and click on “Properties” (imagen)
c. Now click on “COM Security”
d. In “Access Permission” click “Edit Limits”
e. Select “ANONYMOUS LOGON” in “Group or User Name“. In the column “Allow“, set the “Permissions for User” with “Remote Access“.

Squid Transparent Proxy - przykładowa konfiguracja Squid'a

http_port 8080 transparent
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
cache_mem 64 MB
cache_swap_low 80
cache_swap_high 100
maximum_object_size 32768 KB
minimum_object_size 0 KB
maximum_object_size_in_memory 128 KB
ipcache_size 16384
fqdncache_size 0
cache_replacement_policy heap LFUDA
memory_replacement_policy heap GDSF
cache_dir ufs /var/spool/squid 6144 12 256
access_log /var/log/squid/access.log squid
cache_log /dev/null
cache_store_log none
dns_nameservers 208.67.222.222 208.67.220.220
hosts_file /etc/hosts
refresh_pattern -i \.(gif|jpg|jpeg|png|html|bmp|ico|css) 0 50% 7200 reload-into-ims
refresh_pattern -i \.(zip|gz|bz2|exe|rar|mp3|mpg|avi|wmv|vqf|ogg) 43200 100% 43200 reload-into-ims
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern . 0 20% 4320
half_closed_clients off
acl all src 0.0.0.0/0.0.0.0
acl siec src 10.0.0.0/255.255.255.0
acl ZA-DUZO maxconn 500
http_access deny ZA-DUZO siec
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow siec
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_reply_access allow all
icp_access allow all
cache_effective_group proxy
visible_hostname naszadomenajakas.pl
log_icp_queries off
store_avg_object_size 16 KB
store_objects_per_bucket 36
buffered_logs on
reload_into_ims on
acl FTP proto FTP
always_direct allow FTP
strip_query_terms off
coredump_dir /var/spool/squid

poniedziałek, 5 stycznia 2009

Jak wyłączyć wyszukiwanie drukarek w Windows XP?

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"NoNetCrawling"=dword:00000001

Inne sposoby: http://www.wss.pl/WindowsSBS/frmThread.aspx?tid=57805

Inne przydatne wpisy do rejestru: http://pliki.akk.net.pl/images/REG/system.reg

Archiwum bloga