Adres: dawidskomski.spaces.live.com
Domena zostanie za jakiś czas przeniesiona.
PEace J.
24 sierpnia 2010
12 lutego 2010
Terminale POS, bezpieczeństwo przede wszystkim

Dziś rano zdarzył mi się ciekawy fakt związany z kartą płatniczą płacąc za jakieś drobiazgi w Gliwickim sklepie. Otóż wyjmuję zakupy, podaję kartę, ekspedientka przepuszcza kartę z chipem przez czytnik pasków(sic!) i oczekuję aż grzecznie dostanę pinpad aby wpisać PIN. Cała groteskowość zaczyna się w tej chwili ponieważ zamiast pinpad'a dostaję co? ... na pewno nie to czego oczekiwałem, a rachunek z odliczoną sumą pieniędzy. Cała sprawa wydała mi się podejrzana to też zapytałem co jest nie tak, że ja używam PIN'u do płatności i jednak chciałbym go wpisać przez zakupem. Droga Pani zza lady zasugerowała, że to kwestia terminala, który mają po prostu stary... Hmm co ja na to? - Nie może być! Ale jedyne co mogłem w tamtej chwili zrobić to sprawdzić rachunek i wyjść. Byłem gotów zapomnieć o całej sprawie, jednak po południu mój oddech nagle przyspieszył gdy spostrzegłem topic najnowszego njusa na blogu niebezpiecznik.pl
"Karty kredytowe z chipem podatne na atak"
oraz pierwsza linijka
Od wczoraj płatność kartą bez znajomości jej PIN-u jest możliwa. Wystarczy tylko...
...i to mi wystarczyło, żeby rzucić się do bankowego panelu logowania z niebywałą paniką. Na koncie wszystko w porządku więc WTF... Postanowiłem przeprowadzić mały research na ten temat, a przede wszystkim dokończyć njusa, którego wcześniej nie zdołałem doczytać.
[chwilę później]
Czytając dalej zatrzymałem się przy tym fragmencie bo odnosi się do mojej sytuacji:
...W miejscach gdzie do dokonania transakcji PIN nie jest wymagany, sposobem potwierdzenia jest złożenie przez posiadacza karty płatniczej podpisu zgodnego z wzorem podpisu umieszczonym na karcie płatniczej...
W takim razie nasuwa się oczywiste pytanie, jakie są kryteria wymagania czy też niewymagania PIN'u do transakcji?
...polskie karty mBanku z chipem są wszędzie w USA uwierzytelniane przez podpis...
...w Polsce ciągle wymuszają uwierzytelnienie przez podpis, nawet jeśli użyje się karty, która posiada możliwości uwierzytelnienia transakcji PIN-em. Zapewne wynika to z jakiś dziwnych umów z centrami obsługi płatności...
Ja mam kartę płatniczą z chipem wydaną przez Visa Electron i wciąż nie przemawia do mnie ta karkołomna metoda uwierzytelnienia przez podpis, no bo jakiż to wiarygodny dowód? Kasjerki i tak nie porównują podpisu złożonego na wydruku z terminala(tzw. slipie) z tym na rewersie karty płatniczej. Może by i sprawdziła gdybym miał ją podpisaną, pytanie jak kasjerka dokonałaby walidacji poprawności podpisów - otóż, nie można. Jasne, wierzmy sobie na słowo, uśmiechajmy się do siebie, najlepiej to wchodźmy do sklepów i bierzmy co chcemy, a należności wpłacajmy... kiedyś tam.
Według regulaminu ING BANK S.A.:
§ 38
1. Użycie karty wywołuje skutek finansowy poprzez:
1) złożenie podpisu na dokumencie - w momencie, gdy kartą jest dokonywana zapłata w punkcie
handlowo-usługowym, w przypadku realizacji wypłaty gotówki w kasach banków oraz w ramach
usługi cashback. Podpis powinien być zgodny ze wzorem podpisu złożonym na karcie oraz złożonym
w Banku;
2) wprowadzenie PIN - w przypadku użycia karty w bankomacie, realizacji wypłaty gotówki w kasach
banków oraz w ramach usługi cashback, a także podczas dokonywania zapłaty w punkcie handlowo-
usługowym wyposażonym w urządzenie do weryfikacji PIN.
§ 41
Użytkownik karty zobowiązany jest do:
1) podpisania karty zgodnie ze wzorem podpisu składanym w Banku;
2) przechowywania karty i ochrony PIN z zachowaniem należytej staranności;
3) nieprzechowywania karty razem z PIN;
4) nieudostępniania karty i PIN osobom nieuprawnionym;
5) niezwłocznego, tj w terminie do 48 godzin zgłoszenia Bankowi utraty karty;
6) zgłoszenia kradzieży karty na Policję w przypadku podejrzenia kradzieży karty;
7) zniszczenia karty po upływie terminu jej ważności.
dalej czytamy
§ 42
Przy realizacji transakcji użytkownik karty może zostać poproszony o potwierdzenie swojej tożsamości. W takim przypadku użytkownik karty zobowiązany jest do okazania dokumentu tożsamości.
Przypuszczam, że nie była to próba ataku typu MITM wspomnianego już tyle razy w internecie, jednak transakcje bezgotówkowe dokonywane kartami chipowymi autoryzowane są PIN'em i tak powinno zostać. W przypadku, gdy sklep dysponuje terminalem nieobsługującym kart chipowych, tak jak było w moim przypadku sprzedawca będzie musiał użyć paska do przeprowadzenia transakcji(nie widzę tego paska :/). Klient może więc zostać poproszony o złożenie podpisu, mimo, że korzysta z karty chipowej.
Gdyby nawet doszło do kradzieży danych, to poprzez zastrzeżenie karty w ciągu 24h narażeni jesteśmy na utratę pieniędzy maksymalnie do kwoty 150 euro, resztę pokrywa bank - o ile nie zakwestionuje, że klient nienależycie chronił numeru PIN.
Jedyną nauczkę jaką wyniosłem z dzisiejszego wydarzenia to, że warto podpisywać swoją kartę, nie ma co pomagać oszustom w ich voodoo.
8 października 2009
Microsoft Technology Summit 2009

