...making Linux just a little more fun!
Unless you have been living under a rock for the past few years, you must have heard about instant messaging and how it has changed the world of communications over the Internet. According to http://www.webopedia.com, Instant Messaging (IM) is a service that alerts users when their friends or colleagues are on line and allows them to communicate in real time through private online chat areas. Two of the most popular IM services are AOL Instant Messenger (AIM) and MSN Messenger. Unfortunately, most of the publicly available servers use proprietary protocols that only allow you to communicate with users on the same system. These systems are not compatible with each other and can't be accessed from other clients.
Jabber is an open source implementation of the IM server that aims to change this. It uses streaming XML protocols that are free, open, and public. These protocols have been formalized by the Internet Engineering Task Force (IETF) as the approved instant messaging and presence technology under the name of XMPP. The first Jabber technologies were developed in 1998 by Jeremie Miller and is now used on thousands of servers world-wide to enable millions of users to communicate with each other.
The biggest advantage of the Jabber server when compared with commercial IM servers is that, since it is open source, anyone can run a Jabber server and it can be restricted to a specific community like a company work force or a group of friends. In this article, I will document the steps I took to set up a Jabber server and how I managed to overcome the difficulties I faced. Hopefully this will make it easier for you to set up your own Jabber server.
Before we compile the server, we need to make some changes to the system on which we'll be installing the server to make it more secure. The first thing we have to do is create a new user so the Jabberd server process is not run as root. This is highly recommended, since running server processes as root is a pretty bad idea.
Now, you might be wondering why that's the case. Right? Well, imagine this scenario: a buffer overflow flaw is discovered in the Jabberd server code and before a fix for it has been written a script-kiddy who has hated you since you stole his place in the 5th grade cafeteria finds out that you are running a version of the server that is vulnerable to the attack and decides to hack you. Now, if you are running the server as root, he would have you at his mercy, as he would have full control of the server and he could do whatever he wanted with it. On the other hand, if you were running it as another user, he would still have to jump through a lot of hoops to get root access and hopefully he would set off some kind of alarm before he gets it, allowing you to catch him. Convinced yet? No? Well it's your funeral...
To add a user to the server, run the following command as root:
adduser jabber
. Then, choose a password for the account
by running the following command: passwd jabber
.
After changing the password, we need to create a directory where
the jabberd process will store its logs and pids. You do it by
running the following commands:
mkdir -p /usr/local/var/jabberd/pid/
mkdir -p /usr/local/var/jabberd/log/
Once the directories are created, we need to change the ownership of
the directories so that the user jabber can write to them. We do
this by running the following commands:
chown -R jabber:jabber /usr/local/var/jabberd/pid/
chown -R jabber:jabber /usr/local/var/jabberd/log
Since Jabber is an Open Source project, there are multiple implementations of the Jabber server. A list of some of the servers is available at: http://www.jabber.org/software/servers.shtml. I decided to use the Jabberd 2.x implementation of the server as I already had the source for the server on my computer. Also, it wasn't possible to download another server source due to the recent hack of the Jabber Studio servers and the subsequent shutdown of the download section of the site while they figured out what was going on.
Hopefully, by the time you read this, their machines should be back to normal and you will be able to download the latest version of Jabberd from their site.
First thing we have to do after we download the source is to
uncompress it by issuing the following command: tar -zxf
jabberd-2.0s2.tar.gz
. Then we change our current working
directory to the jabberd source directory by issuing the following
command: cd jabberd-2.0s2
The jabberd server has a lot of configuration options that can
be set during the initial configuration. To see a list of all the
options available run the following command: ./configure
--help.
I decided to go with the default settings so I used
the following command to configure the install process:
./configure
Once the configure script has finished running without giving
any errors, we can go ahead and compile the program by issuing the
following command: make
. Once this is done, we
install the server by running: make install
as
root.
By default, jabberd uses MySQL to store the user data, so we'll need to
setup a new MySQL database that jabberd can access. There is a script in
the 'tools' subdirectory of the jabberd source that makes this really easy
to do. To run the script issue the following command:
mysql -u
root -p < tools/db-setup.mysql
Enter the MySQL root password when you are prompted for it. This
script creates a new database and populates it with tables that the
jabberd server requires. Once the script finishes running, we need
to create a user called jabberd2 in MySQL to allow jabberd to
manipulate the database. This is done by issuing the following
command:
mysql -u root -p
.
Now enter the root password when you are prompted for it and you
will get the MySQL command prompt. At this prompt enter the
following command:
GRANT select,insert,delete,update ON jabberd2.* to jabberd2
at localhost IDENTIFIED by 'examplepassword';
replacing "examplepassword" with a password of your choice. Once you run
this command type exit
to exit the program. This finishes the
installation of the jabberd server. Now we need to customize the server
for our use.
To customize the server, we first need to change to the jabberd
directory by running the following command: cd
/usr/local/etc/jabberd/
. Then we want to edit the sm.xml
file so we follow the following steps as root:
sm.xml
in your favorite text
editorjabber.yoursite.com
(Make sure that
jabber.yoursite.com resolves)<auto-create/>
tag. This allows users that are
not registered on the server to register themselves.<roster>/usr/local/etc/jabberd/templates/roster.xml</roster>
.
We will cover the contents of the roster.xml in a few minutes.Once we are done editing, save sm.xml and exit the editor. Now we need to customize c2s.xml, so follow these steps as root:
c2s.xml
in your favorite text editor'Local network configuration'
section and change the <id> from localhost to
jabber.yoursite.comThis completes the configuration of the jabberd server. This
gives us a basic jabber server that allows users to register
themselves and chat with each other. However, if we want to have the
ability to create chat rooms, we need to install some additional
software called mu-conference
. We will cover the
installation of mu-conference momentarily.
jabberd gives us the ability to create a template buddy list so that each new user has a default buddy list. This is very useful in environments where the administrator wants to make sure each user has all the important people in their buddy list without spending a lot of time adding each user manually.
The template file is located in the templates subdirectory and is
called roster.xml
. The file has the following
format:
<query xmlns=’jabber:iq:roster’> <!-- <item name=’Buddy Name’ jid=’JID@Host.domain’ subscription=’both’> <group>BuddyGroup</group> </item> --> </query>
To add new users we need to uncomment the <item name> tag and add a new line for each user. For example if you wanted to add me to the default roster and my JID (Jabber ID) was suramya@jabber.suramya.com the entry for my name would look like this:
<item name='Suramya' jid='suramya@jabber.suramya.com' subscription='both'> <group>Support</group> </item>
The group field tells the client the group under which the entry is supposed to be stored. In this case Suramya is being stored under the Support group. All entries need to be enclosed within the <query> </query> tag, so the complete file with one user would look something like:
<query xmlns=’jabber:iq:roster’> <item name=’Suramya’ jid=’suramya@jabber.suramya.com’ subscription=’both’> <group>Support</group> </item> </query>
Before we can install mu-server we need to install the Jabber Component Runtime(JCR) which is available for download at: http://jabber.terrapin.com/JCR/jcr-0.1.2.tar.gz. To download and install JCR follow these steps:
wget
http://jabber.terrapin.com/JCR/jcr-0.1.2.tar.gz
tar -zxf
jcr-0.1.2.tar.gz
cd
jcr-0.1.2
make
Once jcr finishes compiling we can proceed with the installation of mu-conference by following these steps:
tar -zxf
mu-conference-0.6.0.tar.gz
cp src/main.c mu-conference-0.6.0/src
cp src/jcomp.mk mu-conference-0.6.0/src
cd
mu-conference-0.6.0/src
make -f jcomp.m
cp mu-conference /usr/local/bin
cp ../muc-jcr.xml /usr/local/etc/jabberd/
Now we have to customize mu-conference by editing
muc-jcr.xml
. To customize the conference follow these
steps:
muc-jcr.xml
in your favorite text editorconference.yoursite.com
/usr/local/var/jabberd/spool
/usr/local/var/jabberd/log
usr/local/var/jabberd/pid
mkdir -p
/usr/local/var/jabberd/spool/
This finishes the configuration of the mu-conference server and we are now ready to run it.
To run the server run the following commands:
su jabber
/usr/local/bin/jabberd &
/usr/local/bin/mu-conference -c /etc/jabberd/muc-jcr.xml
&
By now I have hopefully saved you a lot of trouble by telling you how to setup a jabber server quickly and easily. If you think this document helped you or you have some comments or questions about this please feel free to contact me and let me know. However I must warn you that I am a somewhat lazy person who might take a little while before replying to your emails.
Thanks for your time -
Suramya TomarCreated by: Suramya Tomar
Last updated: 14th February 2005
This document is Copyright © 14th July 2005, Suramya
Tomar.
It is released to the public under the Creative Commons
Attribution-ShareAlike 1.0 License
In this section I have the pleasure of acknowledging the following people without whose input this would have never seen the light of the day:
I was born in 1980 in a small Air Force hospital in Hashimara, India. I
then spent the next 18 years of my life all over India during which I had
the pleasure of attending 7 schools to complete 12 years of schooling.
I started using Linux in late 1999 when a friend lent me a Redhat 7.1
installation CD and another friend 'donated' a 6GB harddisk. This was right
after my Win98 had crashed for the nth time so I decided to give Linux a
shot. I tried it and got hooked almost instantly. Over the next 2 years I
upgraded to Redhat 7.3 but when Redhat decided to stop support for RH 7.3 I
switched to Debian and have been living happily ever since.
I like to program a lot and have recently figured out how to decipher
the jumble of characters some people like to call Perl and found that I
actually like it. For websites I like using PHP with MySQL backends and can
program with C, C++, VB and .Net. I am also very interested in computer
security and Artificial Intelligence and try to read as much on
these topics as I can.
Other than working on the computer I like reading (mainly Fantasy and
Science Fiction but I will read anything except romance novels), listening
to music (fav singers include: Shania Twain, In-Grid, Crystal Waters) and
taking stuff apart to see how it works.
If you are really bored and want to learn more about me then feel free to
visit my website at: http://www.suramya.com where you will find
more info about me than you ever wanted to know.