Kiosk internetowy na bazie Opery i Gentoo Linux

Zamieszczam opracowany kiedyś przeze mnie opis przygotowania kiosków internetowych bazujących na Gentoo Linux i przeglądarce Opera. Jest to wersja z 3.03.2008 roku, więc aby wszystko zadziałało trzeba zapewne wiele rzeczy zmodyfikować, ale rozsądny człowiek nie powinien mieć z tym problemów. Ja postaram się w chwili gdy pojawi się odrobina wolnego czasu, zapału i weny twórczej przygotować nową wercję poniższego poradnika. Tymczasem miłej lektury i zabawy podczas budowy systemu. ;-)

Spis treści

Wstęp

Jakiś czas temu na potrzeby mojej uczelni - Wojskowej Akademii Technicznej - przygotowałem kioski internetowe bazujące na systemie Gentoo Linux i przeglądarce internetowej Opera. Założenie było takie, że przygotowana konfiguracja sprzętowo-programowa miała być jak najbardziej idioto i wandaloodporna oraz nie wymagająca konserwacji. Systemy działały przez dwa lata, a skończyły żywot z przyczyn hardware'owych, tak więc sądzę, że wywiązałem się dobrze ze swojego zadania. Mając nadzieję, że mogę komuś pomóc w stworzeniu podobnego rozwiązania, po długich bojach z własnym lenistwem, przygotowałem ten podręcznik.

Sposób przygotowania kiosku postaram się opisać w sposób jak najbardziej zrozumiały, tak aby nawet osoby mające niewielkie pojęcie o Linuksie były w stanie w miarę bezboleśnie przejść przez cały proces, a być może się przy okazji czegoś również nauczyć.

Czego potrzebujemy?

Komputer może być starą maszyną, której już od dawna nie używamy. Na początku przyda nam się w nim napęd CD-ROM - później ze względów bezpieczeństwa zalecam jego usunięcie. Należy zwrócić uwagę na to, że system możemy przygotować na innej szybszej maszynie (w chroocie lub lub na maszynie wirtualnej), a dopiero później przenieść na docelową.

Instalacja systemu

W tej części howto przeprowadzę Cię przez instalację Gentoo – będzie to instalacja dopasowana pod potrzeby kiosku internetowego – jeśli chcesz poznać ogólniejsze podejście przeczytaj oficjalny Podręcznik Gentoo Linux.

Medium instalacyjne

Budowy kiosku możemy dokonać na dwa sposoby:

  • wykorzystując livecd
  • wykorzystując już zainstalowany system – tworzymy wtedy gdzieś na dysku nowy folder (nie musi to być nowa partycja) w którym działamy tak samo jak w przypadku livecd

Obie metody mają swoje wady i zalety – choć wydaje mi się, że dużo przyjemniejsza jest druga. Pozwala nam ona na wykorzystanie naszego desktopu, który zapewne jest dużo wydajniejszy od maszyny którą zamierzamy przeznaczyć na kiosk, a jednocześnie nie mamy takiej utraty wydajności jak w przypadku maszyny wirtualnej. Jednak należy pamiętać, że musimy później jakoś przenieść tak zbudowany system na maszynę docelową – i tu się na pewno przyda livecd.

Możemy użyć dowolnego livecd – wbrew oczekiwaniom wielu początkujących użytkowników Gentoo nie jest wymagane użycie live'a Gentoo. Niezależnie czy zdecydujemy się na Knoppixa, Gentoo, czy jeszcze coś innego instalacja będzie przebiegała według tego samego schematu.

Uruchomienie liveCD

Przed uruchomieniem systemu z płyty należy się upewnić, że BIOS komputera nam na to pozwala.

Po wystartowaniu systemu należy dokonać konfiguracji sieci (jeśli nie zostało to zrobione automatycznie dzięki DHCP).

Partycjonowanie dysku

Budowę kiosku na nowej maszynie zaczynamy od odpowiedniego podziału dysku. Ja stworzyłem tylko dwie partycje: swap i /, jednak jeśli chcesz możesz utworzyć ich więcej (ale lepiej nie mniej).

