适合Web服务器的iptables规则

  1. IPT="/sbin/iptables"
  2. $IPT –delete-chain
  3. $IPT –flush
  4. $IPT -P INPUT DROP    #1
  5. $IPT -P FORWARD DROP  #1
  6. $IPT -P OUTPUT DROP   #1
  7. $IPT -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT #2
  8. $IPT -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT #3
  9. $IPT -A INPUT -p tcp -m tcp –dport 22 -j ACCEPT #3
  10. $IPT -A INPUT -p tcp -m tcp –dport 21 -j ACCEPT  #3
  11. $IPT -A INPUT -p tcp -m tcp –dport 873 -j ACCEPT #3
  12. $IPT -A INPUT -i lo -j ACCEPT #4
  13. $IPT -A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT  #5
  14. $IPT -A INPUT -p icmp -m icmp –icmp-type 11 -j ACCEPT #5
  15. $IPT -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT #6
  16. $IPT -A OUTPUT -p udp -m udp –dport 53 -j ACCEPT #7
  17. $IPT -A OUTPUT -o lo -j ACCEPT #4
  18. $IPT -A OUTPUT -p tcp -m tcp –dport 80 -j ACCEPT #8
  19. $IPT -A OUTPUT -p tcp -m tcp –dport 25 -j ACCEPT #9
  20. $IPT -A OUTPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT  #10
  21. $IPT -A OUTPUT -p icmp -m icmp –icmp-type 11 -j ACCEPT #10
  22. service iptables save
  23. service iptables restart

存为脚本iptables.sh,执行sh iptables.sh自动配置防火墙。
解释:
#1、设置INPUT,FORWARD,OUTPUT链默认target为DROP,也就是外部与服务器不能通信。
#2、设置当连接状态为RELATED和ESTABLISHED时,允许数据进入服务器。
#3、设置外部客户端连接服务器端口80,22,21,873。
#4、允许内部数据循回。
#5、允许外部ping服务器 。
#6、设置状态为RELATED和ESTABLISHED的数据可以从服务器发送到外部。
#7、允许服务器使用外部dns解析域名。
#8、设置服务器连接外部服务器端口80。
#9、允许服务器发送邮件。
#10、允许从服务器ping外部。

Nginx简单防御CC攻击

防cc攻击,推荐使用HttpGuard

 

Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引Rambler使用。 其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网站服务器中表现较好。

Nginx虽然可以比Apache处理更大的连接数,但是HTTP GET FLOOD针对的不仅仅是WEB服务器,还有数据库服务器。大量HTTP请求产生了大量的数据库查询,可以在几秒之内使数据库停止响应,系统负载升高,最终导致服务器当机。

