Ten blog nie jest już rozwijany. Wraz ze wszystkimi artykułami zostały przeniesiony pod adres wmroczkowski.pl

Czy chcesz przejść pod nowy adres?

piątek, 25 lipca 2008

Jak wyświetlić czytelny i kolorowy kod na Blogspot?

Jeżeli chcemy na naszym blogu wyświetlać sformatowany (highlighted) kod jakiegokolwiek języka musimy zrobić kilka następujących czynności:
1. Instalujemy program o nazwie jEdit. Najlepiej najnowszą wersję. Jeśli ściągniemy Java based installer żadne skróty nie dodadzą nam się w systemie. Wtedy uruchamiamy program wchodząc do katalogu docelowego i odpalamy plik jedit.jar.
2. Uruchamiamy program, wchodzimy do zakładki Plugins -> Plugin Manager. Następnie klikamy Download options i wybieramy serwer lustrzany, który jest nam najbliższy. Teraz możemy zrestartować jEdit.
3. Ponownie wchodzimy do Plugin Manager i klikamy zakładkę Install. Odnajdujemy plugin o nazwie Code2HTML, zaznaczamy go i instalujemy.
4. Teraz musimy sobie przygotować kod, który będziemy chcieli wyświetlić i zapisać go na dysku. Musimy dopilnować aby plik miał prawidłowe rozszerzenie - jEdit potrafi rozpoznawać różne języki i dostosowuje do nich konkretne formatowania kodu. Kiedy wczytamy już tak przygotowany plik do programu, wchodzimy do Plugins -> Code2HTML -> HTMLize current buffer.
5. Edytujemy dowolnie wynik konwersji - możemy tu pozmieniać kolory oraz formatowania dla poszczególnych sesji. Zapisujemy gotowy plik z rozszerzeniem .html i uploadujemy go na jakiś serwer. Ja używam do tego google pages. Bardzo wygodne.
6. Teraz pisząc nowego posta na blogspot po prostu wstawiamy taki kod:Można tutaj przy okazji pogrzebać trochę w css'ie aby dopasować wygląd tego okna do swojego bloga. Poniżej znajduje się przykładowa funkcja służąca do formatowania kodu w PHP przygotowana w jEdit:

OK, to tyle na temat kolorowania składni kodu. Jeżeli ktoś zna jakieś inne ciekawe sposoby na wygenerowanie kodu na stronie w bardziej przejrzysty sposób to proszę pisać w komentarzach lub na maila.

Jak wyświetlić kolorowy (highlighted) kod PHP na swojej stronie?

Czasami zdarza się, że potrzebujemy czytelnie wyświetlić jakiś kod PHP na własnej stronie. Moglibyśmy go formatować za pomocą kodu HTML, CSS lub ewentualnie napisać jakąś funkcję w PHP, która zrobi to za nas. Niestety wszystkie te rozwiązania są bardzo czasochłonne. Tutaj przychodzi nam z pomocą funkcja highlight_string(). Za jej pomocą możemy bardzo łatwo wyświetlić kod PHP, który umieszczony w () zostanie odpowiednio sformatowany. A więc wpisując:

Zobaczysz mniej więcej coś takiego:

Napisałem "mniej więcej" ponieważ na blogspot nie ma możliwości dodawania skryptów PHP. Tak naprawdę kolorowy kod na blogspot uzyskuje się całkiem inaczej. Niedługo opiszę ten sposób.
Aby dowiedzieć się więcej szczegółów na temat highlight_string() zapraszam na stronę manuala PHP.

niedziela, 6 lipca 2008

Postfix - podstawowa konfiguracja serwera poczty na Linuxie

No więc stało się. W ostanim poście pisałem na temat konfiguracji DenyHosta i okazało się, że bardzo dobrą sprawą byłoby gdybyśmy mieli skonfigurowany na naszym systmie serwer poczty. Wydaję mi się, że najlepszą alternatywą do zasłużonego i niezbyt bezpieczniego sendmaila jest postfix. Nie będe tu się rozpisywał na temat szczegółowej konfiguracji, jeżeli ktoś będzie chciał szczegołowo wejść w temat to na pewno znajdzie mnóstwo dokumentacji w internecie, polecam przejrzeć tą na stronie postfixa dokumentacja. Teraz po protsu zróbmy tak żeby postfix działał optymalnie konfigurując go pod "przeciętnego" użytkownika. Zaczynajmy!