W celu podzielenia dysku użyłem prostego narzędzia fdisk:

# fdisk /dev/hda

Jeśli na dysku są jakieś niepotrzebne partycje możemy je usunąć za pomocą polecenia "d":

Command (m for help): d
Partition number (1-4): 1

Nowe partycje tworzymy za pomocą polecenia "c" - ja utworzyłem jedynie dwie partycje - swap i /:

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-12483, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-12483, default 12483): +512M

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (994-12483, default 994):
Using default value 994
Last cylinder or +size or +sizeM or +sizeK (994-12483, default 12483):
Using default value 12483

Następnie ustawiłem typ partycji wymiany (swap) poleceniem "t":

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 82
Changed system type of partition 1 to 82 (Linux swap / Solaris)

Na końcu poleceniem "w" zapisałem nową tablicę partycji na dysk:

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
livecd ~ #

Uwaga! Czasem partycje są widoczne dopiero po restarcie komputera - w takim przypadku fdisk nas o tym poinformuje.

Praca z fdiskiem została zakończona. Teraz na świeżo powstałych partycjach należy założyć systemy plików. Ja wybrałem ReiserFS - z niezrozumiałych dla mnie samego powodów bardzo go lubię - może dlatego, że nie zawiódł mnie jeszcze i nie wykonuje długich testów co kilka(dziesiąt) montowań.

# mkreiserfs /dev/hda2
mkreiserfs 3.6.19 (2003 www.namesys.com)

A pair of credits:
Vladimir Demidov wrote the parser for sys_reiser4(), the V3 alpha port, part of
the V3 journal relocation code, and helped Hans keep the business side of
things running.

Hans Reiser was the project initiator, source of all funding for the first 5.5
years. He is the architect and official maintainer.

Guessing about desired format.. Kernel 2.6.19-gentoo-r5 is running.
Format 3.6 with standard journal
Count of blocks on the device: 1447728
Number of blocks consumed by mkreiserfs formatting process: 8256
Blocksize: 4096
Hash function used to sort names: "r5"
Journal Size 8193 blocks (first block 18)
Journal Max transaction length 1024
inode generation number: 0
UUID: 6d54ebed-a838-4ef6-b9d9-36348d924669
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!
ALL DATA WILL BE LOST ON '/dev/hda2'!
Continue (y/n):y
Initializing journal - 0%....20%....40%....60%....80%....100%
Syncing..ok

Tell your friends to use a kernel based on 2.4.18 or later, and especially not a
kernel based on 2.4.9, when you use reiserFS. Have fun.

ReiserFS is successfully created on /dev/hda2.
livecd ~ #

Pozostaje nam jeszcze aktywacja swapu poleceniami mkswap i swapon:

# mkswap /dev/hda1
Setting up swapspace version 1, size = 512446 kB
no label, UUID=9a05ba06-1a49-430c-bed8-8a9b63b76eb9
# swapon /dev/hda1

W ten sposób zakończyliśmy etap przygotowania dysków - teraz możemy przejść do instalacji podstawowego oprogramowania.

Instalacja podstawowego systemu

Instalację oprogramownia należy rozpocząć od pobrania go z internetu. Tak więc montujemy partycję /:

# mount /dev/hda2 /mnt/gentoo/

przechodzimy do katalogu, w którym dokonaliśmy montowania

# cd /mnt/gentoo/

i ściągamy stage'a

# wget http://gentoo.prz.rzeszow.pl/releases/x86/current/stages/stage3-i686-200...
--00:43:12-- http://gentoo.prz.rzeszow.pl/releases/x86/current/stages/stage3-i686-200...
=> `stage3-i686-2007.0.tar.bz2'
Resolving gentoo.prz.rzeszow.pl... 62.93.32.21
Connecting to gentoo.prz.rzeszow.pl|62.93.32.21|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 107,915,722 (103M) [application/x-tar]

100%[=========================================================>] 107,915,722 3.66M/s ETA 00:00

00:43:41 (3.51 MB/s) - `stage3-i686-2007.0.tar.bz2' saved [107915722/107915722]
#

