Penguin
Diff: HowToSecurityQuickstartHOWTO
EditPageHistoryDiffInfoLikePages

Differences between current version and predecessor to the previous major change of HowToSecurityQuickstartHOWTO.

Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History

Newer page: version 3 Last edited on Thursday, October 21, 2004 5:42:00 pm by AristotlePagaltzis
Older page: version 2 Last edited on Friday, June 7, 2002 1:07:31 am by perry Revert
@@ -1,7122 +1 @@
-Security Quick-Start HOWTO for Linux  
-!!!Security Quick-Start HOWTO for Linux  
-!Hal Burgiss  
-  
- hal@foobox.net  
-  
-  
-  
-  
-v. 1.1, 2002-02-06  
-  
-  
-__Revision History__Revision v. 1.12002-02-06Revised by: hbA few fixes, some additions and many touch-ups from the original.Revision v. 1.02001-11-07Revised by: hbInitial Release.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- This document is a an overview of the basic steps required to  
-secure a Linux installation from intrusion. It is intended to be an  
-introduction.   
-  
-  
-  
-  
-  
-----; __Table of Contents__; 1. Introduction: ; 1.1. Why me?; 1.2. Copyright; 1.3. Credits; 1.4. Disclaimer; 1.5. New Versions and Changelog; 1.6. Feedback; 2. Foreword: ; 2.1. The Optimum Configuration; 2.2. Before We Start; 3. Step 1: Which services do we really need?: ; 3.1. System Audit; 3.2. The Danger Zone (or r00t m3 pl34s3); 3.3. Stopping Services; 3.4. Exceptions; 3.5. Summary and Conclusions for Step 1; 4. Step 2: Updating: ; 4.1. Summary and Conclusions for Step 2; 5. Step 3: Firewalls and Setting Access Policies: ; 5.1. Strategy; 5.2. Packet Filters -- Ipchains and Iptables; 5.3. Tcpwrappers (libwrap); 5.4. !PortSentry; 5.5. Proxies; 5.6. Individual Applications; 5.7. Verifying; 5.8. Logging; 5.9. Where to Start; 5.10. Summary and Conclusions for Step 3; 6. Intrusion Detection: ; 6.1. Intrusion Detection Systems (IDS); 6.2. Have I Been Hacked?; 6.3. Reclaiming a Compromised System; 7. General Tips; 8. Appendix: ; 8.1. Servers, Ports, and Packets; 8.2. Common Ports; 8.3. Netstat Tutorial; 8.4. Attacks and Threats; 8.5. Links; 8.6. Editing Text Files; 8.7. nmap; 8.8. Sysctl Options; 8.9. Secure Alternatives; 8.10. Ipchains and Iptables Redux  
-!!!1. Introduction  
-!!1.1. Why me?  
-  
- Who should be reading this document and why should the average Linux user  
-care about security? Those new to Linux, or unfamiliar with the inherent  
-security issues of connecting a Linux system to large networks like Internet  
-should be reading. "Security" is a broad subject with many  
-facets, and is covered in much more depth in other documents, books, and on  
-various sites on the Web. This document is intended to be an introduction to  
-the most basic concepts as they relate to Linux, and as  
-a starting point only.  
-  
-  
-  
-  
-  
-  
-Iptables Weekly Log Summary from Jul 15 04:24:13 to Jul 22 04:06:00  
-Blocked Connection Attempts:  
-  
-Rejected tcp packets by destination port  
-  
-port count  
-111 19  
-53 12  
-21 9  
-515 9  
-27374 8  
-443 6  
-1080 2  
-1138 1  
-  
-  
-Rejected udp packets by destination port  
-  
-port count  
-137 34  
-22 1  
-  
-  
-  
-  
-  
-  
-  
-  
- The above is real, live data from a one week period for my home LAN.  
-Much of the above would seem to be specifically targeted at Linux systems.  
-Many of the targeted "destination" ports are used by well known  
-Linux and Unix services, and all may be installed, and possibly  
-even running, on your system.  
-  
-  
-  
- The focus here will be on threats that are shared by all Linux users, whether  
-a dual boot home user, or large commercial site. And we will take a few,  
-relatively quick and easy steps that will make a typical home Desktop system  
-or small office system running Linux reasonably safe  
-from the majority of outside threats. For those responsible for Linux systems  
-in a larger or more complex environment, you'd be well advised to read this,  
-and then follow up with additional reading suitable to your particular  
-situation. Actually, this is probably good advice for everybody.  
-  
-  
-  
- We will assume the reader knows little about Linux, networking, TCP/IP,  
-and the finer points of running a server Operating System like Linux. We  
-will also assume, for the sake of this document, that all local users are  
-"trusted" users, and won't address physical or local network  
-security issues in any detail. Again, if this is not the case, further  
-reading is strongly recommended.  
-  
-  
-  
-  
- The principles that will guide us in our quest are:  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- There is no magic bullet. There is no one  
-single thing we can do to make us secure. It is not that simple.  
-  
-  
-  
-*  
-*  
-  
- Security is a process that requires maintenance, not an objective to  
-be reached.  
-  
-  
-  
-*  
-*  
-  
- There is no 100% safe program, package or distribution. Just varying  
-degrees of insecurity.  
-  
-  
-  
-*  
-  
-  
-  
- The steps we will be taking to get there are:  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- Step 1: Turn off, and perhaps uninstall, any and all unnecessary services.  
-  
-  
-  
-*  
-*  
-  
- Step 2: Make sure that any services that are installed are updated and  
-patched to the current, safe version -- ''and then stay that  
-way''. Every server application has potential exploits. Some have  
-just not been found yet.  
-  
-  
-  
-*  
-*  
-  
- Step 3: Limit connections to us from outside sources by implementing a  
-firewall and/or other restrictive policies. The goal is to allow only the  
-minimum traffic necessary for whatever our individual situation may be.  
-  
-  
-  
-*  
-*  
-  
- Awareness. Know your system, and how to properly maintain and secure it.  
-New vulnerabilities are found, and exploited, all the time. Today's  
-secure system may have tomorrow's as yet unfound weaknesses.  
-  
-  
-  
-*  
-  
-  
-  
- If you don't have time to read everything, concentrate on Steps 1, 2, and 3.  
-This is where the meat of the subject matter is. The Appendix has a lot of supporting information, which  
-may be helpful, but may not be necessary for all readers.  
-  
-----  
-!!1.2. Copyright  
-  
- Security-Quickstart HOWTO for Linux  
-  
-  
-  
- Copyright © 2001 Hal Burgiss.  
-  
-  
-  
- This document is free; you can redistribute it and/or modify it under the  
-terms of the GNU General Public License as published by the Free Software  
-Foundation; either version 2 of the License, or (at your option) any later  
-version.  
-  
-  
-  
- This document is distributed in the hope that it will be useful, but WITHOUT  
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  
-FOR A PARTICULAR PURPOSE. See the GNU General Public License for more  
-details.  
-  
-  
-  
- You can get a copy of the GNU GPL at at http://www.gnu.org/copyleft/gpl.html.  
-  
-----  
-!!1.3. Credits  
-  
- Many thanks to those who helped with the production of this document.  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- Bill Staehle, who has done a little bit of everything: ideas, editing,  
-encouragement, and suggestions, many of which have been incorporated.  
-Bill helped greatly with the content of this document.  
-  
-  
-  
-*  
-*  
-  
- Others who have contributed in one way or another: Dave Wreski, Ian  
-Jones, and Jacco de Leeuw.  
-  
-  
-  
-*  
-*  
-  
- Various posters on comp.os.linux.security, a great place to learn about  
-Linux and security.  
-  
-  
-  
-*  
-*  
-  
- The Netfilter Development team for their work on  
-iptables and connection tracking, state of the  
-art tools with which to protect our systems.  
-  
-  
-  
-*  
-  
-----  
-!!1.4. Disclaimer  
-  
- The author accepts no liability for the contents of this document. Use the  
-concepts, examples and other content at your own risk. As this is a new  
-document, there may be errors and inaccuracies. Hopefully these are few and  
-far between. Corrections and suggestions are welcomed.  
-  
-  
-  
- This document is intended to give the new user a starting point for securing  
-their system while it is connected to the Internet. Please understand that  
-there is no intention whatsoever of claiming that the contents of this  
-document will necessarily result in an ultimately secure and worry-free  
-computing environment. Security is a complex topic. This document just  
-addresses some of the most basic issues that inexperienced users should be  
-aware of.   
-  
-  
-  
- The reader is encouraged to read other security related documentation and  
-articles. And to stay abreast of security issues as they evolve. Security is  
-not an objective, but an ongoing process.  
-  
-  
-----  
-!!1.5. New Versions and Changelog  
-  
- The current official version can always be found at http://www.linuxdoc.org/HOWTO/Security-Quickstart-HOWTO/.  
-Pre-release versions can be found at http://feenix.burgiss.net/ldp/quickstart/.  
-  
-  
-  
- Other formats, including PDF, PS, single page HTML, may be found at  
-the Linux Documentation HOWTO index page: http://linuxdoc.org/docs.html#howto.  
-  
-  
-  
- Changelog:  
-  
-  
-  
- Version 1.1: Various corrections, amplifications and numerous mostly small  
-additions. Too many to list. Oh yea, learn to spell Red Hat correctly ;-)  
-  
-  
-  
- Version 1.: This is the initial release of this document. Comments  
-welcomed.  
-  
-----  
-!!1.6. Feedback  
-  
- Any and all comments on this document are most welcomed. Please make sure you have  
-the most current version before submitting corrections or suggestions! These  
-can be sent to `hal@foobox.netb.  
-  
-----  
-!!!2. Foreword  
-  
- Before getting into specifics, let's try to briefly answer some questions  
-about why we need to be concerned about security in the first place.   
-  
-  
-  
- It is easy to see why an e-commerce site, an on-line bank, or a government  
-agency with sensitive documents would be concerned about security. But what  
-about the average user? Why should even a Linux home Desktop user worry about  
-security?   
-  
-  
-  
- Anyone connected to the Internet is a target, plain and simple. It  
-makes little difference whether you have a part-time dialup connection, or a  
-full-time connection, though full-time connections make for bigger targets.  
-Larger sites make for bigger targets too, but this does not let small users  
-off the hook since the "small user" may be less skilled and thus  
-an easier victim.  
-  
-  
-  
-  
- There are those out there that are scanning just for easy  
-victims all the time. If you start logging unwanted connection attempts,  
-you will see this soon enough. There is little doubt that many of these  
-attempts are maliciously motivated and the attacker, in some cases, is  
-looking for Linux boxes to crack. Does someone on the other side of the globe  
-really want to borrow my printer?   
-  
-  
-  
- What do they want? Often, they just may want your computer, your IP  
-address, and your bandwidth. Then they use you to either attack others, or  
-possibly commit crimes or mischief and are hiding their true identity behind  
-you. This is an all too common scenario. Commercial and high-profile sites  
-are targeted more directly and have bigger worries, but we all face this type  
-of common threat.   
-  
-  
-  
- With a few reasonable precautions, Linux can be very  
-secure, and with all the available tools, makes for a fantastically fun and  
-powerful Internet connection or server. Most successful break-ins are the  
-result of ignorance or carelessness.   
-  
-  
-  
- The bottom line is:  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- Do you want control of your own system or not?  
-  
-  
-  
-*  
-*  
-  
- Do you want to unwittingly participate in criminal activity?  
-  
-  
-  
-*  
-*  
-  
- Do you want to be used by someone else?  
-  
-  
-  
-*  
-*  
-  
- Do you want to risk losing your Internet connection?  
-  
-  
-  
-*  
-*  
-  
- Do you want to have to go through the time consuming steps of reclaiming  
-your system?  
-  
-  
-  
-*  
-*  
-  
- Do you want to chance the loss of data on your system?  
-  
-  
-  
-*  
-  
-  
-  
- These are all real possibilities, unless we take the appropriate  
-precautions.  
-  
-  
-  
-  
-  
-  
-  
-  
- If you are reading this because you have already been broken into, or  
-suspect that you have, you cannot trust any of your system utilities to  
-provide reliable information. And the suggestions made in the next several  
-sections will not help you recover your system. Please jump straight to the  
-Have I been Hacked? section, and read that  
-first.  
-  
-  
-----  
-!!2.1. The Optimum Configuration  
-  
- Ideally, we would want one computer as a dedicated firewall and router. This  
-would be a bare bones installation, with ''no'' servers  
-running, and only the required services and components installed. The rest of  
-our systems would connect via this dedicated router/firewall system. If we  
-wanted publicly accessible servers (web, mail, etc), these would be in a  
-"DMZ" (De-militarized Zone). The router/firewall allows  
-connections from outside to whatever services are running in the DMZ by  
-"forwarding" these requests, but it is segregated from the rest  
-of the internal network (aka LAN) otherwise. This leaves the rest of the  
-internal network in fairly secure isolation, and relative safety. The  
-"danger zone" is confined to the DMZ.  
-  
-  
-  
-  
- But not everyone has the hardware to dedicate to this kind of installation.  
-This would require a minimum of two computers. Or three, if you would be  
-running any publicly available servers (not a good idea initially). Or maybe  
-you are just new to Linux, and don't know your way around well enough yet. So  
-if we can't do the ideal installation, we will do the next best thing.  
-  
-----  
-!!2.2. Before We Start  
-  
- Before we get to the actual configuration sections, a couple of notes.  
-  
-  
-  
-  
-  
-First, one of the interesting aspects of Linux, is the different  
-distributions like Caldera, Red Hat, SuSE, and Debian. While these are all  
-"Linux", and may share certain features, there is surely some  
-differences as to what utilities they may install as defaults. Most Linux  
-distributions will write their own system configuration tools as well. And with  
-Linux, there is always more than one way to skin a cat. But for the purposes  
-of our discussion, we will have to use as generic set of tools as we can.  
-Unfortunately, GUI tools don't lend themselves to this type of documentation.  
-We will be using text based, command line tools for the most part. If you  
-are familiar with your distribution's utilities, feel free to substitute  
-those in appropriate places. And if not, you should learn them or suitable  
-alternatives.  
-  
-  
-  
- The next several sections have been written such that you can perform the  
-recommended procedures as you read along. This is the  
-"Quick Start" in the document title!  
-  
-  
-  
- To get ready, what you will need for the configuration sections below:  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- A text editor. There are many available. If you use a file manager  
-application , it probably has a built in editor.  
-This will be fine. __pico__ and __mcedit__  
-are two relatively easy to use editors if you don't already have a  
-favorite. There is a quick guide to Text  
-editors in the Appendix that might help you get started. It is  
-always a good idea to make a back up copy, before editing system  
-configuration files.  
-  
-  
-  
-*  
-*  
-  
- For non-GUI editors and some of the commands, you will also need a  
-terminal window opened. __xterm,__  
-__rxvt,__ and __gnome-terminal__ all will  
-work, as well as others.  
-  
-  
-  
-*  
-*  
-  
- You should also be familiar with your distribution's method of stopping  
-services from running on each boot. Also, how they install (and uninstall)  
-packages (__rpm__, __deb__, etc). And where  
-to find the updates for your release. This information is available in  
-your release's documentation, or on your vendor's web site.  
-  
-  
-  
-*  
-  
-  
-  
- We'll be using a hypothetical system here for examples with the hostname  
-"bigcat". Bigcat is a Linux desktop with a fresh install of the  
-latest/greatest Linux distro running. Bigcat has a full-time, direct Internet connection. Even if your  
-installation is not so "fresh", don't be deterred. Better late  
-than never.  
-  
-----  
-!!!3. Step 1: Which services do we really need?  
-  
- In this section we will see which services are running on our freshly installed  
-system, decide which we really need, and do away with the rest. If you are  
-not familiar with how servers and TCP connections work, you may want to read  
-the section on servers and ports in the  
-Appendix first. If not familiar with the __netstat__ utility,  
-you may want to read a quick overview of it  
-beforehand. There is also a section in the Appendix on ports, and corresponding services. You may want to  
-look that over too.  
-  
-  
-  
- Our goal is to turn off as many services as possible. If we can turn them  
-all off, or at least off to outside connections, so much the better. Some  
-rules of thumb we will use to guide us:  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- It is perfectly possible to have a fully functional Internet connection  
-with no servers running that are accessible to outside connections. Not  
-only possible, but desirable in many cases. The principle here is that  
-you will never be successfully broken into via a port that is not opened  
-because no server is listening on it. No server == no port open == not  
-vulnerable. At least to outside connections.  
-  
-  
-  
-*  
-*  
-  
- If you don't recognize a particular service, chances are good you don't  
-really need it. We will assume that and so we'll turn it off. This may  
-sound dangerous, but is a good rule of thumb to go by.  
-  
-  
-  
-*  
-*  
-  
- Some services are just not intended to be run over the Internet -- even  
-if you decide it is something you really do need. We'll flag these  
-as dangerous, and address these in later sections, should you decide  
-you do really need them, and there is no good alternative.  
-  
-  
-  
-*  
-  
-----  
-!!3.1. System Audit  
-  
- So what is really running on our system anyway? Let's not take anything for  
-granted about what "should" be running, or what we  
-"think" is running.  
-  
-  
-  
- Unfortunately, there is no such things as a standard Linux installation. The  
-wide variety of servers available, coupled with each particular distribution's  
-installation options, make providing a ready made list impossible. The best  
-that can be done is show you how to list all running services, and point you  
-in the right general direction.  
-  
-  
-  
- Now open an __xterm__, and __su__ to root.  
-You'll need to widen the window wide so the lines do not wrap. Use this  
-command: netstat -tap |grep LISTEN. This will give us a  
-list of all currently running servers as indicated by the keyword  
-LISTEN, along with the "PID" and  
-"Program Name" that started each particular service.  
-  
-  
-  
-  
-# netstat -tap |grep LISTEN  
-*:exec *:* LISTEN 988/inetd  
-*:login *:* LISTEN 988/inetd  
-*:shell *:* LISTEN 988/inetd  
-*:printer *:* LISTEN 988/inetd  
-*:time *:* LISTEN 988/inetd  
-*:x11 *:* LISTEN 1462/X  
-*:http *:* LISTEN 1078/httpd  
-bigcat:domain *:* LISTEN 956/named  
-bigcat:domain *:* LISTEN 956/named  
-*:ssh *:* LISTEN 972/sshd  
-*:auth *:* LISTEN 388/in.identd  
-*:telnet *:* LISTEN 988/inetd  
-*:finger *:* LISTEN 988/inetd  
-*:sunrpc *:* LISTEN 1290/portmap  
-*:ftp *:* LISTEN 988/inetd  
-*:smtp *:* LISTEN 1738/sendmail: accepting connections  
-*:1694 *:* LISTEN 1319/rpc.mountd  
-*:netbios-ssn *:* LISTEN 422/smbd  
-  
-  
-  
-  
- Note the  
-first three columns are cropped above for readability. If your list is as  
-long as the example, you have some work ahead of you! It is highly unlikely  
-that you really need anywhere near this number of servers running.  
-  
-  
-  
- Please be aware that the example above is just one of many, many possible  
-system configurations. Yours probably does look very different.  
-  
-  
-  
- You don't understand what any of this is telling you? Hopefully then, you've  
-read the __netstat__ tutorial  
-in the Appendix, and understand how it works. Understanding exactly what each  
-server is in the above example, and what it does, is beyond the scope of this  
-document. You will have to check your system's documentation (e.g.  
-Installation Guide, man pages, etc) if that service is important to you. For  
-example, does "exec", "login", and "shell"  
-sound important? Yes, but these are not what they may sound like. They  
-are actually __rexec__, __rlogin__, and  
-__rsh__, the "r" (for remote) commands. These are  
-antiquated, unnecessary, and in fact, are very dangerous if exposed to the  
-Internet.  
-  
-  
-  
- Let's make a few quick assumptions about what is necessary and unnecessary,  
-and therefore what goes and what stays on bigcat. Since we are running a  
-desktop on bigcat, X11 of course needs to stay. If  
-bigcat were a dedicated server of some kind, then X11 would be unnecessary. If  
-there is a printer physically attached, the printer (lp) daemon should stay.  
-Otherwise, it goes. Print servers may sound harmless, but are potential  
-targets too since they can hold ports open. If we plan on logging  
-''in to'' bigcat ''from'' other hosts,  
-sshd (Secure SHell Daemon) would be necessary. If we have Microsoft hosts on  
-our LAN, we probably want Samba, so  
-smbd should stay. Otherwise, it is completely  
-unnecessary. Everything else in this example is optional and not required for  
-a normally functioning system, and should probably go. See anything that you  
-don't recognize? Not sure about? It goes!  
-  
-  
-  
- To sum up: since bigcat is a desktop with a printer attached, we will  
-need "x11", "printer". bigcat is on a LAN with  
-MS hosts, and shares files and printing with them, so  
-"netbios-ssn" (__smbd__) is desired. We will also  
-need "ssh" so we can login from other machines. Everything else  
-is unnecessary for this particular case.   
-  
-  
-  
- Nervous about this? If you want, you can make notes of any changes you make  
-or save the list of servers you got from __netstat__, with  
-this command: netstat -tap |grep LISTEN b ~/services.lst.  
-That will save it your home directory with the name of  
-"services.lst" for future reference.  
-  
-  
-  
- This is to not say that the ones we have decided to keep are inherently safe.  
-Just that we probably need these. So we will have to deal with these via  
-firewalling or other means (addressed below).  
-  
-  
-  
- It is worth noting that the __telnet__ and  
-__ftp__ daemons in the above example are  
-''servers'', aka "listeners". These accept  
-incoming connections to you. You do not need, or want, these just to use  
-__ftp__ or __telnet__  
-''clients''. For instance, you can download files from an  
-FTP site with just an __ftp__ client. Running an  
-ftp server on your end is not required at all, and  
-has serious security implications.  
-  
-  
-  
-  
- There may be individual situations where it is desirable to make exceptions  
-to the conclusions reached above. See below.  
-  
-----  
-!!3.2. The Danger Zone (or r00t m3 pl34s3)  
-  
- The following is a list of services that should ''not'' be  
-run over the Internet. Either disable these (see below), uninstall, or if you  
-really do need these services running locally, make sure they are the  
-current, patched versions ''and'' that they are effectively  
-firewalled. And if you don't have a firewall in place now, turn them off  
-until it is up and verified to be working properly. These are potentially  
-insecure by their very nature, and as such are prime cracker targets.   
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- NFS (Network File System) and related services,  
-including nfsd,  
-lockd, mountd,  
-statd, portmapper,  
-etc. NFS is the standard Unix service for sharing file systems across a  
-network. Great system for LAN usage, but dangerous over the Internet.  
-And its completely unnecessary on a stand alone system.  
-  
-  
-  
-*  
-*  
-  
- rpc.* services, Remote Procedure Call.*, typically NFS and NIS related (see  
-above).  
-  
-  
-  
-*  
-*  
-  
- Printer services (lpd).  
-  
-  
-  
-*  
-*  
-  
- The so-called r* (for "remote", i.e. Remote SHell) services:  
-rsh, rlogin,  
-rexec, rcp etc.  
-Unnecessary, insecure and potentially dangerous, and better utilities are  
-available if these capabilities are needed. ssh  
-will do everything these command do, and in a much more sane way. See the  
-man pages for each if curious. These will probably show in  
-__netstat__ output without the "r":  
-__rlogin__ will be just "login", etc.  
-  
-  
-  
-*  
-*  
-  
- telnet server. There is no reason for this  
-anymore. Use sshd instead.  
-  
-  
-  
-*  
-*  
-  
- ftp server. There are better, safer ways for  
-most systems to exchange files like __scp__ or  
-via __http__ (see below). ftp is a  
-proper protocol only for someone who is running a dedicated ftp server, and  
-who has the time and skill to keep it buttoned down. For everyone else, it is  
-potentially big trouble.  
-  
-  
-  
-*  
-*  
-  
- BIND (__named__), DNS server  
-package. With some work, this can be done without great risk, but is not  
-necessary in many situations, and requires special handling no matter  
-how you do it. See the sections on Exceptions and special handling for individual applications.  
-  
-  
-  
-*  
-*  
-  
- Mail Transport Agent, aka "MTA"  
-(sendmail, exim,  
-postfix, qmail).  
-Most installations on single computers will not really need this. If you are not  
-going to be directly receiving mail from Internet hosts (as a designated MX  
-box), but will rather use the POP server of your ISP, then it is not  
-needed. You may however need this if you are receiving mail  
-''directly'' from other hosts on your LAN, but initially  
-it's safer to disable this. Later, you can enable it over the local  
-interface once your firewall and access policies have been implemented.  
-  
-  
-  
-*  
-  
-  
-  
- This is not necessarily a definitive list. Just some common services that  
-are sometimes started on default Linux  
-installations. And conversely, this does not imply that other  
-services are inherently safe.  
-  
-----  
-!!3.3. Stopping Services  
-  
- The next step is to find where each server on our kill list is being started.  
-If it is not obvious from the __netstat__ output, use  
-__ps__, __find__, __grep__ or  
-__locate__ to find more information from the "Program  
-name" or "PID" info in the last column. There is examples  
-of this in the Process Owner section in the  
-__netstat__ Tutorial of the Appendix. If the service name or  
-port number do not look familiar to you, you might get a real brief  
-explanation in your /etc/services file.  
-  
-  
-  
- Skeptical that we are going to break your system, and the pieces won't go  
-back together again? If so, take this approach: turn off everything listed  
-above in "The Danger Zone", and run your system for a while. OK?  
-Try stopping one of the ones we found to be "unnecessary" above.  
-Then, run the system for a while. Keep repeating this process, until you get  
-to the bare minimum. If this works, then make the changes permanent (see  
-below).  
-  
-  
-  
- The ultimate objective is not just to stop the service now, but to make sure  
-it is stopped permanently! So whatever steps you take here, be sure to check  
-after your next reboot.  
-  
-  
-  
- There are various places and ways to start system services. Let's look at the  
-most common ways this is done, and is probably how your system works. System  
-services are typically either started by "init" scripts, or by  
-__inetd__ (or its replacement __xinetd__) on  
-most distributions. (The location of the init scripts may vary  
-from distribution to distribution.)   
-  
-----  
-!3.3.1. Stopping Init Services  
-  
- Init services are typically started automatically during the boot process, or  
-during a runlevel change. There is a naming scheme that uses symlinks to  
-determine which services are to be started, or stopped, at any given  
-runlevel. The scripts themselves should be in  
-/etc/init.d/ (or possibly  
-/etc/rc.d/init.d/ ). This init style is used by Red Hat,  
-SuSE, Mandrake, Debian, Conectiva, and most Linuxes. Slackware is one notable  
-exception (though recent versions have an option for this)! Typically  
-on Slackware system services are all configured in one file:  
-/etc/rc.d/rc.inet2.  
-  
-  
-  
- You can get a listing of these scripts:  
-  
-  
-  
-  
- # ls -l /etc/init.d/ | less  
-  
-  
-  
-  
- Or use whichever tools your distribution provides for this.  
-  
-  
-  
- To stop a running service now, as root (on !SysVinit style systems,  
-which is pretty much everybody):  
-  
-  
-  
-  
-  
- # /etc/init.d/`$SERVICE_NAMEb stop  
-  
-  
-  
-  
- Where "$SERVICE_NAME" is the name of the init script, which is  
-often, but not always, the same as the service name itself.  
-This should do the trick on ''most'' distributions. Older  
-Red Hat versions may use the path /etc/rc.d/init.d/  
-instead.   
-  
-  
-  
- This only stops this particular service now. It will restart again on the  
-next reboot, or runlevel change, unless additional steps are taken. So this is  
-really a two step process for init type services.  
-  
-  
-  
- Your distribution will have utilities available for controlling which services  
-are started at various runlevels. Debian based systems have  
-__update-rc.d__ for this, and Red Hat based systems have  
-__chkconfig__. If you are familiar with these tools,  
-do it now, and then check again after the next reboot. If you are not  
-familiar with these tools, see the man pages and learn it now! This is  
-something that you need to know. For Debian (where  
-$SERVICE_NAME is the init script name):  
-  
-  
-  
-  
-  
-# update-rc.d -f $SERVICE_NAME remove  
-  
-  
-  
-  
- And Red Hat:  
-  
-  
-  
-  
-  
-# chkconfig $SERVICE_NAME off  
-  
-  
-  
-  
- Another option here is to uninstall a package if you know you do not need it.  
-This is a pretty sure-fire, permanent fix. This also alleviates the  
-potential problem of keeping all installed packages updated and current (Step  
-2). And, package management systems like  
-RPM or DEB make it very  
-easy to re-install a package should you change your mind.  
-  
-  
-----  
-!3.3.2. Inetd  
-  
- Inetd is called a "super-daemon"  
-because it is used to spawn sub-daemons. __inetd__ itself will  
-generally be started via init scripts, and will "listen" on the  
-various ports as determined by which services are enable in its configuration  
-file, /etc/inetd.conf. Any service listed here will be  
-under the control of __inetd__. Likewise, any of the listening  
-servers in __netstat__ output that list "inetd"  
-in the last column under "Program Name", will have been started  
-by __inetd__. You will have to adjust the  
-__inetd__ configuration to stop these services.  
-__xinetd__ is an enhanced __inetd__ replacement,  
-and is configured differently (see next section below).   
-  
-  
-  
- Below is a partial snippet from a typical inetd.conf. Any  
-service with a "#" at the beginning of the line is  
-"commented out", and thus ignored by __inetd__,  
-and consequently disabled.  
-  
-  
-  
-  
-#  
-# inetd.conf This file describes the services that will be available  
-# through the INETD TCP/IP super server. To re-configure  
-# the running INETD process, edit this file, then send the  
-# INETD process a SIGHUP signal.  
-#  
-# Version: @(#)/etc/inetd.conf 3.10 05/27/93  
-#  
-# Authors: Original taken from BSD UNIX 4.3/TAHOE.  
-# Fred N. van Kempen, `waltje@uwalt.nl.mugnet.orgb  
-#  
-# Modified for Debian Linux by Ian A. Murdock `imurdock@shell.portal.comb  
-#  
-# Echo, discard, daytime, and chargen are used primarily for testing.  
-#  
-# To re-read this file after changes, just do a 'killall -HUP inetd'  
-#  
-#echo stream tcp nowait root internal  
-#echo dgram udp wait root internal  
-#discard stream tcp nowait root internal  
-#discard dgram udp wait root internal  
-#daytime stream tcp nowait root internal  
-#daytime dgram udp wait root internal  
-#chargen stream tcp nowait root internal  
-#chargen dgram udp wait root internal  
-time stream tcp nowait root internal  
-#  
-# These are standard services.  
-#  
-#ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a  
-#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd  
-#  
-# Shell, login, exec, comsat and talk are BSD protocols.  
-#  
-#shell stream tcp nowait root /usr/sbin/tcpd in.rshd  
-#login stream tcp nowait root /usr/sbin/tcpd in.rlogind  
-#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd  
-#comsat dgram udp wait root /usr/sbin/tcpd in.comsat  
-#talk dgram udp wait root /usr/sbin/tcpd in.talkd  
-#ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd  
-#dtalk stream tcp wait nobody /usr/sbin/tcpd in.dtalkd  
-#  
-# Pop and imap mail services et al  
-#  
-#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d  
-pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d  
-#imap stream tcp nowait root /usr/sbin/tcpd imapd  
-#  
-# The Internet UUCP service.  
-#  
-#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l  
-#  
-`snipb  
-  
-  
-  
-  
- The above example has two services enabled: __time__ and  
-__pop3__. To disable these, all we need is to open the  
-file with a text editor, comment out the two services with a  
-"#", save the file, and then restart __inetd__  
-(as root):   
-  
-  
-  
-  
- # /etc/init.d/inetd restart  
-  
-  
-  
-  
- Check your logs for errors, and run __netstat__ again to  
-verify all went well.  
-  
-  
-  
- A quicker way of getting the same information, using __grep__:  
-  
-  
-  
-  
- $ grep -v '^#' /etc/inetd.conf  
-time stream tcp nowait root internal  
-pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d  
-  
-  
-  
-  
- Again, do you see anything there that you don't know what it is? Then in  
-all likelihood you are not using it, and it should be disabled.  
-  
-  
-  
- Unlike the init services configuration, this is a lasting change so only  
-the one step is required.  
-  
-  
-  
- Let's expose one myth that gets tossed around: you shouldn't disable a  
-service by commenting out, or removing, entries from  
-/etc/services. This may have the desired effect  
-in some cases, but is not the right way to do it, and may interfere  
-with the normal operation of other system utilities.   
-  
-----  
-!3.3.3. Xinetd  
-  
-xinetd is an inetd replacement with  
-enhancements. It essentially serves the same purpose as  
-inetd, but the  
-configuration is different. The configuration can be in the file  
-/etc/xinetd.conf, or individual files in the directory  
-/etc/xinetd.d/.  
-Turning off  
-xinetd services is done by either deleting the  
-corresponding configuration section, or file. Or by using your text editor and  
-simply setting disable = yes for the appropriate service.  
-Then,  
-xinetd will need to be restarted. See man  
-xinetd and man xinetd.conf for syntax and  
-configuration options. A sample __xinetd__ configuration:  
-  
-  
-  
-  
- # default: on  
-# description: The wu-ftpd FTP server serves FTP connections. It uses \  
-# normal, unencrypted usernames and passwords for authentication.  
-service ftp  
-{  
-disable = no  
-socket_type = stream  
-wait = no  
-user = root  
-server = /usr/sbin/in.ftpd  
-server_args = -l -a  
-log_on_success += DURATION USERID  
-log_on_failure += USERID  
-nice = 10  
-}  
-  
-  
-  
-  
-You can get a quick list of enabled services:  
-  
-  
-  
-  
- $ grep disable /etc/xinetd.d/* |grep no  
-/etc/xinetd.d/finger: disable = no  
-/etc/xinetd.d/rexec: disable = no  
-/etc/xinetd.d/rlogin: disable = no  
-/etc/xinetd.d/rsh: disable = no  
-/etc/xinetd.d/telnet: disable = no  
-/etc/xinetd.d/wu-ftpd: disable = no  
-  
-  
-  
-  
- At this point, the above output should raise some red flags. In the  
-overwhelming majority of systems, all the above can be disabled without any  
-adverse impact. Not sure? Try it without that service. After disabling  
-unnecessary services, then restart __xinetd__:  
-  
-  
-  
-  
- # /etc/init.d/xinetd restart  
-  
-  
-----  
-!3.3.4. When All Else Fails  
-  
- OK, if you can't find the "right" way to stop a service,  
-or maybe a service is being started and you can't find how or where,  
-you can "kill" the process. To do this, you will need to know  
-the PID (Process I.D.). This can be found with __ps__,  
-__top__, __fuser__ or other system utilities.  
-For __top__ and __ps__, this will be the number  
-in the first column. See the Port and Process Owner  
-section in the Appendix for examples.  
-  
-  
-  
-  
- Example (as root):  
-  
-  
-  
-  
- # kill 1163  
-  
-  
-  
-  
- Then run __top__ or __ps__ again to verify  
-that the process is gone. If not, then:  
-  
-  
-  
-  
- # kill -KILL 1163  
-  
-  
-  
-  
- Note the second "KILL" in there. This must be done either  
-by the user who owns the process, or root. Now go find where and how this  
-process got started ;-)  
-  
-  
-  
- The /proc filesystem can also be used to find out  
-more information about each process. Armed with the PID, we can find  
-the path to a mysterious process:  
-  
-  
-  
-  
- $ /bin/ps ax|grep tcpgate  
-921 ? S :00 tcpgate  
-  
-  
-  
-  
-  
- # ls -l /proc/921/exe  
-lrwxrwxrwx 1 root root 0 July 21 12:11 /proc/921/exe -b /usr/local/bin/tcpgate  
-  
-  
-----  
-!!3.4. Exceptions  
-  
- Above we used the criteria of turning off ''all'' unnecessary  
-services. Sometimes that is not so obvious. And sometimes what may be  
-required for one person's configuration is not the same for another's.  
-Let's look at a few common services that fall in this category.  
-  
-  
-  
-  
- Again, our rule of thumb is if we don't need it, we won't run it. It's that  
-simple. If we do need any of these, they are prime candidates for some  
-kind of restrictive policies via firewall rules or other mechanisms (see  
-below).  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- identd - This is a protocol that has been  
-around for ages, and is often installed and running by default. It is used  
-to provide a minimal amount of information about who is connecting to a  
-server. But, it is not necessary in many cases. Where might you need it?  
-Most IRC servers require it. Many mail servers use it, but don't really  
-require it. Try your mail setup without it. If  
-identd is going to be a problem, it will  
-be because there is a time out before before the server starts sending or  
-receiving mail. So mail should work fine without it, but may be slower. A  
-few ftp servers may require it. Most don't  
-though.  
-  
-  
-  
-  
- If identd is required, there are some  
-configuration options that can greatly reduce the information that is  
-revealed:  
-  
-  
-  
-  
-  
-  
-/usr/sbin/in.identd in.identd -l -e -o -n -N  
-  
-  
-  
-  
-  
- The -o flag tells identd to  
-not reveal the operating system type it is run on and to instead always  
-return "OTHER". The -e flag tells identd  
-to always return "UNKNOWN-ERROR" instead of the  
-"NO-USER" or "INVALID-PORT" errors. The  
--n flag tells identd to always return user numbers  
-instead of user names, if you wish to keep the user names a secret. The  
--N flag makes identd check for the file  
-.noident in the user's home directory for which the  
-daemon is about to return a user name. It that file exists then the  
-daemon will give the error "HIDDEN-USER" instead of the  
-normal "USERID" response.  
-  
-  
-  
-*  
-*  
-  
- Mail server (MTA's like sendmail,  
-qmail, etc) - Often a fully functional mail  
-server like sendmail is installed by default.  
-The only time that this is actually required is if you are hosting a  
-domain, and receiving incoming mail directly. Or possibly, for exchanging  
-mail on a LAN, in which case it does not need Internet exposure and can  
-be safely firewalled. For your ISP's POP mail access, you don't need it  
-even though this is a common configuration. One alternative here is to  
-use fetchmail for POP mail retrieval with the  
--m option to specify a local delivery agent:  
-fetchmail -m procmail for instance works with no  
-sendmail daemon running at all. Sendmail, can be handy to have running,  
-but the point is, it is not required in many situations, and can be  
-disabled, or firewalled safely.  
-  
-  
-  
-*  
-*  
-  
- BIND (named) - This often is installed by  
-default, but is only really needed if you are an authoritative name server  
-for a domain. If you are not sure what this means, then you definitely  
-don't need it. BIND is probably the number one crack target on the  
-Internet. BIND is often used though in a  
-"caching" only mode. This can be quite useful, but does not  
-require full exposure to the Internet. In other words, it should be  
-restricted or firewalled. See special handling of individual applications below.  
-  
-  
-  
-*  
-  
-----  
-!!3.5. Summary and Conclusions for Step 1  
-  
- In this section we learned how to identify which services are running  
-on our system, and were given some tips on how to determine which  
-services may be necessary. Then we learned how to find where the services  
-were being started, and how to stop them. If this has not made sense,  
-now is a good time to re-read the above.  
-  
-  
-  
- Hopefully you've already taken the above steps. Be sure to test your results  
-with __netstat__ again, just to verify the desired end has  
-been achieved, and only the services that are really required are running.  
-  
-  
-  
- It would also be wise to do this after the next reboot, anytime you upgrade  
-a package (to make sure a new configuration does not sneak in), and after  
-every system upgrade or new install.   
-  
-----  
-!!!4. Step 2: Updating  
-  
- OK, this section should be comparatively short, simple and straightforward  
-compared to the above, but no less important.  
-  
-  
-  
- The very first thing after a new install you should check your  
-distribution's updates and security notices and apply all patches  
-. Only a year old you say? That's a long  
-time actually, and not current enough to be safe. Only a few months or few  
-weeks? Check anyway. A day or two? Better safe than sorry. It is quite  
-possible that security updates have been released during the pre-release  
-phase of the development and release cycle. If you can't take this step,  
-disable any publicly accessible services until you can.  
-  
-  
-  
- Linux distributions are not static entities. They are updated with new,  
-patched packages as the need arises. The updates are just as important  
-as the original installation. Even more so, since they are fixes. Sometimes  
-these updates are bug fixes, but quite often they are security fixes because  
-some hole has been discovered. Such "holes" are  
-''immediately'' known to the cracker community, and they are  
-quick to exploit them on a large scale. Once the hole is known, it is quite  
-simple to get in through it, and there will be many out there looking for it.  
-And Linux developers are also equally quick to provide fixes. Sometimes the  
-same day as the hole has become known!  
-  
-  
-  
- Keeping ''all'' installed packages current with your release  
-is one of the most important steps you can take in maintaining a secure  
-system. It can not be emphasized enough that all installed packages should be  
-kept updated -- not just the ones you use. If this is burdensome, consider  
-uninstalling any unused packages. Actually this is a good idea anyway.   
-  
-  
-  
- But where to get this information in a timely fashion? There are a number of  
-web sites that offer the latest security news. There are also a number of  
-mailing lists dedicated to this topic. In fact, your vendor  
-most likely has such a list where vulnerabilities and the corresponding fix  
-is announced. This is an excellent way to stay abreast of  
-issues effecting your release, and is ''highly  
-recommended''. http://linuxsecurity.com is a good  
-site for Linux only issues. They also have weekly newsletters available:  
-http://www.linuxsecurity.com/general/newsletter.html.  
-  
-  
-  
-  
- Also, many distributions have utilities that will automatically update your  
-installed packages via ftp. This can be run as a  
-cron job on a regular basis and is a painless  
-way to go if you have ready Internet access.  
-  
-  
-  
-  
- This is not a one time process -- it is ongoing. It is important to stay  
-current. So watch those security notices. And subscribe to  
-your vendor's  
-security mailing list today! If you have cable modem, DSL, or other  
-full time connection, there is no excuse not to do this religiously.  
-All distributions make this easy enough!  
-  
-  
-  
-  
- One last note: any time a new package is installed, there is also a  
-chance that a new or revised configuration has been installed as well.  
-Which means that if this package is a server of some kind, it may be  
-enabled as a result of the update. This is bad manners, but it can  
-happen, so be sure to run netstat or  
-comparable to verify your system is where you want it after any  
-updates or system changes. In fact, do it periodically even if there are no  
-such changes.  
-  
-----  
-!!4.1. Summary and Conclusions for Step 2  
-  
- It is very simple: make sure your Linux installation is current. Check  
-with your vendor  
-for what updated packages may be available. There is nothing  
-wrong with running an older release, just so the packages in it are  
-updated according to what your vendor  
-has made available since the initial release. At least as long as  
-your vendor is still supporting  
-the release and updates are still being provided.  
-  
-  
-----  
-!!!5. Step 3: Firewalls and Setting Access Policies  
-  
- So what is a "firewall"? It's a vague term that can mean  
-anything that acts as a protective barrier between us and the outside world.  
-This can be a dedicated system, or a specific application that provides this  
-functionality. Or it can be a combination of components, including various  
-combinations of hardware and software. Firewalls are built from  
-"rules" that are used to define what is allowed to enter and  
-exit a given system or network. Let's look at some of the possible components  
-that are readily available for Linux, and how we might implement a reasonably  
-safe firewalling strategy.  
-  
-  
-  
- In Step 1 above, we have turned off all services we don't need. In our  
-example, there were a few we still needed to have running. In this  
-section, we will take the next step here and decide which we need to leave  
-open to the world. And which we might be able to restrict in some way. If we can  
-block them all, so much the better, but this is not always practical.  
-  
-----  
-!!5.1. Strategy  
-  
- What we want to do now is restrict connections and traffic so that we only  
-allow the minimum necessary for whatever our particular situation is. In  
-some cases we may want to block all incoming "new" connection  
-attempts. Example: we want to run X, but don't  
-want anyone from outside to access it, so we'll block it completely from  
-outside connections. In other situations, we may want to limit, or restrict,  
-incoming connections to trusted sources only. The more restrictive, the  
-better. Example: we want to __ssh__ into our system from  
-outside, but we only ever do this from our workplace. So we'll limit  
-__sshd__ connections to our workplace address range. There are  
-various ways to do this, and we'll look at the most common ones.  
-  
-  
-  
-  
- We also will not want to limit our firewall to any one application. There is  
-nothing wrong with a "layered" defense-in-depth approach. Our  
-front line protection will be a packet filter -- either  
-ipchains or iptables  
-(see below). Then we can use additional tools and mechanisms to reinforce  
-our firewall.  
-  
-  
-  
-  
- We will include some brief examples. Our rule of thumb will be to deny  
-everything as the default policy, then open up just what we need. We'll try  
-to keep this as simple as possible since it can be an involved and complex  
-topic, and just stick to some of the most basic concepts. See the  
-Links section for further reading on this  
-topic.  
-  
-----  
-!!5.2. Packet Filters -- Ipchains and Iptables  
-  
- "Packet filters" (like ipchains)  
-have the ability to look at individual packets, and make decisions based  
-on what they find. These can be used for many purposes. One common purpose  
-is to implement a firewall.  
-  
-  
-  
- Common packet filters on Linux are ipchains which  
-is standard with 2.2 kernels, and iptables which  
-is available with the more recent 2.4 kernels.  
-iptables has more advanced packet filtering  
-capabilities and is recommended for anyone running a 2.4 kernel. But either  
-can be effective for our purposes. ipfwadm is  
-a similar utility for 2.0 kernels (not discussed here).  
-  
-  
-  
-  
- If constructing your own ipchains or  
-iptables firewall rules seems a bit daunting,  
-there are various sites that can automate the process. See the  
-Links section. Also the included examples may be  
-used as a starting point.  
-And your distribution may be including a  
-utility of some kind for generating a firewall script.  
-This may be  
-adequate, but it is still recommended to know the proper syntax and  
-how the various mechanisms work as such tools rarely do more than a  
-few very simple rules.  
-  
-  
-  
-  
-  
-  
-  
-  
- Various examples are given below. These are presented for illustrative  
-purposes to demonstrate some of the concepts being discussed here.  
-While they might also be useful as a starting point for your own  
-script, please note that they are not meant to be all encompassing.  
-You are strongly encouraged to understand how the scripts work, so  
-you can create something even more tailored for your own situation.  
-  
-  
-----  
-!5.2.1. ipchains  
-  
- ipchains can be used with either 2.2 or 2.4  
-kernels. When ipchains is in place, it checks  
-every packet that moves through the system. The packets move across different  
-"chains", depending where they originate and where they are  
-going. Think of "chains" as rule sets. In advanced  
-configurations, we could define our own custom chains. The three default  
-built-in chains are input, which is incoming traffic,  
-output, which is outgoing traffic, and  
-forward, which is traffic being forwarded from one  
-interface to another (typically used for "masquerading").  
-Chains can be manipulated in various ways to control the flow of traffic in  
-and out of our system. Rules can be added at our discretion to achieve  
-the desired result.  
-  
-  
-  
- At the end of every "chain" is a "target". The  
-target is specified with the -j option to the command. The  
-target is what decides the fate of the packet and essentially terminates that  
-particular chain. The most common targets are mostly self-explanatory:  
-ACCEPT, DENY,  
-REJECT, and MASQ.  
-MASQ is for "ipmasquerading".  
-DENY and REJECT essentially do the  
-same thing, though in different ways. Is one better than the other? That is  
-the subject of much debate, and depends on other factors that are beyond the  
-scope of this document. For our purposes, either should suffice.  
-  
-  
-  
-  
- ipchains has a very flexible configuration. Port  
-(or port ranges), interfaces, destination address, source address can be  
-specified, as well as various other options. The man page explains these  
-details well enough that we won't get into specifics here.  
-  
-  
-  
- Traffic entering our system from the Internet, enters via the  
-input chain. This is the one that we need as tight as we  
-can make it.  
-  
-  
-  
- Below is a brief example script for a hypothetical system. We'll let the  
-comments explain what this script does. Anything starting with a  
-"#" is a comment. ipchains rules  
-are generally incorporated into shell scripts, using shell variables to  
-help implement the firewalling logic.  
-  
-  
-  
-  
-#!/bin/sh  
-#  
-# ipchains.sh  
-#  
-# An example of a simple ipchains configuration.  
-#  
-# This script allows ALL outbound traffic, and denies  
-# ALL inbound connection attempts.  
-#  
-###################################################################  
-# Begin variable declarations and user configuration options ######  
-#  
-IPCHAINS=/sbin/ipchains  
-# This is the WAN interface, that is our link to the outside world.  
-# For pppd and pppoe users.  
-# WAN_IFACE="ppp0"  
-WAN_IFACE="eth0"  
-## end user configuration options #################################  
-###################################################################  
-# The high ports used mostly for connections we initiate and return  
-# traffic.  
-LOCAL_PORTS=`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f1`:\  
-`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f2`  
-# Any and all addresses from anywhere.  
-ANYWHERE="/"  
-# Let's start clean and flush all chains to an empty state.  
-ipchains -F  
-# Set the default policies of the built-in chains. If no match for any  
-# of the rules below, these will be the defaults that ipchains uses.  
-ipchains -P forward DENY  
-ipchains -P output ACCEPT  
-ipchains -P input DENY  
-# Accept localhost/loopback traffic.  
-ipchains -A input -i lo -j ACCEPT  
-# Get our dynamic IP now from the Inet interface. WAN_IP will be our  
-# IP address we are protecting from the outside world. Put this  
-# here, so default policy gets set, even if interface is not up  
-# yet.  
-WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \ -f 1`  
-# Bail out with error message if no IP available! Default policy is  
-# already set, so all is not lost here.  
- [[ -z "$WAN_IP" ] 88 echo "$WAN_IFACE not configured, aborting." 88 exit 1  
-# Accept non-SYN TCP, and UDP connections to LOCAL_PORTS. These are  
-# the high, unprivileged ports (1024 to 4999 by default). This will  
-# allow return connection traffic for connections that we initiate  
-# to outside sources. TCP connections are opened with 'SYN' packets.  
-ipchains -A input -p tcp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS ! -y -j ACCEPT  
-# We can't be so selective with UDP since that protocol does not  
-# know about SYNs.  
-ipchains -A input -p udp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS -j ACCEPT  
-## ICMP (ping)  
-#  
-# ICMP rules, allow the bare essential types of ICMP only. Ping  
-# request is blocked, ie we won't respond to someone else's pings,  
-# but can still ping out.  
-ipchains -A input -p icmp --icmp-type echo-reply \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-ipchains -A input -p icmp --icmp-type destination-unreachable \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-ipchains -A input -p icmp --icmp-type time-exceeded \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-###################################################################  
-# Set the catchall, default rule to DENY, and log it all. All other  
-# traffic not allowed by the rules above, winds up here, where it is  
-# blocked and logged. This is the default policy for this chain  
-# anyway, so we are just adding the logging ability here with '-l'.  
-# Outgoing traffic is allowed as the default policy for the 'output'  
-# chain. There are no restrictions on that.  
-ipchains -A input -l -j DENY  
-echo "Ipchains firewall is up `date`."  
-##-- eof ipchains.sh  
-  
-  
-  
-  
- To use the above script would require that it is executable (i.e.  
-chmod +x ipchains.sh), and run by root to build the  
-chains, and hence the firewall.   
-  
-  
-  
- To summarize what this example did was to start by setting some shell  
-variables in the top section, to be used later in the script. Then we set  
-the default rules (ipchains calls these "policies") of denying  
-all inbound and forwarded traffic, and of allowing all our own outbound  
-traffic. We had to open some holes in the high, unprivileged ports so  
-that we could have return traffic from connections that bigcat initiates to  
-outside addresses. If we connect to someone's web server, we want that HTML  
-data to be able to get back to us, for instance. The same applies to other  
-network traffic. We then allowed a few specific types of the ICMP protocol  
-(most are still blocked). We are also logging any inbound traffic that  
-violates any of our rules so we know who is doing what. Notice that we are  
-only using IP address here, not hostnames of any kind. This is so that  
-our firewall works, even in situation where there may be DNS failures.  
-Also, to prevent any kind of DNS spoofing.  
-  
-  
-  
- See the ipchains man page for a full explanation  
-of syntax. The important ones we used here are:  
-  
-  
-  
-  
-  
-  
-  -A input: Adds a rule to the  
-"input" chain. The default chains are input, output, and forward.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  -p udp: This rule only applies to the  
-"UDP" "protocol". The -p  
-option can be used with tcp, udp or icmp protocols.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  -i $WAN_IFACE: This rule applies to the specified  
-interface only, and applies to whatever chain is referenced (input, output,  
-or forward).  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  -s `IP addressb [[port]: This rule only  
-applies to the source address as specified. It can optionally have a port  
-(e.g. 22) immediately afterward, or port range, e.g. 1023:4999.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  -d `IP addressb [[port]: This rule only  
-applies to the destination address as specified. Also, it may include port or  
-port range.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  -l : Any packet that hits a rule with this option  
-is logged (lower case "L").  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  -j ACCEPT: Jumps to the "ACCEPT"  
-"target". This effectively terminates this chain  
-and decides the ultimate fate for this particular packet, which in this  
-example is to "ACCEPT" it. The same is  
-true for other -j targets like DENY.  
-  
-  
-  
-  
-  
-  
- By and large, the order in which command line options are specified is not  
-significant. The chain name (e.g. input) must come first  
-though.  
-  
-  
-  
- Remember in Step 1 when we ran __netstat__, we had  
-both X and print servers running among other things. We don't want these  
-exposed to the Internet, even in a limited way. These are still happily  
-running on bigcat, but are now safe and sound behind our  
-ipchains based firewall. You probably have other  
-services that fall in this category as well.  
-  
-  
-  
- The above example is a simplistic all or none approach. We allow all our own  
-outbound traffic (not necessarily a good idea), and block all inbound  
-connection attempts. It would more than likely require a bit of fine tuning  
-to make it work for you. For a more advanced set of rules, see the Appendix. And you might want to read http://linuxdoc.org/HOWTO/IPCHAINS-HOWTO.html.  
-  
-  
-  
- Whenever you have made changes to your firewall, you should verify its  
-integrity. One step to make sure your rules seem to be doing what you  
-intended, is to see how ipchains has interpreted  
-your script. You can do this by opening your xterm  
-very wide, and issuing the following command:  
-  
-  
-  
-  
- # ipchains -L -n -v | less  
-  
-  
-  
-  
- The output is grouped according to chain. You should also find a way to scan  
-yourself (see the Verifying section below). And  
-then keep an eye on your logs to make sure you are blocking what is  
-intended.  
-  
-----  
-!5.2.2. iptables  
-  
- iptables is the next generation packet filter for  
-Linux, and requires a 2.4 kernel. It can do everything  
-ipchains can, but has a number of noteworthy  
-enhancements. The syntax is similar to ipchains in  
-many respects. See the man page for details.  
-  
-  
-  
- The most noteworthy enhancement is "connection tracking", also  
-known as "stateful inspection". This gives  
-iptables more knowledge of the state of each  
-packet. Not only does it know if the packet is a TCP or UDP packet, or  
-whether it has the SYN or ACK flags set, but also if it is part of an existing  
-connection, or related somehow to an existing connection. The implications  
-for firewalling should be obvious.  
-  
-  
-  
- The bottom line is that it is easier to get a tight firewall with  
-iptables, than with  
-ipchains. So this is the recommended way to go.  
-  
-  
-  
-  
- Here is the same script as above, revised for  
-iptables:  
-  
-  
-  
-  
-#!/bin/sh  
-#  
-# iptables.sh  
-#  
-# An example of a simple iptables configuration.  
-#  
-# This script allows ALL outbound traffic, and denies  
-# ALL inbound connection attempts.  
-#  
-###################################################################  
-# Begin variable declarations and user configuration options ######  
-#  
-# Local Interfaces  
-# This is the WAN interface that is our link to the outside world.  
-# For pppd and pppoe users.  
-# WAN_IFACE="ppp0"  
-WAN_IFACE="eth0"  
-#  
-## end user configuration options #################################  
-###################################################################  
-# Any and all addresses from anywhere.  
-ANYWHERE="/"  
-# This module may need to be loaded:  
-modprobe ip_conntrack_ftp  
-# Start building chains and rules #################################  
-#  
-# Let's start clean and flush all chains to an empty state.  
-iptables -F  
-# Set the default policies of the built-in chains. If no match for any  
-# of the rules below, these will be the defaults that IPTABLES uses.  
-iptables -P FORWARD DROP  
-iptables -P OUTPUT ACCEPT  
-iptables -P INPUT DROP  
-# Accept localhost/loopback traffic.  
-iptables -A INPUT -i lo -j ACCEPT  
-## ICMP (ping)  
-#  
-# ICMP rules, allow the bare essential types of ICMP only. Ping  
-# request is blocked, ie we won't respond to someone else's pings,  
-# but can still ping out.  
-iptables -A INPUT -p icmp --icmp-type echo-reply \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-iptables -A INPUT -p icmp --icmp-type destination-unreachable \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-iptables -A INPUT -p icmp --icmp-type time-exceeded \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-###################################################################  
-# Set the catchall, default rule to DENY, and log it all. All other  
-# traffic not allowed by the rules above, winds up here, where it is  
-# blocked and logged. This is the default policy for this chain  
-# anyway, so we are just adding the logging ability here with '-j  
-# LOG'. Outgoing traffic is allowed as the default policy for the  
-# 'output' chain. There are no restrictions on that.  
-iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
-iptables -A INPUT -m state --state NEW -i ! $WAN_IFACE -j ACCEPT  
-iptables -A INPUT -j LOG -m limit --limit 30/minute --log-prefix "Dropping: "  
-echo "Iptables firewall is up `date`."  
-##-- eof iptables.sh  
-  
-  
-  
-  
- The same script logic is used here, and thus this does pretty much the same  
-exact thing as the ipchains script in the  
-previous section. There are some subtle differences as to syntax. Note the  
-case difference in the chain names for one (e.g. INPUT vs input). Logging is  
-handled differently too. It has its own "target" now  
-(-j LOG), and is much more flexible.  
-  
-  
-  
- There are some very fundamental differences as well, that might not be so  
-obvious. Remember this section from the ipchains  
-script:  
-  
-  
-  
-  
-# Accept non-SYN TCP, and UDP connections to LOCAL_PORTS. These are the high,  
-# unprivileged ports (1024 to 4999 by default). This will allow return  
-# connection traffic for connections that we initiate to outside sources.  
-# TCP connections are opened with 'SYN' packets. We have already opened  
-# those services that need to accept SYNs for, so other SYNs are excluded here  
-# for everything else.  
-ipchains -A input -p tcp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS ! -y -j ACCEPT  
-# We can't be so selective with UDP since that protocol does not know  
-# about SYNs.  
-ipchains -A input -p udp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS -j ACCEPT  
-  
-  
-  
-  
- We jumped through hoops here with ipchains so  
-that we could restrict unwanted, incoming connections as much as possible. A  
-bit of a kludge, actually.  
-  
-  
-  
- That section is missing from the iptables version.  
-It is not needed as connection tracking handles this quite nicely, and then  
-some. This is due to the "statefulness" of  
-iptables. It knows more about each packet than  
-ipchains. For instance, it knows whether the  
-packet is part of a "new" connection, or an  
-"established" connection, or a "related"  
-connection. This is the so-called "stateful inspection" of  
-connection tracking.  
-  
-  
-  
- There are many, many features of iptables that  
-are not touched on here. For more reading on the Netfilter project and  
-iptables, see http://netfilter.samba.org.  
-And for a more advanced set of rules, see the Appendix.   
-  
-----  
-!!5.3. Tcpwrappers (libwrap)  
-  
- Tcpwrappers provides much the same desired results  
-as ipchains and  
-iptables above, though works quite differently.  
-Tcpwrappers actually intercepts the connection  
-attempt, then examines its configurations files, and decides whether to  
-accept or reject the request. Tcpwrappers  
-controls access at the application level, rather than the socket level  
-like iptables and ipchains.  
-This can be quite effective, and is a standard component on most Linux  
-systems.  
-  
-  
-  
- Tcpwrappers consists of the configuration  
-files /etc/hosts.allow and  
-/etc/hosts.deny. The functionality is provided by the  
-libwrap library.   
-  
-  
-  
- Tcpwrappers first looks to see if access is  
-permitted in /etc/hosts.allow, and if so, access is  
-granted. If not in /etc/hosts.allow, the file  
-/etc/hosts.deny is then checked to see if access is  
-''not'' allowed. If so, access is denied. Else,  
-''access is granted''. For this reason,  
-/etc/hosts.deny should contain only one uncommented  
-line, and that is: ALL: ALL. Access should then be  
-permitted through entries in /etc/hosts.allow, where  
-specific services are listed, along with the specific host addresses allowed  
-to access these services. While hostnames can be used here, use of hostnames  
-opens the limited possibility for name spoofing.  
-  
-  
-  
- Tcpwrappers is commonly used to protect services  
-that are started via inetd (or  
-xinetd). But also any program  
-that has been compiled with libwrap support, can  
-take advantage of it. Just don't assume that all programs have built in  
-libwrap support -- they do not. In fact, most  
-probably don't. So we will only use it in our examples here to protect  
-services start via inetd. And then rely on our  
-packet filtering firewall, or other mechanism, to protect non-(x)inetd  
-services.  
-  
-  
-  
- Below is a small snippet from a typical inetd.conf file:  
-  
-  
-  
-  
- # Pop and imap mail services et al  
-#  
-#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d  
-#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d  
-#imap stream tcp nowait root /usr/sbin/tcpd imapd  
-#  
-  
-  
-  
-  
- The second to last column is the tcpwrappers  
-daemon -- __/usr/sbin/tcpd__. Immediately after is the daemon  
-it is protecting. In this case, POP and  
-IMAP mail servers. Your distro probably has  
-already done this part for you. For the few applications that have built-in  
-support for tcpwrappers via the  
-libwrap library, specifying the daemon as above  
-is not necessary.  
-  
-  
-  
- We will use the same principles here: default policy is to deny everything,  
-then open holes to allow the minimal amount of traffic necessary.  
-  
-  
-  
- So now with your text editor, __su__ to root and open  
-/etc/hosts.deny. If it does not exist, then create  
-it. It is just a plain text file. We want the following line:  
-  
-  
-  
-  
-  
- ALL: ALL  
-  
-  
-  
-  
- If it is there already, fine. If not, add it in and then save and close file.  
-Easy enough. "ALL" is one of the keywords that  
-tcpwrappers understands. The format is  
-$SERVICE_NAME : $WHO, so we are denying all connections to  
-all services here. At least all services that are using  
-tcpwrappers. Remember, this will primarily be  
-inetd services. See man 5  
-hosts_access for details on the syntax of these files. Note the  
-"5" there!  
-  
-  
-  
- Now let's open up just the services we need, as restrictively as we can,  
-with a brief example:  
-  
-  
-  
-  
- ALL: 127...1  
-sshd,ipop3d: 192.168.1.  
-sshd: .myworkplace.com, hostess.mymomshouse.com  
-  
-  
-  
-  
- The first line allows all "localhost" connections.  
-You will need this. The second  
-allows connections to the sshd and  
-ipop3d services from IP addresses that start with  
-192.168.1., in this case the private address range for  
-our hypothetical home LAN. Note the trailing ".". It's  
-important. The third line allows connections to only our  
-sshd daemon from any host associated with  
-.myworkplace.com. Note the leading "." in  
-this example. And then also, the single host  
-hostess.mymomshouse.com. In summary, localhost and all  
-our LAN connections have access to any and all tcpwrappered services on  
-bigcat. But only our workplace addresses, and our mother can use  
-sshd on bigcat from outside connections. Everybody  
-else is denied by the default policy in /etc/hosts.deny.  
-  
-  
-  
-  
- The types of wild cards above (.myworkplace.com and  
-192.168.1.) are not supported by  
-ipchains and iptables,  
-or most other Linux applications for that matter. Also,  
-tcpwrappers can use hostnames in place of  
-IP addresses which is quite handy in some situations. This does  
-not work with ipchains and  
-iptables.   
-  
-  
-  
- You can test your tcpwrappers configuration  
-with the included __tcpdchk__ utility (see the man page). Note  
-that at this time this does not work with xinetd,  
-and may not even be included in this case.  
-  
-  
-  
- There is nothing wrong with using both tcpwrappers  
-and a packet filtering firewall like ipchains. In  
-fact, it is recommended to use a "layered" approach. This  
-helps guard against accidental misconfigurations. In this case, each  
-connection will be tested by the packet filter rules first, then  
-tcpwrappers.   
-  
-  
-  
- Remember to make backup copies before editing system configuration files,  
-restart the daemon afterward, and then check the logs for error messages.  
-  
-----  
-!5.3.1. xinetd  
-  
- As mentioned, xinetd is an  
-enhanced inetd . It has much of the  
-same functionality, with some notable enhancements. One is that  
-tcpwrappers support can be  
-compiled in, eliminating the need for explicit references to  
-__tcpd__. Which means /etc/hosts.allow  
-and /etc/hosts.deny are automatically in effect.  
-Don't  
-assume this is the case though. A little testing, then viewing the logs  
-should be able to tell you whether tcpwrappers  
-support is automatic or not.  
-  
-  
-  
-  
- Some of xinetd's other enhancements: specify  
-IP address to listen on, which is a very effective method of access control;  
-limit the rate of incoming connections and the total number of simultaneous  
-connections; limit services to specific times of day. See the  
-xinetd and xinetd.conf  
-man pages for more details.  
-  
-  
-  
- The syntax is quite different though. An example from  
-/etc/xinetd.d/tftp:  
-  
-  
-  
-  
- service tftp  
-{  
-socket_type = dgram  
-bind = 192.168.1.1  
-instances = 2  
-protocol = udp  
-wait = yes  
-user = nobody  
-only_from = 192.168.1.  
-server = /usr/sbin/in.tftpd  
-server_args = /tftpboot  
-disable = no  
-}  
-  
-  
-  
-  
- Notice the bind statement. We are only listening on,  
-or "binding" to, the private, LAN interface here. No outside  
-connections can be made since the outside port is not even opened. We are  
-also only accepting connections from 192.168.1., our LAN.  
-For xinetd's purposes, this denotes any IP  
-address beginning with "192.168.1". Note that the syntax is different  
-from inetd. The server  
-statement in this case is the __tftp__ daemon,  
-__in.tftpd__. Again, this assumes that  
-libwrap/tcpwrappers support is compiled into  
-xinetd. The user running the  
-daemon will be "nobody". Yes, there is a user account called  
-"nobody", and it is wise to run such daemons as non-root users  
-whenever possible. Lastly, the disable statement is  
-xinetd's way of turning services on or off. In  
-this case, it is "on". This is on here only as an example. Do  
-NOT run tftp as a public service as it is unsafe.  
-  
-----  
-!!5.4. !PortSentry  
-  
- Portsentry  
-works quite differently than the other tools discussed so far.  
-Portsentry does what its name implies --  
-it guards ports. Portsentry is configured with the  
-/etc/portsentry/portsentry.conf file.  
-  
-  
-  
-  
- Unlike the other applications discussed above, it does this by actually  
-becoming the listening server on those ports. Kind of like baiting a trap.  
-Running netstat -taup as root while  
-portsentry is running, will show  
-portsentry as the LISTENER on  
-whatever ports portsentry is configured for. If  
-portsentry senses a connection attempt, it blocks  
-it completely. And then goes a step further and blocks the route to that host  
-to stop all further traffic. Alternately, ipchains  
-or iptables can be used to block the host  
-completely. So it makes an excellent tool to stop port scanning of a range of  
-ports.  
-  
-  
-  
-  
- But portsentry has limited flexibility as to  
-whether it allows a given connection. It is pretty much all or nothing. You  
-can define specific IP addresses that it will ignore in  
-/etc/portsentry/portsentry.ignore. But you cannot allow  
-selective access to individual ports. This is because only one server can  
-bind to a particular port at the same time, and in this case that is  
-portsentry itself. So it has limited usefulness as a  
-stand-alone firewall. As part of an overall firewall strategy, yes, it can  
-be quite useful. For most of us, it should not be our first line of defense,  
-and we should only use it in conjunction with other tools.  
-  
-  
-  
-  
- Suggestion on when portsentry might be useful:  
-  
-  
-  
-  
-  
-  
-*  
-  
-  
-As a second layer of defense, behind either  
-ipchains or iptables.  
-Packet filtering will catch the packets first, so that anything that gets  
-to portsentry would indicate a misconfiguration.  
-Do not use in conjunction with inetd services --  
-it won't work. They will butt heads.  
-  
-  
-  
-*  
-*  
-  
-  
-As a way to catch full range ports scans. Open a pinhole or two in the  
-packet filter, and let portsentry catch these  
-and re-act accordingly.  
-  
-  
-  
-*  
-*  
-  
-  
-If you are ''very sure'' you have no exposed public servers  
-at all, and you just want to know who is up to what. But do not assume  
-anything about what portsentry is protecting.  
-By default it does not watch all ports, and may even leave some very  
-commonly probed ports open. So make sure you configure it accordingly.  
-And make sure you have tested and verified your set up first, and that  
-nothing is exposed.  
-  
-  
-  
-*  
-  
- All in all, the packet filters make for a better firewall.  
-  
-----  
-!!5.5. Proxies  
-  
- The dictionary defines "proxy" as "the authority or power  
-to act on behalf of another". This pretty well describes software proxies as  
-well. It is an intermediary in the connection path. As an example, if we  
-were using a web proxy like "squid" (http://www.squid-cache.org/),  
-every time we browse to a web site, we  
-would actually be connecting to our locally running squid server.  
-Squid in turn, would relay our request to the ultimate, real destination. And  
-then squid would relay the web pages back to us. It is  
-a go-between. Like "firewalls", a "proxy" can refer  
-to either a specific application, or a dedicated server which runs a proxy  
-application.   
-  
-  
-  
- Proxies can perform various duties, not all of which have much to do with  
-security. But the fact that they are an intermediary, makes them a good place  
-to enforce access control policies, limit direct connections through a  
-firewall, and control how the network behind the proxy looks to the Internet.  
-So this makes them strong candidates to be part of an overall firewall  
-strategy. And, in fact, are sometimes used instead of packet filtering  
-firewalls. Proxy based firewalls probably make more sense where many users  
-are behind the same firewall. And it probably is not high on the list of  
-components necessary for home based systems.   
-  
-  
-  
- Configuring and administering proxies can be complex, and is beyond the scope of  
-this document. The Firewall and Proxy Server HOWTO, http://linuxdoc.org/HOWTO/Firewall-HOWTO.html, has examples  
-of setting up proxy firewalls. Squid usage is discussed at  
-http://squid-docs.sourceforge.net/latest/html/book1.htm  
-  
-  
-----  
-!!5.6. Individual Applications  
-  
- Some servers may have their own access control features. You should check  
-this for each server application you run. We'll only look at a few of the  
-common ones in this section. Man pages, and other application specific  
-documentation, is your friend here. This should be done whether you have  
-confidence in your firewall or not. Again, layers  
-of protection is always best.   
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- BIND - a very common package that provides name  
-server functionality. The daemon itself is "named". This only  
-requires full exposure to the Internet if you are providing DNS look ups  
-for one or more domains to the rest of the world. If you are not sure what  
-this means, ''you do not need, or want'', it exposed. For  
-the overwhelming majority of us this is the case. It is a very common  
-crack target.  
-  
-  
-  
-  
- But it may be installed, and can be useful in a caching only mode. This  
-does not require full exposure to the Internet. Limit the interfaces  
-on which it "listens" by editing  
-/etc/named.conf (random example shown):  
-  
-  
-  
-  
-  
-  
-options {  
-directory "/var/named";  
-listen-on { 127...1; 192.168.1.1; };  
-version "N/A";  
-};  
-  
-  
-  
-  
-  
- The "listen-on" statement is what limits where named  
-listens for DNS queries. In this example, only on localhost and bigcat's  
-LAN interface. There is no port open for the rest of the world. It just  
-is not there. Restart __named__ after making changes.  
-  
-  
-  
-*  
-*  
-  
- X11 can be told not to allow TCP connections by using the  
--nolisten tcp command line option. If using  
-__startx__, you can make this automatic by placing  
-alias startx="startx -- -nolisten tcp" in your  
-~/.bashrc, or the system-wide file,  
-/etc/bashrc, with your text editor. If using  
-xdm (or variants such as  
-gdm, kdm, etc),  
-this option would be specified in  
-/etc/X11/xdm/Xservers (or comparable) as  
-:0 local /usr/bin/X11/X -nolisten tcp.  
-gdm actually uses  
-/etc/X11/gdm/gdm.conf.  
-  
-  
-  
-  
- If using xdm (or comparable) to start X  
-automatically at boot, /etc/inittab can  
-be modified as: xdm -udpPort , to further  
-restrict connections. This is typically near the bottom of  
-/etc/inittab.  
-  
-  
-  
-*  
-*  
-  
- Recent versions of sendmail can be told to  
-listen only on specified addresses:  
-  
-  
-  
-  
-  
- # SMTP daemon options  
-O !DaemonPortOptions=Port=smtp,Addr=127...1, Name=MTA  
-  
-  
-  
-  
-  
- The above excerpt is from /etc/sendmail.cf which can  
-be carefully added with your text editor. The  
-sendmail.mc directive is:  
-  
-  
-  
-  
-  
-  
-dnl This changes sendmail to only listen on the loopback device 127...1  
-dnl and not on any other network devices.  
-DAEMON_OPTIONS(`Port=smtp,Addr=127...1, Name=MTA')  
-  
-  
-  
-  
-  
- In case you would prefer to build a new sendmail.cf,  
-rather than edit the existing one. Other mail server daemons likely have  
-similar configuration options. Check your local documentation.  
-  
-  
-  
-*  
-*  
-  
- SAMBA connections can be restricted in  
-smb.conf:  
-  
-  
-  
-  
-  
- bind interfaces = true  
-interfaces = 192.168.1. 127.  
-hosts allow = 192.168.1. 127.  
-  
-  
-  
-  
-  
- This will only open, and allow, connections from localhost (127...1),  
-and the local LAN address range. Adjust the LAN address as needed.  
-  
-  
-  
-*  
-*  
-  
- The CUPS print daemon can be told where  
-to listen for connections. Add to /etc/cups/cupsd.conf:  
-  
-  
-  
-  
-  
- Listen 192.168.1.1:631  
-  
-  
-  
-  
-  
- This will only open a port at the specified address and port number.  
-  
-  
-  
-*  
-*  
-  
- xinetd can force daemons to listen only  
-on a specified address with its "bind" configuration  
-directive. For instance, an internal LAN interface address.  
-See man xinetd.conf for this and other syntax.  
-There are various other control mechanisms as well.  
-  
-  
-  
-*  
-  
-  
-  
- As always, anytime you make system changes, backup the configuration file  
-first, restart the appropriate daemon afterward, and then check the  
-appropriate logs for error messages.  
-  
-----  
-!!5.7. Verifying  
-  
- The final step after getting your firewall in place, is to verify that it  
-is doing what you intended. You would be wise to do this anytime you make  
-even minor changes to your system configuration.  
-  
-  
-  
- So how to do this? There are several things you can do.  
-  
-  
-  
- For our packet filters like ipchains and  
-iptables, we can list all our rules, chains,  
-and associated activity with iptables -nvL | less  
-(substitute __ipchains__ if appropriate). Open  
-your xterm as wide as possible to avoid wrapping long lines.  
-  
-  
-  
- This should give you an idea if your chains are doing what you think they  
-should. You may want to perform some of the on-line tasks you normally do  
-first: open a few web pages, send and retrieve mail, etc. This will, of  
-course, not give you any information on tcpwrappers or  
-portsentry. __tcpdchk__ can  
-be used to verify tcpwrappers configuration  
-(except with xinetd).  
-  
-  
-  
- And then, scan yourself. nmap is the scanning  
-tool of choice and may be available via your distribution  
-, or from  
-http://www.insecure.org/nmap/nmap_download.html. nmap is very  
-flexible, and essentially is a "port prober". In other words,  
-it looks for open ports, among other things. See the  
-nmap man page for details.  
-  
-  
-  
-  
- If you do run nmap against yourself (e.g.  
-nmap localhost), this should tell you what ports are  
-open -- and ''visible locally'' only! Which hopefully by now, is  
-quite different from what can be seen from the outside. So, scan yourself,  
-and then find a trusted friend, or site (see the Links  
-section), to scan you from the outside. Make sure you are not  
-violating your ISPs Terms of Service by port scanning. It may not be allowed,  
-even if the intentions are honorable. Scanning from outside is the best way  
-to know how the rest of the world sees you. This should tell you how well  
-that firewall is working. See the nmap section in  
-the Appendix for some examples on nmap usage.  
-  
-  
-  
-  
- One caveat on this: some ISPs may filter some ports, and you will not know  
-for sure how well your firewall is working. Conversely, they make it look  
-like certain ports are open by using web, or other, proxies. The scanner  
-may see the web proxy at port 80 and mis-report it as an open port on your  
-system.   
-  
-  
-  
- Another option is to find a website that offers ''full  
-range'' testing. http://www.hackerwhacker.com is  
-one such site. Make sure that any such site is not just scanning a relatively  
-few well known ports.  
-  
-  
-  
- Repeat this procedure with every firewall change, every system upgrade or new  
-install, and when any key components of your system changes.  
-  
-  
-  
- You may also want to enable logging all the denied traffic. At least  
-temporarily. Once the firewall is verified to be doing what you think it  
-should, and if the logs are hopelessly overwhelming, you may want to disable  
-logging.   
-  
-  
-  
- If relying on portsentry at all, please read the  
-documentation. Depending on your configuration it will either drop the  
-route to the scanner, or implement a  
-ipchains/iptables rule  
-doing the same thing. Also, since it "listens" on the  
-specified ports, all those ports will show as "open". A false  
-alarm in this case.  
-  
-  
-----  
-!!5.8. Logging  
-  
- Linux does a lot of logging. Usually to more than one file. It is not always  
-obvious what to make of all these entries -- good, bad or indifferent? Firewall  
-logs tend to generate a fair amount of each. Of course, you are wanting to  
-stop only the "bad", but you will undoubtedly catch some  
-harmless traffic as well. The 'net has a lot of background noise.   
-  
-  
-  
- In many cases, knowing the intentions of an incoming packet are almost  
-impossible. Attempted intrusion? Misbehaved protocol? Mis-typed IP address?  
-Conclusions can be drawn based on factors such as destination port, source  
-port, protocol, and many other variables. But there is no substitute for  
-experience in interpreting firewall logs. It is a black art in many cases.  
-  
-  
-  
- So do we really need to log? And how much should we be trying to log? Logging  
-is good in that it tells us that the firewall is functional. Even if we  
-don't understand much of it, we know it is doing "something".  
-And if we have to, we can dig into those logs and find whatever data might be  
-called for.  
-  
-  
-  
-  
- On the other hand, logging can be bad if it is so excessive, it is difficult  
-to find pertinent data, or worse, fills up a partition. Or if we over re-act  
-and take every last entry as an all out assault. Some perspective is a great  
-benefit, but something that new users lack almost by definition. Again, once  
-your firewall is verified, and you are perplexed or overwhelmed, home  
-desktop users may want to disable as much logging as possible. Anyone with  
-greater responsibilities should log, and then find ways to extract the  
-pertinent data from the logs by filtering out extraneous information.  
-  
-  
-  
- Not sure where to look for log data? This could conceivably be  
-many places depending on how your distribution configured the various daemons  
-and __syslogd__. Most logging is done in  
-/var/log/*. Check that directory with ls -l  
-/var/log/ and see if you can tell the most active logs by size and  
-timestamp. Also, look at /etc/syslog.conf to see where  
-the default logs are. /var/log/messages is a good place  
-to look for starters.   
-  
-  
-  
- Portsentry and tcpwrappers  
-do a certain amount of logging that is not adjustable.  
-xinetd has logging enhancements that can be turned  
-on. Both ipchains and  
-iptables, on the other hand, are very flexible as  
-to what is logged.  
-  
-  
-  
- For ipchains the -l option can  
-be added to any rule. iptables uses the  
--j LOG target, and requires its own, separate rule instead.  
-iptables goes a few steps further and allows  
-customized log entries, and rate limiting. See the man page. Presumably, we  
-are more interested in logging blocked traffic, so we'd confine logging to  
-only our DENY and REJECT rules.  
-  
-  
-  
- So whether you log, and how much you log, and what you do with the logs, is  
-an individual decision, and probably will require some trial and error so  
-that it is manageable. A few auditing and analytical tools can be quite  
-helpful:  
-  
-  
-  
- Some tools that will monitor your logs for you and notify you when necessary.  
-These likely will require some configuration, and trial and error, to make  
-the most out of them:   
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- A nice log entry analyzer for ipchains and  
-iptables from Manfred Bartz: http://www.logi.cc/linux/!NetfilterLogAnalyzer.php3.  
-What does all that stuff mean anyway?  
-  
-  
-  
-*  
-*  
-  
-  
-!LogSentry (formerly logcheck) is available from  
-http://www.psionic.org/products/logsentry.html,  
-the same group that is responsible for  
-portsentry. !LogSentry  
-is an all purpose log monitoring tool with a flexible configuration, that  
-handles multiple logs.  
-  
-  
-  
-*  
-*  
-  
- http://freshmeat.net/projects/firelogd/, the Firewall Log Daemon from Ian Jones, is designed to  
-watch, and send alerts on iptables or  
-ipchains logs data.  
-  
-  
-  
-*  
-*  
-  
- http://freshmeat.net/projects/fwlogwatch/ by Boris Wesslowski, is a similar idea, but supports  
-more log formats.  
-  
-  
-  
-*  
-  
-----  
-!!5.9. Where to Start  
-  
- Let's take a quick look at where to run our firewall scripts from.  
-  
-  
-  
- Portsentry can be run as an init process, like  
-other system services. It is not so important when this is done.  
-Tcpwrappers will be automatically be invoked by  
-inetd or xinetd, so not  
-to worry there either.  
-  
-  
-  
-  
- But the packet filtering scripts will have to be started somewhere. And many  
-scripts will have logic that uses the local IP address. This will mean that  
-the script must be started after the interface has come up and been assigned  
-an IP address. Ideally, this should be immediately after the interface is up.  
-So this depends on how you connect to the Internet. Also, for protocols like  
-PPP or DHCP that may  
-be dynamic, and get different IP's on each re-connect, it is best to have  
-the scripts run by the appropriate daemon.  
-  
-  
-  
-  
-  
-For PPP, you probably have an  
-/etc/ppp/ip-up file. This will be executed every  
-time there is a connect or re-connect. You should put the full path to your  
-firewall script here. Check the local documentation for the correct  
-location. Debian use files in /etc/ppp/ip-up.d/, so  
-either put the script itself there, or a symlink to it. Red Hat uses  
-/etc/ppp/ip-up.local for any user defined, local  
-PPP configuration.   
-  
-  
-  
- For DHCP, it depends on which client.  
-__dhcpcd__ will execute  
-__/etc/dhcpcd/dhcpcd-`interfaceb.exe__ (e.g.  
-dhcpcd-eth0.exe) whenever a lease is obtained or renewed. So this is where to  
-put a reference to your firewall script. For  
-__pump__, the main  
-configuration file is /etc/pump.conf.  
-__Pump__ will run whatever script is defined by the  
-"script" statement any time there is a new or renewed lease:  
-  
-  
-  
-  
- script /usr/local/bin/ipchains.sh  
-  
-  
-  
-  
- If you have a static IP address (i.e. it never changes), the placement is not  
-so important and should be ''before'' the interface comes  
-up!  
-  
-----  
-!!5.10. Summary and Conclusions for Step 3  
-  
- In this section we looked at various components that might be used to  
-construct a "firewall". And learned that a firewall is as  
-much a strategy and combination of components, as it is any one particular  
-application or component. We looked at a few of the most commonly available  
-applications that can be found on most, if not all, Linux systems. This is  
-not a definitive list.  
-  
-  
-  
- This is a lot of information to digest at all at one time and expect anyone  
-to understand it all. Hopefully this can used as a starting point, and  
-used for future reference as well. The packet filter firewall examples can be  
-used as starting points as well. Just use your text editor, cut and paste  
-into a file with an appropriate name, and then run chmod  
-+x against it to make it executable. Some minor editing of the  
-variables may be necessary. Also look at the Links section for sites and utilities that can be  
-used to generate a custom script. This may be a little less daunting.  
-  
-  
-  
- Now we are done with Steps 1, 2 and 3. Hopefully by now you have already  
-instituted some basic measures to protect your system(s) from the various and  
-sundry threats that lurk on networks. If you haven't implemented any of the  
-above steps yet, now is a good time to take a break, go back to the top, and  
-have at it. The most important steps are the ones above.  
-  
-  
-  
-  
- A few quick conclusions...  
-  
-  
-  
- "What is best iptables,  
-ipchains, tcpwrappers,  
-or portsentry?" The quick answer is that  
-iptables can do more than any of the others. So  
-if you are using a 2.4 kernel, use  
-iptables. Then,  
-ipchains if using a 2.2 kernel. The long answer is  
-"it just depends on what you are doing and what the objective  
-is". Sorry. The other tools all have some merit in any given  
-situation, and all can be effective in the right situation.   
-  
-  
-  
- "Do I really need all these packages?" No, but please combine  
-more than one approach, and please follow all the above recommendations.  
-iptables by itself is good, but in conjunction  
-with some of the other approaches, we are even stronger. Do not rely on any  
-single mechanism to provide a security blanket. "Layers" of  
-protection is always best. As is sound administrative practices. The best  
-iptables script in the world is but one piece of  
-the puzzle, and should not be used to hide other system weaknesses.  
-  
-  
-  
- "If I have a small home LAN, do I need to have a firewall on each  
-computer?" No, not necessary as long as the LAN gateway has a properly  
-configured firewall. Unwanted traffic should be stopped at that point. And as  
-long as this is working as intended, there should be no unwanted traffic on  
-the LAN. But, by the same token, doing this certainly does no harm. And on  
-larger LANs that might be mixed platform, or with untrusted users, it would  
-be advisable.  
-  
-----  
-!!!6. Intrusion Detection  
-  
- This section will deal with how to get early warning, how to be alerted  
-after the fact, and how to clean up from intrusion attempts.  
-  
-  
-----  
-!!6.1. Intrusion Detection Systems (IDS)  
-  
- Intrusion Detection Systems (IDS for short) are designed to catch what might  
-have gotten past the firewall. They can either be designed to catch an  
-active break-in attempt in progress, or to detect a successful break-in  
-after the fact. In the latter case, it is too late to prevent any damage, but  
-at least we have early awareness of a problem. There are two basic types of  
-IDS: those protecting networks, and those protecting individual hosts.  
-  
-  
-  
- For host based IDS, this is done with utilities that monitor the filesystem  
-for changes. System files that have changed in some way, but should not  
-change -- unless we did it -- are a dead give away that something is amiss.  
-Anyone who gets in, and gets root, will presumably make changes to the system  
-somewhere. This is usually the very first thing done. Either so he can get  
-back in through a backdoor, or to launch an attack against someone else. In  
-which case, he has to change or add files to the system.   
-  
-  
-  
- This is where tools like tripwire (http://www.tripwire.org) play a role.  
-Such tools monitor various aspects of the filesystem, and compare them against a  
-stored database. And can be configured to send an alert if  
-''any'' changes are detected. Such tools should only be  
-installed on a known "clean" system.   
-  
-  
-  
- For home desktops and home LANs, this is probably not an absolutely necessary  
-component of an overall security strategy. But it does give peace of mind, and  
-certainly does have its place. So as to priorities, make sure the Steps 1, 2  
-and 3 above are implemented and verified to be sound, before delving into  
-this.  
-  
-  
-  
- RPM users can  
-get somewhat the same results with rpm -Va, which will  
-verify all packages, but without all the same functionality. For instance, it  
-will not notice new files added to most directories. For this to be helpful,  
-it needs to be done after a clean install, and then each time any packages  
-are upgraded or added. Example:  
-  
-  
-  
-  
-  
-# rpm -Va b /root/system.checked  
-  
-  
-  
-  
- Then we have a stored system snapshot that we can refer back to.   
-  
-  
-  
- Debian users have a similar tool with __debsums__.  
-  
-  
-  
-  
-  
-# debsums -s b /root/system.checked  
-  
-  
-  
-  
- Another idea is to run __chkrootkit__  
-(http://www.chkrootkit.org/)  
-as a weekly cron job. This will detect common "rootkits".   
-  
-----  
-!!6.2. Have I Been Hacked?  
-  
- Maybe you are reading this because you've noticed something "odd"  
-about your system, and are suspicious that someone was gotten in? This can be  
-a clue.  
-  
-  
-  
- The first thing an intruder typically does is install a "rootkit".  
-There are many prepackaged rootkits available on the Internet.  
-The rootkit is essentially a script, or set of scripts, that makes quick work  
-of modifying the system so the intruder is in control, and he is well hidden.  
-He does this by installing modified binaries of common system utilities and  
-tampering with log files. Or by using special kernel modules that achieve  
-similar results. So common commands like __ls__ may be  
-modified so as to not show where he has his files stored. Clever!   
-  
-  
-  
- A well designed rootkit can be quite effective. Nothing on the system can  
-really be trusted to provide accurate feedback. Nothing! But sometimes the  
-modifications are not as smooth as intended and give hints that something is  
-not right. Some things that ''might'' be warning signs:  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
-  
-__Login__ acts weird. Maybe no one can login. Or only  
-root can login. Any __login__ weirdness at all should be  
-suspicious. Similarly, any weirdness with adding or changing passwords.  
-  
-  
-  
-*  
-*  
-  
- System utilities are slower, or awkward, or show strange and unexpected  
-results. Common utilities that might be modified are: __ls__,  
-__find__, __who__, __w__,  
-__last__, __netstat__,  
-__login__, __ps__, __top__.  
-This is not a definitive list!  
-  
-  
-  
-*  
-*  
-  
- Files or directories named "..." or ".. "  
-(dot dot space). A sure bet in this case. Files with haxor looking  
-names like "r00t-something".  
-  
-  
-  
-*  
-*  
-  
- Unexplained bandwidth usage.  
-  
-  
-  
-*  
-*  
-  
- Logs that are missing completely, or missing large sections. Or a sudden  
-change in __syslog__ behavior.  
-  
-  
-  
-*  
-*  
-  
- Mysterious open ports, or processes.  
-  
-  
-  
-*  
-*  
-  
- Files that cannot be deleted or moved. Some rootkits use  
-__chattr__ to make files "immutable",  
-or not changable. This kind of change will not show up with  
-__ls__, so the files look normal at first glance. See the  
-man pages for __chattr__ and __lsattr__ on  
-how to reverse this. Then see the next section below on restoring  
-your system as the jig is up at this point.  
-  
-  
-  
-*  
-*  
-  
- Indications of a "sniffer", such as log messages of an  
-interface entering "promiscuous" mode.  
-  
-  
-  
-*  
-*  
-  
- Modifications to /etc/inetd.conf, or  
-/etc/passwd. Especially, any additions. Try  
-using __cat__ or __tail__ to view these  
-files. Additions will most likely be appended to the end. Remember though  
-such changes may not be "visible" to any system tools.  
-  
-  
-  
-*  
-  
-  
-  
- Sometimes the intruder is not so smart and forgets about root's  
-.bash_history, or cleaning up log entries, or even  
-leaves strange, leftover files in /tmp. So these should  
-always be checked. Just don't necessarily expect them to be accurate.  
-  
-  
-  
- Packet sniffers, like tcpdump  
-(http://www.tcpdump.org), might  
-be useful in finding any uninvited traffic. Interpreting sniffer output is  
-probably beyond the average new user. snort  
-(http://www.snort.org), and  
-ethereal  
-(http://www.ethereal.com), are  
-also good. Ethereal has a GUI.  
-  
-  
-  
- As mentioned, a compromised system will undoubtedly have altered system  
-binaries, and the output of system utilities is not to be trusted. Nothing on  
-the system can be relied upon to be telling you the truth. Re-installing  
-individual packages may or may not help since it could be system libraries  
-or kernel modules that are doing the dirty work.   
-  
-  
-  
- RPM users can  
-use rpm -Va |less to attempt to verify the integrity all  
-packages. But again there is no assurance that rpm  
-itself has not been tampered with, or the system components that  
-RPM relies on.  
-  
-  
-  
- If you have __pstree__ on your system, try this instead  
-of the standard __ps__. Sometimes the script kiddies forget  
-about this one. No guarantees though that this is accurate either.  
-  
-  
-  
-  
- You can also try querying the /proc filesystem,  
-which contains everything the kernel knows about processes that are  
-running:  
-  
-  
-  
-  
-  
-# cat /proc/*/stat | awk '{print $1,$2}'  
-  
-  
-  
-  
- This will provide a list of all processes and PIDs numbers (assuming  
-a malicious kernel module is not hiding this).  
-  
-  
-  
-  
-Another approach is to visit http://www.chkrootkit.org, download  
-their rootkit checker, and see what it says.  
-  
-  
-  
- Some interesting discussions on issues surrounding forensics can be found at http://www.fish.com/security/.  
-There is also a collection of tools available, aptly called  
-"The Coroner's Toolkit" (TCT).  
-  
-  
-  
-  
- Read below for steps on recovering from an intrusion.  
-  
-----  
-!!6.3. Reclaiming a Compromised System  
-  
- So now you've confirmed a break-in, and know that someone else has root  
-access, and quite likely one or more hidden backdoors to your system. You've  
-lost control. How to clean up and regain control?  
-  
-  
-  
- There is no sure fire way of doing this short of a complete re-install. There  
-is no way to find with assurance all the modified files and backdoors that  
-may have been left. Trying to patch up a compromised system risks a false  
-sense of security and may actually aggravate an already bad situation.  
-  
-  
-  
-  
- The steps to take, in this order:  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- Pull the plug and disconnect the machine. You may be unwittingly  
-participating in criminal activity, and doing to others what has been done  
-to you.  
-  
-  
-  
-*  
-*  
-  
- Depending on the needs of the situation and time available to restore the  
-system, it is advantageous to learn as much as you can about how the  
-attacker got in, and what was done in order to plug the hole and avoid a  
-recurrence. This could conceivably be time consuming, and is not always  
-feasible. And it may require more expertise than the typical user  
-possesses.  
-  
-  
-  
-*  
-*  
-  
- Backup important data. Do ''not'' include any system files  
-in the backup, and system configuration files like  
-inetd.conf. Limit the backup to personal data files  
-only! You don't want to backup, then restore something that might open  
-a backdoor or other hole.  
-  
-  
-  
-*  
-*  
-  
- Re-install from scratch, and reformat the drive during the installation  
-(__mke2fs__) to make sure no remnants are hiding.  
-  
-  
-  
-*  
-*  
-  
- Restore from backups. After a clean install is the best time to install  
-an IDS (Intrusion Detection System) such as tripwire  
-(http://www.tripewire.org).  
-  
-  
-  
-*  
-*  
-  
- Apply all updates or patches for your distribution. Check  
-your vendor's web site for security related notices.  
-  
-  
-  
-*  
-*  
-  
- Re-examine your system for unnecessary services. Re-examine your firewall and  
-access policies, and tighten all holes. ''Use new  
-passwords'', as these were stolen in all likelihood.  
-  
-  
-  
-*  
-*  
-  
- Re-connect system ;-)  
-  
-  
-  
-*  
-  
-  
-  
- At this time, any rootkit cleanup tools that may be available on-line are not  
-recommended. They probably do work just fine most of the time. But again,  
-how to be absolutely sure that all is well and all vestiges of the intrusion  
-are gone?  
-  
-----  
-!!!7. General Tips  
-  
- This section will quickly address some general concepts for maintaining a  
-more secure and reliable system or network. Let's emphasize  
-"maintaining" here since computer systems change daily, as does  
-the environment around them. As mentioned before, there isn't any one thing  
-that makes a system secure. There are too many variables. Security is an  
-approach and an attitude more than it is a reliance on any particular  
-product, application or specific policy.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
-  
-Do not allow remote root logins. This may be controlled by a configuration  
-file such as /etc/securetty. Remove any lines  
-that begin "pts". This is one big security hole.  
-  
-  
-  
-*  
-*  
-  
- In fact, don't log in as root at all. Period. Log in on your user account  
-and __su__ to root when needed. Whether the login is remote  
-or local. Or use __sudo__, which can run individual commands  
-with root privileges.  
-(There should be a __sudo__ package  
-available from your vendor.)  
-This takes some getting used to, but it is  
-the "right" way to do things. And the safest. And will become  
-more a more natural way of doing this as time goes on.  
-  
-  
-  
-  
- I know someone is saying right now "but that is so much trouble, I am  
-root, and it is my system". True, but root is a specialized account that  
-was not ever meant to be used as a regular user account. Root has access to  
-everything, even hardware devices. The system "trusts" root.  
-It believes that you know what you are doing. If you make a mistook, it  
-assumes that you meant that, and will do it's best to do what you told it  
-to do...even if that destroys the system!  
-  
-  
-  
-  
- As an example, let's say you start X as root, open  
-Netscape, and visit a web site. The web page has  
-badly behaved java script. And conceivably now that badly written java  
-script might have access to much more of your system than if you had done  
-it the "right" way.  
-  
-  
-  
-*  
-*  
-  
- Take passwords seriously. Don't give them out to anyone. Don't use the same  
-one for everything. Don't use root's password for anything else -- except  
-root's password! Never sign up or register on line, using any of your  
-system passwords. Passwords should be a combination of mixed case letters,  
-numbers and/or punctuation and a reasonable length (eight characters or  
-longer). Don't use so-called "dictionary" words that are easy  
-to guess like "cat" or "dog". Don't incorporate  
-personal information like names or dates or hostnames. Don't write down  
-system passwords -- memorize them.  
-  
-  
-  
-  
- Use the more secure "shadow" passwords. This  
-should be the default for any recent Linux distribution now.  
-If  
-the file /etc/shadow exists, then it is enabled  
-already. The commands __pwconv__ and  
-__grpconv__, can be used to convert password and group files  
-to shadow format if available.  
-  
-  
-  
-*  
-*  
-  
- Avoid using programs that require clear text logins over untrusted networks  
-like the Internet. __Telnet__ is a prime example.  
-__ssh__ is much better. If there is any support for  
-SSL (Secure Socket Layers), use it. For instance, does your ISP offer POP  
-or IMAP mail via SSL? Recent distributions should include  
-openssl, and many  
-Linux applications can use SSL where support is available.  
-  
-  
-  
-*  
-*  
-  
- Set resource limits. There are various ways to do this. The need for  
-this probably increases with the number of users accessing a given system.  
-Not only does setting limits on such things as disk space prevent  
-intentional mischief, it can also help with unintentionally misbehaved  
-applications or processes. __quota__ (man  
-quota) can be used to set disk space limits.  
-Bash includes the __ulimit__  
-command (man ulimit or man bash),  
-that can limit various functions on a per user basis.  
-  
-  
-  
-  
- Also, not discussed here at any length, but PAM  
-(Pluggable Authentication Modules) has a very sophisticated approach to  
-controlling various system functions and resources. See man  
-pam to get started. PAM is configured  
-via either /etc/pam.conf or  
-/etc/pam.d/*. Also files in  
-/etc/security/*, including  
-/etc/security/limits.conf, where again various sane  
-limits can be imposed. An in depth look at PAM  
-is beyond the scope of this document. The  
-User-Authentication HOWTO (http://linuxdoc.org/HOWTO/User-Authentication-HOWTO/index.html) has more on this.  
-  
-  
-  
-*  
-*  
-  
- Make sure someone with a clue is getting root's mail. This can be done with an  
-"alias". Typically, the mail server will have a file such  
-as /etc/aliases where this can defined. This can  
-conceivably be an account on another machine if need be:  
-  
-  
-  
-  
-  
-  
-# Person who should get root's mail. This alias  
-# must exist.  
-# CHANGE THIS LINE to an account of a HUMAN  
-root: hal@bigcat  
-  
-  
-  
-  
-  
- Remember to run __newaliases__ (or equivalent) afterward.  
-  
-  
-  
-*  
-*  
-  
- Be careful where you get software. Use trusted sources. How well do you  
-trust complete strangers? Check your vendor  
-first if looking for a  
-specific package. It will probably be best suited for your system any way.  
-Or, the original package's project site is good as well. Installing from raw  
-source (either tarball or src.rpm) at least gives you the ability to  
-examine the code. Even if you don't understand it ;-) While this does not  
-seem to be a wide spread problem with Linux software sites, it is very  
-trivial for someone to add a very few lines of code, turning that harmless  
-looking binary into a "Trojan horse" that opens a backdoor to  
-your system. Then the jig is up.  
-  
-  
-  
-*  
-*  
-  
- So someone has scanned you, probed you, or otherwise seems to want into  
-your system? Don't retaliate. There is a good chance that the source IP  
-address is a compromised system, and the owner is a victim already. Also,  
-you may be violating someone's Terms of Service, and have trouble with  
-your own ISP. The best you can do is to send your logs to the abuse  
-department of the source IP's ISP, or owner. This is often  
-something like "abuse@someisp.com". Just don't expect to  
-hear much back. Generally speaking, such activity is not legally  
-criminal, unless an actual break-in has taken place. Furthermore,  
-even if criminal, it will never be prosecuted unless significant  
-damage (read: big dollars) can be shown.  
-  
-  
-  
-*  
-*  
-  
- Red Hat,Mandrake and Debian users can install the "Bastille  
-Hardening System", http://www.bastille-linux.org/.  
-This is a multi-purpose system for "hardening" Red Hat and  
-Mandrake system security. It has a GUI interface which can be used to  
-construct firewall scripts from scratch and configure  
-PAM among many other things. Debian support  
-is new.  
-  
-  
-  
-*  
-*  
-  
- So you have a full-time Internet connection via cable-modem or DSL. But  
-do you always use it, or always need it? There's an old saying that  
-"the only truly secure system, is a disconnected system".  
-Well, that's certainly one option. So take that interface down, or stop the  
-controlling daemon (__dhcpcd__, __pppoed__,  
-etc). Or possibly even set up cron jobs to bring your  
-connection up and down according to your normal schedule and usage.  
-  
-  
-  
-*  
-*  
-  
- What about cable and DSL routers that are often promoted as  
-"firewalls"? The lower priced units are mostly equating  
-NAT (Network Address Translation), together with the ability to open holes  
-for ports through it, as a firewall. While NAT itself does provide a fair  
-degree of security for the systems behind the NAT gateway, this does not  
-constitute anything but a very rudimentary firewall. And if holes are  
-opened, there is still exposure. Also, you are relying on the router's  
-firmware and implementation not to be flawed. It is wise to have some kind  
-of additional protection behind such routers.  
-  
-  
-  
-*  
-*  
-  
- What about wireless network cards and hubs? Insecure, despite what  
-the manufacturers may claim. Treat these connections just as you would an  
-Internet connection. Use secure protocols like ssh  
-only! Even if it is just one LAN box to another.  
-  
-  
-  
-*  
-*  
-  
- If you find you need to run a particular service, and it is for just you,  
-or maybe a relatively small number of people, use a non-standard port. Most  
-server daemons support this. For instance, __sshd__ runs on  
-port 22 by default. All worms and script kiddies will expect it there, and  
-look for it there. So, run it on another port! See the __sshd__  
-man page.  
-  
-  
-  
-*  
-*  
-  
- Lastly, know your system! Let's face it, if you are new to Linux, you can't  
-already know something you have never used. Understood. But in the process  
-of learning, learn how to do things the right way, not the easiest way.  
-There is several decades of history behind "the right way" of  
-doing things. This has stood the test of time. What may seem unnecessary or  
-burdensome now, will make sense in due time.  
-  
-  
-  
-  
- Be familiar with whatever services you are running, and the implications  
-these services might have to the overall health of your system if  
-something does go wrong. Read what you can, and ask questions. Don't run  
-something as a service "just because I can", or because the  
-installer put it there. You can't start out being an experienced System  
-Administrator clearly. But you can work to learn enough about your own  
-system, that you are in control. This is one thing that separates *nix from  
-MS systems: we can never be in complete control with MS, but we can with  
-*nix. Conversely, if something bad happens, we often have no one else to  
-blame.  
-  
-  
-  
-*  
-  
-----  
-!!!8. Appendix  
-!!8.1. Servers, Ports, and Packets  
-  
- Let's take a quick, non-technical look at some networking concepts, and how  
-they can potentially impact our own security. We don't need to know much  
-about networking, but a general idea of how things work is certainly going to  
-help us with firewalls and other related issues.  
-  
-  
-  
- As you may have noticed Linux is a very network oriented Operating System.  
-Much is done by connecting to "servers" of one type or another  
--- X servers, font servers, print servers, etc.   
-  
-  
-  
- Servers provide "services", which provide various capabilities,  
-both to the local system and potentially other remote systems. The same  
-server generally provides both functionalities. Some servers  
-work quietly behind the scenes, and others are more interactive by nature. We  
-may only be aware of a print server when we need to print something, but it  
-is there running, listening, and waiting for connection requests whether we  
-ever use it or not (assuming of course we have it enabled). A typical Linux  
-installation will have many, many types of servers available to it. Default  
-installations often will turn some of these "on".  
-  
-  
-  
- And even if we are not connected to a real network all the time, we are still  
-"networked" so to speak. Take our friendly local X server for  
-instance. We may tend to think of this as just providing a GUI interface,  
-which is only true to a point. It does this by "serving" to  
-client applications, and thus is truly a server. But X Windows is also  
-capable of serving remote clients over a network -- even large networks like  
-the Internet. Though we probably don't really want to be doing this ;-)  
-  
-  
-  
- And yes, if you are not running a firewall or have not taken other  
-precautions, and are connected to the Internet, it is quite possible that  
-someone -- anyone -- could connect to your X server. X11  
-"listens" on TCP "port" 6000 by default. This  
-principle applies to most other servers as well -- they can be easily  
-connected to, unless something is done to restrict or prevent connections.  
-  
-  
-  
- In TCP/IP (Transmission Control Protocol/Internet Protocol) networks like we  
-are talking about with Linux and the Internet, every connected computer  
-has a unique "IP Address". Think of this like a phone number.  
-You have a phone number, and in order to call someone else, you have to know  
-that phone number, and then dial it. The phone numbers have to be unique for  
-the system to work. IP address are generally expressed as "dotted  
-quad" notation, e.g. 152.19.254.81.  
-  
-  
-  
- On this type of network, servers are said to "listen". This  
-means that they have a "port" opened, and are awaiting incoming  
-connections to that port. Connections may be local, as is typically the case  
-with our X server, or remote -- meaning from another computer  
-"somewhere". So servers "listen" on a specific  
-"port" for incoming connections. Most servers have a default  
-port, such as port 80 for web servers. Or 6000 for X11. See  
-/etc/services for a list of common ports and their  
-associated service.  
-  
-  
-  
- The "port" is actually just an address in the kernel's  
-networking stack, and is a method that TCP, and other protocols, use to  
-organize connections and the exchange of data between computers. There are  
-total of 65,536 TCP and UDP ports available, though usually only a relatively  
-few of these are used at any one time. These are classified as  
-"privileged", those ports below 1024, and  
-"unprivileged", 1024 and above. Most servers use the privileged  
-ports.  
-  
-  
-  
- Only one server may listen on, or "bind" to, a port at a time.  
-Though that server may well be able to open multiple connections via that one  
-port. Computers talk to each other via these "port" connections.  
-One computer will open a connection to a "port" on another  
-computer, and thus be able to exchange data via the connection that has been  
-established between their respective ports.  
-  
-  
-  
- Getting back to the phone analogy, and stretching it a bit, think of calling  
-a large organization with a complex phone system. The organization has many  
-"departments": sales, shipping, billing, receiving, customer  
-service, R8D, etc. Each department has it's own "extension"  
-number. So the shipping department might be extension 21, the sales might be  
-department 80 and so on. The main phone number is the IP Address, and the  
-department's extension is the port in this analogy. The  
-"department's" number is always the same when we call. And  
-generally they can handle many simultaneous incoming calls.  
-  
-  
-  
-  
- The data itself is contained in "packets", which are small  
-chunks of data, generally 1500 bytes or less each. Packets are used to  
-control and organize the connection, as well as carry data. There are  
-different types of packets. Some are specifically used for controlling the  
-connection, and then some packets carry our data as their payload. If  
-there is a lot of data, it will be broken up into multiple packets which is  
-almost always how it works. The packets will be transmitted one at a time,  
-and then "re-assembled" at the other end. One web page for  
-instance, will take many packets to transmit -- maybe hundreds or even  
-thousands. This all happens very quickly and transparently.  
-  
-  
-  
- We can see a typical connection between two computers in this one line  
-excerpt from __netstat__ output:  
-  
-  
-  
-  
- tcp 30 0 169.254.179.139:1359 18.29.1.67:21 CLOSE_WAIT  
-  
-  
-  
-  
- The interesting part is the IP addresses and ports in the fourth and fifth  
-columns. The port is the number just to the right of the colon. The left side  
-of the colon is the IP address of each computer. The fourth column is the  
-local address, or our end of the connection. In the example, 169.254.179.139  
-is the IP address assigned by my ISP. It is connected to port 21  
-(FTP) on 18.29.1.67, which is rpmfind.net. This is just after an FTP download  
-from rpmfind.net. Note that while I am connected to their FTP server on their  
-port 21, the port on my end that is used by my FTP client is 1359. This is a  
-randomly assigned "unprivileged" port, used for my end of the  
-two-way "conversation". The data moves in both directions:  
-me:port#1359 `-b them:port#21. The FTP protocol is actually a little  
-more complicated than this, but we won't delve into the finer points here.  
-The CLOSE_WAIT is the TCP state of the connection at this  
-particular point in time. Eventually the connection will close completely on  
-both ends, and netstat will not show anything for  
-this.  
-  
-  
-  
-  
- The "unprivileged" port that is used for my end of the  
-connection, is temporary and is not associated with a locally running server.  
-It will be closed by the kernel when the connection is terminated. This is  
-quite different than the ports that are kept open by "listening"  
-servers, which are permanent and remain "open" even after a  
-remote connection is terminated.  
-  
-  
-  
- So to summarize using the above example, we have client (me) connecting  
-to a server (rpmfind.net), and the connection is defined and controlled by  
-the respective ports on either end. The data is transmitted and controlled by  
-packets. The server is using a "privileged" port (i.e. a port  
-below number 1024) which stays open listening for connections. The  
-"unprivileged" port used on my end by my client application is  
-temporary, is only opened for the duration of the connection, and only  
-responds to the server's port at the other end of the connection. This type  
-of port is not vulnerable to attacks or break-ins generally speaking. The  
-server's port is vulnerable since it remains open. The administrator of the  
-FTP server will need to take appropriate precautions that his server is  
-secure. Other Internet connections, such as to web servers or mail servers,  
-work similar to the above example, though the server ports are different.  
-SMTP mail servers use port 25, and web servers typically use port 80.  
-See the Ports section for other commonly used  
-ports and services.  
-  
-  
-  
- One more point on ports: ports are only accessible if there is something  
-listening on that port. No one can force a port open if there is no service  
-or daemon listening there, ready to handle incoming connection requests.  
-A closed port is a totally safe port.  
-  
-  
-  
-  
- And a final point on the distinction between clients and servers. The example  
-above did not have a __telnet__ or __ftp__  
-server in the LISTENER section in the  
-__netstat__ example above. In other words, no such servers  
-were running locally. You do not need to run a __telnet__ or  
-__ftp__ server daemon in order to connect to  
-''somebody else's'' __telnet__ or  
-__ftp__ server. These are only for providing these services  
-to others that would be making connections to you. Which you don't really  
-want to be doing in most cases. This in no way effects the ability to use  
-__telnet__ and __ftp__ client software.  
-  
-----  
-!!8.2. Common Ports  
-  
- A quick run down of some commonly seen and used ports, with the commonly  
-associated service name, and risk factor. All have ''some''  
-risk. It is just that some have historically had more exploits than others.  
-That is how they are evaluated below, and not necessarily to be interpreted  
-as whether any given service is safe or not.   
-  
-  
-  
-  
-  
-  
-  
-  
- 1-19, assorted protocols, many of which are antiquated, and probably  
-none of which are needed on a modern system. If you don't know what  
-any of these are, then you definitely don't need them.  
-The echo service (port 7) should not be  
-confused with the common __ping__ program. Leave all these  
-off.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 20 - FTP-DATA. "Active" FTP connections use two  
-ports: 21 is the control port, and 20 is where the data comes through.  
-Passive FTP does not use port 20 at all. Low risk, but see below.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 21 - FTP server port, aka File Transfer Protocol. A well entrenched protocol  
-for transferring files between systems. Very high risk, and maybe the number  
-one crack target.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 22 - SSH (Secure Shell), or sometimes PCAnywhere. Low to moderate  
-risk (yes there are exploits even against so called "secure"  
-services).  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 23 - Telnet server. For LAN use only. Use ssh  
-instead in non-secure environments. Moderate risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 25 - SMTP, Simple Mail Transfer Protocol, or mail server port, used for  
-sending outgoing mail, and transferring mail from one place to another.  
-Moderate risk. This has had a bad history of exploits, but has improved  
-lately.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 37 - Time service. This is the built-in  
-inetd time service. Low risk. For LAN use  
-only.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 53 - DNS, or Domain Name Server port. Name servers listen on this port,  
-and answer queries for resolving host names to IP addresses. High Risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 67 (UDP) - BOOTP, or DHCP, server port. Low risk. If using DHCP on your  
-LAN, this does not need to be exposed to the Internet.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 68 (UDP) - BOOTP, or DHCP, client port. Low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 69 - tftp, or Trivial File Transfer Protocol. Extremely insecure. LAN  
-only, if really, really needed.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 79 - Finger, used to provide information about the system, and logged  
-in users. Low risk as a crack target, but gives out way too much  
-information and should not be run.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 80 - WWW or HTTP standard web server port. The most commonly used service  
-on the Internet. Low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 98 - Linuxconf web access administrative port. LAN only, if really needed  
-at all.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 110 - POP3, aka Post Office Protocol, mail server port. POP mail is mail  
-that the user retrieves from a remote system. Low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 111 - sunrpc (Sun Remote Procedure Call), or portmapper port. Used by NFS  
-(Network File System), NIS (Network Information Service), and various related  
-services. Sounds dangerous and is high risk. LAN use only. A favorite crack  
-target.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 113 - identd, or auth, server port. Used, and sometimes required, by some  
-older style services (like SMTP and IRC) to validate the connection.  
-Probably not needed in most cases. Low risk, but could give an attacker  
-too much information about your system.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 119 -- nntp or news server port. Low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 123 - Network Time Protocol for synchronizing with time servers where a  
-high degree of accuracy is required. Low risk, but probably not required  
-for most users. rdate makes an easier and more  
-secure way of updating the system clock. And then  
-inetd's built in time service for synchronizing  
-LAN systems is another option.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 137-139 - !NetBios (SMB) services. Mostly a Windows thing. Low risk on  
-Linux, but LAN use only. 137 is a very commonly seen port attempt. A  
-rather obnoxious protocol from Redmond that generates a lot of  
-"noise", much of which is harmless.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 143 - IMAP, Interim Mail Access Protocol. Another mail retrieval protocol.  
-Low to moderate risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 161 - SNMP, Simple Network Management Protocol. More commonly used in  
-routers and switches to monitor statistics and vital signs. Not needed  
-for most of us, and low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 177 - XDMCP, the X Display Management Control Protocol for remote connections  
-to X servers. Low risk, but LAN only is recommended.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 443 - HTTPS, a secure HTTP (WWW) protocol in fairly wide use. Low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 465 - SMTP over SSL, secure mail server protocol. Low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 512 (TCP) - exec is how it shows in netstat.  
-Actually the proper name is __rexec,__ for Remote  
-Execution. Sounds dangerous, and is. High risk, LAN only if at all.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 512 (UDP) - biff, a mail notification protocol. Low risk, LAN only.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 513 - login, actually __rlogin__, aka Remote Login. No  
-relation to the standard __/bin/login__ that we use  
-every time we log in. Sounds dangerous, and is. High risk, and LAN only if  
-really needed.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 514 (TCP) - shell is the nickname, and how netstat  
-shows it. Actually, __rsh__ is the application for  
-"Remote Shell". Like all the "r" commands, this  
-is a throw back to kindler, gentler times. Very insecure, so high risk, and  
-LAN only usage, if at all.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 514 (UDP) - syslog daemon port, only used for remote logging purposes. The  
-average user does not need this. Probably low risk, but definitely LAN  
-only if really required.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 515 - lp or print server port. High risk, and LAN only of course. Someone  
-on the other side of the world does not want to use your printer for it's  
-intended purpose!  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 587 - MSA, or "submission", the Mail Submission Agent  
-protocol. A new mail handling protocol supported by most MTA's (mail  
-servers). Low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 631 - the CUPS (print daemon) web management port. LAN only, low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 635 - mountd, part of NFS. LAN use only.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 901 - SWAT, Samba Web Administration Tool port. LAN only.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 993 - IMAP over SSL, secure IMAP mail service. Very low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 995 - POP over SSL, secure POP mail service. Very low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 1024 - This is the first "unprivileged" port, which is  
-dynamically assigned by the kernel to whatever application requests  
-it. This can be almost anything. Ditto for ports just above this.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 1080 - Socks Proxy server. A favorite crack target.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 1243 - !SubSeven Trojan. Windows only problem.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 1433 - MS SQL server port. A sometimes target. N/A on Linux.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 2049 - nfsd, Network File Service Daemon port. High risk, and LAN  
-usage only is recommended.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 3128 - Squid proxy server port. Low risk, but for most should be  
-LAN only.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 5432 - Postgres SQL server port. LAN only, relatively low risk.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 5631 (TCP), 5632 (UDP) - PCAnywhere ports. Windows only. PCAnywhere  
-can be quite "noisy", and broadcast wide address ranges.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 6000 - X11 TCP port for remote connections. Low to moderate risk, but  
-again, this should be LAN only. Actually, this can include ports  
-6000-6009 since X can support multiple displays and each display would  
-have its own port. ssh's X11Forwarding will  
-start using ports at 6010.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 6346 - gnutella.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 6667 - ircd, Internet Relay Chat Daemon.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 6699 - napster.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 7100-7101 - Some font servers use these ports. Low risk, but LAN only.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 8000 and 8080 - common web cache and proxy server ports. LAN only.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 10000 - webmin, a web based system administration utility. Low risk at this  
-point.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 27374 - !SubSeven, a commonly probed for Windows only Trojan. Also, 1243.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- 31337 - Back Orifice, another commonly probed for Windows only Trojan.  
-  
-  
-  
-  
-  
-  
-  
-  
- More services and corresponding port numbers can be found in  
-/etc/services. Also, the "official"  
-list is http://www.iana.org/assignments/port-numbers.  
-  
-  
-  
- A great analysis of what probes to these and other ports might mean  
-from Robert Graham: http://www.linuxsecurity.com/resource_files/firewalls/firewall-seen.html. A very good reference.  
-  
-  
-  
- Another point here, these are the ''standard'' port  
-designations. There is no law that says any service has to run on a  
-specific port. Usually they do, but certainly they don't always have to.  
-  
-  
-  
- Just a reminder that when you see these types of ports in your firewall logs,  
-it is not anything to go off the deep end about. Not if you have followed  
-Steps 1-3 above, and verified your firewall works. You are fairly safe. Much  
-of this traffic may be "stray bullets" too -- Internet  
-background noise, misconfigured clients or routers, noisy Windows stuff, etc.  
-  
-  
-----  
-!!8.3. Netstat Tutorial  
-!8.3.1. Overview  
-  
- __netstat__ is a very useful utility for viewing  
-the current state of your network status -- what servers are listening for  
-incoming connections, what interfaces they listen on, who is connected to us,  
-who we are connect to, and so on. Take a look at the man page for some of the  
-many command line options. We'll just use a relative few options here.  
-  
-  
-  
- As an example, let's check all currently listening servers and active  
-connections for both TCP and UDP on our hypothetical host,  
-bigcat. bigcat is a home desktop installation, with a DSL  
-Internet connection in this example. bigcat has two ethernet cards: one for  
-the external connection to the ISP, and one for a small LAN with an address  
-of 192.168.1.1.  
-  
-  
-  
-  
-  
-$ netstat -tua  
-Active Internet connections (servers and established)  
-Proto Recv-Q Send-Q Local Address Foreign Address State  
-tcp 0 0 *:printer *:* LISTEN  
-tcp 0 0 bigcat:8000 *:* LISTEN  
-tcp 0 0 *:time *:* LISTEN  
-tcp 0 0 *:x11 *:* LISTEN  
-tcp 0 0 *:http *:* LISTEN  
-tcp 0 0 bigcat:domain *:* LISTEN  
-tcp 0 0 bigcat:domain *:* LISTEN  
-tcp 0 0 *:ssh *:* LISTEN  
-tcp 0 0 *:631 *:* LISTEN  
-tcp 0 0 *:smtp *:* LISTEN  
-tcp 0 1 dsl-78-199-139.s:1174 64.152.100.93:nntp SYN_SENT  
-tcp 0 1 dsl-78-199-139.s:1175 64.152.100.93:nntp SYN_SENT  
-tcp 0 1 dsl-78-199-139.s:1173 64.152.100.93:nntp SYN_SENT  
-tcp 0 0 dsl-78-199-139.s:1172 207.153.203.114:http ESTABLISHED  
-tcp 1 0 dsl-78-199-139.s:1199 www.xodiax.com:http CLOSE_WAIT  
-tcp 0 0 dsl-78-199-139.sd:http 63.236.92.144:34197 TIME_WAIT  
-tcp 400 0 bigcat:1152 bigcat:8000 CLOSE_WAIT  
-tcp 6648 0 bigcat:1162 bigcat:8000 CLOSE_WAIT  
-tcp 553 0 bigcat:1164 bigcat:8000 CLOSE_WAIT  
-udp 0 0 *:32768 *:*  
-udp 0 0 bigcat:domain *:*  
-udp 0 0 bigcat:domain *:*  
-udp 0 0 *:631 *:*  
-  
-  
-  
-  
- This output probably looks very different from what you get on your own  
-system. Notice the distinction between "Local Address" and  
-"Foreign Address", and how each includes a corresponding port  
-number (or service name if available) after the colon. "Local  
-Address" is our end of the connection. The first group with  
-LISTEN in the far right hand column are services that are  
-running on this system. These are servers that are running in the background  
-on bigcat, and "listen" for incoming connections. So they  
-have a port opened, and this is where they "listen". These  
-connections might come from the local system (i.e. bigcat itself), or remote  
-systems. This is very important information to have! The others just below  
-this are connections that have been established from this system to other  
-systems. The respective connections are in varying states as indicated by the  
-key words in the last column. Those with no key word in the last column at  
-the end are servers responding to UDP connections. UDP is a different  
-protocol from TCP altogether, but is used for some types of low priority  
-network traffic.  
-  
-  
-  
- Now, the same thing with the "-n" flag to suppress converting to  
-"names" so we can actually see the port numbers:  
-  
-  
-  
-  
-$ netstat -taun  
-Active Internet connections (servers and established)  
-Proto Recv-Q Send-Q Local Address Foreign Address State  
-tcp 0 0 ...:515 ...:* LISTEN  
-tcp 0 0 127...1:8000 ...:* LISTEN  
-tcp 0 0 ...:37 ...:* LISTEN  
-tcp 0 0 ...:6000 ...:* LISTEN  
-tcp 0 0 ...:80 ...:* LISTEN  
-tcp 0 0 192.168.1.1:53 ...:* LISTEN  
-tcp 0 0 127...1:53 ...:* LISTEN  
-tcp 0 0 ...:22 ...:* LISTEN  
-tcp 0 0 ...:631 ...:* LISTEN  
-tcp 0 0 ...:25 ...:* LISTEN  
-tcp 0 1 169.254.179.139:1174 64.152.100.93:119 SYN_SENT  
-tcp 0 1 169.254.179.139:1175 64.152.100.93:119 SYN_SENT  
-tcp 0 1 169.254.179.139:1173 64.152.100.93:119 SYN_SENT  
-tcp 0 0 169.254.179.139:1172 207.153.203.114:80 ESTABLISHED  
-tcp 1 0 169.254.179.139:1199 216.26.129.136:80 CLOSE_WAIT  
-tcp 0 0 169.254.179.139:80 63.236.92.144:34197 TIME_WAIT  
-tcp 400 0 127...1:1152 127...1:8000 CLOSE_WAIT  
-tcp 6648 0 127...1:1162 127...1:8000 CLOSE_WAIT  
-tcp 553 0 127...1:1164 127...1:8000 CLOSE_WAIT  
-udp 0 0 ...:32768 ...:*  
-udp 0 0 192.168.1.1:53 ...:*  
-udp 0 0 127...1:53 ...:*  
-udp 0 0 ...:631 ...:*  
-  
-  
-  
-  
- Let's look at the first few lines of this in detail. On line one,  
-  
-  
-  
-  
- tcp 0 0 ...:515 ...:* LISTEN  
-  
-  
-  
-  
- "Local Address" is ..., meaning  
-"all" interfaces that are available. The local port is 515, or the  
-standard print server port, usually owned by the lpd daemon. You can find a  
-listing of common service names and corresponding ports in the file  
-/etc/services.  
-  
-  
-  
- The fact that it is listening on all interfaces is significant. In this case,  
-that would be lo (localhost), eth0, and eth1. Printer connections could  
-conceivably be made over any of these interfaces. Should a user on this system  
-bring up a PPP connection, then the print daemon would be listening on that  
-interface (ppp0) as well. The "Foreign Address" is also  
-..., meaning from "anywhere".  
-  
-  
-  
- It is also worth noting here, that even though this server is telling the  
-kernel to listen on all interfaces, the __netstat__ output  
-does not reflect whether there may be a firewall in place that may be  
-filtering incoming connections. We just can't tell that at this point.  
-Obviously, for certain servers, this is very desirable. Nobody outside your  
-own LAN has any reason whatsoever to connect to your print server port for  
-instance.  
-  
-  
-  
- Line two is a little different:  
-  
-  
-  
-  
- tcp 0 0 127...1:8000 ...:* LISTEN  
-  
-  
-  
-  
- Notice the "Local Address" this time is localhost's address  
-of 127...1. This is very significant as only connections  
-local to this machine will be accepted. So only bigcat can connect to  
-bigcat's TCP port 8000. The security implications should be obvious. Not all  
-servers have configuration options that allow this kind of restriction, but  
-it is a very useful feature for those that do. Port 8000 in this example,  
-is owned by the web proxy Junkbuster.  
-  
-  
-  
- With the next three entries, we are back to listening on all available  
-interfaces:  
-  
-  
-  
-  
- tcp 0 0 ...:37 ...:* LISTEN  
-tcp 0 0 ...:6000 ...:* LISTEN  
-tcp 0 0 ...:80 ...:* LISTEN  
-  
-  
-  
-  
- Looking at /etc/services, we can tell that port 37  
-is a "time" service, which is a time server.  
-6000 is X11, and 80 is the standard port for HTTP  
-servers like Apache. There is nothing really  
-unusual here as these are all readily available services on Linux.  
-  
-  
-  
- The first two above are definitely not the kind of services you'd want just  
-anyone to connect to. These should be firewalled so that all outside  
-connections are refused. Again, we can't tell from this output whether any  
-firewall is in place, much less how effectively implemented it may be.  
-  
-  
-  
- The web server on port 80 is not a huge security risk by itself. HTTP is a  
-protocol that is often open to all comers. For instance, if we wanted to host  
-our own home page, Apache can certainly do this  
-for us. It is also possible to firewall this off, so that it is for use only  
-to our LAN clients as part of an Intranet. Obviously too, if you do not have  
-a good justification for running a web server, then it should be disabled  
-completely.  
-  
-  
-  
-  
- The next two lines are interesting:  
-  
-  
-  
-  
- tcp 0 0 192.168.1.1:53 ...:* LISTEN  
-tcp 0 0 127...1:53 ...:* LISTEN  
-  
-  
-  
-  
- Again notice the "Local Address" is not ....  
-This is good! The port this time is 53, or the DNS port used by nameserver  
-daemons like __named.__ But we see the nameserver  
-daemon is only listening on the lo interface (localhost), and the interface  
-that connects bigcat to the LAN. So the kernel only allows connections from  
-localhost, and the LAN. There will be no port 53 available to outside  
-connections at all. This is a good example of how individual applications  
-can sometimes be securely configured. In this case, we are probably looking  
-at a caching DNS server since a real nameserver that is responsible for  
-handling DNS queries would have to have port 53 open to the world. This  
-is a security risk and requires special handling.  
-  
-  
-  
-  
- The last three LISTENER entries:  
-  
-  
-  
-  
- tcp 0 0 ...:22 ...:* LISTEN  
-tcp 0 0 ...:631 ...:* LISTEN  
-tcp 0 0 ...:25 ...:* LISTEN  
-  
-  
-  
-  
- These are back to listening on all available interfaces. Port 22 is  
-sshd, the Secure Shell server daemon. This is a good  
-sign! Notice that the service for port 631 does not have a service name if we  
-look at the output in the first example. This might be a clue that something  
-unusual is going on here. (See the next section for the answer to this  
-riddle.) And lastly, port 25, the standard port for the SMTP mail daemon.  
-Most Linux installations probably will have an SMTP daemon running, so this  
-is not necessarily unusual. But is it necessary?  
-  
-  
-  
- The next grouping is established connections. For our purposes the state of  
-the connection as indicated by the last column is not so important. This is  
-well explained in the man page.  
-  
-  
-  
-  
- tcp 0 1 169.254.179.139:1174 64.152.100.93:119 SYN_SENT  
-tcp 0 1 169.254.179.139:1175 64.152.100.93:119 SYN_SENT  
-tcp 0 1 169.254.179.139:1173 64.152.100.93:119 SYN_SENT  
-tcp 0 0 169.254.179.139:1172 207.153.203.114:80 ESTABLISHED  
-tcp 1 0 169.254.179.139:1199 216.26.129.136:80 CLOSE_WAIT  
-tcp 0 0 169.254.179.139:80 63.236.92.144:34197 TIME_WAIT  
-tcp 400 0 127...1:1152 127...1:8000 CLOSE_WAIT  
-tcp 6648 0 127...1:1162 127...1:8000 CLOSE_WAIT  
-tcp 553 0 127...1:1164 127...1:8000 CLOSE_WAIT  
-  
-  
-  
-  
- There are nine total connections here. The first three is our external  
-interface connecting to a remote host on their port 119, the standard NNTP (News)  
-port. There are three connections here to the same news server. Apparently  
-the application is multi-threaded, as it is trying to open multiple  
-connections to the news server. The next two entries are connections to a  
-remote web server as indicated by the port 80 after the colon in the fifth  
-column. Probably a pretty common looking entry for most of us. But the one  
-just after is reversed and has the port 80 in the fourth column, so this is  
-someone that has connected to bigcat's web server via its external,  
-Internet-side interface. The last three entries are all connections from  
-localhost to localhost. So we are connecting to ourselves here. Remembering  
-from above that port 8000 is bigcat's web proxy, this is a web browser that  
-is connected to the locally running proxy. The proxy then will open an  
-external connection of its own, which probably is what is going on with lines  
-four and five.  
-  
-  
-  
- Since we gave __netstat__ both the -t and  
--u options, we are getting both the TCP and UDP listening  
-servers. The last few lines are the UDP ones:  
-  
-  
-  
-  
- udp 0 0 ...:32768 ...:*  
-udp 0 0 192.168.1.1:53 ...:*  
-udp 0 0 127...1:53 ...:*  
-udp 0 0 ...:631 ...:*  
-  
-  
-  
-  
- The last three entries have ports that are familiar from the above  
-discussion. These are servers that are listening for both TCP and UDP  
-connections. Same servers in this case, just using two different protocols.  
-The first one on local port 32768 is new, and does not have a service name  
-available to it in /etc/services. So at first glance  
-this should be suspicious and pique our curiosity. See the next section for  
-the explanation.  
-  
-  
-  
- Can we draw any conclusions from this hypothetical situation? For  
-the most part, these look to be pretty normal looking network services and  
-connections for Linux. There does not seem to be an unduly high number of  
-servers running here, but that by itself does not mean much since we don't  
-know if all these servers are really required or not. We know that  
-__netstat__ can not tell us if any of these are effectively  
-firewalled, so there is no way to say how secure all this might be. We also  
-don't really know if all the listening services are really required by the  
-owner here. That is something that varies widely from installation to  
-installation. Does bigcat even have a printer attached for instance?  
-Presumably it does, or this is a completely unnecessary risk.  
-  
-----  
-!8.3.2. Port and Process Owners  
-  
- We've learned a lot about what is going on with bigcat's networking from  
-the above section. But suppose we see something we don't recognize and  
-want to know what started that particular service? Or we want to stop a  
-particular server and it is not obvious from the above output?  
-  
-  
-  
- The -p option should give us the process's PID and the  
-program name that started the process in the last column. Let's look at the  
-TCP servers again (with first three columns cropped for spacing). We'll have  
-to run this as root to get all the available information:  
-  
-  
-  
-  
-# netstat -tap  
-Active Internet connections (servers and established)  
-Local Address Foreign Address State PID/Program name  
-*:printer *:* LISTEN 988/inetd  
-bigcat:8000 *:* LISTEN 1064/junkbuster  
-*:time *:* LISTEN 988/inetd  
-*:x11 *:* LISTEN 1462/X  
-*:http *:* LISTEN 1078/httpd  
-bigcat:domain *:* LISTEN 956/named  
-bigcat:domain *:* LISTEN 956/named  
-*:ssh *:* LISTEN 972/sshd  
-*:631 *:* LISTEN 1315/cupsd  
-*:smtp *:* LISTEN 1051/master  
-  
-  
-  
-  
- Some of these we already know about. But we see now that the printer daemon  
-on port 515 is being started via __inetd__ with a  
-PID of "988". __inetd__ is a special situation.  
-__inetd__ is often called the "super server",  
-since it's main role is to spawn sub-services. If we look at the first line, __inetd__  
-is listening on port 515 for printer services. If a connection comes for this  
-port, __inetd__ intercepts it, and then will spawn the  
-appropriate daemon, i.e. the print daemon in this case. The configuration of  
-how __inetd__ handles this is typically done in  
-/etc/inetd.conf. This should tell us that if we want to  
-stop an __inetd__ controlled server on a permanent basis, then  
-we will have to dig into the __inetd__ (or perhaps  
-__xinetd__) configuration. Also the time service above is  
-started via __inetd__ as well. This should also tell us that  
-these two services can be further protected by  
-tcpwrappers (discussed in Step 3 above). This is  
-one benefit of using __inetd__ to control certain system  
-services.  
-  
-  
-  
- We weren't sure about the service on port 631 above since it did not have  
-a standard service name, which means it is something maybe unusual or off  
-the beaten path. Now we see it is owned by __cupsd__  
-, which is one of  
-several print daemons available under Linux. This happens to be the web  
-interface for controlling the printer service. Something  
-__cupsd__ does that is indeed a little different than other  
-print servers.   
-  
-  
-  
- The last entry above is the SMTP mail server on bigcat. Often, this is  
-__sendmail__ with many distributions. But  
-not in this case. The command is "master", which may not ring  
-any bells. Armed with the program name we could go searching the filesystem  
-with tools like the __locate__ or __find__  
-commands. After we found it, we could then probably discern what package it  
-belonged to. But with the PID available now, we can look at  
-__ps__ output, and see if that helps us any:  
-  
-  
-  
-  
- $ /bin/ps ax |grep 1051 |grep -v grep  
-1051 ? S :24 /usr/libexec/postfix/master  
-  
-  
-  
-  
- We took a shortcut here by combining __ps__ with  
-__grep__. It looks like that this file belongs to  
-__postfix__, which is indeed a mail server package  
-comparable to __sendmail__.   
-  
-  
-  
- Running __ps__ with the --forest flag  
-(-f for short) can be helpful in determining what  
-processes are parent or child process or another process. An edited example:  
-  
-  
-  
-  
-  
- $ /bin/ps -axf  
-956 ? S :00 named -u named  
-957 ? S :00 \_ named -u named  
-958 ? S :46 \_ named -u named  
-959 ? S :47 \_ named -u named  
-960 ? S :00 \_ named -u named  
-961 ? S :11 \_ named -u named  
-1051 ? S :30 /usr/libexec/postfix/master  
-1703 ? S :00 \_ tlsmgr -l -t fifo -u -c  
-1704 ? S :00 \_ qmgr -l -t fifo -u -c  
-1955 ? S :00 \_ pickup -l -t fifo -c  
-1863 ? S :00 \_ trivial-rewrite -n rewrite -t unix -u -c  
-2043 ? S :00 \_ cleanup -t unix -u -c  
-2049 ? S :00 \_ local -t unix  
-2062 ? S :00 \_ smtpd -n smtp -t inet -u -c  
-  
-  
-  
-  
- A couple of things to note here. We have two by now familiar daemons here:  
-__named__ and __postfix (smtpd)__. Both  
-are spawning sub-processes. In the case of __named__, what we are  
-seeing is threads, various sub-processes that it always spawns.  
-__Postfix__ is also spawning sub-processes, but not as  
-"threads". Each sub-process has its own specific task. It is  
-worth noting that child processes are dependent on the parent process.  
-So killing the parent PID, will in turn kill all child processes.  
-  
-  
-  
-  
- If all this has not shed any light, we might also try __locate__:  
-  
-  
-  
-  
- $ locate /master  
-/etc/postfix/master.cf  
-/var/spool/postfix/pid/master.pid  
-/usr/libexec/postfix/master  
-/usr/share/vim/syntax/master.vim  
-/usr/share/vim/vim60z/syntax/master.vim  
-/usr/share/doc/postfix-20010202/html/master.8.html  
-/usr/share/doc/postfix-20010202/master.cf  
-/usr/share/man/man8/master.8.gz  
-  
-  
-  
-  
- __find__ is perhaps the most flexible file finding utility,  
-but doesn't use a database the way __locate__ does, so is  
-much slower:  
-  
-  
-  
-  
- $ find / -name master  
-/usr/libexec/postfix/master  
-  
-  
-  
-  
- If __lsof__ is installed, it is another command that is useful  
-for finding who owns processes or ports:  
-  
-  
-  
-  
- # lsof -i :631  
-COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME  
-cupsd 1315 root 0u IPv4 3734 TCP *:631 (LISTEN)  
-  
-  
-  
-  
- This is again telling us that the __cupsd__ print daemon is  
-the owner of port 631. Just a different way of getting at it. Yet one more  
-way to get at this is with __fuser__, which should be  
-installed:  
-  
-  
-  
-  
- # fuser -v -n tcp 631  
-USER PID ACCESS COMMAND  
-631/tcp root 1315 f.... cupsd  
-  
-  
-  
-  
- See the man pages for __fuser__ and __lsof__  
-command syntax.  
-  
-  
-  
- Another place to look for where a service is started, is in the  
-init.d directory, where the actual init scripts  
-live (for !SysVinit systems). Something like ls -l  
-/etc/init.d/, should give us a list of these.  
-Often the script name itself gives a hint as to which service(s) it starts,  
-though it may not necessarily exactly match the "Program Name"  
-as provided by __netstat__. Or we can use  
-__grep__ to search inside files and match a search pattern.  
-Need to find where __rpc.statd__ is being started, and we  
-don't see a script by this name?  
-  
-  
-  
-  
- # grep rpc.statd /etc/init.d/*  
-/etc/init.d/nfslock: [[ -x /sbin/rpc.statd ] || exit  
-/etc/init.d/nfslock: daemon rpc.statd  
-/etc/init.d/nfslock: killproc rpc.statd  
-/etc/init.d/nfslock: status rpc.statd  
-/etc/init.d/nfslock: /sbin/pidof rpc.statd b/dev/null 2b81; STATD="$?"  
-  
-  
-  
-  
- We didn't really need all that information, but at least we see now  
-exactly which script is starting it. Remember too that not all services  
-are started this way. Some may be started via inetd,  
-or xinetd.  
-  
-  
-  
- The /proc filesystem also keeps everything we want  
-to know about processes that are running. We can query this to find out  
-more information about each process. Do you need to know the full path of the  
-command that started a process?  
-  
-  
-  
-  
- # ls -l /proc/1315/exe  
-lrwxrwxrwx 1 root root 0 July 4 19:41 /proc/1315/exe -b /usr/sbin/cupsd  
-  
-  
-  
-  
- Finally, we had a loose end or two in the UDP listening services. Remember we  
-had a strange looking port number 32768, that also had no service name  
-associated with it:  
-  
-  
-  
-  
- # netstat -aup  
-Active Internet connections (servers and established)  
-Local Address Foreign Address State PID/Program name  
-*:32768 *:* 956/named  
-bigcat:domain *:* 956/named  
-bigcat:domain *:* 956/named  
-*:631 *:* 1315/cupsd  
-  
-  
-  
-  
- Now by including the "PID/Program name"  
-option with the -p flag, we see this also belongs to  
-__named__, the nameserver daemon. Recent versions of  
-BIND use an unprivileged port for some types  
-of traffic. In this case, this is BIND 9.x.  
-So no real alarms here either. The unprivileged port here is the one  
-__named__ uses to to talk to other nameservers for name  
-and address lookups, and should not be firewalled.   
-  
-  
-  
- So we found no big surprises in this hypothetical situation.  
-  
-  
-  
- If all else fails, and you can't find a process owner for an open port,  
-suspect that it may be an RPC (Remote Procedure Call) service of some kind.  
-These use randomly assigned ports without any seeming logic or consistency,  
-and are typically controlled by the __portmap__ daemon.  
-In some cases, these may not reveal the process owner to  
-__netstat__ or __lsof__. Try stopping  
-__portmap__, and then see if the mystery service goes away. Or  
-you can use __rpcinfo -p localhost__ to see what RPC services  
-may be running (__portmap__ must be running for this to  
-work).  
-  
-  
-  
-  
-  
-  
-  
-  
- If you suspect you have been broken into, ''do not trust''  
-__netstat__ or __ps__ output. There is a good  
-chance that they, and other system components, has been tampered with in  
-such a way that the output is not reliable.  
-  
-  
-----  
-!!8.4. Attacks and Threats  
-  
- In this section, we will take a quick look at some of the common threats  
-and techniques that are out there, and attempt to put them into some  
-perspective.  
-  
-  
-  
- The corporate world, government agencies and high profile Internet sites have  
-to be concerned with a much more diverse and challenging set of threats than  
-the typical home desktop user. There are many reasons someone may want to  
-break in to someone else's computer. It may be just for kicks, or any number  
-of malicious reasons. They may just want a base from which to attack  
-someone else. This is a very common motivation.  
-  
-  
-  
-  
- The most common "attack" for most of us is from already  
-compromised systems. The Internet is littered with computers that have been  
-broken into, and are now doing their master's bidding blindly, in zombie-like  
-fashion. They are programmed to scan massively large address ranges, probing  
-each individual IP address as they go. Looking for one or more open ports,  
-and then probing for known weaknesses if they get the chance. Very  
-impersonal. Very methodical. And very effective. We are all in the path of  
-such robotic scans. All because those responsible for these systems fail to  
-do what you are doing now - taking steps to protect their system(s), and  
-avoid being r00ted.  
-  
-  
-  
- These scans do not look at login banners that may be presented on connection.  
-It will do little good to change your /etc/issue.net to  
-pretend that you are running some obscure operating system. If they find  
-something listening, they will try all of the exploits appropriate to that  
-port, without regard to any indications your system may give. If it works,  
-they are in -- if not, they will move on.  
-  
-----  
-!8.4.1. Port Scans and Probes  
-  
- First, let's define "scan" and "probe" since these  
-terms come up quite a bit. A "probe" implies testing if a given  
-port is open or closed, and possibly what might be listening on that port. A  
-"scan" implies either "probing" multiple ports on  
-one or more systems. Or individual ports on multiple systems. So you might  
-"scan" all ports on your own system for instance. Or a  
-cracker might "scan" the 216.78.*.* address range to see who  
-has port 111 open.  
-  
-  
-  
-  
- Black hats can use scan and probe information to know what services are  
-running on a given system, and then they might know what exploits to try.  
-They may even be able to tell what Operating System is running, and even  
-kernel version, and thus get even more information. "Worms", on  
-the other hand, are automated and scan blindly, generally just looking for  
-open ports, and then a susceptible victim. They are not trying to  
-"learn" anything, the way a cracker might.  
-  
-  
-  
- The distinction between "scan" and "probe"is often  
-blurred. Both can used in good ways, or in bad ways, depending on who is  
-doing it, and why. You might ask a friend to scan you, for instance, to see  
-how well your firewall is working. This is a legitimate use of scanning tools  
-such as nmap. But what if someone you don't know  
-does this? What is their intent? If it's your ISP, they may be trying to  
-enforce their Terms of Service Agreement. Or maybe, it is someone just  
-playing, and seeing who is "out there". But more than likely it  
-is someone or something with not such good intentions.  
-  
-  
-  
- Full range port scans (meaning probing of many ports on the same machine)  
-seem to be a not so common threat for home based networks. But certainly,  
-scanning individual ports across numerous systems is a very, very common  
-occurrence.  
-  
-  
-----  
-!8.4.2. Rootkits  
-  
- A "rootkit" is the script kiddie's stock in trade. When a  
-successful intrusion takes place, the first thing that is often done, is to  
-download and install such "rootkits". The rootkit is a set of  
-scripts designed to take control of the system, and then hide the intrusion.  
-Rootkits are readily available on the web for various Operating Systems.   
-  
-  
-  
- A rootkit will typically replace critical system files such as  
-__ls__, __ps__, __netstat__,  
-__login__ and others. Passwords may be added, hidden  
-daemons started, logs tampered with, and surely one of more backdoors are  
-opened. The hidden backdoors allow easy access any time the attacker wants  
-back in. And often the vulnerability itself may even be fixed so that the new  
-"owner" has the system all to himself. The entire process is  
-scripted so it happens very quickly. The rightful owners of these compromised  
-systems generally have no idea what is going on, and are victims themselves.  
-A well designed rootkit can be very difficult to detect.  
-  
-----  
-!8.4.3. Worms and Zombies  
-  
- A "worm" is a self replicating exploit. It infects a system,  
-then attempts to spread itself typically via the same vulnerability. Various  
-"worms" are weaving their way through the entire Internet  
-address space constantly, spreading themselves as they go.  
-  
-  
-  
- But somewhere behind the zombie, there is a controller. Someone launched  
-the worm, and they will be informed after a successful intrusion. It is  
-then up to them how the system will be used.  
-  
-  
-  
-  
- Many of these are Linux systems, looking for other Linux systems to  
-"infect" via a number of exploits. But most Operating Systems  
-share in this threat. Once a vulnerable system is found, the actual entry  
-and take over is quick, and may be difficult to detect after the fact. The  
-first thing an intruder (whether human or "worm") will do is  
-attempt to cover their tracks. A "rootkit" is downloaded and  
-installed. This trend has been exacerbated by the growing popularity of cable  
-modems and DSL. The number of full time Internet connections is growing  
-rapidly, and this makes fertile ground for such exploits since often  
-these aren't as well secured as larger sites.   
-  
-  
-  
- While this may sound ominous, a few simple precautions can effectively  
-deter this type of attack. With so many easy victims out there, why waste much  
-effort breaking into ''your'' system? There is no incentive  
-to really try very hard. Just scan, look, try, move on if unsuccessful. There  
-is always more IPs to be scanned. If your firewall is effectively bouncing  
-this kind of thing, it is no threat to you at all. Take comfort in that,  
-and don't over re-act.  
-  
-  
-  
- It is worth noting, that these worms cannot "force" their way  
-in. They need an open and accessible port, ''and'' a known  
-vulnerability. If you remember the "Iptables Weekly Log Summary"  
-in the opening section above, many of those may have all been the result of  
-this type of scan. If you've followed the steps in this HOWTO, you should be  
-reasonably safe here. This one is easy enough to deflect.  
-  
-----  
-!8.4.4. Script Kiddies  
-  
- A "script kiddie" is a "cracker" wanna be who  
-doesn't know enough to come up with his/her own exploits, but instead  
-relies on "scripts" and exploits that have been developed by  
-others. Like "worms", they are looking for easy victims,  
-and may similarly scan large address ranges looking for specific ports  
-with known vulnerabilities. Often, the actual scanning is done from  
-already comprised systems so that it is difficult to trace it back to them.  
-  
-  
-  
- The script kiddie has a bag of ready made tricks at his disposal, including  
-an arsenal of "rootkits" for various Operating Systems. Finding  
-susceptible victims is not so hard, given enough time and address space to  
-probe. The motives are a mixed bag as well. Simple mischief, defacement  
-of web sites, stolen credit card numbers, and the latest craze,  
-"Denial of Service" attacks (see below). They collect  
-zombies like trophies and use them to carry out whatever their objective is.  
-  
-  
-  
- Again, the key here is that they are following a "script", and  
-looking for easy prey. Like the worm threat above, a functional firewall  
-and a few very basic precautions, should be sufficient to deflect any  
-threat here. By now, you should be relatively safe from this nuisance.  
-  
-----  
-!8.4.5. Spoofed IPs  
-  
- How easy is it to spoof an IP address? With the right tools, very easy. How  
-much of a threat is this? Not much, for most of us, and is over-hyped as a  
-threat.  
-  
-  
-  
- Because of the way TCP/IP works, each packet must carry both the source and  
-destination IP addresses. Any return traffic is based on this information. So  
-a spoofed IP can never return any useful information to an attacker who is  
-sending out spoofed packets. The traffic would go back to wherever that  
-spoofed IP address was pointed. The attacker gets nothing back at all.  
-  
-  
-  
- This does have potential for "DoS" attacks (see below) where  
-learning something about the targeted system is not important. And may be  
-used for some general mischief making as well.  
-  
-----  
-!8.4.6. Targeted Attacks  
-  
- The worm and wide ranging address type scans, are impersonal. They are just  
-looking for any vulnerable system. It makes no difference whether it is a top  
-secret government facility, or your mother's Window's box. But there are  
-"black hats" that will spend a great deal of effort to get into  
-a system or network. We'll call these "targeted" attacks since  
-there has been a deliberate decision made to break in to a specific system  
-or network.  
-  
-  
-  
-  
- In this case, the attacker will look the system over for weaknesses. And  
-possibly make many different kinds of attempts, until he finds a crack to  
-wiggle through. Or gives up. This is more difficult to defend against. The  
-attacker is armed and dangerous, so to speak, and is stalking his prey.   
-  
-  
-  
- Again, this scenario is very unlikely for a typical home system. There just  
-generally isn't any incentive to take the time and effort when there are  
-bigger fish to fry. For those who may be targets, the best defense here  
-includes many of things we've discussed. Vigilance is probably more important  
-than ever. Good logging practices and an IDS (Intrusion Detection System)  
-should be in place. And subscribing to one or more security related mailing  
-lists like BUGTRAQ. And of course, reading those alerts daily, and taking  
-the appropriate actions, etc.  
-  
-  
-----  
-!8.4.7. Denial of Service (DoS)  
-  
- "DoS" is another type of "attack" in which the  
-intention is to disrupt or overwhelm the targeted system or network in such a  
-way that it cannot function normally. DoS can take many forms. On the  
-Internet, this often means overwhelming the victim's bandwidth or TCP/IP  
-stack, by sending floods of packets and thus effectively disabling the  
-connection. We are talking about many, many packets per second. Thousands in  
-some cases. Or perhaps, the objective is to crash a server.  
-  
-  
-  
- This is much more likely to be targeted at organizations or high profile  
-sites, than home users. And can be quite challenging to stop depending  
-on the technique. And it generally requires the co-operation of  
-networks between the source(s) and the target, so that the floods are  
-stopped, or minimized, before they reach the targeted destination. Once they  
-hit the destination, there is no good way to completely ignore them.   
-  
-  
-  
- "DDoS", Distributed Denial of Service, is where multiple sources  
-are used to maximize the impact. Again, not likely to be directly targeted at  
-home users. These are "slaves" that are "owned"  
-by a cracker, or script kiddie, that are woken up and are targeted at the  
-victim. There may be many computers involved in the attack.  
-  
-  
-  
-  
- If you are home user, and with a dynamic IP address, you might find  
-disconnecting, then re-connecting to get a new IP, an effective way out  
-if you are the target. Maybe.  
-  
-  
-----  
-!8.4.8. Brute Force  
-  
- "Brute force" attacks are where the attacker makes repetitive  
-attempts at the same perceived weakness(es). Like a battering ram. A classic  
-example would be where someone tries to access a  
-telnet server simply by continually throwing  
-passwords at it, hoping that one will eventually work. Or maybe crash the  
-server. This doesn't require much imagination, and is not a commonly used  
-tactic against home systems.  
-  
-  
-  
-  
- By the way, this is one good argument against allowing remote root logins.  
-The root account exists on all systems. It is probably the only one that this  
-is true of. You'd like to make a potential attacker guess both the login  
-name ''and'' password. But if root is allowed remote logins,  
-then the attacker only needs to guess the password!  
-  
-  
-----  
-!8.4.9. Viruses  
-  
- And now something ''not'' to worry about. Viruses seem to be  
-primarily a Microsoft problem. For various reasons, viruses  
-are not a significant threat to Linux users. This is not to say that it will  
-always be this way, but the current virus explosion that plagues Microsoft  
-systems, can not spread to Linux (or Unix) based systems. In fact, the  
-various methods and practices that enable this phenomena, are not exploitable  
-on Linux. So Anti-Virus software is not recommended as part of our arsenal.  
-At least for the time being with Linux only networks.  
-  
-  
-----  
-!!8.5. Links  
-  
- Some references for further reading are listed below. Not listed is your  
-distribution's site, security page or ftp download site. You will  
-have to find these on your own. Then you should bookmark them!  
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- Other relevant documents available from the Linux Documentation Project:  
-  
-  
-  
-  
-  
-  
-  
- Security HOWTO: http://linuxdoc.org/HOWTO/Security-HOWTO.html  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Firewall HOWTO: http://linuxdoc.org/HOWTO/Firewall-HOWTO.html  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Ipchains HOWTO: http://linuxdoc.org/HOWTO/IPCHAINS-HOWTO.html  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- User Authentication: http://linuxdoc.org/HOWTO/User-Authentication-HOWTO/index.html, includes a  
-nice discussion on PAM.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- VPN (Virtual Private Network): http://linuxdoc.org/HOWTO/VPN-HOWTO.html  
-and http://linuxdoc.org/HOWTO/VPN-Masquerade-HOWTO.html  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- The Remote X Apps Mini HOWTO,  
-http://www.linuxdoc.org/HOWTO/mini/Remote-X-Apps.html,  
-includes excellent discussions on the security implications of running  
-X Windows.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- The Linux Network Administrators Guide:  
-http://linuxdoc.org/LDP/nag2/index.html, includes a good overview of networking and TCP/IP, and  
-firewalling.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- The Linux Administrator's Security Guide:  
- http://www.seifried.org/lasg/,  
-includes many obvious topics of interest, including firewalling,  
-passwords and authentication, PAM, and more.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Securing Red Hat:  
-http://linuxdoc.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/index.html  
-  
-  
-  
-  
-  
-*  
-*  
-  
- Tools for creating custom ipchains and  
-iptables firewall scripts:  
-  
-  
-  
-  
-  
-  
-  
- PMFirewall: http://www.pmfirewall.com/PMFirewall/  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Firestarter: http://firestarter.sourceforge.net  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Two related projects: http://seawall.sourceforge.net/ for ipchains,  
-and http://shorewall.sourceforge.net/ for iptables.  
-  
-  
-  
-  
-  
-*  
-*  
-  
- Netfilter and iptables documentation from the netfilter developers  
-(available in many other languages as well):  
-  
-  
-  
-  
-  
-  
-  
- FAQ: http://netfilter.samba.org/documentation/FAQ/netfilter-faq.html  
- Packet filtering: http://netfilter.samba.org/documentation/HOWTO/packet-filtering-HOWTO.html  
- Networking: http://netfilter.samba.org/documentation/HOWTO/networking-concepts-HOWTO.html  
- NAT/masquerading: http://netfilter.samba.org/documentation/HOWTO/NAT-HOWTO.html  
-  
-  
-  
-  
-  
-*  
-*  
-  
- Port number assignments, and what that scanner may be scanning for:  
-  
-  
-  
-  
-  
-  
-  
- http://www.linuxsecurity.com/resource_files/firewalls/firewall-seen.html  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- http://www.sans.org/newlook/resources/IDFAQ/oddports.htm  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- http://www.iana.org/assignments/port-numbers, the official assignments.  
-  
-  
-  
-  
-  
-*  
-*  
-  
- General security sites. These all have areas on documentation, alerts,  
-newsletters, mailing lists, and other resources.  
-  
-  
-  
-  
-  
-  
-  
- Linux Security.com: http://www.linuxsecurity.com, loaded with good info, and Linux specific.  
-Lots of good docs: http://www.linuxsecurity.com/docs/  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- CERT, http://www.cert.org  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- The SANS Institute: http://www.sans.org/  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- The Coroner's Toolkit (TCT): http://www.fish.com/security/,  
-discussions and tools for dealing with post break-in issues (and  
-preventing them in the first place).  
-  
-  
-  
-  
-  
-*  
-*  
-  
- Privacy:  
-  
-  
-  
-  
-  
-  
-  
- Junkbuster: http://www.junkbuster.com, a  
-web proxy and cookie manager.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- PGP: http://www.gnupg.org/  
-  
-  
-  
-  
-  
-*  
-*  
-  
- Other documentation and reference sites:  
-  
-  
-  
-  
-  
-  
-  
- Linux Security.com: http://www.linuxsecurity.com/docs/  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Linux Newbie: http://www.linuxnewbie.org/nhf/intel/security/index.html  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- The comp.os.linux.security FAQ: http://www.linuxsecurity.com/docs/colsfaq.html  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- The Internet Firewall FAQ: http://pubweb.nfr.net/~mjr/pubs/fwfaq/  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- The Site Security Handbook RFC: http://www.ietf.org/rfc/rfc2196.txt  
-  
-  
-  
-  
-  
-*  
-*  
-  
- Miscellaneous sites of interest:  
-  
-  
-  
-  
-  
-  
-  
- http://www.bastille-linux.org, for Mandrake and Red Hat only.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- SAINT: http://www.wwdsi.com/saint/,  
-system security analysis.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- SSL: http://www.openssl.org/  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- SSH: http://www.openssh.org/  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Scan yourself: http://www.hackerwhacker.com  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- PAM: http://www.kernel.org/pub/linux/libs/pam/index.html  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Detecting Trojaned Linux Kernel Modules: http://members.prestige.net/tmiller12/papers/lkm.htm  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Rootkit checker: http://www.chkrootkit.org  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Port scanning tool nmap's home page: http://www.insecure.org  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Nessus, more than just a port scanner: http://www.nessus.org  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Tripwire, intrusion detection:  
-http://www.tripwire.org  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- Snort, sniffer and more: http://www.snort.org  
-  
-  
-  
-  
-  
-  
-  
-  
-  
- http://www.mynetwatchman.com  
-and http://dshield.org are  
-"Distributed Intrusion Detection Systems". They collect  
-log data from subscribing "agents", and collate the  
-data to find and report malicious activity. If you want to fight back,  
-check these out.  
-  
-  
-  
-  
-  
-*  
-  
-----  
-!!8.6. Editing Text Files  
-  
-By Bill Staehle  
-  
-  
-  
-All the world is a file.  
-  
-  
-  
-There are a great many types of files, but I'm going to stretch it here,  
-and class them into two really broad families:  
-  
-  
-  
-  
-  
-  
-  
- Text files are just that.  
- Binary files are not.  
-  
-  
-  
-  
-  
-  
-  
-  
-Binary files are meant to be read by machines, text files can be easily  
-edited, and are generally read by people. But text files can be (and  
-frequently are) read by machines. Examples of this would be configuration  
-files, and scripts.  
-  
-  
-  
-There are a number of different text editors available in *nix. A few  
-are found on every system. That would be '/bin/ed' and '/bin/vi'. 'vi' is  
-almost always a clone such as 'vim' due to license problems. The problem with  
-'vi' and 'ed' is that they are terribly user unfriendly. Another common editor  
-that is not always installed by default is 'emacs'. It has a lot more features  
-and capability, and is not easy to learn either.  
-  
-  
-  
- As to 'user friendly' editors, 'mcedit' and 'pico' are good choices to start  
-with. These are often much easier for those new to *nix.  
-  
-  
-  
- The first things to learn are how to exit an editing session, how to save  
-changes to the file, and then how to avoid breaking long lines that should  
-not be broken (wrapped).  
-  
-  
-  
-The 'vi' editor  
-  
-  
-  
-'vi' is one of the most common text editors in the Unix world, and it's  
-nearly always found on any *nix system. Actually, due to license problems,  
-the '/bin/vi' on a Linux system is always a 'clone', such as 'elvis',  
-'nvi', or 'vim' (there are others). These clones can act exactly like  
-the original 'vi', but usually have additional features that make it  
-slightly less impossible to use.  
-  
-  
-  
-So, if it's so terrible, why learn about it? Two reasons. First, as  
-noted, it's almost guaranteed to be installed, and other (more user  
-friendly) editors may not be installed by default. Second, many of the  
-'commands' work in other applications (such as the pager 'less' which is  
-also used to view man pages). In 'less', accidentally pressing the 'v' key  
-starts 'vi' in most installations.  
-  
-  
-  
-'vi' has two modes. The first is 'command mode', and keystrokes are  
-interpreted as commands. The other mode is 'insert' mode, where nearly all  
-keystrokes are interpreted as text to be inserted.  
-  
-  
-  
-==b Emergency exit from 'vi'  
-1. press the `escb key up to three times, until the computer beeps, or the  
-screen flashes.  
-2. press the keys :q! `Enterb  
-  
-  
-  
- That is: colon, the letter Q, and then the exclamation point, followed by  
-the Enter key.  
-  
-  
-  
-'vi' commands are as follows. All of these are in 'command' mode:  
-  
-  
-  
-  
-  
-  
-a Enter insertion mode after the cursor.  
-A Enter insertion mode at the end of the current line.  
-i Enter insertion mode before the cursor.  
-o Enter insertion mode opening a new line BELOW current line.  
-O Enter insertion mode opening a new line ABOVE current line.  
-h move cursor left one character.  
-l move cursor right one character.  
-j move cursor down one line.  
-k move cursor up one line.  
-/mumble move cursor forward to next occurrence of 'mumble' in  
- the text  
-?mumble move cursor backward to next occurrence of 'mumble'  
- in the text  
-n repeat last search (? or / without 'mumble' to search for  
- will do the same thing)  
-u undo last change made  
-  
-^B Scroll back one window.  
-^F Scroll forward one window.  
-^U Scroll up one half window.  
-^D Scroll down one half window.  
-  
-:w Write to file.  
-:wq Write to file, and quit.  
-:q quit.  
-:q! Quit without saving.  
-  
-`escb Leave insertion mode.  
-  
-  
-  
-  
-  
-  
-  
-  
-NOTE: The four 'arrow' keys almost always work in 'command' or 'insert'  
-mode.  
-  
-  
-  
-The 'ed' editor.  
-  
-  
-  
-The 'ed' editor is a line editor. Other than the fact that it is virtually  
-guaranteed to be on any *nix computer, it has no socially redeeming  
-features, although some applications may need it. A _lot_ of things have  
-been offered to replace this 'thing' from 1975.  
-  
-  
-  
-==b Emergency exit from 'ed'  
-  
-  
-  
-1. type a period on a line by itself, and press `Enterb This gets you to  
-the command mode or prints a line of text if you were in command mode.  
-2. type q and press `Enterb. If there were no changes to the file,  
-this action quits ed. If you then see a '?' this means that the file had  
-changed, and 'ed' is asking if you want to save the changes. Press q and  
-`Enterb a second time to confirm that you want out.  
-  
-  
-  
-The 'pico' editor.  
-  
-  
-  
-'pico' is a part of the Pine mail/news package from the University of  
-Washington (state, USA). It is a very friendly editor, with one minor  
-failing. It silently inserts a line feed character and wraps the line when  
-it exceeds (generally) 74 characters. While this is fine while creating  
-mail, news articles, and text notes, it is often fatal when editing system  
-files. The solution to this problem is simple. Call the program with the  
--w option, like this:  
-  
-  
-  
-pico -w file_2_edit  
-  
-  
-  
-Pico is so user friendly, no further instructions are needed. It _should_  
-be obvious (look at the bottom of the screen for commands). There is an  
-extensive help function. Pico is available with nearly all distributions,  
-although it _may_ not be installed by default.  
-  
-  
-  
-==b Emergency exit from 'pico'  
-  
-  
-  
-Press and hold the `Ctrlb key, and press the letter x. If no changes  
-had been made to the file, this will quit pico. If changes had been made,  
-it will ask if you want to save the changes. Pressing n will then exit.  
-  
-  
-  
-The 'mcedit' editor.  
-  
-  
-  
-'mcedit' is part of the Midnight Commander shell program, a full featured  
-visual shell for Unix-like systems. It can be accessed directly from the  
-command line ( mcedit file_2_edit ) or as part of 'mc' (use the arrow keys  
-to highlight the file to be edited, then press the F4 key).  
-  
-  
-  
-mcedit is probably the most intuitive editor available, and comes with  
-extensive help. "commands" are accessed through the F* keys. Midnight  
-Commander is available with nearly all distributions, although it _may_ not  
-be installed by default.  
-  
-  
-  
-==b Emergency exit from 'mcedit'  
-  
-  
-  
-Press the F10 key. If no changes have been made to the file, this will  
-quit mcedit. If changes had been made, it will ask if you want to Cancel  
-this action. Pressing n will then exit.  
-  
-----  
-!!8.7. nmap  
-  
- Let's look at a few quick examples of what __nmap__ scans  
-look like. The intent here is to show how to use __nmap__  
-to verify our firewalling, and system integrity. __nmap__  
-has other uses that we don't need to get into. Do NOT use  
-__nmap__ on systems other than your own, unless you have  
-permission from the owner, and you know it is not a violation of anyone's  
-Terms of Service. This kind of thing ''will'' be taken as  
-hostile by most people.  
-  
-  
-  
- As mentioned previously, __nmap__ is a sophisticated  
-port scanning tool. It tries to see if a host is "there",  
-and what ports might be open. Barring that, what states those ports  
-might be in. __nmap__ has a complex command line and  
-can do many types of "scans". See the man page for all  
-the nitty gritty.  
-  
-  
-  
- A couple of words of warning first. If using  
-portsentry, turn it off. It will drop the route  
-to wherever the scan is coming from. You might want to turn off any logging  
-also, or at least be aware that you might get copious logs if doing multiple  
-scans.  
-  
-  
-  
- A simple, default scan of "localhost":  
-  
-  
-  
-  
- # nmap localhost  
-Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )  
-Interesting ports on bigcat (127...1):  
-(The 1507 ports scanned but not shown below are in state: closed)  
-Port State Service  
-22/tcp open ssh  
-25/tcp open smtp  
-37/tcp open time  
-53/tcp open domain  
-80/tcp open http  
-3000/tcp open ppp  
-Nmap run completed -- 1 IP address (1 host up) scanned in 2 seconds  
-  
-  
-  
-  
- If you've read most of this document, you should be familiar with  
-these services by now. These are some of the same ports we've seen in other  
-examples. Some things to note on this scan: it only did 1500+  
-"interesting" ports -- not all ports. This can be configured  
-differently if more is desirable (see man page). It only did TCP ports too.  
-Again, configurable. It only picks up "listening" services,  
-unlike __netstat__ that shows all open ports -- listening or  
-otherwise. Note the last "open" port here is 3000 is identified  
-as "PPP". Wrong! That is just an educated guess by nmap based on  
-what is contained in /etc/services for this port number.  
-Actually in this case it is ntop (a network  
-traffic monitor). Take the service names with a grain of salt. There is no  
-way for __nmap__ to really know what is on that port. Matching  
-port numbers with service names can at times be risky. Many do have standard  
-ports, but there is nothing to say they have to use the commonly associated  
-port numbers.   
-  
-  
-  
- Notice that in all our __netstat__ examples, we had two classes  
-of open ports: listening servers, and then established connections that we  
-initiated to other remote hosts (e.g. a web server somewhere).  
-__nmap__ only sees the first group -- the listening servers!  
-The other ports connecting us to remote servers are not visible, and thus  
-not vulnerable. These ports are "private" to that single  
-connection, and will be closed when the connection is terminated.  
-  
-  
-  
- So we have open and closed ports here. Simple enough, and gives a pretty good  
-idea what is running on bigcat -- but not necessarily what we look like to  
-the outside world since this was done from localhost, and wouldn't reflect  
-any firewalling or other access control mechanisms.  
-  
-  
-  
- Let's do a little more intensive scan. Let's check all ports -- TCP and UDP.  
-  
-  
-  
-  
- # nmap -sT -sU -p 1-65535 localhost  
-Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )  
-Interesting ports on bigcat (127...1):  
-(The 131050 ports scanned but not shown below are in state: closed)  
-Port State Service  
-22/tcp open ssh  
-25/tcp open smtp  
-37/tcp open time  
-53/tcp open domain  
-53/udp open domain  
-80/tcp open http  
-3000/tcp open ppp  
-8000/tcp open unknown  
-32768/udp open unknown  
-Nmap run completed -- 1 IP address (1 host up) scanned in 385 seconds  
-  
-  
-  
-  
- This is more than just "interesting" ports -- it is everything.  
-We picked up a couple of new ones in the process too. We've seen these before  
-with __netstat__, so we know what they are. That is the  
-__Junkbuster__ web proxy on port 8000/tcp and  
-__named__ on 32768/udp. This scan takes much, much longer, but it  
-is the only way to see all ports.  
-  
-  
-  
- So now we have a pretty good idea of what is open on bigcat. Since  
-we are scanning localhost from localhost, everything should be visible.  
-We still don't know how the outside world sees us though. Now I'll  
-__ssh__ to another host on the same LAN, and try again.  
-  
-  
-  
-  
- # nmap bigcat  
-Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )  
-Interesting ports on bigcat (192.168.1.1):  
-(The 1520 ports scanned but not shown below are in state: closed)  
-Port State Service  
-22/tcp open ssh  
-3000/tcp open ppp  
-Nmap run completed -- 1 IP address (1 host up) scanned in 1 second  
-  
-  
-  
-  
- I confess to tampering with the iptables rules  
-here to make a point. Only two visible ports on this scan. Everything  
-else is "closed". So says nmap.  
-Once again:  
-  
-  
-  
-  
- # nmap bigcat  
-Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )  
-Note: Host seems down. If it is really up, but blocking our ping probes, try -P0  
-Nmap run completed -- 1 IP address (0 hosts up) scanned in 30 seconds  
-  
-  
-  
-  
-Oops, I blocked ICMP (ping) while I was at it this time. One more time:   
-  
-  
-  
-  
- # nmap -P0 bigcat  
-Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )  
-All 1523 scanned ports on bigcat (192.168.1.1) are: filtered  
-Nmap run completed -- 1 IP address (1 host up) scanned in 1643 seconds  
-  
-  
-  
-  
- That's it. Notice how long that took. Notice ports are now  
-"filtered" instead of "closed". How does  
-__nmap__ know that? Well for one, "closed" means  
-bigcat sent a packet back saying "nothing running here", i.e.  
-port is closed. In this last example, the iptables  
-rules were changed to not allow ICMP (ping), and to "DROP" all  
-incoming packets. In other words, no response at all. A subtle difference  
-since __nmap__ seems to still know there was a host there,  
-even though no response was given. One lesson here, is if you want to slow a  
-scanner down, "DROP" (or "DENY") the packets. This  
-forces a TCP time out for the remote end on each port probe. Anyway, if your  
-scans look like this, that is probably as well as can be expected, and your  
-firewall is doing its job.  
-  
-  
-  
- A brief note on UDP: __nmap__ can not accurately determine  
-the status of these ports if they are "filtered". You probably  
-will get a false-positive "open" condition. This has to do with  
-UDP being a connectionless protocol. If __nmap__ gets no  
-answer (e.g. due to a "DROP"), it assumes the packets reached  
-the target, and thus the port will be reported as "open".  
-This is "normal" for __nmap__.  
-  
-  
-  
- We can play with firewall rules in a LAN set up to try to simulate how the  
-outside world sees us, and if we are smart, and know what we are doing,  
-and don't have a brain fart, we probably will have a pretty good picture. But  
-it is still best to try to find a way to do it from outside if possible.  
-Again, make sure you are not violating any ISP rules of conduct. Do you have  
-a friend on the same ISP?   
-  
-----  
-!!8.8. Sysctl Options  
-  
- The "sysctl" options are kernel parameters that can be  
-configured via the /proc filesystem. These can  
-be dynamically adjusted at run-time. Typically these options are off  
-if set to "", and on if set to "1".  
-  
-  
-  
- Some of these have security implications, and thus is why we are here ;-)  
-We'll just list the ones we think are relevant. Feel free to cut and  
-paste these into a firewall script, or other file that is run during boot  
-(like /etc/rc.local). Or your  
-distribution may have their own way of tuning this.  
-You can read up on what these mean in  
-/usr/src/linux/Documentation/sysctl/README and other  
-files in the kernel Documentation directories.  
-  
-  
-  
-  
-  
-#!/bin/sh  
-#  
-# Configure kernel sysctl run-time options.  
-#  
-###################################################################  
-# Anti-spoofing blocks  
-for i in /proc/sys/net/ipv4/conf/*/rp_filter;  
-do  
-echo 1 b $i  
-done  
-# Ensure source routing is OFF  
-for i in /proc/sys/net/ipv4/conf/*/accept_source_route;  
-do  
-echo 0 b $i  
-done  
-# Ensure TCP SYN cookies protection is enabled  
-[[ -e /proc/sys/net/ipv4/tcp_syncookies ] 88\  
-echo 1 b /proc/sys/net/ipv4/tcp_syncookies  
-# Ensure ICMP redirects are disabled  
-for i in /proc/sys/net/ipv4/conf/*/accept_redirects;  
-do  
-echo 0 b $i  
-done  
-# Ensure oddball addresses are logged  
-[[ -e /proc/sys/net/ipv4/conf/all/log_martians ] 88\  
-echo 1 b /proc/sys/net/ipv4/conf/all/log_martians  
-[[ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ] 88\  
-echo 1 b /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts  
-[[ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] 88\  
-echo 1 b /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses  
-## Optional from here on down, depending on your situation. ############  
-# Ensure ip-forwarding is enabled if  
-# we want to do forwarding or masquerading.  
-[[ -e /proc/sys/net/ipv4/ip_forward ] 88\  
-echo 1 b /proc/sys/net/ipv4/ip_forward  
-# On if your IP is dynamic (or you don't know).  
-[[ -e /proc/sys/net/ipv4/ip_dynaddr ] 88\  
-echo 1 b /proc/sys/net/ipv4/ip_dynaddr  
-# eof  
-  
-  
-----  
-!!8.9. Secure Alternatives  
-  
- This section will give a brief run down on secure alternatives to  
-potentially insecure methods. This will be a hodge podge of clients  
-and servers.   
-  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
-  
-telnet, rsh - ssh  
-  
-  
-  
-*  
-*  
-  
- ftp, rcp - scp or sftp. Both are part of ssh packages. Also, files  
-can easily be transfered via HTTP if Apache is already running  
-anyway. Apache can be buttoned down even more by using SSL (HTTPS).  
-  
-  
-  
-*  
-*  
-  
- sendmail - postfix, qmail. Not to imply that current versions of  
-sendmail are insecure. Just that there  
-is some bad history there, and just because it is so widely used  
-that it makes an inviting crack target.  
-  
-  
-  
-  
- As noted above, Linux installations often include a fully functional  
-mail server. While this may have some advantages, it is not necessary  
-in many cases for simply sending mail, or retrieving mail. This can all  
-be done without a "mail server daemon" running locally.  
-  
-  
-  
-*  
-*  
-  
- POP3 - SPOP3, POP3 over SSL. If you really need to run your own  
-POP server, this is the way to do it. If retrieving your mail from  
-your ISP's server, then you are at their mercy as to what they provide.  
-  
-  
-  
-*  
-*  
-  
- IMAP - IMAPS, same as above.  
-  
-  
-  
-*  
-*  
-  
- If you find you need a particular service, and it is for just you or a few  
-friends, consider running it on a non-standard port. Most server daemons  
-support this, and is not a problem as long as those who will be  
-connecting, know about it. For instance, the standard port for  
-__sshd__ is 22. Any worm or scan will probe for this port  
-number. So run it on a randomly chosen port. See the __sshd__  
-man page.  
-  
-  
-  
-*  
-  
-----  
-!!8.10. Ipchains and Iptables Redux  
-  
- This section offers a little more advanced look at some of things that  
-ipchains and iptables  
-can do. These are basically the same scripts as in Step 3 above, just  
-with some more advanced configuration options added. These will provide  
-"masquerading", "port forwarding", allow access to  
-some user definable services, and a few other things. Read the comments for  
-explanations.  
-  
-----  
-!8.10.1. ipchains II  
-  
-  
-#!/bin/sh  
-#  
-# ipchains.sh  
-#  
-# An example of a simple ipchains configuration. This script  
-# can enable 'masquerading' and will open user definable ports.  
-#  
-###################################################################  
-# Begin variable declarations and user configuration options ######  
-#  
-# Set the location of ipchains (default).  
-IPCHAINS=/sbin/ipchains  
-# Local Interfaces  
-#  
-# This is the WAN interface, that is our link to the outside world.  
-# For pppd and pppoe users.  
-# WAN_IFACE="ppp0"  
-WAN_IFACE="eth0"  
-#  
-# Local Area Network (LAN) interface.  
-#LAN_IFACE="eth0"  
-LAN_IFACE="eth1"  
-# Our private LAN address(es), for masquerading.  
-LAN_NET="192.168.1./24"  
-# For static IP, set it here!  
-#WAN_IP="1.2.3.4"  
-# Set a list of public server port numbers here...not too many!  
-# These will be open to the world, so use caution. The example is  
-# sshd, and HTTP (www). Any services included here should be the  
-# latest version available from your vendor. Comment out to disable  
-# all PUBLIC services.  
-#PUBLIC_PORTS="22 80 443"  
-PUBLIC_PORTS="22"  
-# If we want to do port forwarding, this is the host  
-# that will be forwarded to.  
-#FORWARD_HOST="192.168.1.3"  
-# A list of ports that are to be forwarded.  
-#FORWARD_PORTS="25 80"  
-# If you get your public IP address via DHCP, set this.  
-DHCP_SERVER=66.21.184.66  
-# If you need identd for a mail server, set this.  
-MAIL_SERVER=  
-# A list of unwelcome hosts or nets. These will be denied access  
-# to everything, even our 'PUBLIC' services. Provide your own list.  
-#BLACKLIST="11.22.33.44 55.66.77.88"  
-# A list of "trusted" hosts and/or nets. These will have access to  
-# ALL protocols, and ALL open ports. Be selective here.  
-#TRUSTED="1.2.3.4/8 5.6.7.8"  
-## end user configuration options #################################  
-###################################################################  
-# The high ports used mostly for connections we initiate and return  
-# traffic.  
-LOCAL_PORTS=`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f1`:\  
-`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f2`  
-# Any and all addresses from anywhere.  
-ANYWHERE="/"  
-# Start building chains and rules #################################  
-#  
-# Let's start clean and flush all chains to an empty state.  
-$IPCHAINS -F  
-# Set the default policies of the built-in chains. If no match for any  
-# of the rules below, these will be the defaults that ipchains uses.  
-$IPCHAINS -P forward DENY  
-$IPCHAINS -P output ACCEPT  
-$IPCHAINS -P input DENY  
-# Accept localhost/loopback traffic.  
-$IPCHAINS -A input -i lo -j ACCEPT  
-# Get our dynamic IP now from the Inet interface. WAN_IP will be our  
-# IP address we are protecting from the outside world. Put this  
-# here, so default policy gets set, even if interface is not up  
-# yet.  
-[[ -z "$WAN_IP" ] 88\  
-WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \ -f 1`  
-# Bail out with error message if no IP available! Default policy is  
-# already set, so all is not lost here.  
-[[ -z "$WAN_IP" ] 88 echo "$WAN_IFACE not configured, aborting." 88 exit 1  
-WAN_MASK=`ifconfig $WAN_IFACE | grep Mask | cut -d : -f 4`  
-WAN_NET="$WAN_IP/$WAN_MASK"  
-## Reserved IPs:  
-#  
-# We should never see these private addresses coming in from outside  
-# to our external interface.  
-$IPCHAINS -A input -l -i $WAN_IFACE -s 10.../8 -j DENY  
-$IPCHAINS -A input -l -i $WAN_IFACE -s 172.16../12 -j DENY  
-$IPCHAINS -A input -l -i $WAN_IFACE -s 192.168../16 -j DENY  
-$IPCHAINS -A input -l -i $WAN_IFACE -s 127.../8 -j DENY  
-$IPCHAINS -A input -l -i $WAN_IFACE -s 169.254../16 -j DENY  
-$IPCHAINS -A input -l -i $WAN_IFACE -s 224.../4 -j DENY  
-$IPCHAINS -A input -l -i $WAN_IFACE -s 240.../5 -j DENY  
-# Bogus routing  
-$IPCHAINS -A input -l -s 255.255.255.255 -d $ANYWHERE -j DENY  
-## LAN access and masquerading  
-#  
-# Allow connections from our own LAN's private IP addresses via the LAN  
-# interface and set up forwarding for masqueraders if we have a LAN_NET  
-# defined above.  
-if [[ -n "$LAN_NET" ]; then  
-echo 1 b /proc/sys/net/ipv4/ip_forward  
-$IPCHAINS -A input -i $LAN_IFACE -j ACCEPT  
-$IPCHAINS -A forward -s $LAN_NET -d $LAN_NET -j ACCEPT  
-$IPCHAINS -A forward -s $LAN_NET -d ! $LAN_NET -j MASQ  
-fi  
-## Blacklist hosts/nets  
-#  
-# Get the blacklisted hosts/nets out of the way, before we start opening  
-# up any services. These will have no access to us at all, and will be  
-# logged.  
-for i in $BLACKLIST; do  
-$IPCHAINS -A input -l -s $i -j DENY  
-done  
-## Trusted hosts/nets  
-#  
-# This is our trusted host list. These have access to everything.  
-for i in $TRUSTED; do  
-$IPCHAINS -A input -s $i -j ACCEPT  
-done  
-# Port Forwarding  
-#  
-# Which ports get forwarded to which host. This is one to one  
-# port mapping (ie 80 -b 80) in this case.  
-# NOTE: ipmasqadm is a separate package from ipchains and needs  
-# to be installed also. Check first!  
-[[ -n "$FORWARD_HOST" ] 88 ipmasqadm portfw -f 88\  
-for i in $FORWARD_PORTS; do  
-ipmasqadm portfw -a -P tcp -L $WAN_IP $i -R $FORWARD_HOST $i  
-done  
-## Open, but Restricted Access ports/services  
-#  
-# Allow DHCP server (their port 67) to client (to our port 68) UDP traffic  
-# from outside source.  
-[[ -n "$DHCP_SERVER" ] 88\  
-$IPCHAINS -A input -p udp -s $DHCP_SERVER 67 -d $ANYWHERE 68 -j ACCEPT  
-# Allow 'identd' (to our TCP port 113) from mail server only.  
-[[ -n "$MAIL_SERVER" ] 88\  
-$IPCHAINS -A input -p tcp -s $MAIL_SERVER -d $WAN_IP 113 -j ACCEPT  
-# Open up PUBLIC server ports here (available to the world):  
-for i in $PUBLIC_PORTS; do  
-$IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP $i -j ACCEPT  
-done  
-# So I can check my home POP3 mailbox from work. Also, so I can ssh  
-# in to home system. Only allow connections from my workplace's  
-# various IPs. Everything else is blocked.  
-$IPCHAINS -A input -p tcp -s 255.10.9.8/29 -d $WAN_IP 110 -j ACCEPT  
-# Uncomment to allow ftp data back (active ftp). Not required for 'passive'  
-# ftp connections.  
-#$IPCHAINS -A input -p tcp -s $ANYWHERE 20 -d $WAN_IP $LOCAL_PORTS -y -j ACCEPT  
-# Accept non-SYN TCP, and UDP connections to LOCAL_PORTS. These are  
-# the high, unprivileged ports (1024 to 4999 by default). This will  
-# allow return connection traffic for connections that we initiate  
-# to outside sources. TCP connections are opened with 'SYN' packets.  
-# We have already opened those services that need to accept SYNs  
-# for, so other SYNs are excluded here for everything else.  
-$IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS ! -y -j ACCEPT  
-# We can't be so selective with UDP since that protocol does not know  
-# about SYNs.  
-$IPCHAINS -A input -p udp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS -j ACCEPT  
-# Allow access to the masquerading ports conditionally. Masquerading  
-# uses it's own port range -- on 2.2 kernels ONLY! 2.4 kernels, do not  
-# use these ports, so comment out!  
-[[ -n "$LAN_NET" ] 88\  
-$IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP 61000: ! -y -j ACCEPT 88\  
-$IPCHAINS -A input -p udp -s $ANYWHERE -d $WAN_IP 61000: -j ACCEPT  
-## ICMP (ping)  
-#  
-# ICMP rules, allow the bare essential types of ICMP only. Ping  
-# request is blocked, ie we won't respond to someone else's pings,  
-# but can still ping out.  
-$IPCHAINS -A input -p icmp --icmp-type echo-reply \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-$IPCHAINS -A input -p icmp --icmp-type destination-unreachable \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-$IPCHAINS -A input -p icmp --icmp-type time-exceeded \  
--s $ANYWHERE -i $WAN_IFACE -j ACCEPT  
-#######################################################################  
-# Set the catchall, default rule to DENY, and log it all. All other  
-# traffic not allowed by the rules above, winds up here, where it is  
-# blocked and logged. This is the default policy for this chain  
-# anyway, so we are just adding the logging ability here with '-l'.  
-# Outgoing traffic is allowed as the default policy for the 'output'  
-# chain. There are no restrictions on that.  
-$IPCHAINS -A input -l -j DENY  
-echo "Ipchains firewall is up `date`."  
-##-- eof ipchains.sh  
-  
-  
-----  
-!8.10.2. iptables II  
-  
-  
-#!/bin/sh  
-#  
-# iptables.sh  
-#  
-# An example of a simple iptables configuration. This script  
-# can enable 'masquerading' and will open user definable ports.  
-#  
-###################################################################  
-# Begin variable declarations and user configuration options ######  
-#  
-# Set the location of iptables (default).  
-IPTABLES=/sbin/iptables  
-# Local Interfaces  
-# This is the WAN interface that is our link to the outside world.  
-# For pppd and pppoe users.  
-# WAN_IFACE="ppp0"  
-WAN_IFACE="eth0"  
-#  
-# Local Area Network (LAN) interface.  
-#LAN_IFACE="eth0"  
-LAN_IFACE="eth1"  
-# Our private LAN address(es), for masquerading.  
-LAN_NET="192.168.1./24"  
-# For static IP, set it here!  
-#WAN_IP="1.2.3.4"  
-# Set a list of public server port numbers here...not too many!  
-# These will be open to the world, so use caution. The example is  
-# sshd, and HTTP (www). Any services included here should be the  
-# latest version available from your vendor. Comment out to disable  
-# all Public services. Do not put any ports to be forwarded here,  
-# this only direct access.  
-#PUBLIC_PORTS="22 80 443"  
-PUBLIC_PORTS="22"  
-# If we want to do port forwarding, this is the host  
-# that will be forwarded to.  
-#FORWARD_HOST="192.168.1.3"  
-# A list of ports that are to be forwarded.  
-#FORWARD_PORTS="25 80"  
-# If you get your public IP address via DHCP, set this.  
-DHCP_SERVER=66.21.184.66  
-# If you need identd for a mail server, set this.  
-MAIL_SERVER=  
-# A list of unwelcome hosts or nets. These will be denied access  
-# to everything, even our 'Public' services. Provide your own list.  
-#BLACKLIST="11.22.33.44 55.66.77.88"  
-# A list of "trusted" hosts and/or nets. These will have access to  
-# ALL protocols, and ALL open ports. Be selective here.  
-#TRUSTED="1.2.3.4/8 5.6.7.8"  
-## end user configuration options #################################  
-###################################################################  
-# Any and all addresses from anywhere.  
-ANYWHERE="/"  
-# These modules may need to be loaded:  
-modprobe ip_conntrack_ftp  
-modprobe ip_nat_ftp  
-# Start building chains and rules #################################  
-#  
-# Let's start clean and flush all chains to an empty state.  
-$IPTABLES -F  
-$IPTABLES -X  
-# Set the default policies of the built-in chains. If no match for any  
-# of the rules below, these will be the defaults that IPTABLES uses.  
-$IPTABLES -P FORWARD DROP  
-$IPTABLES -P OUTPUT ACCEPT  
-$IPTABLES -P INPUT DROP  
-# Accept localhost/loopback traffic.  
-$IPTABLES -A INPUT -i lo -j ACCEPT  
-# Get our dynamic IP now from the Inet interface. WAN_IP will be the  
-# address we are protecting from outside addresses.  
-[[ -z "$WAN_IP" ] 88\  
-WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \ -f 1`  
-# Bail out with error message if no IP available! Default policy is  
-# already set, so all is not lost here.  
-[[ -z "$WAN_IP" ] 88 echo "$WAN_IFACE not configured, aborting." 88 exit 1  
-WAN_MASK=`ifconfig $WAN_IFACE |grep Mask |cut -d : -f 4`  
-WAN_NET="$WAN_IP/$WAN_MASK"  
-## Reserved IPs:  
-#  
-# We should never see these private addresses coming in from outside  
-# to our external interface.  
-$IPTABLES -A INPUT -i $WAN_IFACE -s 10.../8 -j DROP  
-$IPTABLES -A INPUT -i $WAN_IFACE -s 172.16../12 -j DROP  
-$IPTABLES -A INPUT -i $WAN_IFACE -s 192.168../16 -j DROP  
-$IPTABLES -A INPUT -i $WAN_IFACE -s 127.../8 -j DROP  
-$IPTABLES -A INPUT -i $WAN_IFACE -s 169.254../16 -j DROP  
-$IPTABLES -A INPUT -i $WAN_IFACE -s 224.../4 -j DROP  
-$IPTABLES -A INPUT -i $WAN_IFACE -s 240.../5 -j DROP  
-# Bogus routing  
-$IPTABLES -A INPUT -s 255.255.255.255 -d $ANYWHERE -j DROP  
-# Unclean  
-$IPTABLES -A INPUT -i $WAN_IFACE -m unclean -m limit \  
---limit 15/minute -j LOG --log-prefix "Unclean: "  
-$IPTABLES -A INPUT -i $WAN_IFACE -m unclean -j DROP  
-## LAN access and masquerading  
-#  
-# Allow connections from our own LAN's private IP addresses via the LAN  
-# interface and set up forwarding for masqueraders if we have a LAN_NET  
-# defined above.  
-if [[ -n "$LAN_NET" ]; then  
-echo 1 b /proc/sys/net/ipv4/ip_forward  
-$IPTABLES -A INPUT -i $LAN_IFACE -j ACCEPT  
-# $IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_NET -d $LAN_NET -j ACCEPT  
-$IPTABLES -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IFACE -j MASQUERADE  
-fi  
-## Blacklist  
-#  
-# Get the blacklisted hosts/nets out of the way, before we start opening  
-# up any services. These will have no access to us at all, and will  
-# be logged.  
-for i in $BLACKLIST; do  
-$IPTABLES -A INPUT -s $i -m limit --limit 5/minute \  
--j LOG --log-prefix "Blacklisted: "  
-$IPTABLES -A INPUT -s $i -j DROP  
-done  
-## Trusted hosts/nets  
-#  
-# This is our trusted host list. These have access to everything.  
-for i in $TRUSTED; do  
-$IPTABLES -A INPUT -s $i -j ACCEPT  
-done  
-# Port Forwarding  
-#  
-# Which ports get forwarded to which host. This is one to one  
-# port mapping (ie 80 -b 80) in this case.  
-[[ -n "$FORWARD_HOST" ] 88\  
-for i in $FORWARD_PORTS; do  
-$IPTABLES -A FORWARD -p tcp -s $ANYWHERE -d $FORWARD_HOST \  
---dport $i -j ACCEPT  
-$IPTABLES -t nat -A PREROUTING -p tcp -d $WAN_IP --dport $i \  
--j DNAT --to $FORWARD_HOST:$i  
-done  
-## Open, but Restricted Access ports  
-#  
-# Allow DHCP server (their port 67) to client (to our port 68) UDP  
-# traffic from outside source.  
-[[ -n "$DHCP_SERVER" ] 88\  
-$IPTABLES -A INPUT -p udp -s $DHCP_SERVER --sport 67 \  
--d $ANYWHERE --dport 68 -j ACCEPT  
-# Allow 'identd' (to our TCP port 113) from mail server only.  
-[[ -n "$MAIL_SERVER" ] 88\  
-$IPTABLES -A INPUT -p tcp -s $MAIL_SERVER -d $WAN_IP --dport 113 -j ACCEPT  
-# Open up Public server ports here (available to the world):  
-for i in $PUBLIC_PORTS; do  
-$IPTABLES -A INPUT -p tcp -s $ANYWHERE -d $WAN_IP --dport $i -j ACCEPT  
-done  
-# So I can check my home POP3 mailbox from work. Also, so I can ssh  
-# in to home system. Only allow connections from my workplace's  
-# various IPs. Everything else is blocked.  
-$IPTABLES -A INPUT -p tcp -s 255.10.9.8/29 -d $WAN_IP --dport 110 -j ACCEPT  
-## ICMP (ping)  
-#  
-# ICMP rules, allow the bare essential types of ICMP only. Ping  
-# request is blocked, ie we won't respond to someone else's pings,  
-# but can still ping out.  
-$IPTABLES -A INPUT -p icmp --icmp-type echo-reply \  
--s $ANYWHERE -d $WAN_IP -j ACCEPT  
-$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable \  
--s $ANYWHERE -d $WAN_IP -j ACCEPT  
-$IPTABLES -A INPUT -p icmp --icmp-type time-exceeded \  
--s $ANYWHERE -d $WAN_IP -j ACCEPT  
-# Identd Reject  
-#  
-# Special rule to reject (with rst) any identd/auth/port 113  
-# connections. This will speed up some services that ask for this,  
-# but don't require it. Be careful, some servers may require this  
-# one (IRC for instance).  
-#$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset  
-###################################################################  
-# Build a custom chain here, and set the default to DROP. All  
-# other traffic not allowed by the rules above, ultimately will  
-# wind up here, where it is blocked and logged, unless it passes  
-# our stateful rules for ESTABLISHED and RELATED connections. Let  
-# connection tracking do most of the worrying! We add the logging  
-# ability here with the '-j LOG' target. Outgoing traffic is  
-# allowed as that is the default policy for the 'output' chain.  
-# There are no restrictions placed on that in this script.  
-# New chain...  
-$IPTABLES -N DEFAULT  
-# Use the 'state' module to allow only certain connections based  
-# on their 'state'.  
-$IPTABLES -A DEFAULT -m state --state ESTABLISHED,RELATED -j ACCEPT  
-$IPTABLES -A DEFAULT -m state --state NEW -i ! $WAN_IFACE -j ACCEPT  
-# Enable logging for anything that gets this far.  
-$IPTABLES -A DEFAULT -j LOG -m limit --limit 30/minute --log-prefix "Dropping: "  
-# Now drop it, if it has gotten here.  
-$IPTABLES -A DEFAULT -j DROP  
-# This is the 'bottom line' so to speak. Everything winds up  
-# here, where we bounce it to our custom built 'DEFAULT' chain  
-# that we defined just above. This is for both the FORWARD and  
-# INPUT chains.  
-$IPTABLES -A FORWARD -j DEFAULT  
-$IPTABLES -A INPUT -j DEFAULT  
-echo "Iptables firewall is up `date`."  
-##-- eof iptables.sh  
-  
-  
-----  
-!8.10.3. Summary  
-  
- A quick run down of the some highlights...  
-  
-  
-  
- We added some host based access control rules: "blacklisted",  
-and "trusted". We then showed several types of service  
-and port based access rules. For instance, we allowed some very restrictive  
-access to bigcat's POP3 server so we could connect  
-only from our workplace. We allowed a very narrow rule for the ISP's DHCP  
-server. This rule only allows one port on one outside IP address to connect  
-to only one of our ports and only via the UDP protocol. This is a very  
-specific rule! We are being specific since there is no reason to allow any  
-other traffic to these ports or from these addresses. Remember our goal is  
-the minimum amount of traffic necessary for our particular situation.   
-  
-  
-  
- So we made those few exceptions mentioned above, and all other services  
-running on bigcat should be effectively blocked completely from outside  
-connections. These are still happily running on bigcat, but are now safe and  
-sound behind our packet filtering firewall. You probably have other services  
-that fall in this category as well.  
-  
-  
-  
- We also have a small, home network in the above example. We did not take any  
-steps to block that traffic. So the LAN has access to all services running on  
-bigcat. And it is further "masqueraded", so that it has Internet  
-access (different HOWTO), by manipulating the "forward" chain.  
-And the LAN is still protected by our firewall since it sits behind the  
-firewall. We also didn't impose any restrictive rules on the traffic leaving  
-bigcat. In some situations, this might be a good idea.   
-  
-  
-  
- Of course, this is just a hypothetical example. Your individual situation is  
-surely different, and would require some changes and likely some additions to  
-the rules above. For instance, if your ISP does not use DHCP (most do not),  
-then that rule would make no sense. PPP works  
-differently and such rules are not needed.  
-  
-  
-  
-  
- Please don't interpret that running any server as we did in this example is  
-necessarily a "safe" thing to do. We shouldn't do it this way  
-unless a) we really need to and b) we are running the current, safe version,  
-and c) we are able to keep abreast of security related issues that might  
-effect these services. Vigilance and caution are part of our responsibilities  
-here too.  
-  
-  
-----  
-!8.10.4. iptables mini-me  
-  
- Just to demonstrate how succinctly iptables can be  
-configured in a minimalist situation, the below is from the Netfilter team's  
-''Rusty's Really Quick Guide To Packet Filtering'':  
-  
-  
-  
- "Most people just have a single PPP connection to the Internet, and  
-don't want anyone coming back into their network, or the firewall:"  
-  
-  
-  
-  
- ## Insert connection-tracking modules (not needed if built into kernel).  
-insmod ip_conntrack  
-insmod ip_conntrack_ftp  
-## Create chain which blocks new connections, except if coming from inside.  
-iptables -N block  
-iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT  
-iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT  
-iptables -A block -j DROP  
-## Jump to that chain from INPUT and FORWARD chains.  
-iptables -A INPUT -j block  
-iptables -A FORWARD -j block  
-  
-  
-  
-  
- This simple script will allow all outbound connections that we initiate, i.e.  
-any NEW connections (since the default policy of  
-ACCEPT is not changed). Then any connections that are  
-"ESTABLISHED" and "RELATED" to these are also  
-allowed. And, any connections that are not incoming from our WAN side  
-interface, ppp0, are also allowed. This would be lo or  
-possibly a LAN interface like eth1. So we can do whatever we want, but no  
-unwanted, incoming connection attempts are allowed from the Internet. None.  
-  
-  
-  
- This script also demonstrates the creation of a custom chain, defined here  
-as "block", which is used both for the INPUT and FORWARD  
-chains
+Describe [HowToSecurityQuickstartHOWTO ] here.