本文主要介绍Centos+Nginx下如何快速有效得防御CC攻击。至于如何安装Nginx就不详细介绍了,有兴趣的读者可以在Nginx官方网站(http://www.nginx.org/)下载源代码进行编译。如果你使用的是Centos5,也可以使用rpm包进行安装(http://centos.alt.ru/repository/centos/5/i386/nginx-stable-0.7.65-1.el5.i386.rpm)。

1.主动抑制

为了让Nginx支持更多的并发连接数,根据实际情况对工作线程数和每个工作线程支持的最大连接数进行调整。例如设置“worker_processes 10”和“worker_connections 1024”,那这台服务器支持的最大连接数就是10×1024=10240。

  1. worker_processes 10;
  2. events {
  3. use epoll;
  4. worker_connections 10240;
  5. }

Nginx 0.7开始提供了2个限制用户连接的模块:NginxHttpLimitZoneModule和NginxHttpLimitReqModule。
NginxHttpLimitZoneModule可以根据条件进行并发连接数控制。
例如可以定义以下代码:

  1. http {
  2. limit_zone   my_zone  $binary_remote_addr  10m;
  3. server {
  4. location /somedir/ {
  5. limit_conn   my_zone  1;
  6. }
  7. }
  8. }

其中“limit_zone my_zone $binary_remote_addr 10m”的意思是定义一个名称为my_zone的存储区域、my_zone中的内容为远程IP地址、my_zone的大小为10M;“location /somedir/”的意思是针对somedir目录应用规则;“limit_conn my_zone 1”的意思是针对上面定义的my_zone记录区记录的IP地址在指定的目录中只能建立一个连接。

NginxHttpLimitReqModule可以根据条件进行请求频率的控制。
例如可以定义以下代码:

  1. http {
  2. limit_req_zone  $binary_remote_addr  zone=my_req_zone:10m   rate=1r/s;
  3. server {
  4. location /somedir/ {
  5. limit_req_zone   zone= my_req_zone  burst=2;
  6. }

其中“limit_req_zone $binary_remote_addr zone=my_req_zone:10m rate=1r/s”的意思是定义一个名称为my_req_zone的存储区域,my_req_zone内容为远程IP地址,my_req_zone大小为10M,my_req_zone中的平均请求速率只能为1个每秒;“location /somedir/”的意思是针对somedir目录应用规则;“limit_req_zone zone= my_req_zone burst=2”的意思是针对上面定义的my_req_zone记录区记录的IP地址在请求指定的目录中的内容时最高2个每秒的突发请求速率。

当有连接触发上诉规则时,Nginx会报“503 Service Temporarily Unavailable”的错误,停止用户请求。返回一个503,对服务器来说影响不大,只占用一个nginx的线程而已,相对来说还是很划算的。

为了测试效果,我将以上代码放入Nginx的配置文件,并编写了一个php文件显示phpinfo;另外还写了一个html文件,其中嵌入了多个iframe调用php文件。当我打开这个html文件了,可以看到只有一个iframe中的php文件正常显示了,其他的iframe都显示503错误。
Nginx

应用举例(Discuz!)
Discuz!是使用比较多的一个php论坛程序。以Discuz!7.0为例,程序目录下有比较多的可以直接访问的php文件,但其中最容易受到攻击的一般有index.php(首页)、forumdisplay.php(板块显示)、viewthread.php(帖子显示)。攻击者一般会对这些页面发起大量的请求,导致HTTP服务器连接数耗尽、mysql数据库停止响应,最终导致服务器崩溃。
为了防止上述页面被攻击,我们可以设定以下的规则进行防御:

  1. http {
  2. limit_zone   myzone_bbs  $binary_remote_addr  10m;
  3. limit_req_zone $binary_remote_addr zone=bbs:10m rate=1r/s;
  4. server {
  5. location ~ ^/bbs/(index|forumdisplay|viewthread).php$ {
  6. limit_conn   myzone_bbs  3;
  7. limit_req zone=bbs burst=2 nodelay;
  8. root           html;
  9. fastcgi_pass   unix:/dev/shm/php-cgi.sock;
  10. fastcgi_index  index.php;
  11. fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
  12. include        fastcgi_params;
  13. }
  14. }
  15. }

应用这条规则后,bbs目录下的index.php、forumdisplay.php和viewthread.php这些页面同一个IP只许建立3个连接,并且每秒只能有1个请求(突发请求可以达到2个)。
虽然这样的规则一般来说对正常的用户不会产生影响(极少有人在1秒内打开3个页面),但是为了防止影响那些手快的用户访问,可以在nginx中自定义503页面,503页面对用户进行提示,然后自动刷新。
在Nginx中自定义503页面:

  1. error_page   503   /errpage/503.html;

503页面的源代码:

  1. <html>
  2. &lt; head>
  3. &lt; title>页面即将载入….</title>
  4. &lt; meta http-equiv=content-type c>
  5. &lt; META NAME="ROBOTS" C>
  6. &lt; /head>
  7. &lt; body bgcolor="#FFFFFF">
  8. &lt; table cellpadding="0" cellspacing="0" border="0" width="700" align="center" height="85%">
  9. <tr align="center" valign="middle">
  10. <td>
  11.  
  12. <table cellpadding="10" cellspacing="0" border="0" width="80%" align="center" style="font-family:
  13. Verdana, Tahoma; color: #666666; font-size: 11px">
  14. <tr>
  15. <td valign="middle" align="center" bgcolor="#EBEBEB">
  16. <br /><b style="font-size: 16px">页面即将载入</b>
  17. <br /><br />你刷新页面的速度过快。请少安毋躁,页面即将载入…
  18. <br /><br />[<a href="javascript:window.location.reload();"><font color=#666666>立即重新载入</font></a>]
  19. <br /><br />
  20. </td>
  21. </tr>
  22. </table>
  23.  
  24. </td>
  25. </tr>
  26. &lt; /table>
  27. &lt; /body>
  28. &lt; /html>
  29.  
  30. &lt; SCRIPT language=javascript>
  31. function update()
  32. {
  33. window.location.reload();
  34. }
  35. setTimeout("update()",2000);
  36. &lt; /script>

2.被动防御

虽然主动防御已经抵挡了大多数HTTP GET FLOOD攻击,但是道高一尺魔高一丈,攻击者会总会找到你薄弱的环节进行攻击。所以我们在这里也要介绍一下被动防御的一些方法。
1)封IP地址
访问者通过浏览器正常访问网站,与服务器建立的连接一般不会超过20个,我们可以通过脚本禁止连接数过大的IP访问。
以下脚本通过netstat命令列举所有连接,将连接数最高的一个IP如果连接数超过150,则通过 iptables阻止访问:

  1. #!/bin/sh
  2. status=<code>netstat -na|awk ‘$5 ~ /[0-9]+:[0-9]+/ {print $5}’ |awk -F ":" — ‘{print $1}’ |sort -n|uniq -c |sort -n|tail -n 1</code>
  3. NUM=<code>echo $status|awk ‘{print $1}'</code>
  4. IP=<code>echo $status|awk ‘{print $2}'</code>
  5. result=<code>echo "$NUM &gt; 150" | bc</code>
  6. if [ $result = 1 ]
  7. then
  8. echo IP:$IP is over $NUM, BAN IT!
  9. /sbin/iptables -I INPUT -s $IP -j DROP
  10. fi

运行crontab -e,将上述脚本添加到crontab每分钟自动运行:

  1. * * * * * /root/xxxx.sh

通过apache自带的ab工具进行服务器压力测试:

  1. ab -n 1000 -c 100 http://www.xxx.com/bbs/index.php

测试完成后,我们就可以看到系统中有IP被封的提示:

  1. [root@xxxxxx ~]#tail /var/spool/mail/root
  2. Content-Type: text/plain; charset=ANSI_X3.4-1968
  3. Auto-Submitted: auto-generated
  4. X-Cron-Env: &lt;SHELL=/bin/sh>
  5. X-Cron-Env: &lt;HOME=/root>
  6. X-Cron-Env: &lt;;PATH=/usr/bin:/bin>
  7. X-Cron-Env: &lt;LOGNAME=root>
  8. X-Cron-Env: &lt;USER=root>
  9.  
  10. IP:58.246.xx.xx is over 1047, BAN IT!

至此,又一次HTTP GET FLOOD防御成功。

2)根据特征码屏蔽请求(对CC攻击效果较好)
一般同一种CC攻击工具发起的攻击请求包总是相同的,而且和正常请求有所差异。
当服务器遭遇CC攻击时,我们可以快速查看日志,分析其请求的特征,比如User-agent。下面的是某一次CC攻击时的User-agent
Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate
几乎没有正常的浏览器会在User-agent中带上“must-revalidate”这样的关键字。所以我们可以以这个为特征进行过滤,将User-agent中带有“must-revalidate”的请求全部拒绝访问:

  1. if ($http_user_agent ~ must-revalidate) {
  2. return 403;
  3. }

本文主要介绍了nginx下的HTTP GET FLOOD防御,如果有不对的地方,希望大家可以向我提出。同时,也希望大家能够举一反三,把这种思路应用到apache、lighttpd等常见的web服务器中。
文章来源:http://www.val.so/2011/06/247.html

保证Linux Apache Web服务器安全的10个建议

如果你是一个系统管理员,你应该按照以下的10点建议来保证Apache web服务器的安全。

1、禁用不必要的模块

如果你打算源码编译安装apache,你应该禁用以下的模块。如果你运行./configure -help,你将会看到所有可用的你可以禁用/开启的模块。

  • userdir –用户特定用户的请求映射。例如:带用户名的URL会转化成服务器的一个目录。
  • autoindex – 当没有默认首页(如index.html)时显示目录列表。
  • status –显示服务器统计
  • env – 清除或修改环境变量
  • setenvif –根据客户端请求头字段设置环境变量
  • cgi –CGI脚本
  • actions – 根据特定的媒体类型或请求方法,激活特定的CGI脚本
  • negotiation –提供内容协商支持
  • alias – 提供从文件系统的不同部分到文档树的映射和URL重定向
  • include –实现服务端包含文档(SSI)处理
  • filter –根据上下文实际情况对输出过滤器进行动态配置
  • version –提供基于版本的配置段支持
  • asis – 发送自己包含HTTP头内容的文件

当你执行./configure按照下面禁用以上的所有模块。

  1. ./configure
  2. –enable-ssl
  3. –enable-so
  4. –disable-userdir
  5. –disable-autoindex
  6. –disable-status
  7. –disable-env
  8. –disable-setenvif
  9. –disable-cgi
  10. –disable-actions
  11. –disable-negotiation
  12. –disable-alias
  13. –disable-include
  14. –disable-filter
  15. –disable-version
  16. –disable-asis

如果激活ssl且禁用mod_setenv,你将会得到以下错误。
错误: Syntax error on line 223 of /usr/local/apache2/conf/extra/httpd-ssl.conf: Invalid command ‘BrowserMatch’, perhaps misspelled or defined by a module not included in the server configuration
解决方案:如果你使用ssl,不要禁用setenvif模块。或者你禁用setenvif模块,可以在httpd-ssl.conf注释BrowserMatch。
安装完成全,执行httpd -l,会列出所有已安装的模块。

  1. # /usr/local/apache2/bin/httpd -l
  2. Compiled in modules:
  3.   core.c
  4.   mod_authn_file.c
  5.   mod_authn_default.c
  6.   mod_authz_host.c
  7.   mod_authz_groupfile.c
  8.   mod_authz_user.c
  9.   mod_authz_default.c
  10.   mod_auth_basic.c
  11.   mod_log_config.c
  12.   mod_ssl.c
  13.   prefork.c
  14.   http_core.c
  15.   mod_mime.c
  16.   mod_dir.c
  17.   mod_so.c

在这个例子里,我们安装了如下apache模块:

  • core.c –Apache核心模块
  • mod_auth* –各种身份验证模块
  • mod_log_config.c –允许记录日志和定制日志文件格式
  • mod_ssl.c – SSL
  • prefork.c – 一个非线程型的、预派生的MPM
  • httpd_core.c – Apache核心模块
  • mod_mime.c – 根据文件扩展名决定应答的行为(处理器/过滤器)和内容(MIME类型/语言/字符集/编码)
  • mod_dir.c – 指定目录索引文件以及为目录提供”尾斜杠”重定向
  • mod_so.c – 允许运行时加载DSO模块

2、以单独的用户和用户组运行Apache

Apache可能默认地以nobody或daemon运行。让Apache运行在自己没有特权的帐户比较好。例如:用户apache。
创建apache用户组和用户。

  1. groupadd apache
  2. useradd -d /usr/local/apache2/htdocs -g apache -s /bin/false apache

更改httpd.conf,正确地设置User和Group。

  1. # vi httpd.conf
  2. User apache
  3. Group apache

之后重启apache,执行ps -ef命令你会看到apache以“apache”用户运行(除了第一个都是以root运行之外)。

  1. # ps -ef | grep -i http | awk ‘{print $1}’
  2. root
  3. apache
  4. apache
  5. apache
  6. apache
  7. apache

3、限制访问根目录(使用Allow和Deny)

在httpd.conf文件按如下设置来增强根目录的安全。

  1. <Directory />
  2.     Options None
  3.     Order deny,allow
  4.     Deny from all
  5. </Directory>

在上面的:

  • Options None –设置这个为None,是指不激活其它可有可无的功能。
  • Order deny,allow – 这个是指定处理Deny和Allow的顺序。
  • Deny from all –阻止所有请求。Deny的后面没有Allow指令,所以没人能允许访问。

4、为conf和bin目录设置适当的权限

bin和conf目录应该只允许授权用户查看。创建一个组和把所有允许查看/修改apache配置文件的用户增加到这个组是一个不错的授权方法。
下面我们设置这个组为:apacheadmin
创建组:

  1. groupadd apacheadmin

允许这个组访问bin目录。

  1. chown -R root:apacheadmin /usr/local/apache2/bin
  2. chmod -R 770 /usr/local/apache2/bin

允许这个组访问conf目录。

  1. chown -R root:apacheadmin /usr/local/apache2/conf
  2. chmod -R 770 /usr/local/apache2/conf

增加合适的用户到这个组。

  1. # vi /etc/group
  2. apacheadmin:x:1121:user1,user2

5、禁止目录浏览

如果你不关闭目录浏览,用户就能看到你的根目录(或任何子目录)所有的文件(目录)。
比如,当他们浏览http://{your-ip}/images/而images下没有默认首页,那么他们就会在浏览器中看到所有的images文件(就像ls -l输出)。从这里他们通过点击就能看到私人的图片文件,或点点击子目录看到里面的内容。
为了禁止目录浏览,你可以设置Opitons指令为“None“或者是“-Indexes”。在选项名前加“-”会强制性地在该目录删除这个特性。
Indexes选项会在浏览器显示可用文件的列表和子目录(当没有默认首页在这个目录)。所以Indexes应该禁用。

  1. <Directory />
  2.   Options None
  3.   Order allow,deny
  4.   Allow from all
  5. </Directory>
  6.  
  7. (or)
  8.  
  9. <Directory />
  10.   Options -Indexes
  11.   Order allow,deny
  12.   Allow from all
  13. </Directory>

6、禁用.htaccess

在htdocs目录下的特定子目录下使用.htaccess文件,用户能覆盖默认apache指令。在一些情况下,这样不好,应该禁用这个功能。
我们可以在配置文件中按如下设置禁用.htaccess文件来不允许覆盖apache默认配置。

  1. <Directory />
  2.   Options None
  3.   AllowOverride None
  4.   Order allow,deny
  5.   Allow from all
  6. </Directory>

7、禁用其它选项

下面是一些Options指令的可用值。

  • Options All –所有的选项被激活(除了MultiViews)。如果你不指定Options指令,这个是默认值。
  • Options ExecCGI –执行CGI脚本(使用mod_cgi)。
  • Options FollowSymLinks –如果在当前目录有符号链接,它将会被跟随。
  • Options Includes –允许服务器端包含文件(使用mod_include)。
  • Options IncludesNOEXEC –允许服务器端包含文件但不执行命令或cgi。
  • Options Indexes –允许目录列表。
  • Options MultiViews -允许内容协商多重视图(使用mod_negotiation)
  • Options SymLinksIfOwnerMatch – 跟FollowSymLinks类似。但是要当符号连接和被连接的原始目录是同一所有者是才被允许。

绝不要指定“Options All”,通常指定上面的一个或多个的选项。你可以按下面代码把多个选项连接。
Options Includes FollowSymLinks
当你要嵌入多个Directory指令时,“+”和“-”是有用处的。也有可能会覆盖上面的Directory指令。
如下面,/site目录,允许Includes和Indexes。

  1. <Directory /site>
  2.   Options Includes Indexes
  3.   AllowOverride None
  4.   Order allow,deny
  5.   Allow from all
  6. </Directory>

对于/site/en目录,如果你需要继承/site目录的Indexes(不允许Includes),而且只在这个目录允许FollowSymLinks,如下:

  1. <Directory /site/en>
  2.   Options -Includes +FollowSymLink
  3.   AllowOverride None
  4.   Order allow,deny
  5.   Allow from all
  6. </Directory>
  • /site目录允许IncludesIndexes
  • /site/en目录允许Indexes和FollowSymLink

8、删除不需要的DSO模块

如果你加载了动态共享对象模块到apache,他们应该在httpd.conf文件在“LoadModule”指令下。
请注意静态编译的Apache模块是不在“LoadModule”指令里的。
在httpd.conf注释任何不需要的“LoadModules”指令。

  1. grep LoadModule /usr/local/apache2/conf/httpd.conf

9、限制访问特定网络(或IP地址)

如果你需要只允许特定IP地址或网络访问你的网站,按如下操作:
只允许特定网络访问你的网站,在Allow指令下给出网络地址。

  1. <Directory /site>
  2.   Options None
  3.   AllowOverride None
  4.   Order deny,allow
  5.   Deny from all
  6.   Allow from 10.10.0.0/24
  7. </Directory>

只允许特定IP地址访问你的网站,在Allow指令下给出IP地址。

  1. <Directory /site>
  2.   Options None
  3.   AllowOverride None
  4.   Order deny,allow
  5.   Deny from all
  6.   Allow from 10.10.1.21
  7. </Directory>

10、禁止显示或发送Apache版本号(设置ServerTokens)

默认地,服务器HTTP响应头会包含apache和php版本号。像下面的,这是有危害的,因为这会让黑客通过知道详细的版本号而发起已知该版本的漏洞攻击。

  1. Server: Apache/2.2.17 (Unix) PHP/5.3.5

为了阻止这个,需要在httpd.conf设置ServerTokens为Prod,这会在响应头中显示“Server:Apache”而不包含任何的版本信息。

  1. # vi httpd.conf
  2. ServerTokens Prod

下面是ServerTokens的一些可能的赋值:

  • ServerTokens Prod 显示“Server: Apache”
  • ServerTokens Major 显示 “Server: Apache/2″
  • ServerTokens Minor 显示“Server: Apache/2.2″
  • ServerTokens Min 显示“Server: Apache/2.2.17″
  • ServerTokens OS 显示 “Server: Apache/2.2.17 (Unix)”
  • ServerTokens Full 显示 “Server: Apache/2.2.17 (Unix) PHP/5.3.5″ (如果你这指定任何的值,这个是默认的返回信息)

除了上面10个apache的安全建议,你还必要确保你的UNIX/Linux操作系统的安全。如果你的操作系统不安全,那么只是确保apache的安全就没有任何意义了。通常的我们要保持apache版本的更新,最新的apahce版本会修复所有已知的安全问题。还有就是要确保时常查看apache日志文件。

CentOS 5.5 系统安全配置

1、注释掉不需要的用户和用户组

  1. vi /etc/passwd
  1. #adm
  2. #lp
  3. #sync
  4. #shutdown
  5. #halt
  6. #news
  7. #uucp
  8. #operator
  9. #games
  10. #gopher
  11. #ftp
  1. vi /etc/group
  1. #adm
  2. #lp
  3. #news
  4. #uucp
  5. #games
  6. #dip

2、给下面的文件加上不可更改属性,从而防止非授权用户获得权限

  1. #chattr +i /etc/passwd
  2. #chattr +i /etc/shadow
  3. #chattr +i /etc/group
  4. #chattr +i /etc/gshadow

权限修改之后,就无法添加删除用户了。要取消之前的修改,

  1. #lsattr /etc/passwd /etc/shadow /etc/group /etc/gshadow

lsattr 只是显示文件的属性

  1. #chattr -i /etc/passwd
  2. #chattr -i /etc/shadow
  3. #chattr -i /etc/group
  4. #chattr -i /etc/gshadow

再次查看
lsattr /etc/passwd /etc/shadow /etc/group /etc/gshadow
————- /etc/passwd
————- /etc/shadow
————- /etc/group
————- /etc/gshadow
修改完之后,再执行

  1. chattr +i /etc/passwd
  2. chattr +i/etc/shadow
  3. chattr +i /etc/group
  4. chattr +i/etc/gshadow

禁止Ctrl+Alt+Delete重新启动机器命令

3、修改/etc/inittab文件,将”ca::ctrlaltdel:/sbin/shutdown-t3-rnow”一行注释掉。

然后重新设置/etc/rc.d/init.d/目录下所有文件的许可权限,运行如下命令:

  1. # chmod -R 700 /etc/rc.d/init.d/*

这样便仅有root可以读、写或执行上述所有脚本文件。

4、限制su命令

当不想任何人能够su作为root,可以编辑/etc/pam.d/su文件,增加如下两行:

  1. auth sufficient /lib/security/pam_rootok.sodebug
  2. auth required /lib/security/pam_wheel.sogroup=isd

这时,仅isd组的用户可以su作为root。此后,如果希望用户admin能够su作为root,可以运行如下命令:

  1. #usermod -G 10 admin

5、防止攻击

1)阻止ping, 抵御SYN:
如果没人能ping通系统,安全性自然增加了,为此,我们可以在/etc/rc.d/rc.local文件中增加如下一行

  1. echo 1>/proc/sys/net/ipv4/icmp_echo_ignore_all

SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。
Linux内核提供了若干SYN相关的配置,用命令:

  1. sysctl -a | grep syn

看到:
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5
tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN的重试次数。
加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分SYN攻击,降低重试次数也有一定效果。
调整上述设置的方法是:
vi /etc/rc.d/rc.local ,将下面的命令法添加进去

  1. sysctl -w net.ipv4.tcp_max_syn_backlog=2048 #增加SYN队列长度到2048
  2. sysctl -w net.ipv4.tcp_syncookies=1 #打开SYN COOKIE功能
  3. sysctl -w net.ipv4.tcp_synack_retries=3 #降低重试次数
  4. sysctl -w net.ipv4.tcp_syn_retries=3

2)防止IP欺骗
编辑host.conf文件并增加如下几行来防止IP欺骗攻击。

  1. order hosts,bind #名称解释顺序
  2. multi on #允许主机拥有多个IP地址
  3. nospoof on #禁止IP地址欺骗