oraz najnowszy snapshot portage

# wget http://gentoo.prz.rzeszow.pl/snapshots/portage-latest.tar.bz2
--00:43:56-- http://gentoo.prz.rzeszow.pl/snapshots/portage-latest.tar.bz2
=> `portage-latest.tar.bz2'
Resolving gentoo.prz.rzeszow.pl... 62.93.32.21
Connecting to gentoo.prz.rzeszow.pl|62.93.32.21|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 30,916,447 (29M) [application/x-tar]

100%[=========================================================>] 30,916,447 3.72M/s ETA 00:00

00:44:04 (3.79 MB/s) - `portage-latest.tar.bz2' saved [30916447/30916447]
#

Następnie oba archiwa rozpakowujemy:

# tar -xjpf stage3-i686-2007.0.tar.bz2
# tar -xjf portage-latest.tar.bz2 -C /mnt/gentoo/usr/

Pozostaje nam skopiować plik konfiguracyjny DNS:

# cp -L /etc/resolv.conf /mnt/gentoo/etc/

i już możemy przejść do naszego nowego systemu:

# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev
# chroot /mnt/gentoo /bin/bash
# env-update && source /etc/profile

Od tego momentu pracujemy już na Gentoo, które mamy na dysku, jednak, dopóki nie zainstalujemy jądra i bootloadera, liveCD będzie dla nas pełnić jeszcze rolę pośrednika. Podążając dalej wykonujemy:

# emerge --sync
# emerge gentoo-sources lilo reiserfsprogs dhcpcd

W ten sposób zsynchronizujemy portage, aby dostępne do instalacji pakiety były jak najświeższe, a następnie zainstalujemy bootloader lilo, narzędzia do systemu plików ReiserFS i źródła kernela gentoo-sources - więcej na razie nie potrzeba.

Jeżeli polecenie emerge widzisz po raz pierwszy to przeczytaj koniecznie rozdział „Praca z Gentoo” z Podręcznika Gentoo Linux.

Konfiguracja jądra

Po zainstalowaniu źródeł kernela należy teraz dokonać odpowiedniej jego konfiguracji i kompilacji. Użytkownicy, którzy chcą zautomatyzować cały proces mogą wykorzystać genkernela, jednak ja zalecam konfigurację ręczną – pozwoli ona uzyskać jądro bardzo ładnie dopasowane do naszego sprzętu, jak i bezpieczne.

Zadaniem tej części howto nie jest wytłumaczenie sposobu konfiguracji jądra Linuksa – sądzę, że każdy będzie w stanie zrobić to sam. Poniżej przedstawiam jedynie kilka wskazówek.

Zaczynamy od przejścia do katalogu, w którym zainstalowane zostały źródła:

# cd /usr/src/linux

Następnie wywołujemy menu konfiguracyjne:

# make menuconfig

No i teraz zależy wszystko od Ciebie – ja mogę Ci dać kilka podpowiedzi głównie związanych z bezpieczeństwem:

  • Konfiguruj obsługę tylko tych urządzeń, które masz zamontowane w komputerze i jednocześnie tylko tych, które będą wykorzystywane. Jeśli nie chcesz pozwolić użytkownikom na korzystanie ze stacji dyskietek to nie dodawaj do jądra jej obsługi.
  • W „Kernel hacking” najlepiej odznaczyć wszystko – szczególnie „Magic SysRq key”.
  • Warto zastanowić się nad wyłączeniem obsługi modułów.

o zakończeniu konfiguracji zapisujemy zmiany, po czym kompilujemy jądro. Jeśli obsługa modułów jest skonfigurowana to korzystamy z poleceń:

livecd linux # make && make modules_install

jeśli nie, to wystarczy:

livecd linux # make

Po czym należy skopiować gotowego kernela do /boot:

# cp arch/i386/boot/bzImage /boot/gentoo-2.6.23-r8

