> CentOS > CentOS安全 >

阿里云CentOS服务器安全设置

1、开启云盾所有服务

 

 

 

2、通过防火墙策略限制对外扫描行为

 

请您根据您的服务器操作系统,下载对应的脚本运行,运行后您的防火墙策略会封禁对外发包的行为,确保您的主机不会再出现恶意发包的情况,为您进行后续数据备份操作提供足够的时间。

Window2003的批处理文件下载地址:http://oss.aliyuncs.com/aliyunecs/windows2003_drop_port.bat

 

Window2008的批处理文件下载地址:http://oss.aliyuncs.com/aliyunecs/windows2008_drop_port.bat

Linux系统脚本:http://oss.aliyuncs.com/aliyunecs/linux_drop_port.sh

 

上述文件下载到机器内部直接执行即可。

 

文件内容如下:

 

  1. #!/bin/bash  
  2. #########################################  
  3. #Function:    linux drop port  
  4. #Usage:       bash linux_drop_port.sh  
  5. #Author:      Customer Service Department  
  6. #Company:     Alibaba Cloud Computing  
  7. #Version:     2.0  
  8. #########################################  
  9.    
  10. check_os_release()  
  11. {  
  12.  while true  
  13.   do  
  14.    os_release=$(grep "Red Hat Enterprise Linux Server release"/etc/issue 2>/dev/null)  
  15.    os_release_2=$(grep "Red Hat Enterprise Linux Server release"/etc/redhat-release 2>/dev/null)  
  16.    if [ "$os_release" ] && [ "$os_release_2" ]  
  17.    then  
  18.      if echo "$os_release"|grep "release 5" >/dev/null2>&1  
  19.      then  
  20.        os_release=redhat5  
  21.        echo "$os_release"  
  22.      elif echo "$os_release"|grep "release 6">/dev/null 2>&1  
  23.      then  
  24.        os_release=redhat6  
  25.        echo "$os_release"  
  26.      else  
  27.        os_release=""  
  28.        echo "$os_release"  
  29.      fi  
  30.      break  
  31.    fi  
  32.    os_release=$(grep "Aliyun Linux release" /etc/issue2>/dev/null)  
  33.    os_release_2=$(grep "Aliyun Linux release" /etc/aliyun-release2>/dev/null)  
  34.    if [ "$os_release" ] && [ "$os_release_2" ]  
  35.    then  
  36.      if echo "$os_release"|grep "release 5" >/dev/null2>&1  
  37.      then  
  38.        os_release=aliyun5  
  39.        echo "$os_release"  
  40.      elif echo "$os_release"|grep "release 6">/dev/null 2>&1  
  41.      then  
  42.        os_release=aliyun6  
  43.        echo "$os_release"  
  44.      else  
  45.        os_release=""  
  46.        echo "$os_release"  
  47.      fi  
  48.      break  
  49.    fi  
  50.    os_release=$(grep "CentOS release" /etc/issue 2>/dev/null)  
  51.    os_release_2=$(grep "CentOS release" /etc/*release2>/dev/null)  
  52.    if [ "$os_release" ] && [ "$os_release_2" ]  
  53.    then  
  54.      if echo "$os_release"|grep "release 5" >/dev/null2>&1  
  55.      then  
  56.        os_release=centos5  
  57.         echo "$os_release"  
  58.      elif echo "$os_release"|grep "release 6">/dev/null 2>&1  
  59.      then  
  60.        os_release=centos6  
  61.        echo "$os_release"  
  62.      else  
  63.        os_release=""  
  64.        echo "$os_release"  
  65.      fi  
  66.      break  
  67.    fi  
  68.    os_release=$(grep -i "ubuntu" /etc/issue 2>/dev/null)  
  69.    os_release_2=$(grep -i "ubuntu" /etc/lsb-release2>/dev/null)  
  70.    if [ "$os_release" ] && [ "$os_release_2" ]  
  71.    then  
  72.      if echo "$os_release"|grep "Ubuntu 10" >/dev/null2>&1  
  73.      then  
  74.         os_release=ubuntu10  
  75.        echo "$os_release"  
  76.      elif echo "$os_release"|grep "Ubuntu 12.04">/dev/null 2>&1  
  77.      then  
  78.        os_release=ubuntu1204  
  79.        echo "$os_release"  
  80.      elif echo "$os_release"|grep "Ubuntu 12.10">/dev/null 2>&1  
  81.       then  
  82.        os_release=ubuntu1210  
  83.        echo "$os_release"  
  84.      else  
  85.        os_release=""  
  86.        echo "$os_release"  
  87.      fi  
  88.      break  
  89.    fi  
  90.    os_release=$(grep -i "debian" /etc/issue 2>/dev/null)  
  91.    os_release_2=$(grep -i "debian" /proc/version 2>/dev/null)  
  92.    if [ "$os_release" ] && [ "$os_release_2" ]  
  93.    then  
  94.      if echo "$os_release"|grep "Linux 6" >/dev/null2>&1  
  95.      then  
  96.        os_release=debian6  
  97.        echo "$os_release"  
  98.      else  
  99.         os_release=""  
  100.        echo "$os_release"  
  101.      fi  
  102.      break  
  103.    fi  
  104.    os_release=$(grep "openSUSE" /etc/issue 2>/dev/null)  
  105.    os_release_2=$(grep "openSUSE" /etc/*release 2>/dev/null)  
  106.    if [ "$os_release" ] && [ "$os_release_2" ]  
  107.    then  
  108.       if echo "$os_release"|grep"13.1" >/dev/null 2>&1  
  109.      then  
  110.        os_release=opensuse131  
  111.        echo "$os_release"  
  112.      else  
  113.        os_release=""  
  114.        echo "$os_release"  
  115.      fi  
  116.      break  
  117.    fi  
  118.    break  
  119.    done  
  120. }  
  121.    
  122. exit_script()  
  123. {  
  124.  echo -e "\033[1;40;31mInstall $1 error,will exit.\n\033[0m"  
  125.   rm-f $LOCKfile  
  126.  exit 1  
  127. }  
  128.    
  129. config_iptables()  
  130. {  
  131.  iptables -I OUTPUT 1 -p tcp -m multiport --dport21,22,23,25,53,80,135,139,443,445 -j DROP  
  132.  iptables -I OUTPUT 2 -p tcp -m multiport --dport 1433,1314,1521,2222,3306,3433,3389,4899,8080,18186-j DROP  
  133.  iptables -I OUTPUT 3 -p udp -j DROP  
  134.  iptables -nvL  
  135. }  
  136.    
  137. ubuntu_config_ufw()  
  138. {  
  139.   ufwdeny out proto tcp to any port 21,22,23,25,53,80,135,139,443,445  
  140.   ufwdeny out proto tcp to any port 1433,1314,1521,2222,3306,3433,3389,4899,8080,18186  
  141.   ufwdeny out proto udp to any  
  142.   ufwstatus  
  143. }  
  144.    
  145. ####################Start###################  
  146. #check lock file ,one time only let thescript run one time  
  147. LOCKfile=/tmp/.$(basename $0)  
  148. if [ -f "$LOCKfile" ]  
  149. then  
  150.  echo -e "\033[1;40;31mThe script is already exist,please next timeto run this script.\n\033[0m"  
  151.  exit  
  152. else  
  153.  echo -e "\033[40;32mStep 1.No lock file,begin to create lock fileand continue.\n\033[40;37m"  
  154.  touch $LOCKfile  
  155. fi  
  156.    
  157. #check user  
  158. if [ $(id -u) != "0" ]  
  159. then  
  160.  echo -e "\033[1;40;31mError: You must be root to run this script,please use root to execute this script.\n\033[0m"  
  161.   rm-f $LOCKfile  
  162.  exit 1  
  163. fi  
  164.    
  165. echo -e "\033[40;32mStep 2.Begen tocheck the OS issue.\n\033[40;37m"  
  166. os_release=$(check_os_release)  
  167. if [ "X$os_release" =="X" ]  
  168. then  
  169.  echo -e "\033[1;40;31mThe OS does not identify,So this script isnot executede.\n\033[0m"  
  170.   rm-f $LOCKfile  
  171.  exit 0  
  172. else  
  173.  echo -e "\033[40;32mThis OS is $os_release.\n\033[40;37m"  
  174. fi  
  175.    
  176. echo -e "\033[40;32mStep 3.Begen toconfig firewall.\n\033[40;37m"  
  177. case "$os_release" in  
  178. redhat5|centos5|redhat6|centos6|aliyun5|aliyun6)  
  179.  service iptables start  
  180.  config_iptables  
  181.   ;;  
  182. debian6)  
  183.  config_iptables  
  184.   ;;  
  185. ubuntu10|ubuntu1204|ubuntu1210)  
  186.   ufwenable <<EOF  
  187. y  
  188. EOF  
  189.  ubuntu_config_ufw  
  190.   ;;  
  191. opensuse131)  
  192.  config_iptables  
  193.   ;;  
  194. esac  
  195.    
  196. echo -e "\033[40;32mConfig firewallsuccess,this script now exit!\n\033[40;37m"  
  197. rm -f $LOCKfile  

 

 

3、设置iptables,限制访问

 

 

 

  1. /sbin/iptables -P INPUT ACCEPT  
  2. /sbin/iptables -F  
  3. /sbin/iptables -X  
  4. /sbin/iptables -Z  
  5.   
  6. /sbin/iptables -A INPUT -i lo -j ACCEPT   
  7. /sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT  
  8. /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT  
  9. /sbin/iptables -A INPUT -p tcp --dport 8080 -j ACCEPT  
  10. /sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT  
  11. /sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT  
  12. /sbin/iptables -P INPUT DROP  
  13.  service iptables save  
以上脚本,在每次重装完系统后执行一次即可,其配置会保存至/etc/sysconfig/iptables

 

此步骤参考http://www.netingcn.com/aliyun-iptables.html

由于作为web服务器来使用,所以对外要开放 80 端口,另外肯定要通过ssh进行服务器管理,22 端口也要对外开放,当然最好是把ssh服务的默认端口改掉,在公网上会有很多人试图破解密码的,如果修改端口,记得要把该端口对外开发,否则连不上就悲剧了。下面提供配置规则的详细说明:

第一步:清空所有规则

当Chain INPUT (policy DROP)时执行/sbin/iptables -F后,你将和服务器断开连接
所有在清空所有规则前把policy DROP该为INPUT,防止悲剧发生,小心小心再小心
/sbin/iptables -P INPUT ACCEPT
清空所有规则
/sbin/iptables -F
/sbin/iptables -X
计数器置0
/sbin/iptables -Z

第二步:设置规则

允许来自于lo接口的数据包,如果没有此规则,你将不能通过127.0.0.1访问本地服务,例如ping 127.0.0.1
/sbin/iptables -A INPUT -i lo -j ACCEPT 

开放TCP协议22端口,以便能ssh,如果你是在有固定ip的场所,可以使用 -s 来限定客户端的ip
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT

开放TCP协议80端口供web服务
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT

10.241.121.15是另外一台服务器的内网ip,由于之间有通信,接受所有来自10.241.121.15的TCP请求
/sbin/iptables -A INPUT -p tcp -s 10.241.121.15 -j ACCEPT

接受ping
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

这条规则参看:http://www.netingcn.com/iptables-localhost-not-access-internet.html
/sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

屏蔽上述规则以为的所有请求,不可缺少,否则防火墙没有任何过滤的功能
/sbin/iptables -P INPUT DROP

可以使用 iptables -L -n 查看规则是否生效

至此防火墙就算配置好,但是这是临时的,当重启iptables或重启机器,上述配置就会被清空,要想永久生效,还需要如下操作:

/etc/init.d/iptables save   
或
service iptables save

执行上述命令可以在文件 /etc/sysconfig/iptables 中看到配置

以下提供一个干净的配置脚本:

/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z

/sbin/iptables -A INPUT -i lo -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -s 10.241.121.15 -j ACCEPT
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
/sbin/iptables -P INPUT DROP 

最后执行 ,先确保ssh连接没有问题,防止规则错误,导致无法连上服务器,因为没有save,重启服务器规则都失效,否则就只有去机房才能修改规则了。也可以参考:ubuntu iptables 配置脚本来写一个脚本。


4、常用网络监控命令

(1) netstat -tunl:查看所有正在监听的端口

  1. [root@AY1407041017110375bbZ ~]# netstat -tunl  
  2. Active Internet connections (only servers)  
  3. Proto Recv-Q Send-Q Local Address               Foreign Address             State        
  4. tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN        
  5. udp        0      0 ip:123           0.0.0.0:*                                 
  6. udp        0      0 ip:123           0.0.0.0:*                                 
  7. udp        0      0 127.0.0.1:123               0.0.0.0:*                                 
  8. udp        0      0 0.0.0.0:123                 0.0.0.0:*    

其中123端口用于NTP服务。

 

(2)netstat  -tunp:查看所有已连接的网络连接状态,并显示其PID及程序名称。

 

  1. [root@AY1407041017110375bbZ ~]# netstat -tunp  
  2. Active Internet connections (w/o servers)  
  3. Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name     
  4. tcp        0     96 ip:22            221.176.33.126:52699        ESTABLISHED 926/sshd              
  5. tcp        0      0 ip:34385         42.156.166.25:80            ESTABLISHED 1003/aegis_cli    

根据上述结果,可以根据需要kill掉相应进程。

 

如:

kill -9 1003

(3)netstat -tunlp

 

(4)netstat常用选项说明:

-t: tcp   

-u : udp
-l, --listening
       Show only listening sockets.  (These are omitted by default.)
-p, --program
       Show the PID and name of the program to which each socket belongs.
--numeric , -n
Show numerical addresses instead of trying to determine symbolic host, port or user names.

 

5、修改ssh的监听端口

(1)修改 /etc/ssh/sshd_config 

原有的port 22

改为port 44

(2)重启服务

/etc/init.d/sshd restart
(3)查看情况

 

  1.  netstat -tunl  
  2. Active Internet connections (only servers)  
  3. Proto Recv-Q Send-Q Local Address               Foreign Address             State        
  4. tcp        0      0 0.0.0.0:44               0.0.0.0:*                   LISTEN        
  5. udp        0      0 ip:123           0.0.0.0:*                                 
  6. udp        0      0 ip:123           0.0.0.0:*                                 
  7. udp        0      0 127.0.0.1:123               0.0.0.0:*                                 
  8. udp        0      0 0.0.0.0:123                 0.0.0.0:*     



(责任编辑:IT)