We will now perform some of the processes described above on a Debian system, to improve the security configuration.
First we will examine what our machine offers the network. In order to do this, we will use the nmap tool as a port scanner. With the command (from the root):
nmap -sTU -O localhost
root@machine:˜# nmap -sUT -O localhost starting nmap 3.27 (www.insecure.org/nmap/) at 2003-09-17 11:31 CEST Interesting ports on localhost (127.0.0.1):
(The 3079 ports scanned but not shown below are in state: closed)
Remote operating system guess: Linux kernel 2.4.0-2.5.20 Uptime 2.011 days (since Mon Sep 15 11:14:57 2003) Nmap run completed --1 IP address (1 host up) scanned in 9.404 seconds
We can see that a high number of open services have been detected (depending on the machine, there may be more: telnet, FTP, finger...), in both transmission control protocol (TCP) and user datagram protocol (UDP). Some services, such as discard, daytime, time may be useful on occasion, but they should not normally be open to the network, as they are considered non-secure. SMTP is the resending and routing service, for mail; if we are acting as the host or mail server, this would have to be active; but if we are only reading and writing emails through POP3 or IMAP accounts, this doesn't necessarily have to be active.
Another method for detecting active services would be by searching active listening ports, which can be achieved with netstat -lut command.
The nmap command can also be applied with the DNS or IP name of the machine; this shows us how the system looks from the exterior (with localhost, we see what the actual machine can see), or, better still, we could even use a machine of an external network (for example, any PC connected to the Internet) to examine what could be seen in our machine from outside.
We will now go to /etc/inetd.conf to deactivate these services. We should look for lines such as:
discard stream tcp nowait root internal smtp stream tcp nowait mail /usr/sbin/exim exim –bs
and we type a number symbol (#) at the beginning of the line (only in the services that we wish to deactivate and when we know what they are really doing (check pages of man as deactivating them has been recommended). Another case of recommended deactivation would be that of the ftp, telnet, finger services and we should use ssh to replace them.
Now we have to reboot inetd so that it rereads the configuration that we have changed: /etc/init.d/inetd restart.
We return to nmap:
From what is left, we have the ssh service, which we wish to leave active, and the web server, which we will stop for the moment:
ipp is the printing service associated to CUPS. In the local administration section we saw that there was a CUPS web interface that connected to port 631. If we wish to have an idea of what a specific port is doing, we can look in /etc/services:
root@machine:# grep 631 /etc/services ipp 631/tcp # Internet Printing Protocol ipp 631/udp # Internet Printing Protocol
If we are not acting as the printing server to the exterior, we have to go to the CUPS configuration and eliminate this feature (for example, by placing a listen 127.0.0.1:631, so that only the local machine listens), or limit the access to the permitted machines.
Some other ports also appear as unknown, in this case, ports 728 and 734; this indicates that the system has not been able to determine which nmap is associated to the port. We will try to see it ourselves. For this, we can execute the netstat command on the system, which offers different statistics on the network system, from the packets sent and received and errors to the elements in which we are interested, which are the open connections and who is using them. We will try to find out who is using the unknown ports:
root@machine:˜# netstat -anp | grep 728 udp 0 0 0.0.0.0:728 0.0.0.0:* 552/rpc.statd
And if we do the same with port 734, we can see that it was rpc.statd that opened the port; rpc.statd is a daemon associated to NFS (in this case, the system has an NFS server). If we repeat this process with ports 111, which appeared as sunrpc, we will see that the daemon that is behind is portmap, which is used in the remote procedure call system (RPC). The RPC system permits users to use the remote calls between two processes that are on different machines. portmap is a daemon that converts the calls that arrive at the port to the internal RPC services numbers and it is used by different servers such as NFS, NIS, NIS+.
The RPC services offered can be seen with the rpcinfo command:
root@machine:˜# rpcinfo -p
where we see the RPC services with some of the ports that had already been detected. Another command that may be useful is lsof, which, among other functions, makes it possible to relate ports with the services that have opened them (for example: lsof -i | grep 731).
The portmap daemon is somewhat critical with regard to security, as, in principle, it does not offer the client authentication mechanisms, as this is supposedly delegated to the service (NFS, NIS...). Consequently, portmap could be subjected to DoS attacks that could cause faults in the services or cause downtime. We usually protect portmap using some kind of wrapper and/or firewall. If we do not use these and we do not intend to use the NFS and NIS services, the best thing to do is to completely deactivate portmap, removing it from the runlevel on which it activates. We can also stop them momentarily with the following scripts (in Debian):
/etc/init.d/nfs-common /etc/init.d/nfs-kernel-server /etc/init.d/portmap
by entering the stop parameter to stop the RPC services (in this case NFS).
We will then control the security in the base using a simple wrapper. Let us suppose that we wish to let a specific machine pass through ssh, which we will call 220.127.116.11 (IP address). We will close portmap to the exterior, as we do not have NIS and we have an NFS server but we are not serving anything (we could close it, but we will leave it for future use). We will create a wrapper (we are assuming that the TCP wrappers are already installed) modifying the files hosts.deny -j allow. In /etc/hosts.deny:
ALL : ALL : spawn (/usr/sbin/safe_finger -l @%h \ | /usr/bin/mail -s "%c FAILED ACCESS TO %d!!" root) &
we are denying all of the services (be careful, some of them are related to inetd) (primer all), and the next step to take will be to find out who has requested the service and from what machine and we will send an email message to the root user reporting the attempt. We could also write a log file... Now, in /etc/hosts.allow:
we enable access for the IP 18.104.22.168 machine in the sshd server (of the ssh). We could also enter the access to portmap, all we would need is a portmap line: la_ip. We can enter a list of machines or subnets that can use the service (see man hosts.allow). Remember that we also have the tcpdchk command to check that the configuration of the wrapper is correct and the tcpdmatch command to simulate what would happen with a specific attempt, for example:
root@machine:˜# tcpdmatch sshd 22.214.171.124
warning: sshd: no such process name in /etc/inetd.conf client: hostname machine.domain.es client: address 126.96.36.199 server: process sshd matched: /etc/hosts.allow line 13 access: grantedv
tells us that access would be provided. One detail is that it tells us that sshd is not in inetd.conf and, if we verify it, we see that it is not: it is not activated by the inetd server, but by the daemon in the runlevel on which we are operating. Besides, in Debian, this is a daemon that is compiled with the included wrapper libraries (which does not therefore require tcpd to work). In Debian, there are various daemons such as: ssh, portmap, in.talk, rpc.statd, rpc.mountd, among others. This allows us to secure these daemons using wrappers.
Another question that should be verified concerns the existing current connections. With the netstat -utp command, we can list the tcp, udp connections established with the exterior, whether they are incoming or outgoing; therefore, at any time, we can detect the connected clients and who we are connected to. Another important command (with multiple functions) is lsof, which can relate open files with established processes or connections on the network through lsof -i, which helps to detect any inappropriate accesses to files.
We could also use a firewall for similar processes (or as an added mechanism). We will begin by seeing how the rules of the firewall are at this time: (iptables -L command)
root@aopcjj:˜# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
In other words, the firewall is not placing any restrictions at this time and all the packets can be sent, received and resent.
At this point, we could add a firewall that would provide better management of the packets that we receive and send, and which would be a preliminary control for improving security. Depending on our needs, we would establish the necessary rules similarly to the firewall examples provided in this unit.
If we set up the firewalls, we can consider whether to use this mechanism as a single security element and remove the wrappers: this could be done, because the firewalls (in this case through iptables) offer a very powerful feature that allows us to follow up a packet by type, protocol and by what it is doing in the system. A good firewall could be enough, but, to be on the safe side, more security measures will always be helpful. And if the firewall were not well designed and let some packets escape, the wrapper would be the level-service measure for stopping any non-desired accesses. To offer a metaphor that is often used, if we consider our system to be like a medieval castle that must be defended, the moat and the front walls would be the firewall, and the second containment wall would be the wrapper.