Konfiguracja /etc/fstab

Teraz zapiszemy w pliku /etc/fstab należy zapisać rozkład naszych systemów plików. Tak więc odpalamy edytor:

# nano /etc/fstab

i dokonujemy odpowiednich zmian. U mnie plik wynikowy wygląda tak:

/dev/hda2 / reiserfs noatime,notail 0 1
/dev/hda1 none swap sw 0 0
shm /dev/shm tmpfs nodev,nosuid,noexec 0 0

Konfiguracja bootloadera

Wybranym przeze mnie (głównie ze względu na swoją prostotę) bootloaderem jest lilo. Jego konfiguracji dokonujemy w pliku /etc/lilo.conf. U mnie wygląda on tak:

boot=/dev/hda
default=Gentoo
compact

image=/boot/gentoo-2.6.23-r8
label=Gentoo
read-only
root=/dev/hda2
password=qwe
restricted

Ze względu na bezpieczeństwo kiosku szczególnej uwagi wymagają zwłaszcza dwie ostatnie linijki. Pierwsza z nich definiuje hasło, natomiast druga sprawia, że będzie ono musiało być ono podane jedynie gdy podczas bootowania zostaną podane jądru jakieś argumenty – czyli na przykład wtedy gdy ktoś chce uruchomić system w trybie pojedynczego użytkownika.

Należy zwrócić uwagę, że hasło jest zapisywane jawnym tekstem – pamiętajmy zatem o odebraniu dostępu do pliku wszystkim oprócz roota:

# chmod 600 /etc/lilo.conf

Gdy zakończymy konfigurację lilo, należy wykonać:

# lilo

Hasło roota

Na koniec ustawmy jeszcze hasło roota:

# passwd root

i można dokonać restartu maszyny. Jeżeli dokonaliśmy poprawnej konfiguracji kernela, fstaba i lilo, to powinno nam wystartować najbardziej podstawowe Gentoo. Powodzenia!

Dalsza konfiguracja systemu

Jeżeli system wystartował logujemy się na roota i kontynuujemy naszą zabawę.

Konfiguracja sieci

Najprościej rozwiązać problem konfiguracji sieci poprzez przydzielanie kioskom adresów przez serwer DHCP. Wystarczy wtedy (bez konfiguracji w pliku /etc/conf.d/net) nakazać włączenie odpowiedniego interfejsu sieciowego w takcie systemu:

# rc-update add net.eth0 default
* net.eth0 added to runlevel default
#

Ustawienie czasu

Aby system znał aktualny czas, należy najpierw wybrać odpowiednią strefę czasową:

# cp /usr/share/zoneinfo/Europe/Warsaw /etc/localtime

a następnie w pliku /etc/conf.d/clock dokonać odpowiednich zmian:

CLOCK="local" TIMEZONE="Europe/Warsaw"

po czym należy zrestartować demona czasu:

# /etc/init.d/clock restart

Lokalizacja GLIBC

Możemy ustawić lokalizację GLIBC w pliku /etc/locale.gen:

en_US ISO-8859-1
en_US.UTF-8 UTF-8
pl_PL ISO-8859-2
pl_PL.UTF-8 UTF-8

Po czym należy wykonać polecenie

# locale-gen

Użytkownicy

Należy założyć oddzielnego użytkownika na koncie, którego będą pracowali wszyscy chętni do skorzystania z naszego kiosku:

# useradd -m -g users internet
# passwd internet

Dobrym pomysłem jest założenie jeszcze jednego użytkownika, na którego będziemy mogli się zalogować, gdy zajdzie potrzeba konserwacji systemu.

Logowanie zdalne

Administrację kioskiem najprościej będzie prowadzić zdalnie. Należy zatem dodać ssh do domyślnego runlevela, aby startowało razem z systemem:

# rc-update add sshd default

Warto, ze względów bezpieczeństwa, zabronić rootowi bezpośredniego logowania się na swoje konto. Dokonujemy tego w pliku /etc/ssh/sshd_config:

