当一个系统被用作公开网络的服务器时,这个系统就成为被攻击的目标。对网络服务进行访问控制,是一个服务器管理员面临的最重要的安全任务之一,例如,Linux内核使用一个基于iptables的防火墙来将不受欢迎的网络数据包过滤在内核网络之外。对于使用这种防火墙的网络服务,TCP Wrappers又增加了一层保护,这层保护通过定义哪些主机允许或不允许连接到”wrapped”网络服务上来实现.大多数现代网络服务系统,像SSH,Telnet和FTP,都可以利用Xinetd进程服务来管理,这个Xinetd被称为超级守护进程,在这个服务里可以直接设置访问控制,从而在网络层可以进行三层防护。
1.iptables网络防护
你可以用命令添加的方式一条一条增加规则,也可以直接编辑文件。
vim /etc/iptables.firewall.rules
*filter
# Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn’t use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT
# Accept all established inbound connections
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# Allow all outbound traffic – you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp –dport 80 -j ACCEPT
-A INPUT -p tcp –dport 443 -j ACCEPT
# Allow SSH connections
#
# The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state –state NEW –dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -j ACCEPT
# Log iptables denied calls
-A INPUT -m limit –limit 5/min -j LOG –log-prefix “iptables denied: ” –log-level 7
# Drop all other inbound – default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP
COMMIT
读取防火墙规则使其生效:
iptables-restore < /etc/iptables.firewall.rules
这些规则将允许以下的服务和端口:HTTP(80),HTTPS(443),SSH(22)和ping功能,其他访问将被拒绝。
2.Tcp wrappers访问控制
Tcp wrapper:又叫TCPD网络资源访问控制器,工作在TCP层,通常情况下只能对基于TCP协议的某些访问做控制的,其实它对应的是一个库文件,由glibc提供的,工作于用户空间用户请求之间。
客户端–>iptables–>TCP_wrapper–>Service本身的访问控制
如果客户端IP通过了iptables防火墙后想访问我们的服务器资源,这时将会按照以下步骤判断:
当某个ip想访问你的Linux下的特定服务时,系统首先会检查/etc/hosts.alllow文件,如是有的话就放行,
没有的话继续检查/etc/hosts.deny文件,有的话拒绝,没有的就放行,不过一般的做法就直接在/etc/hosts.allow里放允许通行的ip,/etc/hosts.deny里放不允许通行的ip。
检查一个服务是否受tcp wrapper控制,如telent:
#ldd `which in.telnetd` | grep “libwrap.so”
有些程序在编译时是通过静态的方式链接库,用如下命令检查:
#strings `which in.telnetd` | grep hosts
如果要控制访问,编辑/etc/hosts.allow,/etc/hosts.deny文件,格式为,程序名:主机网络。
如对telnet,允许192.168.1.网段访问,但是主机192.168.1.100除外
in.telnetd: 192.168.1. EXCEPT 192.168.1.100
还可以记录访问日志
in.telnetd: 192.168.1. :spawn echo “connect `date`” >>/var/log/tcpwrapper.log
记住规则生效顺序:
/etc/hosts.allow –> /etc/hosts.deny –> 默认规则(allow)
3.Xinetd超级守护进程访问控制
在linux中服务有两类:独立守护进程和瞬时守护进程。
独立守护进程,自己管理自己,不受其他的限制与影响,响应速度快。比如httpd。
瞬时守护进程又称非独立守护进程:按需启动,无需关闭,节省资源。比如Xinetd。
当客户端试图连接到由xinetd控制的网络服务,超级服务接收请求,并检查是否有TCP封装的访问控制规则。
通过编辑两个配置文件,以telnet为例:
/etc/xinetd.conf — 全局配置文件
defaults
{
instances = 60 ; 能处理的最大的并发请求数
log_type = SYSLOGauthpriv ; 记录日志类型
log_on_success = HOST PID ; 记录成功连接的主机iP和进程id
log_on_failure = HOST ; 记录失败连接的主机ip
cps = 25 30 ; 允许任何给定服务每秒25次连接,超过则禁用30秒
}
includedir /etc/xinetd.d
/etc/xinetd.d/ — 对应服务的配置文件
service telnet
{
disable = no ; 启用
flags = REUSE ; 连接属性为REUSE套接字
socket_type = stream ; 套接字类型为strem
wait = no ; 指定服务为多线程,yes为单线程
user = root ; 指定服务的用户为root
server = /usr/sbin/in.telnetd ; 服务的可执行程序
only_from = 172.16.0.0/16 ; 仅允许176.16网段访问
log_on_failure += USERID ; 登陆失败记录用户id
no_access = 172.16.45.0/24 ; 不允许访172.16.45网段访问
log_on_success += PID HOST EXIT ; 登陆成功记录主机ID,主机名,直到登出信息
access_times = 09:45-16:15 ; 可以访问的时间段
bind = 172.16.100.1 ; 只允许网卡ip为172.16.100.1访问
per_source = 1 ; 每个ip每次只能访问一个服务
cps = 10 60 ; 每秒10次,超过禁用60秒,和全局那个范围小取那个
banner =/etc/telnet.banner ; 设置登陆欢迎信息
}
通过防火墙,即TCP wrapper访问过滤,加上SELinux安全控制机制,加上文件权限等访问控制,让Linux系统安全性得到极大的提升!