Chapter 9. Squid Caching Proxy
"Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. Squid has extensive access controls and makes a great server accelerator."
9.1. Squid Caching Proxy and SELinux
When SELinux is enabled, squid runs confined by default. Confined processes run in their own domains, and are separated from other confined processes. If a confined process is compromised by an attacker, depending on SELinux policy configuration, an attacker's access to resources and the possible damage they can do is limited. The following example demonstrates the squid processes running in their own domain. This example assumes the squid package is installed:
Run getenforce
to confirm SELinux is running in enforcing mode:
$ getenforce
Enforcing
The getenforce
command returns Enforcing
when SELinux is running in enforcing mode.
Run service squid start
as the root user to start squid
:
# service squid start
Starting squid: [ OK ]
Run ps -eZ | grep squid
to view the squid
processes:
$ ps -eZ | grep squid
unconfined_u:system_r:squid_t:s0 2522 ? 00:00:00 squid
unconfined_u:system_r:squid_t:s0 2524 ? 00:00:00 squid
unconfined_u:system_r:squid_t:s0 2526 ? 00:00:00 ncsa_auth
unconfined_u:system_r:squid_t:s0 2527 ? 00:00:00 ncsa_auth
unconfined_u:system_r:squid_t:s0 2528 ? 00:00:00 ncsa_auth
unconfined_u:system_r:squid_t:s0 2529 ? 00:00:00 ncsa_auth
unconfined_u:system_r:squid_t:s0 2530 ? 00:00:00 ncsa_auth
unconfined_u:system_r:squid_t:s0 2531 ? 00:00:00 unlinkd
The SELinux context associated with the squid
processes is unconfined_u:system_r:squid_t:s0
. The second last part of the context, squid_t
, is the type. A type defines a domain for processes and a type for files. In this case, the squid
processes are running in the squid_t
domain.
SELinux policy defines how processes running in confined domains, such as squid_t
, interact with files, other processes, and the system in general. Files must be labeled correctly to allow squid access to them.
When /etc/squid/squid.conf
is configured so squid
listens on a port other than the default TCP ports 3128, 3401 or 4827, the semanage port
command must be used to add the required port number to the SELinux policy configuration. The following example demonstrates configuring squid
to listen on a port that is not initially defined in SELinux policy configuration for squid
, and, as a consequence, squid
failing to start. This example also demonstrates how to then configure the SELinux system to allow squid
to successfully listen on a non-standard port that is not already defined in the policy. This example assumes the squid package is installed. Run each command in the example as the root user:
Run service squid status
to confirm squid
is not running:
# service squid status
squid is stopped
If the output differs, run service squid stop
to stop the process:
# service squid stop
Stopping squid: [ OK ]
Run semanage port -l | grep -w squid_port_t
to view the ports SELinux allows squid
to listen on:
semanage port -l | grep -w -i squid_port_t
squid_port_t tcp 3128, 3401, 4827
squid_port_t udp 3401, 4827
Edit /etc/squid/squid.conf
as the root user. Configure the http_port
option so it lists a port that is not configured in SELinux policy configuration for squid
. In this example, squid
is configured to listen on port 10000:
# Squid normally listens to port 3128
http_port 10000
Run the setsebool
command to make sure the squid_connect_any
Boolean is set to off. This ensures squid is only permitted to operate on specific ports:
setsebool -P squid_connect_any 0
Run service squid start
to start squid
:
# service squid start
Starting squid: .................... [FAILED]
An SELinux denial similar to the following is logged:
localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
For SELinux to allow squid
to listen on port 10000, as used in this example, the following command is required:
# semanage port -a -t squid_port_t -p tcp 10000
Run service squid start
again to start squid
and have it listen on the new port:
# service squid start
Starting squid: [ OK ]
Now that SELinux has been configured to allow squid
to listen on a non-standard port (TCP 10000 in this example), squid
starts successfully on this port.