3)防止DoS攻击
对系统所有的用户设置资源限制可以防止DoS类型攻击,如最大进程数和内存使用数量等。
例如,可以在/etc/security/limits.conf中添加如下几行:

  1. * hard core 0
  2. * hard rss 5000
  3. * hard nproc 20

然后必须编辑/etc/pam.d/login文件检查下面一行是否存在。
session required /lib/security/pam_limits.so
4)修改sshd_config文件
首先修改配置文件 vi /etc/ssh/sshd_config
a 修改SSH端口
找到#Port 22一段,这里是标识默认使用22端口,修改为如下:

  1. Port 22
  2. Port 50000

然后保存退出
执行/etc/init.d/sshd restart
这样SSH端口将同时工作与22和50000上。
现在编辑防火墙配置:vi /etc/sysconfig/iptables
启用50000端口。
执行/etc/init.d/iptables restart
现在请使用ssh工具连接50000端口,来测试是否成功。
如果连接成功了,则再次编辑sshd_config的设置,将里边的Port22删除,即可。
b 只使用SSH v2
将#Protocol 2,1改为 Protocol 2
c 限制用户的SSH访问
假设我们只要root,vivek和jerry用户能通过SSH使用系统,向sshd_config配置文件中添加:

  1. AllowUsers root vivek jerry

