By default Tomcat’s HTTP connector listens on port 8080. Changing to port 80 in Linux environment is a tricky issue, since by default listening on any port under 1024 require a privileged user, and for security considerations it is not recommended to run Tomcat with elevated permissions. We can use authbind to achieve this.

In the end of the article, all the commands are summarized to facilitate one-step configuration.

Installing Tomcat

We’ll need the tomcat6 package to run Tomcat’s core components, as well as the tomcat6-admin-webapps .We’ll compile the authbind application from its sources, so we’ll also need gcc.

[root@websrv~]# yum -y install tomcat6 tomcat6-admin-webapps gcc

 [root@websrv~]# chkconfig tomcat6 on

Listening on ports<1024 in Linux with an unprivileged user

There are 3 methods to achieve this:

–   By using authbind which authorizes specific users to specific ports under 1024

–   By using Jsvc, a set of libraries and applications for making Java applications run on UNIX more    easily (Jsvc allows Tomcat application to perform some privileged operations as root (e.g. bind to a port <1024), and then switch identity to a non-privileged user.)

–    By configuring iptables to re-route the packets from port 80 to 8080

We will use the authbind approach. But first, let’s tell Tomcat to listen on port 80 instead of 8080.

Changing Tomcat’s default HTTP port

The default HTTP port is defined in /etc/tomcat6/server.xml. We need to change this default port to 80 in server.xml. To replace the occurrences of port=”8080” to port=”80”, execute the following command:

[root@websrv~]# sed -i ‘s/port\=\”8080\”/port\=\”80\”/’ /etc/tomcat6/server.xml

The same for port 8443, which will be replaced with port 443:

 [root@websrv~]# sed -i ‘s/port\=\”8443\”/port\=\”443\”/’ /etc/tomcat6/server.xml

 We’ll start Tomcat with authbind. This can be achieved by changing Tomcat’s init-script in /etc/init.d, replacing the line

TOMCAT_SCRIPT=”/usr/sbin/tomcat6″

with

TOMCAT_SCRIPT=”exec authbind –deep /usr/sbin/tomcat6″

it can be done like this:

[root@websrv~]# sed -i  ‘s/TOMCAT_SCRIPT=\”\/usr\/sbin\/tomcat6\”/TOMCAT_SCRIPT=\”exec

authbind  –deep \/usr\/sbin\/tomcat6\”/’ /etc/init.d/tomcat6

We have to tell Tomcat to use the IPv4 stack by default. This can be done by appending the line CATALINA_OPTS=”-Djava.net.preferIPv4Stack=true” to /etc/tomcat6/tomcat6.conf:

[root@websrv~]# sed -i ‘$ a\CATALINA_OPTS=\”-Djava\.net\.preferIPv4Stack=true\”\n’

/etc/tomcat6/tomcat6.conf

Installing and configuring authbind

Authbind is installed the usual way, with the help of gcc and make.

[root@websrv~]# wget http://ftp.debian.org/debian/pool/main/a/authbind/authbind_1.2.0.tar.gz

[root@websrv~]# tar -zxvf authbind_1.2.0.tar.gz

[root@websrv~]# cd authbind-1.2.0/

[root@websrv~]# make

[root@websrv~]# make install

Authbind is configured with some special files, for which we can assign our arbitrary permissions for the users we want to give access to. Since Tomcat is running with the Tomcat user, we’ll tell authbind to allow connections to the HTTP port 80 and the HTTPS port 443 for this account:

[root@websrv~]# touch  /etc/authbind/byport/80

[root@websrv~]# chmod 500 /etc/authbind/byport/80

[root@websrv~]# chown tomcat /etc/authbind/byport/80

[root@websrv~]# touch  /etc/authbind/byport/443

[root@websrv~]# chmod 500 /etc/authbind/byport/443

[root@websrv~]# chown tomcat /etc/authbind/byport/443

For the changes to take effect, Tomcat has to be restarted:

[root@websrv~]# /etc/init.d/tomcat6 restart

To see if there is any error, the tomcat log can be consulted:

[root@websrv~]# less -S /var/log/tomcat6/catalina.out

Posted in: Linux.
Last Modified: October 31, 2013

Leave a reply