Microsoft Technology Summit 2009 w skrócie MTS to największa konferencja technologiczna w Polsce i miała miejsce w Warszawskim Pałacu Kultury 29-30 września 2009 roku.
To już 2 edycja pozwalająca lepiej poznać technologie IT Pro, deweloperskie, bazodanowe i BI. Jestem przekonany, że uczestnicy konferencji polubili ją na tyle, że przynajmniej zastanowią się nad kolejną edycją.
Ale od początku: co, gdzie, jak i dlaczego...
Żeby odpowiedzieć sobie na te pytania trzeba zastanowić się nad koniecznością uczestnictwa w takich imprezach. Otóż sam do końca nie byłem przekonany do MTS2009 ale znalazłem w agendzie parę tematów, które mnie zainteresowały i od tego się zaczęło. W miarę zbliżania się terminu wyjazdu zaobserwowałem spore poruszenie na wielu forach i serwisach, w tym we flagowym wss.pl. Byłem niemało zaskoczony zainteresowaniem z jakim się spotkałem.
Zaczęło mi się to coraz bardziej podobać nie wiedząc tak na prawdę zbyt dużo ale sam impet i kierunek w którym to podążało wystarczył - przecież nie mogło być aż tak źle :) Oprócz samej agendy spotkałem się z licznymi atrakcjami serwowanymi gęsto i często takimi jak otwarte warsztaty, wystawcy różnych technologii, Speaker Idol(z naszej grupy ŚRGM wystartowały aż 3 osoby z czego Tomasz Wiśniewski wygrał i za rok będzie miał 1,5h na jakiś temat), strefa xbox, strefa ekspertów, strefa społeczności, dobrze zorganizowane strefy cateringowe, Surface - trochę przy nim zabawiłem testując, psując i nawet udało się wymusić nieoczekiwany restart :->
Wizja jaką nam przekazano na sesji generalnej co prawda nie była oszałamiająca i co najważniejsze nie pierwszy raz puszczana w Polsce (sic!) ale całkiem ładnie w całość dograli panowie z Microsoftu. Pierwszy jak i drugi dzień były bardzo ciekawe, a szczególnie sesje o technologii Silverlight i o deweloperskich konikach Windows 7.
Wszystko byłoby dosyć drętwe gdyby nie ta ilość ludzi, było nas przecież blisko 3000 głów i to sprawiło, że dało się odnaleźć wiele ciekawych osób ze społeczności czy też znajomych, profesorów z uczelni :-P Można było wymienić się poglądami i wiedzą w licznym i specjalistycznym gronie.
Podsumowując mam zamiar jechać za rok ponownie, mam tylko nadzieję, że będzie równie ciekawie i czekam na lokalizację bliżej Polski południowej.
2 sierpnia 2009
Lipcowe spotkanie ISSA Polska Wrocław

