Kiosk computer

Met de Linux User Group Nijmegen maken we maandelijks gebruik van de Klinker. Een zeer oude computer doet daar dienst als ‘kiosk’. De computer heeft alleen maar een browser nodig en verder niks, dus dat gaat prima.
Hieronder staan de stappen om deze kiosk-computer te maken.

Debian

Allereerst heb ik een Debian netinstall gedaan (op dit moment heet deze Jessie), waarbij ik zo min mogelijk pakketten heb geselecteerd.
De gebruiker/user die ik maak heet kiosk. Om de flashplugin te installeren is het nodig om ‘contrib’ toe te voegen aan de sources.list, zodat deze er als volgt uitziet:

# cat /etc/apt/sources.list 
deb http://ftp.nl.debian.org/debian/ jessie main contrib
deb-src http://ftp.nl.debian.org/debian/ jessie main contrib
deb http://security.debian.org/ jessie/updates main contrib
deb-src http://security.debian.org/ jessie/updates main contrib
deb http://ftp.nl.debian.org/debian/ jessie-updates main contrib
deb-src http://ftp.nl.debian.org/debian/ jessie-updates main contrib

Vervolgens heb ik de benodigde pakketten toegevoegd, waarbij ik gekozen heb voor openbox als window manager en iceweasel als browser. Iceweasel is de Debian-versie van Firefox, maar is vrijwel identiek. Ik voeg een recentere versie van Iceweasel toe van het Debian Mozilla Team.
Als teksteditor gebruik ik vim, maar dat kan natuurlijk ook iets anders zijn: emacs, nano, geany, gedit, leafpad of mousepad.

echo "deb http://mozilla.debian.net/ jessie-backports iceweasel-release" > /etc/apt/sources.list.d/iceweasel.list
apt-get update && apt-get install pkg-mozilla-archive-keyring
apt-get update && apt-get dist-upgrade
apt-get install xserver-xorg-core xorg consolekit policykit-1 dbus ntp openbox
apt-get install vim xautolock xprintidle bc rsync unattended-upgrades
apt-get install iceweasel gecko-mediaplayer alsa-base alsa-utils flashplugin-nonfree
apt-get instal --no-install-recommends zenity lightdm
apt-get --purge autoremove

Automatish inloggen

Aangezien de gebruikers geen wachtwoord krijgen van de computer, zal deze automatisch moeten inloggen. Dat kan met lightdm.

# vim /etc/lightdm/lightdm.conf
autologin-user=kiosk
autologin-user-timeout=0

Automatische upgrades

Om de computer automatisch updates te laten uitvoeren, is het pakket unattended-upgrades geïnstalleerd. Dat werkt pas na enkele aanpassingen:

# vim /etc/apt/apt.conf.d/02periodic
APT::Periodic::Enable "1";
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";

# vim /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Origins-Pattern {
      "o=Debian,n=jessie";
      "o=Debian,n=jessie-updates";
//      "o=Debian,n=jessie-proposed-updates";
      "o=Debian,n=jessie,l=Debian-Security";

      "o=Debian,a=stable";
      "o=Debian,a=stable-updates";
//      "o=Debian,a=proposed-updates";
      "origin=Debian,codename=${distro_codename},label=Debian-Security";

      "o=Debian Mozilla Team,n=jessie-backports";
};

Configuratie van Debian

Ik maak een aantal kleine aanpassingen aan de configuratie van Debian.
Alleereerst wijzig ik de instellingen van het toetsenbord en die irritante piep van het systeem:

# vim /etc/default/keyboard 
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT="altgr-intl"
XKBOPTIONS=""
BACKSPACE="guess"

# vim /etc/inputrc
set bell-style none

Het geluid stel ik met behulp van alsamixer in op een acceptabel niveau (er zit een volumeknopje op de boxjes). Dit sla ik op met:

alsactl store

Configuratie van de gebruiker ‘kiosk’

Openbox

Ik kopieer de standaardconfiguratie van openbox naar de home-directory van kiosk en pas deze aan. In rc.xml verander ik het aantal desktops naar 1. En ik verwijder alle muis- en toetsenbord-bindings en de decorations van de vensters.

$ mkdir /home/kiosk/.config/openbox/
$ cp /etc/xdg/rc.xml /home/kiosk/.config/openbox/
$ vim /home/kiosk/.config/openbox/rc.xml
<desktops>
 <number>1</number>
  <firstdesk>1</firstdesk>
  <names>
    <name>desktop 1</name>
  </names>
  <popupTime>875</popupTime>
</desktops>
<dock>
</dock>
<keyboard>
</keyboard>
<mouse>
  <dragThreshold>1</dragThreshold>
  <doubleClickTime>500</doubleClickTime>
  <screenEdgeWarpTime>400</screenEdgeWarpTime>
  <screenEdgeWarpMouse>false</screenEdgeWarpMouse>
</mouse>
<applications>
  <application class="*">
    <decor>no</decor>
    <shade>no</shade>
  </application>
</applications>

Iceweasel/firefox

De configuratie voor iceweasel is als volgt:

  • fullscreen
  • verwijder alle bookmarks
  • disable warning when i attempt to close multiple tabs
  • niuw tabblad: blank