PermitRootLogin no

Instalacja i konfiguracja Xów

Instalacji Xorga dokonujemy wydając polecenie:

# emerge xorg-x11

Pakietów, które zostaną zainstalowane będzie sporo, jednak ich ilość można zmniejszyć przez optymalny dla nas dobór flag.

Xorga najprościej skonfigurować przy użyciu polecenia:

# xorgconfig

Wystarczy odpowiedzieć na serię pytań. Po zakończeniu dobrze jest dokonać jeszcze małej edycji /etc/X11/xorg.conf:

Section "ServerFlags"
Option "DontZap" "true"
Option "DontVTSwitch" "true"
Option "DontZoom" "true"
EndSection

Przykładowo dzięki włączonej opcji "DontZap" wyłączymy możliwość zabicia serwera X przez kombinację klawiszy Ctrl+Alt+Backspace - uchronimy się w ten sposób przed uzyskaniem przez użytkownika dostępu do konsoli.

Instalacja i konfiguracja Opery

Operę i flasha instalujemy wydając polecenie:

# emerge xorg-x11 opera netscape-flash

Dzięki ustawieniu flagi USE qt-static unikniemy długotrwałego kompilowania Qt.

Po zkończeniu instalacji proponuję ściągnąć odpowiedni plik językowy - można je znaleźć na stronie Opery. Ścieżkę do tego pliku definiujemy w pliku /home/internet/.opera/opera6.ini

[User Prefs]

Language File=/opt/opera/share/opera/locale/ouw923_pl.lng

W tym samym pliku wyłączamy również obsługę torrentów

[BitTorrent]
Enable=0

wskażmy również położenie pliku z filtrami:

[Network]

URL Filter File=/home/internet/.opera/filter.ini

Zawartość tego pliku określa co użytkownik może przeglądać. Moim zdaniem najbezpieczniej będzie gdy zawartość tego pliku będzie następująca:

[prefs] prioritize excludelist=0

[include]
http://*
https://*

[exclude]
*

Jak widać pozwalamy jedynie korzystać z protokołów HTTP i HTTPS, zabraniając wszystkiego innego. Jest to dość istotne ze względów bezpieczeństwa - nie możemy przecież pozwolić, żeby użytkownicy przeglądali nam zawartość dysku!

Zdecydowanie zalecam następujące ustawienie pamięci podręcznej w Operze na 0- inaczej może się okazać, że ktoś dostanie się na pocztę czy konto bankowe swojego poprzednika poprzez jedno kliknięcie wstecz:

[Cache] Always Reload HTTPS In History=1
Cache HTTPS After Sessions=0
Check Expiry History=0
Check Expiry Load=0
Document=0
Figure=0
Cache Docs=0
Cache Figs=0

[Disk Cache]
Enabled=0

Aby sprawić, że Opera będzie „automagicznie” startowała po wystartowaniu systemu operacyjnego należy zrobić jeszcze parę rzeczy.

Po pierwsze trzeba dokonać zman w pliku /etc/inittab:

# Default runlevel.
id:5:initdefault:

# TERMINALS
c1:5:respawn:/bin/su internet -l -c "/bin/bash --login -c startx > /dev/null 2>&1"
#c2:2345:respawn:/sbin/agetty 38400 tty2 linux
#c3:2345:respawn:/sbin/agetty 38400 tty3 linux
#c4:2345:respawn:/sbin/agetty 38400 tty4 linux
#c5:2345:respawn:/sbin/agetty 38400 tty5 linux
#c6:2345:respawn:/sbin/agetty 38400 tty6 linux

Jak widać zostawiamy tylko jeden terminal i jako domyślny runlevel ustawiamy 5. Należy również zwrócić uwagę, że zamiast standardowego programu do logowania użytkowników wpisujemy pewne magiczne zaklęcie, dzięki któremu użytkownik "internet" zostanie automatycznie zalogowany i zostaną odpalone Xy. Jeżeli dodatkowo dokonamy następującego wpisu w pliku /home/internet/.xinitrc:

opera -kioskmode -kioskbuttons -kioskresetstation -kioskwindows -nocontextmenu -nodownload -noexit -nohotlist -nokeys -nomail -nomaillinks -nomenu -noprint -nosave -nowin -resetonexit

to odpalona zostanie również automatycznie Opera. Wyjaśnienie znaczenia poszczególnych przełączników można znaleźć tutaj

Ostateczny efekt będzie taki, że gdy naciśniemy "power" to bez żadnych ingerencji użytkownika odpali się Opera.

Bezpieczeństwo

Należy mieć na uwadze to, że kiosków używać będzie olbrzymia liczba anonimowych osób. Wśród nich znajdą się laicy komputerowi i jak i "obeznani w komputerach" złośliwcy, którzy w każdy możliwy sposób będą chcieli nam udowodnić jak bardzo sprawę spartaczyliśmy. Komputerom należy zapewnić bezpieczeństwo zarówno fizyczne jak wirtualne. Jeżeli postawimy komputer na stole na korytarzu to zapewnienie bezpieczeństwa fizycznego jest z góry skazane na porażkę. Komputer powinien zostać schowany w zamykanej na klucz szafce, a użytkownik powinien mieć dostęp jedynie do klawiatury, myszki i monitora (też odpowiednio zabezpieczonych). Jeśli nie możemy schować komputera załóżmy chociaż hasło na BIOS, tak aby użytkownik nie mógł zmienić jakichkolwiek jego parametrów i wymontujmy zbędne napędy (CD-ROM, stacje dyskietek itp.). W BIOSie i kernelu pozostawmy włączone tylko to co jest konieczne do działania kiosku - przykładowo jeśli nie korzystamy z myszy czy klawiatury na USB to wyłączmy całkowicie obsługę USB.

Operę powinno się uruchamiać z przełącznikiem "-kioskresetstation", który po pewnym czasie braku aktywności użytkownika przeładuje jej ustawienia. Okaże się to bardzo przydatne w przypadku, gdy ktoś uzna, że świetnym dowcipem będzie pozostawienie otwartej strony z pornografią czy innymi niewłaściwymi treściami.

Wyłączmy całkowicie dźwięk - nie byłoby najlepiej gdyby głośniki zaczęły się "drzeć" gdy w salach obok są zajęcia.

Zakończenie

Mam nadzieję, że powyższe howto okaże się przydatne. Oczywiście wiele jest jeszcze do zrobienia. Podczas tworzenia tego howto i budowania kiosku w VMware, zauważyłem kilka rzeczy, które kiedyś mi umknęły. Na przykład okazuje się, że problemem jest zintegrowanie Adobe Readera z Operą - nie udało mi się wyłączyć możliwości dostania się użytkownika na dysk ("save as", "open") - choć z tego co czytałem da się to osiągnąć JavaScriptem. Innym problemem okazało się zintegrowanie odtwarzaczy multimedialnych - mplayerplug-in nic nie wyświetlał a gxine wyświetlał się w innym oknie zamiast ładnie siedzieć wewnątrz Opery. Mam nadzieję, że z czasem uda mi się te problemy rozwiązać. Wszystkich, którzy będą mieli jakieś uwagi, spostrzeżenia, rady itp. bardzo proszę o komentarze - z niecierpliwością czekam na konstruktywną krytykę.

Odpowiedzi

Stare dobre kioski ...

Widzę, że znowu zamieściłeś kioseczki na stronie. Powinieneś tekst trochę uaktualnić i wrzucić na jakiś większy linuksowy portal. Kioski są genialne więc pochwal się nimi ze światem :)

Zastanawiam się nad

Zastanawiam się nad uaktualnieniem howto, muszę tylko trochę do tego przysiąść - daj mi chwilę. ;-) Stary opis wrzuciłem ze względu na to, że dostałem mailem prośbę o jego udostępnienie, co, przynaję, motywuje do tego aby nad nim trochę popracować i opracować nową wersję. Fajnie wiedzieć, że jest to przydatne. :-)