1. Ten punkt jest opcjonalny - dla tych którzy mają zainstalowany starszy serwer poczty jakim jest sendmail. Przede wszystkim musimy go usunąć. Najpeirw sprawdzamy czy sendmail jest obecnie uruchomiony:
ps x
Jeżeli tak, to go wyłączamy:
/etc/init.d/sendmail stop
i usuwamy:
apt-get remove --purge sendmail
Jeżeli usunięcie w ten sposób jest niemożliwe należy usunąc sendmaila ręcznie. Robimy to następująco:
which sendmail
po czym zmieniamy nazwy wyświetlonych plików:
mv sendmail sendmail.OFF
Teraz zabieramy prawa temu plikowi:
chmod 700 sendmail.OFF

Następnie usuwamy go ze skryptów startowych. Zależnie od dystrybucji, wpis powinien znajdować się w /etc/rc.d/ lub w /etc/rc.d/init.d . Należy odnaleźć wywołanie sendmaila w którymś z plików rc.X o je usunąć lub zahashować (#). W jego miejsce wpisujesmy postfix start.

2. Przechodzimy do instalacji postfixa - najłatwiejszy sposób to:
apt-get install postfix
po czym uruchomi nam się podstawowa konfiguracja. W pierwszym oknie klikamy OK, następnie w General type of configuration wybieramy Internet Site. W następnym oknie zobaczymy Mail Name defaultowo przypisana jest tu nazwa hosta, więc tak możemy zostawić. Teraz możemy przejść do właściwej części konfiguracji.

3. Zabieramy się za konfigurację lokalną. Wszystkie pliki konfiguracyjne znajdują się w /etc/postfix/. Nie ma tego dużo - my skupimy się na pliku main.cf. Przydatne nam będzie polecenie, które wyświetla wszystkie ustawienia oraz zmienne postfixa - postconf. Sprobuj je wywołać samo, a następnie z parametrem np. myhostname.
Otwieramy plik konfiguracyjny postfixa:
nano /etc/postfix/main.cf
Odnajdujemy wpis myhostname i upewniamy się, że jest tam wpisana nazwa naszego hosta.
Dla ułatwienia wrzucę tutaj podstawowy plik konfiguracyjny, który powinien działać:
command_directory = /usr/sbin
mail_owner = postfix
mydomain = wpisujemy nazwę naszej domeny
myhostname = wpisujemy nazwę naszego hosta
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, mail.$mydomain, localhost, $mydomain
relayhost =
relay_domains = $mydestination
mynetworks = 127.0.0.0/8 192.168.1.1/24 Dzięki pierwszemu adresowi nasza poczta rozsyłana jest globalnie, drugi adres jest adresem naszej podsieci - przeważnie jest to także nasza brama, dzięki temu adresowi maile są wysyłane w Świat.
inet_interfaces = all
inet_protocols = ipv4

4. Zapisujemy plik, wpisujemy postfix reload i teraz już możemy wysyłać pocztę za pomocą polecenia mail.
Podstawową konfigurację mamy za sobą. Tak skonfigurowany serwer poczty nie jest chroniony w żaden sposób i może posłużyć za bramę dla spamerów. Jeżeli naszym dostawcą internetu TP S.A. to nasze maile będą odbijane przez gmail. Na nasze maile również nie można w żaden sposób odpowiedzieć czy napisać do nas z zewnątrz. Wszystkie te problemy rozwiąże w kolejnych postach.

czwartek, 3 lipca 2008

DenyHosts, czyli jeszcze bezpieczniejsze SSH

Witam po długiej przerwie. Kto by pomyślał, że to będzie taki pracowity okres… Przejdźmy do rzeczy: ostatnimi czasy poświęcam więcej czasu systemowi o wiele znaczącej nazwie jaką jest Linux. Moje ostatnie plany „zmusiły” mnie do postawienia serwera na Debianie i jak się okazało sprawiło mi to wiele frajdy. Wszystko wspaniale działa – mysql, PHP, samba i rzecz, która była mi niezbędna do pracy – SSH. Po pewnym czasie zauważyłem, że na moim serwerze generuje się dziwny ruch – możemy to zobaczyć wpisując jako root następującą komendę:
cat /var/log/auth.log |grep invalid

Wynik będzie prawdopodobnie podobny do tego poniżej tylko, że znacznie duższy.

Jul 3 20:59:49 debian-serwer sshd[9627]: Failed password for invalid user alex from 193.218.155.219 port 36407 ssh2
Jul 3 20:59:52 debian-serwer sshd[9629]: Failed password for invalid user brett from 193.218.155.219 port 36504 ssh2
Jul 3 20:59:54 debian-serwer sshd[9631]: Failed password for invalid user mike from 193.218.155.219 port 37059 ssh2
Jul 3 20:59:57 debian-serwer sshd[9633]: Failed password for invalid user alan from 193.218.155.219 port 37120 ssh2
Jul 3 20:59:59 debian-serwer sshd[9635]: Failed password for invalid user data from 193.218.155.219 port 37707 ssh2
Jul 3 21:00:04 debian-serwer sshd[9639]: Failed password for invalid user http from 193.218.155.219 port 37879 ssh2
Jul 3 21:00:06 debian-serwer sshd[9641]: Failed password for invalid user httpd from 193.218.155.219 port 39878 ssh2
Jul 3 21:00:16 debian-serwer sshd[9649]: Failed password for invalid user info from 193.218.155.219 port 43904 ssh2
Jul 3 21:00:18 debian-serwer sshd[9651]: Failed password for invalid user shop from 193.218.155.219 port 44402 ssh2
Jul 3 21:00:21 debian-serwer sshd[9653]: Failed password for invalid user sales from 193.218.155.219 port 45696 ssh2
Jul 3 21:00:23 debian-serwer sshd[9655]: Failed password for invalid user web from 193.218.155.219 port 46620 ssh2
Jul 3 21:00:26 debian-serwer sshd[9657]: Failed password for invalid user www from 193.218.155.219 port 47784 ssh2
Jul 3 21:00:28 debian-serwer sshd[9659]: Failed password for invalid user wwwrun from 193.218.155.219 port 48591 ssh2
Jul 3 21:00:31 debian-serwer sshd[9661]: Failed password for invalid user adam from 193.218.155.219 port 49459 ssh2
Jul 3 21:00:33 debian-serwer sshd[9663]: Failed password for invalid user stephen from 193.218.155.219 port 50373 ssh2
Jul 3 21:00:35 debian-serwer sshd[9665]: Failed password for invalid user richard from 193.218.155.219 port 51208 ssh2
Jul 3 21:00:38 debian-serwer sshd[9667]: Failed password for invalid user george from 193.218.155.219 port 51476 ssh2
Jul 3 21:00:40 debian-serwer sshd[9669]: Failed password for invalid user michael from 193.218.155.219 port 52192 ssh2
Jul 3 21:00:43 debian-serwer sshd[9671]: Failed password for invalid user john from 193.218.155.219 port 52903 ssh2
Jul 3 21:00:46 debian-serwer sshd[9673]: Failed password for invalid user david from 193.218.155.219 port 53839 ssh2
Jul 3 21:00:48 debian-serwer sshd[9675]: Failed password for invalid user paul from 193.218.155.219 port 54252 ssh2
Jul 3 21:00:53 debian-serwer sshd[9679]: Failed password for invalid user angel from 193.218.155.219 port 55321 ssh2
Jul 3 21:00:58 debian-serwer sshd[9683]: Failed password for invalid user pgsql from 193.218.155.219 port 56702 ssh2
Jul 3 21:01:01 debian-serwer sshd[9685]: Failed password for invalid user pgsql from 193.218.155.219 port 57653 ssh2
Jul 3 21:01:06 debian-serwer sshd[9689]: Failed password for invalid user adm from 193.218.155.219 port 58824 ssh2
Jul 3 21:01:09 debian-serwer sshd[9691]: Failed password for invalid user ident from 193.218.155.219 port 59109 ssh2
Jul 3 21:01:11 debian-serwer sshd[9693]: Failed password for invalid user resin from 193.218.155.219 port 60094 ssh2

Interesujące, prawda? Są to boty, które przeszukują sieć w poszukiwaniu dziur w zabezpieczeniach. Jeżeli im się uda – mamy kolejne zoombie w necie. Proszę zauważyć, że w tym przypadku wszystkie próby pochodzą z jednego adresu. Można to zrobić ręcznie i po prostu zablokować takie ip na firewallu ale to działa tylko na chwilę, takich adresów jest naprawdę wiele, przynajmniej kilka dziennie, więc to by była syzyfowa praca. Tutaj z pomocą przychodzi nam program o nazwie DenyHosts pobierz.
To jest bardzo prosty program ale jego funkcjonalność wydaję się nieoceniona – blokuje wszystkie takie ataki wg ustawionych kryteriów, powiadamia nas o tym na maila oraz wysyła adres agresora na swój serwer i tam uaktualnia ogólną bazę danych zbanowanych adresów, które każdy klient blokuje również u siebie. Obecnie z DenyHosts korzysta 6800 klientów, więc została utworzona już całkiem pokaźna baza. Przy uaktualnianiu cogodzinnym do naszej listy banów dodaje się kilkadziesiąt nowych adresów. Po poprawnej konfiguracji takie ataki stają się naprawdę sporadyczne.
A teraz do rzeczy – jak to się robi?
1. A więc zaczynamy standardowo, czyli od instalacji programu:
sudo apt-get install denyhosts
2. Program jest już defaultowo skonfigurowany i uruchamia się już po instalacji ale my chcemy trochę usprawnić jego pracę. Edytujemy plik konfiguracyjny:
sudo nano /etc/denyhosts.conf
3. Zabieramy się do edycji. Pierwsze sekcje pomijamy bo nas za bardzo nie interesują, dotyczą rozmieszczenia plików z logami itp. Kolejna sekcja wygląda następująco:

########################################################################
#
# PURGE_DENY: removed HOSTS_DENY entries that are older than this time
# when DenyHosts is invoked with the --purge flag
#
# format is: i[dhwmy]
# Where 'i' is an integer (eg. 7)
# 'm' = minutes
# 'h' = hours
# 'd' = days
# 'w' = weeks
# 'y' = years
#
# never purge:
PURGE_DENY =
#
# purge entries older than 1 week
#PURGE_DENY = 1w
#
# purge entries older than 5 days
#PURGE_DENY = 5d
#######################################################################

Tutaj ustawiamy po jakim czasie adres ma być usuwany z naszej listy zbanowanych adresów. Defaultowo j PURGE_DENY jest bez parametrów co oznacza, że adresy nie będą w ogóle usuwany - tak zostawiamy.


#######################################################################
#
# BLOCK_SERVICE: the service name that should be blocked in HOSTS_DENY
#
# man 5 hosts_access for details
#
# eg. sshd: 127.0.0.1 # will block sshd logins from 127.0.0.1
#
# To block all services for the offending host:
#BLOCK_SERVICE = ALL
# To block only sshd:
BLOCK_SERVICE = sshd
# To only record the offending host and nothing else (if using
# an auxilary file to list the hosts). Refer to:
# http://denyhosts.sourceforge.net/faq.html#aux
#BLOCK_SERVICE =
#
#######################################################################

Tutaj ustawiamy dla których usług ma być blokowany dany adres. Standardowo jest ustawione blokowanie na wszsytkie usługi - tutaj również tak zostawiamy.


#######################################################################
#
# DENY_THRESHOLD_INVALID: block each host after the number of failed login
# attempts has exceeded this value. This value applies to invalid
# user login attempts (eg. non-existent user accounts)
#
DENY_THRESHOLD_INVALID = 5
#
#######################################################################

W tym miejscu ustawiamy po ilu nieudanych próbach adres będzie blokowany dla kont których nie ma w /etc/passwd . Przeważnie dotyczy to ataków słowników. Sądze, że my znamy własny login, więc można to spokojnie zmniejszyć do 2 prób.


#######################################################################
#
# DENY_THRESHOLD_VALID: block each host after the number of failed
# login attempts has exceeded this value. This value applies to valid
# user login attempts (eg. user accounts that exist in /etc/passwd) except
# for the "root" user
#
DENY_THRESHOLD_VALID = 10
#
#######################################################################

Ta reguła dotyczy prób logowania na istniejące konta. Radzę zachować tutaj ostrożność - my też możemy się pomylić lub zapomnieć hasła. 7-8 prób będzie to optymalną wartością.


#######################################################################
#
# DENY_THRESHOLD_ROOT: block each host after the number of failed
# login attempts has exceeded this value. This value applies to
# "root" user login attempts only.
#
DENY_THRESHOLD_ROOT = 1
#
#######################################################################

Powyższa opcja od razu blokuje próbę logowania jako root.


#######################################################################
#
# DENY_THRESHOLD_RESTRICTED: block each host after the number of failed
# login attempts has exceeded this value. This value applies to
# usernames that appear in the WORK_DIR/restricted-usernames file only.
#
DENY_THRESHOLD_RESTRICTED = 1
#
#######################################################################

Ta opcja blokuje wszystkie próby użycia loginu, który jest wymieniony w pliku restricted-usernames.


#######################################################################
#
# SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS
#
# SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES|NO
# If set to YES, if a suspicious login attempt results from an allowed-host
# then it is considered suspicious. If this is NO, then suspicious logins
# from allowed-hosts will not be reported. All suspicious logins from
# ip addresses that are not in allowed-hosts will always be reported.
#
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
######################################################################

Tutaj powinniśmy mieć YES. Program monitoruje wtedy raporty DenyHosts w celu odnalazienia podejrzanych logowań lub odnajduje wpisy, które nie są przydatne.


######################################################################
#
# HOSTNAME_LOOKUP
#
# HOSTNAME_LOOKUP=YES|NO
# If set to YES, for each IP address that is reported by Denyhosts,
# the corresponding hostname will be looked up and reported as well
# (if available).
#
HOSTNAME_LOOKUP=YES
#
######################################################################

Jeżeli YES to atakujący host będzie informowany o blokowaniu (o ile to jest możliwe). Jeżeli zależy nam na prędkości proponuje to wyłączyć.


######################################################################
#
# LOCK_FILE
#
# LOCK_FILE=/path/denyhosts
# If this file exists when DenyHosts is run, then DenyHosts will exit
# immediately. Otherwise, this file will be created upon invocation
# and deleted upon exit. This ensures that only one instance is
# running at a time.
#
# Redhat/Fedora:
#LOCK_FILE = /var/lock/subsys/denyhosts
#
# Debian
LOCK_FILE = /var/run/denyhosts.pid
#
# Misc
#LOCK_FILE = /tmp/denyhosts.lock
#
######################################################################

Zabezpieczenie przed urchomieniem dwa razy programu. Usuwamy komentarz przy naszej dystrybucji.


#######################################################################
#
# ADMIN_EMAIL: if you would like to receive emails regarding newly
# restricted hosts and suspicious logins, set this address to
# match your email address. If you do not want to receive these reports
# leave this field blank (or run with the --noemail option)
#
# Multiple email addresses can be delimited by a comma, eg:
# ADMIN_EMAIL = foo@bar.com, bar@foo.com, etc@foobar.com
#
ADMIN_EMAIL = xxx@xxx.pl
#
#######################################################################

#######################################################################
#
# SMTP_HOST and SMTP_PORT: if DenyHosts is configured to email
# reports (see ADMIN_EMAIL) then these settings specify the
# email server address (SMTP_HOST) and the server port (SMTP_PORT)
#
#
SMTP_HOST = localhost
SMTP_PORT = 25
#
#######################################################################

#######################################################################
#
# SMTP_USERNAME and SMTP_PASSWORD: set these parameters if your
# smtp email server requires authentication
#
#SMTP_USERNAME=foo
#SMTP_PASSWORD=bar
#
#####################################################################

W tym miejscu możemy sobie ustawić powiadomienia na adres e-mail. Wszystkie ruchy w logach będą raportowane. Polecam jeżeli ktoś ma skonfigurowany serwer poczty, polecam Postfix. Może w kolejnym poście opiszę konfigurację takiego serwera.


#######################################################################
#
# SMTP_FROM: you can specify the "From:" address in messages sent
# from DenyHosts when it reports thwarted abuse attempts
#
SMTP_FROM = DenyHosts
#
#######################################################################

#######################################################################
#
# SMTP_SUBJECT: you can specify the "Subject:" of messages sent
# by DenyHosts when it reports thwarted abuse attempts
SMTP_SUBJECT = DenyHosts Report
#
######################################################################

######################################################################
#
# SMTP_DATE_FORMAT: specifies the format used for the "Date:" header
# when sending email messages.
#
# for possible values for this parameter refer to: man strftime
#
# the default:
#
#SMTP_DATE_FORMAT = %a, %d %b %Y %H:%M:%S %z
#
######################################################################

Tutaj kolejne ustawienia poczty - ustawiamy nadawacę, temat i format daty.

Kolejne sekcje zostawiamy defaultowo aż do:

#######################################################################
#
# SYNC_SERVER: The central server that communicates with DenyHost
# daemons. Currently, denyhosts.net is the only available server
# however, in the future, it may be possible for organizations to
# install their own server for internal network synchronization
#
# To disable synchronization (the default), do nothing.
#
# To enable synchronization, you must uncomment the following line:
#SYNC_SERVER = http://xmlrpc.denyhosts.net:9911
#
#######################################################################

Tutaj wybieramy czy DenyHosts ma się łączyć z serwerem w celu aktualizacji bazy adresów. Defaultowo wyłączone - proponuję włączyć poprzez usunięcie hasha przy SYNC_SERVER.


#######################################################################
#
# SYNC_INTERVAL: the interval of time to perform synchronizations if
# SYNC_SERVER has been uncommented. The default is 1 hour.
#
#SYNC_INTERVAL = 1h
#
#######################################################################

Wybieramy jak często ma być robiona aktualizacja. Ja mam 1h ale jeżeli nie lubimy jak nasz serwer często się aktualizuje możemy tu ustawić np. 12h.


#######################################################################
#
# SYNC_UPLOAD: allow your DenyHosts daemon to transmit hosts that have
# been denied? This option only applies if SYNC_SERVER has
# been uncommented.
# The default is SYNC_UPLOAD = yes
#
#SYNC_UPLOAD = no
SYNC_UPLOAD = yes
#
#######################################################################

Tutaj wybieramy czy chcemy robić upload naszej bazy zablopkowanych adresów. Proponuje YES.


#######################################################################
#
# SYNC_DOWNLOAD: allow your DenyHosts daemon to receive hosts that have
# been denied by others? This option only applies if SYNC_SERVER has
# been uncommented.
# The default is SYNC_DOWNLOAD = yes
#
#SYNC_DOWNLOAD = no
#SYNC_DOWNLOAD = yes
#
#
#
#######################################################################

Czy chcemy ściągać bazy adresów innych użytkowników? Oczywiście, że tak.


#######################################################################
#
# SYNC_DOWNLOAD_THRESHOLD: If SYNC_DOWNLOAD is enabled this parameter
# filters the returned hosts to those that have been blocked this many
# times by others. That is, if set to 1, then if a single DenyHosts
# server has denied an ip address then you will receive the denied host.
#
# See also SYNC_DOWNLOAD_RESILIENCY
#
#SYNC_DOWNLOAD_THRESHOLD = 10
#
# The default is SYNC_DOWNLOAD_THRESHOLD = 3
#
#SYNC_DOWNLOAD_THRESHOLD = 3
#
#######################################################################

Tutaj mała opcja filtrowania. Jeżeli ustawimy na 1 to wtedy wszystkie adresy zablokowane przez przynajmniej jeden serwer zostaną również zablokowane u nas. Proponuje zostawić jak jest.

4. Zapisujemy plik i wpisujemy:
sudo /etc/init.d/denyhosts restart
i możemy spać spokojnie ;) Od tej pory każdy kto będzie próbował się zalogować w podejrzany sposób będzie blokowany a jego ip będzie umieszczane w /etc/hosts.deny . Wszystkie logi programu, łącznie z zablokowanymi adresami znajdują się w /var/log/denyhosts.
Dziękuje i pozdrawiam!