In Preferences:

  • make default (en vervolgens: do not check)
  • homepage: https://duckduckgo.com/
  • search engines: duckduckgo (default), ixquick https, startpage https, google ssl (encrypted), wikipedia(en)
  • privacy:
    • do not track
    • use tracking protection
    • custom settings
      • do not remember history
      • accept cookies
      • accept third-party cookies: from visited
      • keep until I close firefox
      • clear history when iceweasel closes
      • location bar: nothing
  • security:
    • do not remember logins for sites
  • addons/extensies:
    • adblock plus
      • malware blocking: yes, social media buttons: no, disable tracking: yes
      • geen tabs on flash/java
    • disable ctrl-q
    • disable hello, pocket, reader
    • disconnect
    • duckduckgo plus
    • https everywhere
      • do not show counter
      • observatory: no
    • public fox
      • alles aanvinken
      • downloads: *
      • wachtwoord instellen
    • reset kiosk
      • not fullscreen
      • do not reuse hometab
      • overige wel aanvinken
      • 300 seconds
    • self-destructing cookies
      • notifications off
  • about:addons
    • do not update add-ons automatically
  • about:config
    • browser.tabs.closeWindowWithLastTab false
    • browser.disableResetPrompt true​
    • print.always_print_silent true
    • print.show_print_progress false

Kleinigheidjes

$ vim /home/kiosk/.config/gtk-2.0/gtkfilechoose.nl
ShowHidden=false

$ vim /home/kiosk/.config/user-dirs.dirs
XDG_DESKTOP_DIR="$HOME/"
XDG_DOWNLOAD_DIR="$HOME/"
XDG_TEMPLATES_DIR="$HOME/"
XDG_PUBLICSHARE_DIR="$HOME/"
XDG_DOCUMENTS_DIR="$HOME/"
XDG_MUSIC_DIR="$HOME/"
XDG_PICTURES_DIR="$HOME/"
XDG_VIDEOS_DIR="$HOME/"

Het kiosk-script

In het script /usr/bin/kiosk staan alle commando’s die nodig zijn om de kiosk te synchronizeren en af te sluiten.

#!/bin/bash
case $1 in
  --sync)
      rsync -qa --ignore-errors --delete --exclude='.Xauthority' /etc/kiosk/ /home/kiosk/     
      [[ $EUID -eq 0 ]] && chown -R kiosk:kiosk /home/kiosk/
      ;;
  --shutdown)
      dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
      ;;
  --question)
      zenity --question --title="A question..." --text="What do you want to do?" --ok-label="Shutdown this computer" --cancel-label="Start browser"
      if [[ $? == 0 ]]; then
         kiosk --shutdown
      fi
      ;;
  --timer)
      minutes=1
      seconds=$(( minutes * 60 ))
      sleep 1
      for (( i = seconds; i > 0; --i )); do
         echo "#\nThis computer will shut down in $i seconds.\nMove the mouse or press any key to prevent this.\n"
         percentage=$(echo "scale=0; 100 - $i*100/$seconds" | bc -l)
         echo $percentage
         idle=$(xprintidle)
         [[ "$idle" -lt 1000 ]] && exit
         sleep 1
      done | zenity --progress --auto-close --no-cancel --title="" --text="" --width=500 --height=140
      idle=$(xprintidle)
      [[ "$idle" -ge 1000 ]] && kiosk --shutdown
      ;; 
esac 
exit

Het script moet executable zijn, dat gaat via:

chmod +x /usr/bin/kiosk

De ‘lockdown’

BIOS

Om te voorkomen dat gebruikers opstarten vanaf een eigen usb-stickje is het handig om de ‘boot-order’ in de bios te wijzigen zodat deze alleen vanaf de harddisk opstart. Daarna wel een wachtwoord op de bios zetten natuurlijk.

GRUB

Allereerst zet ik de time-out van GRUB (de bootloader) op 0 seconden. Daarna beveilig ik GRUB met een wachtwoord, zoals beschreven op howtogeek.

# vim /etc/default/grub
GRUB_TIMEOUT=0

# grub-mkpasswd-pbkdf2
...

# vim /etc/grub.d/40_custom
...
set superusers=”name”
password_pbkdf2 name grub.pbkdf2.sha512.10000.[long-string-from-grub-mkpasswd-pbkdf2]

# vim /etc/grub.d/10_linux
CLASS="--class gnu-linux --class gnu --class os --unrestricted"

# update-grub

Om te voorkomen dat deze aanpassingen worden overschreven door een update van GRUB, zet ik deze updates uit:

apt-mark hold grub-common
apt-mark hold grub2-common
apt-mark hold grub-pc
apt-mark hold grub-pc-bin

Magic-sysrq

echo "kernel.sysrq = 0" > /etc/sysctl.d/01-magic.conf

Openbox

In het autostart-bestand van openbox zorg ik dat het scherm aan blijft. Vervolgens start ik xautolock, zodat de computer automatisch afsluit na 29 minuten (en nog een time van 1 minuut). Tot slot maak ik een loopje wat steeds de browser opnieuw opstart.

$ vim /home/kiosk/.config/openbox/autostart
xset s off
xset -dpms
xset b off
xset s noblank
xautolock -secure -time 29 -locker "/usr/bin/kiosk --timer" &
while true; do
   /usr/bin/kiosk --sync
   iceweasel
   /usr/bin/kiosk --question
done

Kopieer de configuratie

Om te voorkomen dat een gebruiker wijzigingen aanbrengt aan de configuratie kopieer ik alles naar een directory van root:

find /home/kiosk -type d -empty -delete
mkdir /etc/kiosk/
cp -r /home/kiosk/{.bash_logout,.bashrc,.config,.mozilla,.profile} /etc/kiosk/
chmod -R a+rX /etc/kiosk/

Plaats de configuratie terug

Tijdens een reboot wordt de configuratie teruggezet op twee manieren:

  • via een crontab van root
# crontab -e
@reboot /usr/bin/kiosk --sync
  • via het autostart-script van openbox

Klaar!

Nu hebben we een computer

  • waarmee je alleen kunt internetten via een browser
  • die automatisch afsluit na een half uur
  • die geen informatie opslaat

Happy browsing!