22 lipca miało miejsce kolejne spotkanie międzynarodowego stowarzyszenia ISSA Polska (Information Systems Security Association) oddział we Wrocławiu w kompleksie Credit Suisse.
Pierwszy raz tam się pojawiłem ale na szczęście wszystko odbyło się zgodnie z moimi oczekiwaniami.
Relację zdaję dopiero teraz - miałem trochę pracy ale mimo to warto wspomnieć conieco z uwagi na dobrze przygotowany i poprowadzony temat. Być może uda się zwabić w tamto miejsce jeszcze więcej specjalistów.
Sam dojazd do Wrocławia przebiegł sprawnie, bez nieoczekiwanych postojów, GPS tylko raz kazał skręcić w miejscu gdzie nie było można ale to nic gdy wspomnę o pieszym błądzeniu po ul. Szewskiej gdzie numeracja budynków trochę nas zmyliła i zwiedziliśmy ostatecznie więcej Wrocławia niż chcieliśmy.
Techniczny audyt bezpieczeństwa to temat spotkania i dotyczył audytu zabezpieczeń skryptów i serwera www pewnej strony internetowej.
Borys Łącki przedstawił praktyczne metody testu penetracyjnego strony www od kuchni z uwzględnieniem doń zainstalowanych aplikacji począwszy od poszukiwania możliwych luk i kompromitacji poufnych informacji po analizę i sprawne wykorzystanie każdej nich.
Na szczęście nie były to jedynie suche fakty techniczne ponieważ pojawiły się też aspekty psychologicznego podejścia do problemu poszukiwania kolejnych potencjalnych luk na podstawie wcześniej zarejestrowanych uchybień w zabezpieczeniach.
Cały proces analizowania kolejno zdobytych informacji ukazywał jak łatwo można przejąć kontrolę nad całym serwerem używając z początku mało istotnych lecz licznych błędów administratora.
Polityka zabezpieczeń danego serwera była naganna i pozwalała przejąć nie tylko serwer www aczkolwiek też inne usługi, komputery w sieci lokalnej oraz drukarki.
Po mettingu w niepełnym składzie poszliśmy przedyskutować co ciekawsze tematy w pobliskiej knajpie i tak szybko minęła reszta tego dnia.
Było ciekawie i o ile czas pozwoli jestem gotów pojawić się na kolejnym spotkaniu ISSA Polska we Wrocławiu.
2 kwietnia 2009
Nowa funkcja serwisu nasza-klasa.pl
Całkiem "przypadkiem" natknąłem się na zdumiewająco ciekawą "funkcjonalność" w cieszącym się popularnością serwisie nasza-klasa.pl.
Polega ona na przekierowywaniu adresu z serwisu n-k na dowolną, określoną witrynę internetową.
Link do tego ficzeru:
Można też zastosować tzw. Double Encoding aby zamaskować adres docelowy.
Bardzo fajna niespodzianka ze strony twórców serwisu ;)
Załóżmy, że Twoi dziadkowie chcieliby wysłać kartkę okolicznościową swoim wnuczętom pod jakąś krzykliwą czy też znaną domeną, czyż to nie wspaniała okazja, żeby użyć nasza-klasa.pl?
Inny przykład, nie każdy lubi wchodzić na strony z podejrzaną nazwą, a co jeśli domena to nasza-klasa.pl? Dalej jest to niezaufana witryna? :>
Co jeśli chciałbyś koniecznie podbić odwiedzalność swojej strony www, czy linki z nasza-klasa.pl by Ci nie pomogły?
Jest i szarlataneria, nie będę się rozpisywać na ten temat, ale dzięki temu nowemu gadżetowi można zarzucić wędkę na ryby z niezłą przynętą...
Podsumowując, wszystko wskazuje na to, że nasza-klasa.pl dba o swoich internautów i potrafi zaspokoić potrzeby najróżniejszych grup społecznych...
Poczekajmy na nowe usługi nasza-klasa.pl ]:->
5 kwietnia 2009:
Funkcja została nagle zablokowana, bez jakichkolwiek informacji, mimo, że istniała przynajmniej od grudnia 2008.
Polega ona na przekierowywaniu adresu z serwisu n-k na dowolną, określoną witrynę internetową.
Link do tego ficzeru:
http://nasza-klasa.pl/hitcount/?u=http://onet.plZostaniemy przekierowani na stronę onet'u
Można też zastosować tzw. Double Encoding aby zamaskować adres docelowy.
Bardzo fajna niespodzianka ze strony twórców serwisu ;)
Załóżmy, że Twoi dziadkowie chcieliby wysłać kartkę okolicznościową swoim wnuczętom pod jakąś krzykliwą czy też znaną domeną, czyż to nie wspaniała okazja, żeby użyć nasza-klasa.pl?
Inny przykład, nie każdy lubi wchodzić na strony z podejrzaną nazwą, a co jeśli domena to nasza-klasa.pl? Dalej jest to niezaufana witryna? :>
Co jeśli chciałbyś koniecznie podbić odwiedzalność swojej strony www, czy linki z nasza-klasa.pl by Ci nie pomogły?
Jest i szarlataneria, nie będę się rozpisywać na ten temat, ale dzięki temu nowemu gadżetowi można zarzucić wędkę na ryby z niezłą przynętą...
Podsumowując, wszystko wskazuje na to, że nasza-klasa.pl dba o swoich internautów i potrafi zaspokoić potrzeby najróżniejszych grup społecznych...
Poczekajmy na nowe usługi nasza-klasa.pl ]:->
5 kwietnia 2009:
Funkcja została nagle zablokowana, bez jakichkolwiek informacji, mimo, że istniała przynajmniej od grudnia 2008.
31 marca 2009
Instalacja i wstęp do PostgreSQL
W którymś momencie podczas zaangażowania się w realizację dużego projektu doszło do mnie, że zazwyczaj stosowana przeze mnie baza danych MySQL jest trochę uboga o możliwości jakimi dysponuje, zarządzanie i dalszy rozwój przy dużej liczbie danych może doprowadzić w późniejszym czasie do konieczności wdrożenia nowych mechanizmów w ramach jak będą dodawane/ujmowane(przenoszone do wersji Enterprise) funkcjonalności MySQL'a.
Ogólnie rzecz ujmując MySQL nie identyfikuje się w moich oczach jako baza danych do porządnych zastosowań, może jest to kwestia bogactwa w ficzery innych baz, kto wie - postanowiłem się przekonać - wybór padł na PostgreSQL, który już od dawna posiada ciekawe rozwiązania. Tak to element publicznej nagonki na MySQL ;-P
Założony plan tego artykułu jest następujący:
* Krótki wstęp
* Instalacja w Debianie
* Konfiguracja wstępna w Debianie, pliki, uruchamianie
* Użytkownicy i uprawnienia
* Tryb interaktywny konsoli psql
* Prosty opis najczęściej używanych komend sql
* Społeczność PostgreSQL
* Podsumowanie
I. Krótki wstęp
PostgreSQL to opensourcowa relacyjno-obiektowa baza danych, wolna zarówna na użytek własny jak i komercyjny. Nie jest wprawdzie tak popularna jak MySQL ale na pewno jest bardziej rozbudowana, a szybkością lubi grzeszyć.
II. Instalacja
W Linuksie, a konkretniej w Debianie instalujemy PostgreSQLa poleceniem
Teraz w naszym systemie hula już odpalony PostgreSQL. Musimy wiedzieć, że w systemie został stworzony użytkownik postgres - administrator bazy danych i domyślnie tylko on może się logować do bazy po instalacji.
Można na niego wejść tylko z roota (dla bezpieczeństwa) przez polecenie
i wpisując
bez wpisywania hasła dostępu mamy dostęp do bazy.
Muszę jeszcze dopowiedzieć, że skrypty instalacyjne dały nam do użytku wiele pożytecznych poleceń związanych z bazą danych są to:
- clusterdb - ponownie klastruje tabele bazy danych
- createuser - tworzenie użytkowników
- dropuser - usuwa użytkownika
- createdb - tworzy bazę
- dropdb - porzuca bazę
- createlang - tworzy set językowy
- droplang - usuwa set językowy
- pg_createcluster - tworzy nowy klaster
- pg_ctlcluster - kontrola klastrów
- pg_dropcluster - porzuca klaster
- pg_maintenance - przeprowadza czynności zarządzalne na klastrach
- pg_lsclusters - wyświetla listę klastrów
- pg_upgradecluster - aktualizuje klaster do nowszej wersji
- pg_dump - kopia zapasowa
- pg_dumpall - kopia zapasowa j.w. tylko od razu całej bazy
- pg_restore - przywrócenie kopii zapasowej
- psql - interaktywny terminal do zarządzania bazą
- reindexdb - indeksuje bazę lub tabelę na nowo
- vacuumdb - odśmieca bazę i analizuje dla optymalizatora
- vacuumlo - usuwa duże obiekty LO nie mające odnośników w tabelach
III. Konfiguracja wstępna, pliki, uruchamianie
Plik inicjujący serwera PostgreSQL znajduje się jak zwykle tutaj
Pliki bazy danych znajdują się w katalogach
Pracę zaczynamy od utworzenia użytkownika/roli(tak poprawnie nazywane jest to co za chwile zrobimy, jest z tym związany zaawansowany system uprawnień - teraz będę używał już tylko tego określenia). Mamy 2 sposoby na zrobienie tego albo komendą w systemie albo w bazie danych, polecam ten pierwszy sposób jako, że jest łatwiejszy i w końcu to vol.1.
Najpierw musimy się zalogować jako postgres
oraz przystępujemy do właściwej części
-l możemy się logować, -E hasło przechowywane jest w postaci zaszyfrowanej, -P zapytani zostaniemy o ustawienie hasła dla roli.
Na pytania kreatora odpowiadamy 'n' (no/nie).
Tworzymy bazę dla roli
-O określa której roli przypiszemy bazę
Zanim się zalogujemy musimy dodać wpis w pliku autoryzacji PostgreSQL, edytujemy np. vim'em
dodajemy linijkę
i przeładowujemy konfigurację
Teraz już możemy się logować
W dalszej części artykułu będę używać komend w interaktywnym interfejsie psql.
IV. Użytkownicy i uprawnienia
Listę użytkowników/rol w bazie danych może sprawdzić wpisując w trybie interaktywnym
wnet pojawi się na ekranie tabela przedstawiająca listę ról wraz z podstawowym zestawem uprawnień. Może na początek wspomnę ponownie jak założyć rolę ale wewnątrz psql:
w ten sposób tworzymy rolę rolex z hasłem 'qwerty' bezpiecznie przechowywanym w tablicach dbms. Można tu też z góry podać podstawowy set uprawnień dla takiej roli np. superuser/nosuperuser, login/nologin, createrole/nocreaterole, pełną listę można zobaczyć wpisując
Usuwanie roli:
Szczegółowe uprawnienia są realizowane komendą GRANT, w zależności od tego czy komenda ma dotyczyć tabeli,bazy,funkcji,sekwencji etc. mamy do wyboru różne możliwe uprawnienia do ustawienia - przykładowy sposób użycia dla tabeli:
Realizujemy tutaj pomysł aby dać danej roli do danej tabeli dostęp tylko na wyciąganie i dopisywanie rekordów. Możemy również napisać po prostu ALL co da wszystkie możliwe prawa dostępu. Dopisanie 'WITH GRANT OPTION' powoduje, że rola może rozdawać uprawnienia. Możliwe są też ustawienia grupowe.
Warto jeszcze wspomnieć jak zmienić hasło. Robimy to w następujący sposób:
V. Tryb interaktywny konsoli psql
Mieliśmy już wcześniej styczność z konsolą psql, czas poznać ją nieco lepiej. Gdy zalogujemy się, konsola wypluje przełączniki, które pomogą uzyskać pomoc z komendami sql i samym PostgreSQL'em, czyli kolejno \h oraz \?. Poprzedzając komendy przełącznikiem \h jesteśmy w stanie dowiedzieć się nieco więcej o ich składni, parametrach jakie przyjmują i oczywiście do czego służą np.
Warto podkreślić, że gdy testujemy zapytania i coś nie gra pierwszą rzeczą jaką powinniśmy zrobić to wgłębienie się w polecenie \? i \h
Teraz dawka według mnie najprzydatniejszych komend na start:
Podłączenie do konkretnej bazy danych
Wyświetla historię komend, chyba nie muszę mówić jak wygodnie jest mieć przed sobą całą taką listę.
Wykonuje zapytania SQL z pliku
Zapisuje wyniki zapytań do pliku
Pokazuje listę tabel, ról(u), sekwencji, indeksów... bazy. Istnieją wariacje tego polecenia żeby pokazywało tylko wybrany typ obiektów np. tabele to będzie \dt, indeksy \di - analogia pierwszej litery od typu obiektu.
Lista wszystkich baz danych
Ciekawa opcja wyrzucania wyników w HTML - przenośna wizualizacja wyników zapytań
VI. Prosty opis najczęściej używanych komend sql
Podstawowymi klauzulami SQL dzięki którym będzie można już współpracować z bazą danych są: CREATE TABLE, SELECT, INSERT, UPDATE, DELETE
Tworzenie tabeli o nazwie 'tabelka'. W kolejnych wierszach znajdują się deklaracje kolumn nowej tabeli. Zasada definiowania kolumn jest taka, że najpierw podajemy jej nazwę, następnie określamy typ kolumny i dodatkowe opcje.
1 wiersz - serial to typ inkrementujący kolejno dodawane rekordy, tzn., że stworzona zostaje nowa tabela z indeksami, które są używane podczas rozrostu tabeli, PRIMARY KEY to zdefiniowanie klucza podstawowego dla tabeli.
2 wiersz - not null sprawia, że baza zwróci błąd przy próbie pozostawienia pola pustego.
3 wiersz - unique wymusza unikatowość pola
4 wiersz - varchar(10) varchar to typ danych znakowych o zmiennym rozmiarze w zależności jak dużo danych jest w polu, w nawiasach podaje się jego ograniczenia co do ilości znaków.
Ta klauzula wyciąga dane z bazy danych, w naszym przypadku kolumny 1 i 2 z tabeli o nazwie 'tabelka' ale tylko te wiersze gdzie kolumna1 zawiera tekst 'tajnytekst', wyniki posortowaliśmy malejąco(ORDER BY DESC), jednocześnie chcieliśmy zobaczyć tylko 10 wyników. Zapytanie można by zakończyć przed klauzulą WHERE ale jak powszechnie wiadomo nie chodzi o to, żeby wszystkie dane wyrzucać na ekran, a tylko te co chcemy. Zamiast listy kolumn można też użyć znaku gwiazdki(*) co spowoduje wyświetlenie wszystkich kolumn tejże tabeli.
Utworzenie nowego rekordu do kolumn 1 i 2 o wartości dane1 i dane2. Można pominąć podawanie kolumn ale nie jest to zalecane rozwiązanie bo w wtedy trzeba podać wartości dla wszystkich kolumn. Problem pojawia się wtedy gdy mamy wiele kolumn albo dodajemy nowe/usuwamy. Dlatego lepiej podać których kolumn dotyczy nasze zapytanie i czas spędzony na grzebaniu w zapytaniach można wykorzystać na przyjemniejsze rzeczy :)
Modyfikujemy kolumne 1 w miejscu gdzie kolumna 2 osiąga wartość 'dane2'
Usunięcie wiersza gdzie kolumna1 ma wartość 'nowa wartość'
VII. Społeczność PostgreSQL
Społeczność skupiająca się w okół PostrgreSQL nie stanowi niestety takiego gromkiego tłumu jak w przypadku MySQL ale oprócz grup i list dyskusyjnych parę ciekawych źródeł zawsze się znajdzie:
* Oficjalna strona PGSQL
* Polska strona PGSQL
* Wiele ciekawych blogów
* Wiki
Zawsze są jeszcze kanały IRC (tak, tak IRC żyje ;)) i mniejsze fora internetowe.
Jeśli macie jakieś ciekawe źródła skontaktujcie się ze mną a dodam je w tym miejscu.
VIII. Podsumowanie
Mam nadzieję, że artykuł przybliżył Wam choć w małym stopniu podstawową obsługę PostgreSQL i, że coś z niego wyniesiecie. Następna część będzie już bardziej szczegółowa to mogę obiecać.
Jeśli macie jakieś sugestie, poprawki - proszę o info.
Dziękuję za uwagę.
Ogólnie rzecz ujmując MySQL nie identyfikuje się w moich oczach jako baza danych do porządnych zastosowań, może jest to kwestia bogactwa w ficzery innych baz, kto wie - postanowiłem się przekonać - wybór padł na PostgreSQL, który już od dawna posiada ciekawe rozwiązania. Tak to element publicznej nagonki na MySQL ;-P
Założony plan tego artykułu jest następujący:
* Krótki wstęp
* Instalacja w Debianie
* Konfiguracja wstępna w Debianie, pliki, uruchamianie
* Użytkownicy i uprawnienia
* Tryb interaktywny konsoli psql
* Prosty opis najczęściej używanych komend sql
* Społeczność PostgreSQL
* Podsumowanie
I. Krótki wstęp
PostgreSQL to opensourcowa relacyjno-obiektowa baza danych, wolna zarówna na użytek własny jak i komercyjny. Nie jest wprawdzie tak popularna jak MySQL ale na pewno jest bardziej rozbudowana, a szybkością lubi grzeszyć.
II. Instalacja
W Linuksie, a konkretniej w Debianie instalujemy PostgreSQLa poleceniem
aptitude install postgresql
Teraz w naszym systemie hula już odpalony PostgreSQL. Musimy wiedzieć, że w systemie został stworzony użytkownik postgres - administrator bazy danych i domyślnie tylko on może się logować do bazy po instalacji.
Można na niego wejść tylko z roota (dla bezpieczeństwa) przez polecenie
su postgres
i wpisując
psql
bez wpisywania hasła dostępu mamy dostęp do bazy.
Muszę jeszcze dopowiedzieć, że skrypty instalacyjne dały nam do użytku wiele pożytecznych poleceń związanych z bazą danych są to:
- clusterdb - ponownie klastruje tabele bazy danych
- createuser - tworzenie użytkowników
- dropuser - usuwa użytkownika
- createdb - tworzy bazę
- dropdb - porzuca bazę
- createlang - tworzy set językowy
- droplang - usuwa set językowy
- pg_createcluster - tworzy nowy klaster
- pg_ctlcluster - kontrola klastrów
- pg_dropcluster - porzuca klaster
- pg_maintenance - przeprowadza czynności zarządzalne na klastrach
- pg_lsclusters - wyświetla listę klastrów
- pg_upgradecluster - aktualizuje klaster do nowszej wersji
- pg_dump - kopia zapasowa
- pg_dumpall - kopia zapasowa j.w. tylko od razu całej bazy
- pg_restore - przywrócenie kopii zapasowej
- psql - interaktywny terminal do zarządzania bazą
- reindexdb - indeksuje bazę lub tabelę na nowo
- vacuumdb - odśmieca bazę i analizuje dla optymalizatora
- vacuumlo - usuwa duże obiekty LO nie mające odnośników w tabelach
III. Konfiguracja wstępna, pliki, uruchamianie
Plik inicjujący serwera PostgreSQL znajduje się jak zwykle tutaj
/etc/init.d/postgresql-8.3
Pliki bazy danych znajdują się w katalogach
/var/lib/postgresql/8.3/
Pracę zaczynamy od utworzenia użytkownika/roli(tak poprawnie nazywane jest to co za chwile zrobimy, jest z tym związany zaawansowany system uprawnień - teraz będę używał już tylko tego określenia). Mamy 2 sposoby na zrobienie tego albo komendą w systemie albo w bazie danych, polecam ten pierwszy sposób jako, że jest łatwiejszy i w końcu to vol.1.
Najpierw musimy się zalogować jako postgres
eneon@localhost# su postgres
oraz przystępujemy do właściwej części
postgres@localhost$ createuser -l -E -P testowy
-l możemy się logować, -E hasło przechowywane jest w postaci zaszyfrowanej, -P zapytani zostaniemy o ustawienie hasła dla roli.
Na pytania kreatora odpowiadamy 'n' (no/nie).
Tworzymy bazę dla roli
createdb -O testowy testowy
-O określa której roli przypiszemy bazę
Zanim się zalogujemy musimy dodać wpis w pliku autoryzacji PostgreSQL, edytujemy np. vim'em
vim /etc/postgresql/8.3/main/pg_hba.conf
dodajemy linijkę
local testowy testowy md5
i przeładowujemy konfigurację
/etc/init.d/postgresql-8.3 reload
Teraz już możemy się logować
psql -U testowy
W dalszej części artykułu będę używać komend w interaktywnym interfejsie psql.
IV. Użytkownicy i uprawnienia
Listę użytkowników/rol w bazie danych może sprawdzić wpisując w trybie interaktywnym
\du
wnet pojawi się na ekranie tabela przedstawiająca listę ról wraz z podstawowym zestawem uprawnień. Może na początek wspomnę ponownie jak założyć rolę ale wewnątrz psql:
CREATE ROLE rolex WITH ENCRYPTED PASSWORD 'qwerty';
w ten sposób tworzymy rolę rolex z hasłem 'qwerty' bezpiecznie przechowywanym w tablicach dbms. Można tu też z góry podać podstawowy set uprawnień dla takiej roli np. superuser/nosuperuser, login/nologin, createrole/nocreaterole, pełną listę można zobaczyć wpisując
\h create role
Usuwanie roli:
DROP ROLE nazwa_roli;
Szczegółowe uprawnienia są realizowane komendą GRANT, w zależności od tego czy komenda ma dotyczyć tabeli,bazy,funkcji,sekwencji etc. mamy do wyboru różne możliwe uprawnienia do ustawienia - przykładowy sposób użycia dla tabeli:
GRANT SELECT,INSERT ON tabela TO rola;
Realizujemy tutaj pomysł aby dać danej roli do danej tabeli dostęp tylko na wyciąganie i dopisywanie rekordów. Możemy również napisać po prostu ALL co da wszystkie możliwe prawa dostępu. Dopisanie 'WITH GRANT OPTION' powoduje, że rola może rozdawać uprawnienia. Możliwe są też ustawienia grupowe.
Warto jeszcze wspomnieć jak zmienić hasło. Robimy to w następujący sposób:
\password
V. Tryb interaktywny konsoli psql
Mieliśmy już wcześniej styczność z konsolą psql, czas poznać ją nieco lepiej. Gdy zalogujemy się, konsola wypluje przełączniki, które pomogą uzyskać pomoc z komendami sql i samym PostgreSQL'em, czyli kolejno \h oraz \?. Poprzedzając komendy przełącznikiem \h jesteśmy w stanie dowiedzieć się nieco więcej o ich składni, parametrach jakie przyjmują i oczywiście do czego służą np.
\h CREATE ROLE
Warto podkreślić, że gdy testujemy zapytania i coś nie gra pierwszą rzeczą jaką powinniśmy zrobić to wgłębienie się w polecenie \? i \h
Teraz dawka według mnie najprzydatniejszych komend na start:
\c baza
Podłączenie do konkretnej bazy danych
\s
Wyświetla historię komend, chyba nie muszę mówić jak wygodnie jest mieć przed sobą całą taką listę.
\i plik
Wykonuje zapytania SQL z pliku
\o plik
Zapisuje wyniki zapytań do pliku
\d
Pokazuje listę tabel, ról(u), sekwencji, indeksów... bazy. Istnieją wariacje tego polecenia żeby pokazywało tylko wybrany typ obiektów np. tabele to będzie \dt, indeksy \di - analogia pierwszej litery od typu obiektu.
\l
Lista wszystkich baz danych
\H
Ciekawa opcja wyrzucania wyników w HTML - przenośna wizualizacja wyników zapytań
VI. Prosty opis najczęściej używanych komend sql
Podstawowymi klauzulami SQL dzięki którym będzie można już współpracować z bazą danych są: CREATE TABLE, SELECT, INSERT, UPDATE, DELETE
CREATE TABLE tabelka (
id serial PRIMARY KEY,
kolumna1 text not null,
kolumna2 int unique,
kolumna3 varchar(10)
);
Tworzenie tabeli o nazwie 'tabelka'. W kolejnych wierszach znajdują się deklaracje kolumn nowej tabeli. Zasada definiowania kolumn jest taka, że najpierw podajemy jej nazwę, następnie określamy typ kolumny i dodatkowe opcje.
1 wiersz - serial to typ inkrementujący kolejno dodawane rekordy, tzn., że stworzona zostaje nowa tabela z indeksami, które są używane podczas rozrostu tabeli, PRIMARY KEY to zdefiniowanie klucza podstawowego dla tabeli.
2 wiersz - not null sprawia, że baza zwróci błąd przy próbie pozostawienia pola pustego.
3 wiersz - unique wymusza unikatowość pola
4 wiersz - varchar(10) varchar to typ danych znakowych o zmiennym rozmiarze w zależności jak dużo danych jest w polu, w nawiasach podaje się jego ograniczenia co do ilości znaków.
SELECT kolumna1,kolumna2 FROM tabelka WHERE kolumna1='tajnytekst' ORDER BY DESC LIMIT 10;
Ta klauzula wyciąga dane z bazy danych, w naszym przypadku kolumny 1 i 2 z tabeli o nazwie 'tabelka' ale tylko te wiersze gdzie kolumna1 zawiera tekst 'tajnytekst', wyniki posortowaliśmy malejąco(ORDER BY DESC), jednocześnie chcieliśmy zobaczyć tylko 10 wyników. Zapytanie można by zakończyć przed klauzulą WHERE ale jak powszechnie wiadomo nie chodzi o to, żeby wszystkie dane wyrzucać na ekran, a tylko te co chcemy. Zamiast listy kolumn można też użyć znaku gwiazdki(*) co spowoduje wyświetlenie wszystkich kolumn tejże tabeli.
INSERT INTO tabelka(kolumna1,kolumn2) VALUES('dane1','dane2');
Utworzenie nowego rekordu do kolumn 1 i 2 o wartości dane1 i dane2. Można pominąć podawanie kolumn ale nie jest to zalecane rozwiązanie bo w wtedy trzeba podać wartości dla wszystkich kolumn. Problem pojawia się wtedy gdy mamy wiele kolumn albo dodajemy nowe/usuwamy. Dlatego lepiej podać których kolumn dotyczy nasze zapytanie i czas spędzony na grzebaniu w zapytaniach można wykorzystać na przyjemniejsze rzeczy :)
UPDATE tabelka SET kolumna1='nowa wartosc' where kolumna2='dane2';
Modyfikujemy kolumne 1 w miejscu gdzie kolumna 2 osiąga wartość 'dane2'
DELETE FROM tabelka where kolumna1='nowa wartosc';
Usunięcie wiersza gdzie kolumna1 ma wartość 'nowa wartość'
VII. Społeczność PostgreSQL
Społeczność skupiająca się w okół PostrgreSQL nie stanowi niestety takiego gromkiego tłumu jak w przypadku MySQL ale oprócz grup i list dyskusyjnych parę ciekawych źródeł zawsze się znajdzie:
* Oficjalna strona PGSQL
* Polska strona PGSQL
* Wiele ciekawych blogów
* Wiki
Zawsze są jeszcze kanały IRC (tak, tak IRC żyje ;)) i mniejsze fora internetowe.
Jeśli macie jakieś ciekawe źródła skontaktujcie się ze mną a dodam je w tym miejscu.
VIII. Podsumowanie
Mam nadzieję, że artykuł przybliżył Wam choć w małym stopniu podstawową obsługę PostgreSQL i, że coś z niego wyniesiecie. Następna część będzie już bardziej szczegółowa to mogę obiecać.
Jeśli macie jakieś sugestie, poprawki - proszę o info.
Dziękuję za uwagę.
Wersjonowanie softu
Pewnie część z Was dręczą cyferki dołączane do nazw plików z programami, które pojawiają się i zmieniają w zależności od developerskich fantazji.
Otóż filozofia nadawania kolejnych numerków wersji programów i prawidłowa analiza jest w gruncie rzeczy bardzo prosta.
Idea opiera się głównie na rozdzielaniu kropkami i myślnikami kolejnych cyferek i literek.
Taki bardziej rozbudowany system versioning'u ma miejsce najczęściej wśród oprogramowania wolnego/otwartego FLOSS (ang. Free Libre/Open Source Software), jednak nie tylko.
Niektóre programy w ogóle nie zawierają w swojej nazwie pliku wersji - co według mnie jest złym nawykiem np. popularny komunikator Skype tak ma w wersji na Windowsa.
Inne natomiast posiadają krótki opis wersji w postaci x.y np. 0.93, 1.22 i w zasadzie to najprostszy sposób na przekazanie informacji o stanie danej aplikacji.
Jest też sposób nadawania wersji od którejś z kolei ale może to wynikać z dłuższego wewnętrznego rozwoju, kwestii związanej z datą powstania programu lub innych fanaberii.
Główna zasada w takim zapisie jest taka, że wersje poniżej 1.0 mogą być niedopracowane i skutki używania mogą być niepożądane.
Często dzieje się tak, że autor programu kiedy zbliża się do wersji 1.0 tak na prawdę nie jest systematyczny czy konsekwentny z miarowym oznaczaniem kolejnych wersji - stąd liczby zaczynają być kończone dodatkowymi np. gdy jest 0.93 to następna to już 0.932 lub 0.93.2.
Czasem we wczesnych fazach rozwoju lub w przypadku rzadkich aktualizacji dodaje się przyrostki a lub b czyli alfa/beta znaczy to tyle co bardzo eksperymentalne wydanie np. 0.93a lub 0.93b.
Jeśli chodzi o dłuższe formaty zapisu wersji to posłużę się przykładem program-2.8.24-rc2
Mamy taki o to sobie program i sprawa wygląda tak, że pierwsza cyferka to Major (ang. głowna) czyli główna cyferka rozwojowa jej zmiana nie jest zbyt częsta i dotyczy ogólnych zmian w koncepcji programu, zmiany API oprogramowania, celów rozwojowych.
Druga cyferka tzw. Minor (ang. mniejsza) też zbyt często się nie zmienia i dotyczy kontynuacji wyznaczonych koncepcji, dodania nowych funkcjonalności czy też ich zmiany.
Trzecia tzw. Release (ang. wydanie) stosunkowo najczęściej zmieniająca się wprowadza usprawnienia do ogólnej funkcjonalności programu, mniejsze ilości dodatkowego kodu, a także patche (ang. łatki).
Czwarta aczkolwiek bardzo opcjonalna wprowadza często jedynie zmiany wynikłe z pojawienia się krytycznych luk w kodzie i nie zmieniają funkcjonalności całego programu i są różnie oznaczane np. jako '-rc2' czy release candidate (ang. kandydat do wydania nr 2) lub po kropce jako dodatkowy numerek (czasem stosowany jako Nightly build czyli nocnych kompilacji).
Z ciekawostek np. TeX numerowany jest jako kolejne liczby rozwinięcia dziesiętnego liczby PI: 3, 3.1, 3.14, 3.141 i tak dalej. Obecna wersja to 3.141592.
Powiązany z nim METAFONT jest numerowany według rozwinięcia e - aktualna wersja to 2.71828.
Microsoft Word przeskoczył z wersji 2.0 do 6.0 by "dogonić" WordPerfecta.
Microsoft Office po wersji 12 doczeka się wersji 14. Ponoć "13" jest pechowa.
Często przyjmuje się też, że parzyste numery oznaczają wersję stabilną, a nieparzyste rozwojową.
Teraz wracając do naszego przykładu program-2.8.24-rc2 lecimy od lewej:
program - wiadomo, nazwa programu
2 - nasz Major
8 - Minor
24-rc2 - Release ale jako Release Candidate
Wersjonowanie jest ogólnie mówiąc kwestią uznania więc rozwodzenie się tutaj miało charakter informacyjny, nie instruktażowy.
Otóż filozofia nadawania kolejnych numerków wersji programów i prawidłowa analiza jest w gruncie rzeczy bardzo prosta.
Idea opiera się głównie na rozdzielaniu kropkami i myślnikami kolejnych cyferek i literek.
Taki bardziej rozbudowany system versioning'u ma miejsce najczęściej wśród oprogramowania wolnego/otwartego FLOSS (ang. Free Libre/Open Source Software), jednak nie tylko.
Niektóre programy w ogóle nie zawierają w swojej nazwie pliku wersji - co według mnie jest złym nawykiem np. popularny komunikator Skype tak ma w wersji na Windowsa.
Inne natomiast posiadają krótki opis wersji w postaci x.y np. 0.93, 1.22 i w zasadzie to najprostszy sposób na przekazanie informacji o stanie danej aplikacji.
Jest też sposób nadawania wersji od którejś z kolei ale może to wynikać z dłuższego wewnętrznego rozwoju, kwestii związanej z datą powstania programu lub innych fanaberii.
Główna zasada w takim zapisie jest taka, że wersje poniżej 1.0 mogą być niedopracowane i skutki używania mogą być niepożądane.
Często dzieje się tak, że autor programu kiedy zbliża się do wersji 1.0 tak na prawdę nie jest systematyczny czy konsekwentny z miarowym oznaczaniem kolejnych wersji - stąd liczby zaczynają być kończone dodatkowymi np. gdy jest 0.93 to następna to już 0.932 lub 0.93.2.
Czasem we wczesnych fazach rozwoju lub w przypadku rzadkich aktualizacji dodaje się przyrostki a lub b czyli alfa/beta znaczy to tyle co bardzo eksperymentalne wydanie np. 0.93a lub 0.93b.
Jeśli chodzi o dłuższe formaty zapisu wersji to posłużę się przykładem program-2.8.24-rc2
Mamy taki o to sobie program i sprawa wygląda tak, że pierwsza cyferka to Major (ang. głowna) czyli główna cyferka rozwojowa jej zmiana nie jest zbyt częsta i dotyczy ogólnych zmian w koncepcji programu, zmiany API oprogramowania, celów rozwojowych.
Druga cyferka tzw. Minor (ang. mniejsza) też zbyt często się nie zmienia i dotyczy kontynuacji wyznaczonych koncepcji, dodania nowych funkcjonalności czy też ich zmiany.
Trzecia tzw. Release (ang. wydanie) stosunkowo najczęściej zmieniająca się wprowadza usprawnienia do ogólnej funkcjonalności programu, mniejsze ilości dodatkowego kodu, a także patche (ang. łatki).
Czwarta aczkolwiek bardzo opcjonalna wprowadza często jedynie zmiany wynikłe z pojawienia się krytycznych luk w kodzie i nie zmieniają funkcjonalności całego programu i są różnie oznaczane np. jako '-rc2' czy release candidate (ang. kandydat do wydania nr 2) lub po kropce jako dodatkowy numerek (czasem stosowany jako Nightly build czyli nocnych kompilacji).
Z ciekawostek np. TeX numerowany jest jako kolejne liczby rozwinięcia dziesiętnego liczby PI: 3, 3.1, 3.14, 3.141 i tak dalej. Obecna wersja to 3.141592.
Powiązany z nim METAFONT jest numerowany według rozwinięcia e - aktualna wersja to 2.71828.
Microsoft Word przeskoczył z wersji 2.0 do 6.0 by "dogonić" WordPerfecta.
Microsoft Office po wersji 12 doczeka się wersji 14. Ponoć "13" jest pechowa.
Często przyjmuje się też, że parzyste numery oznaczają wersję stabilną, a nieparzyste rozwojową.
Teraz wracając do naszego przykładu program-2.8.24-rc2 lecimy od lewej:
program - wiadomo, nazwa programu
2 - nasz Major
8 - Minor
24-rc2 - Release ale jako Release Candidate
Wersjonowanie jest ogólnie mówiąc kwestią uznania więc rozwodzenie się tutaj miało charakter informacyjny, nie instruktażowy.
Subskrybuj:
Posty (Atom)