d 配置空闲超时退出时间间隔
用户可以通过ssh登录到服务器,你可以设置一个空闲超时时间间隔避免出现孤儿ssh会话,打开sshd_config配置文件,确保有如下的配置项:

  1. ClientAliveInterval 300
  2. ClientAliveCountMax 0

上面的例子设置的空闲超时时间间隔是300秒,即5分钟,过了这个时间后,空闲用户将被自动踢出出去(可以理解为退出登录/注销)。
e 禁用.rhosts文件
不要读取用户的~/.rhosts和~/.shosts文件,使用下面的设置更新sshd_config配置文件:
IgnoreRhosts yes
SSH可以模拟过时的rsh命令的行为,rsh被公认为是不安全的远程访问协议,因此必须得禁用掉。

6、限制不同文件的权限

  1. [root@localhost ~]# chmod 700 /usr/bin/
  2. [root@localhost ~]# chmod 750 /usr/bin/*++*
  3. [root@localhost ~]# chmod 750 /usr/bin/c++*
  4. [root@localhost ~]# chmod 750 /usr/bin/ld
  5. [root@localhost ~]# chmod 750 /usr/bin/as
  6. [root@localhost ~]# locate sqlaccess
  7. /opt/lampp/bin/mysqlaccess
  8. [root@localhost ~]# chmod 755 /opt/lampp/bin/mysqlaccess
  9. [root@localhost ~]# chattr +a .bash_history
  10. [root@localhost ~]# chattr +i .bash_history
  11. [root@localhost ~]# chmod 700 /bin/ping
  12. [root@localhost ~]# chmod 700 /usr/bin/finger
  13. [root@localhost ~]# chmod 700 /usr/bin/who
  14. [root@localhost ~]# chmod 700 /usr/bin/w
  15. [root@localhost ~]# chmod 700 /usr/bin/locate
  16. [root@localhost ~]# chmod 700 /usr/bin/whereis
  17. [root@localhost ~]# chmod 700 /usr/bin/vim
  18. [root@localhost ~]# chmod 700 /usr/bin/make
  19. [root@localhost ~]# chmod 700 /bin/netstat
  20. [root@localhost ~]# chmod 700 /usr/bin/tail
  21. [root@localhost ~]# chmod 700 /usr/bin/less
  22. [root@localhost ~]# chmod 700 /usr/bin/head
  23. [root@localhost ~]# chmod 700 /bin/cat
  24. [root@localhost ~]# chmod 700 /bin/uname
  25. [root@localhost ~]# chmod 500 /bin/ps
  26. [root@localhost ~]# chmod 500 /usr/sbin/lsof

