Description: Candidates should be able to install and configure a proxy server, including access policies, authentication and resource usage.
Key Knowledge Areas:
Squid 3.x configuration files, terms and utilities
Access restriction methods
Client user authentication methods
Layout and content of ACL in the Squid configuration files
Terms and Utilities:
In this light weight lesson we talk about squid proxy server. Squid has a giant configuration file and covering all aspect of that needs spending more time, but for this course we just discuss about items which are important for LPIC2 exam.
A proxy server is a computer that acts as an intermediary between a desktop computer and the internet and allows a client machine to make an indirect connection to network servers and services. There are many reasons why we might want to include a proxy server on our network:
To share internet connection on a LAN
To speed up internet surfing
To hide the IP address of the client computer for anonymous surfing
To implement internet access control
To scan outbound content
To circumvent regional restrictions
Clearly some of the above reasons are perfectly fitting for a business and some others do not.Regardless, knowing how to install and configure a proxy server is a must-have skill for a network administrator.
Squid is a free and open-source full featured web proxy cache server released under GPL 3, which can be used in many other ways like a web server caching daemon to speed up websites loading, cache DNS lookups, filter the traffic and many other network protocols, right now, Squid server supports HTTP and FTP protocols, there is a limited support to other protocols like TLS and SSL, it was first released in 1996.
Lets install squid on CentOS7 and see what does really look like:
[[email protected] ~]# yum install squid[[email protected] ~]# rpm -ql squid | grep etc/etc/NetworkManager/dispatcher.d/20-squid/etc/httpd/conf.d/squid.conf/etc/logrotate.d/squid/etc/pam.d/squid/etc/squid/etc/squid/cachemgr.conf/etc/squid/cachemgr.conf.default/etc/squid/errorpage.css/etc/squid/errorpage.css.default/etc/squid/mime.conf/etc/squid/mime.conf.default/etc/squid/squid.conf/etc/squid/squid.conf.default/etc/sysconfig/squid
The current version of squid server is version 3 , so based on our distribution we might need to mention that or version 3 will be automatically installed.
The default configuration file for squid is located under /etc/squid3/squid.conf or /etc/squid/squid.conf.
[[email protected] ~]# cd /etc/squid/[[email protected] squid]# ls -ltotal 48-rw-r--r--. 1 root squid 692 Apr 10 2018 cachemgr.conf-rw-r--r--. 1 root root 692 Apr 10 2018 cachemgr.conf.default-rw-r--r--. 1 root root 1817 Apr 10 2018 errorpage.css-rw-r--r--. 1 root root 1817 Apr 10 2018 errorpage.css.default-rw-r--r--. 1 root root 12077 Apr 10 2018 mime.conf-rw-r--r--. 1 root root 12077 Apr 10 2018 mime.conf.default-rw-r-----. 1 root squid 2315 Apr 10 2018 squid.conf-rw-r--r--. 1 root root 2315 Apr 10 2018 squid.conf.default
This file contains some configuration directives that needs to be configured to affect the behavior of the Squid.
[[email protected] squid]# cat squid.conf## Recommended minimum configuration:## Example rule allowing access from your local networks.# Adapt to list your (internal) IP networks from where browsing# should be allowedacl localnet src 10.0.0.0/8 # RFC1918 possible internal networkacl localnet src 172.16.0.0/12 # RFC1918 possible internal networkacl localnet src 192.168.0.0/16 # RFC1918 possible internal networkacl localnet src fc00::/7 # RFC 4193 local private network rangeacl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machinesacl SSL_ports port 443acl Safe_ports port 80 # httpacl Safe_ports port 21 # ftpacl Safe_ports port 443 # httpsacl Safe_ports port 70 # gopheracl Safe_ports port 210 # waisacl Safe_ports port 1025-65535 # unregistered portsacl Safe_ports port 280 # http-mgmtacl Safe_ports port 488 # gss-httpacl Safe_ports port 591 # filemakeracl Safe_ports port 777 # multiling httpacl CONNECT method CONNECT## Recommended minimum Access Permission configuration:## Deny requests to certain unsafe portshttp_access deny !Safe_ports# Deny CONNECT to other than secure SSL portshttp_access deny CONNECT !SSL_ports# Only allow cachemgr access from localhosthttp_access allow localhost managerhttp_access deny manager# We strongly recommend the following be uncommented to protect innocent# web applications running on the proxy server who think the only# one who can access services on "localhost" is a local user#http_access deny to_localhost## INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS## Example rule allowing access from your local networks.# Adapt localnet in the ACL section to list your (internal) IP networks# from where browsing should be allowedhttp_access allow localnethttp_access allow localhost# And finally deny all other access to this proxyhttp_access deny all# Squid normally listens to port 3128http_port 3128# Uncomment and adjust the following to add a disk cache directory.#cache_dir ufs /var/spool/squid 100 16 256# Leave coredumps in the first cache dircoredump_dir /var/spool/squid## Add any of your own refresh_pattern entries above these.#refresh_pattern ^ftp: 1440 20% 10080refresh_pattern ^gopher: 1440 0% 1440refresh_pattern -i (/cgi-bin/|\?) 0 0% 0refresh_pattern . 0 20% 4320
The file in Ubuntu is so huge cause of its rich documents.Lets take a look at important ones:
port [mode] [options]
This is the default port for the HTTP proxy server, by default it is 3128
Defines the amount of memory Squid can use for cache. The default is 256 MB and it is commented out. This does not specify the memory usage of Squid and may be exceeded.
Objects greater than this size will not be attempted to kept in the memory cache. This should be set high enough to keep objects accessed frequently in memory to improve performance whilst low enough to keep larger objects from hoarding cache_mem. And the default size is 512 KB.
cache_dir aufs Directory-Name Mbytes L1 L2 [options]
The entry cache_dir defines the directory where all the objects are stored on disk. The numbers at the end indicate the maximum disk space in MB to use and the number of directories in the first and second level. "ufs" is the old well-known Squid storage format that has always been there. By default disk caching is not turned on and we can enable it by commenting it out.
cache_dir ufs /var/cache/squid/ 100 16 256 : The default is 100 MB occupied disk space in the /var/cache/squid directory and creation of 16 subdirectories inside it, each containing 256 more subdirectories.
Set the default value for max-size parameter on any cache_dir. The value is specified in bytes, and the default is 4 MB.
And after doing some configurations (as en example here we have turned on disk cache) we need to restart squid service :
[[email protected] ~]# systemctl status squid.service● squid.service - Squid caching proxyLoaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled)Active: inactive (dead)[[email protected] ~]# systemctl start squid.service[[email protected] ~]# systemctl status squid.service● squid.service - Squid caching proxyLoaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled)Active: active (running) since Wed 2018-10-10 11:49:42 EDT; 10s agoProcess: 35580 ExecStart=/usr/sbin/squid $SQUID_OPTS -f $SQUID_CONF (code=exited, status=0/SUCCESS)Process: 35571 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/SUCCESS)Main PID: 35582 (squid)CGroup: /system.slice/squid.service├─35582 /usr/sbin/squid -f /etc/squid/squid.conf├─35584 (squid-1) -f /etc/squid/squid.conf└─35588 (logfile-daemon) /var/log/squid/access.logOct 10 11:49:42 centos7-2 systemd: Starting Squid caching proxy...Oct 10 11:49:42 centos7-2 squid: Squid Parent: will start 1 kidsOct 10 11:49:42 centos7-2 squid: Squid Parent: (squid-1) process 35584 startedOct 10 11:49:42 centos7-2 systemd: Started Squid caching proxy.[[email protected] ~]# telnet localhost 3128Trying ::1...Connected to localhost.Escape character is '^]'.helo........
And as a next step we need to configure our browser to goes trough proxy server (we use the same computer for our demonstration):
And if you like browsing in terminal with programs like lynx:
[[email protected] squid]# export http_proxy=http://192.168.52.135:3128
Well, for testing purpose we need to show the speed of web surfing in our browser which is not possible here. Do not forget that each web browser has a local cache and try to clear that before reloading a page again and again.
ACLs allow us to restrict the access to websites, and / or monitor the access on a per user basis. We can restrict access based on day of week or time of day, or domain, for example.
The access control scheme of the Squid web proxy server consists of two different components:
1-The ACL elements are directive lines that begin with the word “acl” and represent types of data that are performed against any request transaction.
acl aclname acltype argument ...
acl SSL_ports port 443acl Safe_ports port 80 # httpacl Safe_ports port 21 # ftpacl Safe_ports port 443 # httpsacl Safe_ports port 70 # gopheracl Safe_ports port 210 # waisacl Safe_ports port 1025-65535 # unregistered portsacl Safe_ports port 280 # http-mgmtacl Safe_ports port 488 # gss-httpacl Safe_ports port 591 # filemakeracl Safe_ports port 777 # multiling http
The lines above for squid.conf represent a basic example of the usage of ACL elements.
The first word, acl, indicates that this is a ACL element directive line.
The second word, localhost or Safe_ports, specify a name for the directive.
The third word, port in this case, is an ACL element type that is used to represent a TCP port. It can be a client IP address or range of addresses. Also it is possible to use hostname, if we have some sort of DNS resolution implemented.
***** Different ACL Elements *****src: source (client) IP addressesdst: destination (server) IP addressesmyip: the local IP address of a client's connectionarp: Ethernet (MAC) address matchingsrcdomain: source (client) domain namedstdomain: destination (server) domain namesrcdom_regex: source (client) regular expression pattern matchingdstdom_regex: destination (server) regular expression pattern matchingsrc_as: source (client) Autonomous System numberdst_as: destination (server) Autonomous System numberpeername: name tag assigned to the cache_peer where request is expected to be sent.time: time of day, and day of weekurl_regex: URL regular expression pattern matchingurlpath_regex: URL-path regular expression pattern matching, leaves out the protocol and hostnameport: destination (server) port numbermyport: local port number that client connected tomyportname: name tag assigned to the squid listening port that client connected toproto: transfer protocol (http, ftp, etc)method: HTTP request method (get, post, etc)http_status: HTTP response status (200 302 404 etc.)browser: regular expression pattern matching on the request user-agent headerreferer_regex: regular expression pattern matching on the request http-referer headerident: string matching on the user's nameident_regex: regular expression pattern matching on the user's nameproxy_auth: user authentication via external processesproxy_auth_regex: regular expression pattern matching on user authentication via external processessnmp_community: SNMP community string matchingmaxconn: a limit on the maximum number of connections from a single client IP addressmax_user_ip: a limit on the maximum number of IP addresses one user can login fromreq_mime_type: regular expression pattern matching on the request content-type headerreq_header: regular expression pattern matching on a request header contentrep_mime_type: regular expression pattern matching on the reply (downloaded content) content-type header. This is only usable in the http_reply_access directive, not http_access.rep_header: regular expression pattern matching on a reply header content. This is only usable in the http_reply_access directive, not http_access.external: lookup via external acl helper defined by external_acl_typeuser_cert: match against attributes in a user SSL certificateca_cert: match against attributes a users issuing CA SSL certificateext_user: match on user= field returned by external acl helper defined by external_acl_typeext_user_regex: regular expression pattern matching on user= field returned by external acl helper defined by external_acl_type
2-The access list rules consist of an allow or deny action followed by a number of ACL elements, and are used to indicate what action or limitation has to be enforced for a given request. There are a number of different access lists:
***** Different ACL types *****http_access: Allows HTTP clients (browsers) to access the HTTP port. This is the primary access control list.http_reply_access: Allows HTTP clients (browsers) to receive the reply to their request. This further restricts permissions given by http_access, and is primarily intended to be used together with rep_mime_type acl for blocking different content types.icp_access: Allows neighbor caches to query your cache with ICP.miss_access: Allows certain clients to forward cache misses through your cache. This further restricts permissions given by http_access, and is primarily intended to be used for enforcing sibling relations by denying siblings from forwarding cache misses through your cache.cache: Defines responses that should not be cached.url_rewrite_access: Controls which requests are sent through the redirector pool.ident_lookup_access: Controls which requests need an Ident lookup.always_direct: Controls which requests should always be forwarded directly to origin servers.never_direct: Controls which requests should never be forwarded directly to origin servers.snmp_access: Controls SNMP client access to the cache.broken_posts: Defines requests for which squid appends an extra CRLF after POST message bodies as required by some broken origin servers.cache_peer_access: Controls which requests can be forwarded to a given neighbor (cache_peer).htcp_access: Controls which remote machines are able to make HTCP requests.htcp_clr_access: Controls which remote machines are able to make HTCP CLR requests.request_header_access: Controls which request headers are removed when violating HTTP protocol.reply_header_access: Controls which reply headers are removed from delivery to the client when violating HTTP protocol.delay_access: Controls which requests are handled by what delay poolicap_access: (replaced by adaptation_access in Squid-3.1) What requests may be sent to a particular ICAP server.adaptation_access: What requests may be sent to a particular ICAP or eCAP filter service.log_access: Controls which requests are logged. This is global and overrides specific file access lists appended to access_log directives.
Lets go back to squid.conf and fine some examples:
# Deny requests to certain unsafe portshttp_access deny !Safe_ports
The two lines above are access list rules and represent an explicit implementation of the ACL directives mentioned earlier and it denies access to the localhost unsafe ports.
An access list rule consists of an allow or deny keyword, followed by a list of ACL element names.
An access list consists of one or more access list rules.
Access list rules are checked in the order they are written. List searching terminates as soon as one of the rules is a match.
If a rule has multiple ACL elements, it uses AND logic. In other words, all ACL elements of the rule must be a match in order for the rule to be a match. This means that it is possible to write a rule that can never be matched. For example, a port number can never be equal to both 80 AND 8000 at the same time.
To summarize the ACL logics can be described as: (note: AND/OR below is just for illustartion, not part of the syntax)
http_access allow|deny acl AND acl AND ...ORhttp_access allow|deny acl AND acl AND ...OR...
If none of the rules are matched, then the default action is the opposite of the last rule in the list. Its a good idea to be explicit with the default action. The best way is to use the all ACL (Cache All). For example:
http_access deny all
So to have a big picture in mind of how squid works, it works like that :
For demonstration Lets create required ACL elements and ACL rules to avoid visiting yahoo web site on Fridays:
acl YAHOO dstdomain .yahoo.comacl FRIDAY time Friday
Do not forget to define acl rule before cache all:
## INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS#http_access deny YAHOO FRIDAY# Example rule allowing access from your local networks.# Adapt localnet in the ACL section to list your (internal) IP networks# from where browsing should be allowed#http_access allow localnethttp_access allow localhost# And finally deny all other access to this proxyhttp_access deny all
and finally do not forget to restart thr service:
One another option of squid is adding user authentication . For that we need to use auth_param ACL element.
The auth_param directive controls almost every aspect of Squid's external user authentication interface. Squid currently supports three authentication schemes: Basic, Digest, and NTLM. Basic authentication support is compiled by default (For the others, you must use the enable-auth option with ./configure.).
The auth_param directive is very complex, what we are presenting here for LPIC2 exam is HTTP Basic authentication helper, and the syntax would be:
auth_param basic program command ...
auth_param basic program /opt/squid/ncsa /etc/squid/passwd
So basic says what type of authentication we are going to use, so in browser it just pops up a window.
program defines what program is going to be used for Authentication, and the actual location of that program (the location might be different in different distributions, be careful and check it).
ncsa is a very simple program which uses the same apache htpasswd type format.
some others are:
=> NCSA: Uses an NCSA-style username and password file.=> LDAP: Uses the Lightweight Directory Access Protocol=> MSNT: Uses a Windows NT authentication domain.=> PAM: Uses the Linux Pluggable Authentication Modules scheme.=> SMB: Uses a SMB server like Windows NT or Samba.=> getpwam: Uses the old-fashioned Unix password file.=> SASL: Uses SALS libraries.=> NTLM, Negotiate and Digest authentication
And the last argument for ncsa is where the user password file is stored.
Start implementing basic user authentication in squid and as first step locate nsa_auth place in our distribution
(In ubuntu use
dpkg -L squid | grep ncsa_auth ) :
[[email protected] squid]# locate ncsa_auth[[email protected] squid]# rpm -ql squid | grep ncsa_auth/usr/lib64/squid/basic_ncsa_auth/usr/share/man/man8/basic_ncsa_auth.8.gz[[email protected] squid]# ls -l /usr/lib64/squid/ | grep auth-rwxr-xr-x. 1 root root 5399 Apr 10 2018 basic_db_auth-rwxr-xr-x. 1 root root 11360 Apr 10 2018 basic_getpwnam_auth-rwxr-xr-x. 1 root root 23768 Apr 10 2018 basic_ldap_auth-rwxr-xr-x. 1 root root 5502 Apr 10 2018 basic_msnt_multi_domain_auth-rwxr-xr-x. 1 root root 24032 Apr 10 2018 basic_ncsa_auth-rwxr-xr-x. 1 root root 15488 Apr 10 2018 basic_nis_auth-rwxr-xr-x. 1 root root 19664 Apr 10 2018 basic_pam_auth-rwxr-xr-x. 1 root root 2975 Apr 10 2018 basic_pop3_auth-rwxr-xr-x. 1 root root 20048 Apr 10 2018 basic_radius_auth-rwxr-xr-x. 1 root root 15456 Apr 10 2018 basic_sasl_auth-rwxr-xr-x. 1 root root 15536 Apr 10 2018 basic_smb_auth-rwxr-xr-x. 1 root root 2657 Apr 10 2018 basic_smb_auth.sh-rwxr-xr-x. 1 root root 41512 Apr 10 2018 basic_smb_lm_auth-rwxr-xr-x. 1 root root 32192 Apr 10 2018 digest_edirectory_auth-rwxr-xr-x. 1 root root 24112 Apr 10 2018 digest_file_auth-rwxr-xr-x. 1 root root 28016 Apr 10 2018 digest_ldap_auth-rwxr-xr-x. 1 root root 44688 Apr 10 2018 negotiate_kerberos_auth-rwxr-xr-x. 1 root root 15648 Apr 10 2018 negotiate_kerberos_auth_test-rwxr-xr-x. 1 root root 19744 Apr 10 2018 ntlm_fake_auth-rwxr-xr-x. 1 root root 63088 Apr 10 2018 ntlm_smb_lm_auth
Next we configure squid.conf file and search for auth_param . There are some documentations and examples :
# === Example Configuration ===## This configuration displays the recommended authentication scheme# order from most to least secure with recommended minimum configuration# settings for each scheme:###auth_param negotiate program <uncomment and complete this line to activate>##auth_param negotiate children 20 startup=0 idle=1##auth_param negotiate keep_alive on####auth_param digest program <uncomment and complete this line to activate>##auth_param digest children 20 startup=0 idle=1##auth_param digest realm Squid proxy-caching web server##auth_param digest nonce_garbage_interval 5 minutes##auth_param digest nonce_max_duration 30 minutes##auth_param digest nonce_max_count 50####auth_param ntlm program <uncomment and complete this line to activate>##auth_param ntlm children 20 startup=0 idle=1##auth_param ntlm keep_alive on####auth_param basic program <uncomment and complete this line>##auth_param basic children 5 startup=5 idle=1##auth_param basic realm Squid proxy-caching web server##auth_param basic credentialsttl 2 hours#Default:# none
and the default is none. We add the previously discussed basic http authentication options :
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords###Specify squid password file and helper program locationauth_param basic children 5###The number of authenticator processes to spawn:auth_param basic realm Squid Basic Authentication###Part of the text the user will see when prompted their username and passwordauth_param basic credentialsttl 2 hoursSpecifies how long squid assumes an externally validated username:password pair is valid for - in other words how often the helper program is called for that user with password prompt. It is set to 2 hours.
Next we need to create an ACL element and then tell it to use that element in an ACL:
### ACL elementacl BASICAUTHENTICATED proxy_auth REQUIRED
### ACLhttp_access allow BASICAUTHENTICATED
do not forget that based on the order you put your rules the result would be different. So if we put it above other rules, as long as users can authenticate it works fine. part of our squid.conf file:
acl Safe_ports port 591 # filemakeracl Safe_ports port 777 # multiling httpacl CONNECT method CONNECTauth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwordsauth_param basic children 5auth_param basic realm Squid Basic Authenticationauth_param basic credentialsttl 2 hoursacl MYBASICAUTH proxy_auth REQUIREDhttp_access allow MYBASICAUTH##acl YAHOO dstdomain .yahoo.com##acl FRIDAY time Friday## Recommended minimum Access Permission configuration:## Deny requests to certain unsafe portshttp_access deny !Safe_ports
Now we have to create password file(for that we might need to install apach2-utils (Deb)or httpd-tools (RedHat)) :
[[email protected] squid]# htpasswd -c /etc/squid/passwords user1New password:Re-type new password:Adding password for user user1[[email protected] squid]# ls -ltotal 52-rw-r--r--. 1 root squid 692 Apr 10 2018 cachemgr.conf-rw-r--r--. 1 root root 692 Apr 10 2018 cachemgr.conf.default-rw-r--r--. 1 root root 1817 Apr 10 2018 errorpage.css-rw-r--r--. 1 root root 1817 Apr 10 2018 errorpage.css.default-rw-r--r--. 1 root root 12077 Apr 10 2018 mime.conf-rw-r--r--. 1 root root 12077 Apr 10 2018 mime.conf.default-rw-r--r--. 1 root root 44 Oct 10 14:21 passwords-rw-r-----. 1 root squid 2565 Oct 10 13:49 squid.conf-rw-r--r--. 1 root root 2315 Apr 10 2018 squid.conf.default
and to make sure every thing is working properly with our passwords file:
[[email protected] squid]# /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwordsuser1 [email protected]?OK
lets restart the service and see the results:
That is squid log file directory. The logs give us information about Squid workloads and performance. The logs record not only access information, but also system configuration errors and resource consumption (eg, memory, disk space). There are several log file maintained by Squid. Some have to be explicitely activated during compile time, others can safely be deactivated during.
/var/log/squid/access.log : Most log file analysis program are based on the entries in access.log. We can use this file to find out who is using squid server and what they are doing etc
/var/log/squid/cache.log : The cache.log file contains the debug and error messages that Squid generates.
/var/log/squid/store.log : The store.log file covers the objects currently kept on disk or removed ones. As a kind of transaction log it is ususally used for debugging purposes.
To display log files in real time use tail command:
tail -f /var/log/squid/access.log
that is all.