Linux web browser station (formerly "The Linux Public Web Browser mini-HOWTO")
v0.0.5 10 October 2000
Describes the setup of Internet kiosk-type system based on Linux to be
deployed to provide public Internet/webmail access.
The directions below will produce the RedHat (currently version 6.2 is used,
7.0 is in development) Linux system that boots into the bare (=no window
manager, like gnome, kde or fvwm2) X server and starts Netscape Navigator (not
Communicator, which includes Main and News clients). Upon exiting the browser
the X server is restarted and the new Netscape process is launched as
needed. The system is intended for Internet Kiosks and similar applications.
Security is emphasized at all the stages of the setup.
This HOWTO will be updated (maybe significantly) as long as more reports about the deployment of
such boxes will arrive.
Use the information in this document at your own risk. I disavow any
potential liability for the contents of this document. Use of the
concepts, examples, and/or other content of this document is entirely
at your own risk.
All copyrights are owned by their owners, unless specifically noted
otherwise. Use of a term in this document should not be regarded as
affecting the validity of any trademark or service mark.
Naming of particular products or brands should not be seen as endorsements.
You are strongly recommended to take a backup of your system before
major installation and backups at regular intervals.
In this version I have the pleasure of acknowledging the previous maintainer
of this HOWTO who nicely agreed to transfer it to me
New versions of this document can be found at
from 0.0.4 to 0.0.3
from 0.0.2 to 0.0.3
- references added
- abstract finished
- Write abstract
- Suggested hardware
.Xdefaults disable some keys (Alt-Ctrl-F1)
- X server port 6000 attacks, do something about them
- X server under root, bad
- Eliminate more unneeded RPMs
- Implement /etc/pam.d/limits.conf to prevent netscape bloat and system
crash (well, by causing it to crash before bloat ;-) ), see
- Protect some files with chattr is nice
- Provided CDROM booting considerations
- Redo everything for RedHat 7.0
All comments, error reports, additional information (very much appreciated!!!)
and criticism of all sorts should be directed to:
My PGP key is located at
This document is copyrighted (c) 2000 Anton Chuvakin, and parts of it are
Copyright 1997 Donald B. Marti Jr. where marked as such
v0.3, 5 January 1998
The basic idea here is to give web access to people who wander by,
while limiting their ability to mess anything up.
Copyright 1997 Donald B. Marti Jr.
This document may be redistributed under the terms of
the Linux Documentation Project license.
This document currently contains information for Netscape Navigator
only, but I plan to add notes for other browsers too as I get the
necessary information. If you try this with a different browser,
please let me know.
The basic idea here is to give web access to people who wander by,
while limiting their ability to mess anything up.
This setup was originally intended for trade shows, but it might be
applicable other places you want to have a web browser going without
having to babysit a computer.
Following these instructions
does not make your system bulletproof or idiot-proof.
You need a graphical browser
This document assumes that you already have a running graphical web browser,
such as Netscape Navigator, on your system.
You should have permission to use your graphical web browser.
If you want to use Netscape Navigator in a commercial setting,
you can buy a copy with appropriate license through Caldera.
You need to be able to add an account
If you don't have the right to be root,
get the system administrator to add the ``
and give you ownership of
guest's home directory.
Skip to the ``Create or edit the following files'' step
Create or edit the following files in /home/guest)
when he or she is done.
httpd for a stand-alone web browsing station
If you are setting up a web browsing station to run stand-alone,
without a network connection,
you should have
httpd working and the web documents installed.
To tell if this is the case, enter:
lynx -dump http://localhost/
You should get the text of the home page on your system.
As root, run
adduser to add a user named
to set the password for the
This should be something easy to remember, like ``
You will be telling people this password.
Don't make it the same as your own password.
guest's home directory owned by you.
chown me.mygroup /home/guest
'' with your regular username and ``
with your group name.
(On Red Hat Linux, these will be the same,
since every user has his or her own group.)
You should now exit and do the rest of the steps as yourself,
This means that when
the login shell will start up the X Window System right away.
This means that when X starts,
just gets the web browser,
no window manager. If you prefer another web browser, do something else.
.Xclients should be executable by
chmod 755 /home/guest/.Xclients
to make it so.
If you use
(1) to log people in,
this file should make guest get the web browser
as if he or she had logged in normally.
should be executable by
chmod 755 /home/guest/.xsession
to make it so.
! Disable drag-to-select.
! Make visited and unvisited links the same color by default
! Disable some of the keyboard commands.
! Mouse bindings: make all mouse buttons do the same thing.
*drawingArea.translations: #replace \
<Btn1Down>: ArmLink() \n\
<Btn2Down>: ArmLink() \n\
<Btn3Down>: ArmLink() \n\
~Shift<Btn1Up>: ActivateLink() \
~Shift<Btn2Up>: ActivateLink() \
~Shift<Btn3Up>: ActivateLink() \
Shift<Btn1Up>: ActivateLink() \
Shift<Btn2Up>: ActivateLink() \
Shift<Btn3Up>: ActivateLink() \
<Btn1Motion>: DisarmLinkIfMoved() \n\
<Btn2Motion>: DisarmLinkIfMoved() \n\
<Btn3Motion>: DisarmLinkIfMoved() \n\
<Motion>: DescribeLink() \n\
This file disables blink tags, drag-to-select,
and some of the keyboard commands.
It also makes all mouse buttons do the same thing,
hides the menu bar, and makes visited and unvisited links the same color,
so each visitor gets nice clean blue links,
not ones that other people have been thumbing through and staining purple.
You should replace the
NETSCAPE_GEOMETRY in this file
with an X geometry that looks like this:
X is the width of your screen and
Y is the height
of your screen
This will position the Netscape menu bar off the top of the screen,
so the user won't be distracted.
For example, if your screen is 800x600,
the geometry should be
chmod 777 /home/guest/.netscape
.netscape directory and make it
Log out, then log in as
Since you won't be able to use the menu bar as
you should edit guest's preferences manually if you need to change them,
or change your own preferences to what you want
guest's to be
and copy the preferences file.
Install RedHat (further just RH) Linux on the box. Make sure shadow and MD5
passwords are enabled. And have a nice long root password! Refer to
corresponding installation guides.
RH Linux was and is *really* buggy out of the box (both local and remote exploits are
discovered every day, see
BugTRAQ database), and many software packages installed by default can
be used to obtain root shell from non-privileged account or in the worst cases
across the network (or just mess up the box). Thus special attention should be given to package
selection on the browser workstation.
Install ssh-server RPM for remote administration. Do NOT use inetd daemon
mode, make sshd run standalone and use /etc/hosts.allow for access
control (ssh daemon will read the file upon startup)
Make sure you create a boot floppy using a mkbootdisk command as errors
in LILO configuration might render the system unbootable.
Make the following modifications to configuration files
The file above disables Ctrl-Alt-Del combination and makes new runlevel 4 a default
runlevel. It also eliminates virtual consoles (all but 1).
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
# Author: Miquel van Smoorenburg, <firstname.lastname@example.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#--fixed by anton for browser station
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 4 - browser X
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#--anton: default runlevel now 4! other levels protected by LILO password
# System initialization.
# Things to run in every runlevel.
# Trap CTRL-ALT-DELETE
#anton -- not here, disable
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
#--anton -- only one is needed! comment out the rest
# Run xdm in runlevel 5
# xdm is now a separate service
Brief explanation for the options (see man mount for more)
/dev/hda1 / ext2 defaults,ro 1 1
/dev/hda7 /home ext2 defaults,nodev,noexec,nosuid 1 2
/dev/hda6 /tmp ext2 defaults,nodev,noexec,nosuid 1 2
/dev/hda5 /var ext2 defaults,nodev,noexec,nosuid 1 2
#/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0
#/dev/fd0 /mnt/floppy auto noauto,owner 0 0
none /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/hda8 swap swap defaults 0 0
- /etc/rc.d/ directory
Create file xbrowser in /etc/rc.d/init.d and symlink
cd /etc/rc.d/rc4.d ; ln -s /etc/rc.d/init.d/xbrowser S99xbrowser)it as
S99xbrowser in /etc/rc.d/rc4.d
so that directory /etc/rc.d/rc4.d looks like this
This init files are run upon entering runlevel 4 (either at reboot or when
typing init 4 from root prompt). Files are run in order of increasing
numbers so that our xbrowser runs in the end.
drwxrwxrwx 2 root root 4096 Sep 10 15:30 .
drwxrwxrwx 10 root root 4096 Sep 10 15:30 ..
lrwxrwxrwx 1 root root 1179 Sep 10 15:30 S05kudzu-> ../init.d/kudzu
lrwxrwxrwx 1 root root 5094 Sep 10 15:30 S10network-> ../init.d/network
lrwxrwxrwx 1 root root 1367 Sep 10 15:30 S16apmd-> ../init.d/apmd
lrwxrwxrwx 1 root root 1542 Sep 10 15:30 S20random-> ../init.d/random
lrwxrwxrwx 1 root root 3217 Sep 10 15:30 S25netfs-> ../init.d/netfs
lrwxrwxrwx 1 root root 1024 Sep 10 15:30 S30syslog-> ../init.d/syslog
lrwxrwxrwx 1 root root 989 Sep 10 15:30 S40atd-> ../init.d/atd
lrwxrwxrwx 1 root root 1031 Sep 10 15:30 S40crond-> ../init.d/crond
lrwxrwxrwx 1 root root 1203 Sep 10 15:30 S75keytable-> ../init.d/keytable
lrwxrwxrwx 1 root root 1261 Sep 10 15:30 S85gpm-> ../init.d/gpm
lrwxrwxrwx 1 root root 1956 Sep 10 15:30 S90xfs-> ../init.d/xfs
lrwxrwxrwx 1 root root 650 Sep 10 15:30 S99xbrowser-> ../init.d/xbrowser
xbrowser file looks like this
This file will start X server upon boot up with no prompting (after LILO
prompt). The X server will follow the directions in /root/.xinitrc,
below. X server config is shown below too.
# --anton: Init the box into X with browser, no login script
echo "Starting standalone browser....."
#put a mark into log
echo %%%%%%Reboot%%%%% >> /var/log/xlog
#this file marks X startrup using out xinitrc
#--main loop, indefinite with the presence of /tmp/startOK file ------------------
while [ -f /tmp/startOK ] ; do
#put a mark into log
echo %%%%%%Restart%%%%% >> /var/log/xlog
#kill stuck netscape if any (this doesnt help if it turn zombie)
killall -9 netscape >& /dev/null
#clear netscape lock
if [ -f ~netscape/.netscape/lock ]; then
#start X windows, no winman, using the config that starts only netscape
#config is in root home dir!!
#X server runs as root, sort of BAD
/usr/X11R6/bin/xinit /root/.xinitrc -- /usr/X11R6/bin/X bc
#main loop end-------------------------------
- Make sure /etc/sysctl.conf looks like this
This disable kernel interaction keys (aka Magic SysRQ keys) on startup.
# Disables packet forwarding
net.ipv4.ip_forward = 0
# Enables source route verification
net.ipv4.conf.all.rp_filter = 1
# Disables automatic defragmentation (needed for masquerading, LVS)
net.ipv4.ip_always_defrag = 0
# Disables the magic-sysrq key
#--anton: this IS important
kernel.sysrq = 0
Make changes to /etc/X11/XF86Config that was automatically created
during install to look have those in:
Now, the DontZap is a questionable choice. The Crtl-Alt-Backspace
sequence might be the only way to kill stuck netscape or the one with some
window overlapping netscape controls (like, View Source or View Page Info) as
will decrease the likelihood of it crashing, but will not eliminate this
miserable occurrence altogether. In the current setup pressing
Crtl-Alt-Backspace if DontZap is commented out will cause X server to
restart, killing netscape and doing a lock file cleanup.
# File generated by XConfigurator.
# Server flags section.
# Uncomment this to cause a core dump at the spot where a signal is
# received. This may leave the console in an unusable state, but may
# provide a better stack trace in the core dump to aid in debugging
# Uncomment this to disable the <Ctrl><Alt><BS> server abort sequence
# This allows clients to receive this key event.
#--anton -- no X server kill
#--another option is to have a kill as a means to fight broken/stuck netscape,
#--restart will bring it back after cleanup
# Uncomment this to disable the <Crtl><Alt><KP_+>/<KP_-> mode switching
# sequences. This allows clients to receive these key events.
#--anton -- kinda bad too
Make sure that /root/.xinitrc
See comments in file for explanation
/bin/rm -f ~netscape/.netscape/lock >& /dev/null
#--anton: otherwise non-root netscape cant run
#--anton only allow local but from all users
#--anton the name of test box was "afc" thus the line below
#--anton:starts netscape as user "netscape" and full screen!!
#make sure 1024x768 matches your monitor
su netscape -c "netscape -no-about-splash -geometry 1024x768+0+0"
#these commands were used in testing to set netscpae preferences
#same as having "netscape" uiser home dir writable for this user
#netscape -no-about-splash -geometry 1024x768+0+0 >& /tmp/LOG
#also needed: X as user "guest" eventually
Create user netscape, his home directory will be /home/netscape.
Start netscape and apply a restricted settings as:
- no Java (known big risks,
recently really big holes discovered in Netscape Java implementation),
cache (some Java bugs will access cache objects and then bypass JVM
- no cookies (might not be possible though, low risk),
- remove all launches of nonstandard applications (ideally-all applications) with
file types (by going to Netscape->Edit->Preferences->Navigator->Applications),
- history length set to 0 (next user can't see what previous was doing,
the risk is in seeing URL-encoded passwords sometimes)
Do chown to root on /home/netscape (by
chown -R root.root /home/netscape).
Make sure that his home directory belongs to root, there are no world-writable
files and subdirectories there and permission are at least
drwxr-xr-x 4 root root 1024 Sep 7 18:29 .
drwxr-xr-x 4 root root 1024 Sep 7 18:30 ..
-rw-r--r-- 1 root root 16 Sep 7 18:29 .bash_history
-rw-r--r-- 1 root root 24 Sep 5 08:21 .bash_logout
-rw-r--r-- 1 root root 230 Sep 5 08:21 .bash_profile
-rw-r--r-- 1 root root 124 Sep 5 08:21 .bashrc
-rw-r--r-- 1 root root 93 Sep 7 18:25 .mailcap
-rw-r--r-- 1 root root 0 Sep 7 18:25 .mime.types
drwxr-xr-x 4 root root 1024 Sep 10 08:38 .netscape
drwxr--r-- 2 root root 1024 Sep 6 00:04 .xauth
drwxr-xr-x 4 root root 1024 Sep 10 08:38 .
drwxr-xr-x 4 root root 1024 Sep 7 18:29 ..
drwxr--r-- 2 root root 1024 Sep 6 00:04 archive
-rw------- 1 root root 14757 Sep 7 18:38 bookmarks.html
drwxr--r-- 3 root root 1024 Sep 7 18:24 cache
-rw-r--r-- 1 root root 188416 Sep 6 00:05 cert7.db
-rw-r--r-- 1 root root 16384 Sep 7 18:30 history.dat
-rw-r--r-- 1 root root 111 Sep 7 16:20 history.list
-rw-r--r-- 1 root root 16384 Sep 6 00:05 key3.db
-rw-r--r-- 1 root root 0 Sep 6 00:04 nswrapper.copy_defs
-rw-r--r-- 1 root root 279 Sep 10 08:38 plugin-list
-rw-r--r-- 1 root root 3398 Sep 7 18:29 preferences.js
-rw-r--r-- 1 root root 741 Sep 7 18:29 registry
-rw-r--r-- 1 root root 16384 Sep 7 18:29 secmodule.db
Carefully test netscape functionality upon doing the chown to root!
At present, I have not found a way to avoid periodic Netscape complaints about
"Can't write preferences".
Another note is appropriate. Netscape is VERY buggy (last example is
Red Hat Linux Security Advisory
presents a way to crash and exploit netscape using a specially crafted JPEG
and is likely to crash periodically,
possibly producing a buffer overflow with shell access for the intruder. This
shell will have the netscape user as owner. Thus the absence of xterm and rxvt
on the system is absolutely crucial as it provides another line of defense.
Permission on the system should also be set very conservatively (no
world-writable files). Ideally, NO files should be owned by user "netscape" on
the system AT ALL (do a find / -user netscape command to confirm
this, also check for world writable files with find / -perm -2 ! -type l -ls).
The word restricted
will cause password prompting in order to
enter non-standard runlevel (e.g. linux init 0
from LILO: prompt).
That implies using stock RH 6.2 kernel. Kernel upgrade to 2.2.16 might be a
good idea as some bugs were found in early 2.2.14 kernels (low risk).
REMOVE /usr/X11R6/bin/xterm xterm executable COMPLETELY! This is REALLY IMPORTANT
as shell will be much harder to obtain in this case. Make sure its clone,
rxvt, is not installed! Ideally, all programs that can spawn a shell should be
Some physical security
- Secure reset button
- Remove CDROM and floppy disk drive
- Prevent access to the box to avoid hard drive replacement
Some final touches (nice but not essential for system functionality)
- Implement free disk space monitor top avoid partition overflows
- Enable remote logging (preferably to some dedicated box with host-based IDS
that analyzes the logs)
It just might work ;-)
Web Kiosk HOWTO
Similar HOWTO, main differences: no keyboard, uses fvwm2
Public Web Browser HOWTO
Similar HOWTO, older and less security oriented
Linux Security HOWTO
You can buy something
similar to what is described in the HOWTO for $199 (I am not affiliated with
the company in any way)
I also maintain a Linux ISP HOWTO.
I also maintain a list of computer/network security related books with
(where available) reviews and online availability. If you have a book that I don't list please use the form on the page and I will add it to the list and maybe review