转自:http://blog.sina.com.cn/s/blog_5fd841bf0100phjg.html

Linux判断CC攻击命令详解

防cc攻击,推荐使用HttpGuard

 

查看所有80端口的连接数

  1. netstat -nat|grep -i "80"|wc -l

对连接的IP按连接数量进行排序

  1. netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n

查看TCP连接状态

  1. netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn
  2. netstat -n | awk ‘/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}’
  3. netstat -n | awk ‘/^tcp/ {++state[$NF]}; END {for(key in state) print key,"t",state[key]}’
  4. netstat -n | awk ‘/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"t",arr[k]}’
  5. netstat -n |awk ‘/^tcp/ {print $NF}’|sort|uniq -c|sort -rn
  6. netstat -ant | awk ‘{print $NF}’ | grep -v ‘[a-z]’ | sort | uniq -c

查看80端口连接数最多的20个IP

  1. netstat -anlp|grep 80|grep tcp|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head -n20
  2. netstat -ant |awk ‘/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A,i}’ |sort -rn|head -n20

用tcpdump嗅探80端口的访问看看谁最高

  1. tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." ‘{print $1"."$2"."$3"."$4}’ | sort | uniq -c | sort -nr |head -20

查找较多time_wait连接

  1. netstat -n|grep TIME_WAIT|awk ‘{print $5}’|sort|uniq -c|sort -rn|head -n20

查找较多的SYN连接

  1. netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more

转自:http://blog.so.cm

如何配置安全的SSH

这篇文章将介绍如何修改sshd的默认设置以确保sshd安全和受限制,进行保护你的服务器免受黑客入侵。每次你更改sshd的配置文件后需要重启sshd。这样做你当前的连接是不会关闭的。确保你有一个单独的以root登录的终端,以防止你错误的配置。这样做你就可以避免错误配置时仍可以使用root权限更正错误。
继续阅读如何配置安全的SSH

20步打造最安全的Nginx Web服务器

Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器。它运行在UNIX,GNU/Linux,BSD各种版本,Mac OS X,Solaris和Windows。根据调查统计,6%的网站使用Nginx Web服务器。Nginx是少数能处理C10K问题的服务器之一。跟传统的服务器不同,Nginx不依赖线程来处理请求。相反,它使用了更多的可扩展的事件驱动(异步)架构。Nginx为一些高流量的网站提供动力,比如WordPress,人人网,腾讯,网易等。这篇文章主要是介绍如何提高运行在Linux或UNIX系统的Nginx Web服务器的安全性。
继续阅读20步打造最安全的Nginx Web服务器