程序员安全规范:安全无小事,安全防范从nginx配置做起

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45136579/article/details/96865779

程序员安全规范:安全无小事,安全防范从nginx配置做起

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。

隐藏版本号

http {
 server_tokens off;
}

经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然最重要的是及时升级修复漏洞

开启HTTPS

server {
 listen 443;
 server_name ops-coffee.cn;
 
 ssl on;
 ssl_certificate /etc/nginx/server.crt;
 ssl_certificate_key /etc/nginx/server.key;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers HIGH:!aNULL:!MD5;
}
  • ssl on: 开启https
  • ssl_certificate: 配置nginx ssl证书的路径
  • ssl_certificate_key: 配置nginx ssl证书key的路径
  • ssl_protocols: 指定客户端建立连接时使用的ssl协议版本,如果不需要兼容TSLv1,直接去掉即可
  • ssl_ciphers: 指定客户端连接时所使用的加密算法,你可以再这里配置更高安全的算法

添加黑白名单

白名单配置

location /admin/ {
 allow 192.168.1.0/24;
 deny all;
}

上边表示只允许192.168.1.0/24网段的主机访问,拒绝其他所有

也可以写成黑名单的方式禁止某些地址访问,允许其他所有,例如

location /ops-coffee/ {
 deny 192.168.1.0/24;
 allow all;
}

更多的时候客户端请求会经过层层代理,我们需要通过$http_x_forwarded_for来进行限制,可以这样写

set $allow false;
if ($http_x_forwarded_for = "211.144.204.2") { set $allow true; }
if ($http_x_forwarded_for ~ "108.2.66.[89]") { set $allow true; }
if ($allow = false) { return 404; }

添加账号认证

server {
 location / {
 auth_basic "please input user&passwd";
 auth_basic_user_file key/auth.key;
 }
}

限制请求方法

if ($request_method !~ ^(GET|POST)$ ) {
 return 405;
}

$request_method能够获取到请求nginx的method

配置只允许GET\POST方法访问,其他的method返回405

拒绝User-Agent

if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl) {
 return 444;
}

可能有一些不法者会利用wget/curl等工具扫描我们的网站,我们可以通过禁止相应的user-agent来简单的防范

Nginx的444状态比较特殊,如果返回444那么客户端将不会收到服务端返回的信息,就像是网站无法连接一样

图片防盗链

location /images/ {
 valid_referers none blocked www.ops-coffee.cn ops-coffee.cn;
 if ($invalid_referer) {
 return 403;
 }
}

valid_referers: 验证referer,其中none允许referer为空,blocked允许不带协议的请求,除了以上两类外仅允许referer为www.ops-coffee.cn或ops-coffee.cn时访问images下的图片资源,否则返回403

当然你也可以给不符合referer规则的请求重定向到一个默认的图片,比如下边这样

location /images/ {
 valid_referers blocked www.ops-coffee.cn ops-coffee.cn
 if ($invalid_referer) {
 rewrite ^/images/.*\.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;
 }
}

控制并发连接数

可以通过ngx_http_limit_conn_module模块限制一个IP的并发连接数

http {
 limit_conn_zone $binary_remote_addr zone=ops:10m;
 server {
 listen 80;
 server_name ops-coffee.cn;
 
 root /home/project/webapp;
 index index.html;
 location / {
 limit_conn ops 10;
 }
 access_log /tmp/nginx_access.log main;
 }
}

limit_conn_zone: 设定保存各个键(例如$binary_remote_addr)状态的共享内存空间的参数,zone=空间名字:大小

大小的计算与变量有关,例如$binary_remote_addr变量的大小对于记录IPV4地址是固定的4 bytes,而记录IPV6地址时固定的16 bytes,存储状态在32位平台中占用32或者64 bytes,在64位平台中占用64 bytes。1m的共享内存空间可以保存大约3.2万个32位的状态,1.6万个64位的状态

limit_conn: 指定一块已经设定的共享内存空间(例如name为ops的空间),以及每个给定键值的最大连接数

上边的例子表示同一IP同一时间只允许10个连接

当有多个limit_conn指令被配置时,所有的连接数限制都会生效

http {
 limit_conn_zone $binary_remote_addr zone=ops:10m;
 limit_conn_zone $server_name zone=coffee:10m;
 
 server {
 listen 80;
 server_name ops-coffee.cn;
 
 root /home/project/webapp;
 index index.html;
 
 location / {
 limit_conn ops 10;
 limit_conn coffee 2000;
 }
 }
}

上边的配置不仅会限制单一IP来源的连接数为10,同时也会限制单一虚拟服务器的总连接数为2000

缓冲区溢出攻击

缓冲区溢出攻击 是通过将数据写入缓冲区并超出缓冲区边界和重写内存片段来实现的,限制缓冲区大小可有效防止

client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
  • client_body_buffer_size: 默认8k或16k,表示客户端请求body占用缓冲区大小。如果连接请求超过缓存区指定的值,那么这些请求实体的整体或部分将尝试写入一个临时文件。
  • client_header_buffer_size: 表示客户端请求头部的缓冲区大小。绝大多数情况下一个请求头不会大于1k,不过如果有来自于wap客户端的较大的cookie它可能会大于 1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers里面设置
  • client_max_body_size: 表示客户端请求的最大可接受body大小,它出现在请求头部的Content-Length字段, 如果请求大于指定的值,客户端将收到一个"Request Entity Too Large" (413)错误,通常在上传文件到服务器时会受到限制
  • large_client_header_buffers 表示一些比较大的请求头使用的缓冲区数量和大小,默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,请求字段不能大于一个缓冲区大小,如果客户端发送一个比较大的头,nginx将返回"Request URI too large" (414),请求的头部最长字段不能大于一个缓冲区,否则服务器将返回"Bad request" (400)

同时需要修改几个超时时间的配置

client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
  • client_body_timeout: 表示读取请求body的超时时间,如果连接超过这个时间而客户端没有任何响应,Nginx将返回"Request time out" (408)错误
  • client_header_timeout: 表示读取客户端请求头的超时时间,如果连接超过这个时间而客户端没有任何响应,Nginx将返回"Request time out" (408)错误
  • keepalive_timeout: 参数的第一个值表示客户端与服务器长连接的超时时间,超过这个时间,服务器将关闭连接,可选的第二个参数参数表示Response头中Keep-Alive: timeout=time的time值,这个值可以使一些浏览器知道什么时候关闭连接,以便服务器不用重复关闭,如果不指定这个参数,nginx不会在应Response头中发送Keep-Alive信息
  • send_timeout: 表示发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应,nginx将关闭连接

Header头设置

通过以下设置可有效防止XSS攻击

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
  • X-Frame-Options: 响应头表示是否允许浏览器加载frame等属性,有三个配置DENY禁止任何网页被嵌入,SAMEORIGIN只允许本网站的嵌套,ALLOW-FROM允许指定地址的嵌套
  • X-XSS-Protection: 表示启用XSS过滤(禁用过滤为X-XSS-Protection: 0),mode=block表示若检查到XSS攻击则停止渲染页面
  • X-Content-Type-Options: 响应头用来指定浏览器对未指定或错误指定Content-Type资源真正类型的猜测行为,nosniff 表示不允许任何猜测

在通常的请求响应中,浏览器会根据Content-Type来分辨响应的类型,但当响应类型未指定或错误指定时,浏览会尝试启用MIME-sniffing来猜测资源的响应类型,这是非常危险的

例如一个.jpg的图片文件被恶意嵌入了可执行的js代码,在开启资源类型猜测的情况下,浏览器将执行嵌入的js代码,可能会有意想不到的后果

另外还有几个关于请求头的安全配置需要注意

Content-Security-Policy: 定义页面可以加载哪些资源,

add_header Content-Security-Policy "default-src 'self'";

上边的配置会限制所有的外部资源,都只能从当前域名加载,其中default-src定义针对所有类型资源的默认加载策略,self允许来自相同来源的内容

Strict-Transport-Security: 会告诉浏览器用HTTPS协议代替HTTP来访问目标站点

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

上边的配置表示当用户第一次访问后,会返回一个包含了Strict-Transport-Security响应头的字段,这个字段会告诉浏览器,在接下来的31536000秒内,当前网站的所有请求都使用https协议访问,参数includeSubDomains是可选的,表示所有子域名也将采用同样的规则

本文到此结束!喜欢的朋友帮忙转发下文章和关注一下,感谢支持!

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。

下方评论区欢迎发表意见

展开阅读全文

安全网站从小做起

09-10

  我是做asp.net网站开发的,QQ群里一个网友的站被挂马了。他说让我写点安全方面的文章。我就介绍下我的经验吧,各位大牛不要拿砖头砸我。。。rnrn  以下都以ASP.NET开发网站为例。rnrn  1、sql注入漏洞。rnrn  解决办法:使用存储过程,参数不要用字符串拼接。简单改进办法:使用[url=http://www.svnhost.cn/Article/Detail-26.shtml]SqlHelper[/url]和[url=http://www.svnhost.cn/Article/Detail-75.shtml]OledbHelper[/url]rnrn  2、跨站脚本漏洞rnrn  解决办法:“默认禁止,显式允许”的策略。具体参考:[url=http://www.svnhost.cn/Article/Detail-33.shtml][color=#336699]从客户端检测到有潜在危险的Request.Form值[/color][/url],禁止提交html标记(等被转义成rnrn  3、上传漏洞rnrn  解决办法:禁止上传目录的运行权限。只给读取权限。另外要禁止上传非法类型文件。不仅仅是aspx类型,包括很多,甚至htm、html类型文件也不应该直接上传保存。rnrn  4、数据库连接帐号,尽量使用最低权限的帐号。一定不要给管理员权限。rnrn  假如被黑客得知了数据库的密码。rnrn  那我们就可以执行任意系统命令了。rnrn  例如:xp_cmdshell 'dir c:\'rnrn  另外还有rnrn  tasklistrnrn  taskkillrnrn  pslistrnrn  pskillrnrn  net userrnrn  net user guest /active:yesrnrn  net user hack hack /addrnrn  net user hack /delrnrn  net localgruop administrators hack /addrnrn  query userrnrn  logoff 1rnrn  这些命令是不是很恐怖?呵呵。所以一定不要给web数据库连接帐号管理权限。rnrn  5、用户登录。这里不要把用户标识明文存储在cookie里,以用来标识用户是否登录。因为cookie是可以被修改的。请看这里的修改cookie,冒充其他用户。[url=http://www.svnhost.cn/Download/Detail-26.shtml][color=#336699]nc httpwatch使用视频教程[/color][/url],用微软的[url=http://www.svnhost.cn/Article/Detail-23.shtml]Forms窗体身份验证[/url]和角色一般情况都够用了。rnrn  6、如果网站程序中用到读写文件,一定要慎重,因为读取的操作很可能被黑客利用,例如用一个查看图片的aspx文件读取web.config,用一个生产模板的功能生成木马。rnrn  7、充分利用验证码。用户登录、评论等等可能会被提交垃圾信息的地方,都要使用验证码,而且要有一个[url=http://www.svnhost.cn/Article/Detail-34.shtml]安全的验证码[/url]。才能防止被暴力破解,防止网站充满垃圾数据。rnrn  8、代码要严谨,修改用户资料、修改用户数据都要跟用户关联起来,比如update news set title='新的标题' where id=新闻编号,这里还要加一个限制:userid=用户编号,这样可以防止一个人修改别人的新闻。rnrn  9、关闭web.config中的错误显示。rnrn  以上是程序方面的安全问题,想到哪里就写到哪里。没有系统的整理。rnrn  另外顺便提提服务器安全问题。rnrn  1、开启windows防火墙,关闭不用的端口。这点是最重要的。就是说你提供的服务越少,你的服务器就越安全。rnrn  2、设置安全的密码。复杂度要达到一定强度。定期修改密码。密码不要泄露给别人,包括机房管理员。如果必要告诉机房人员,待机房人员用完密码以后立刻改掉。rnrn  3、安装ARP防火墙。机房里ARP病毒非常多,如果中了ARP病毒,轻者浏览网站不正常,可能有木马跟随。严重的就整个网站、机房都断网了。rnrn  4、适当的安装杀毒软件。(诺顿、麦咖啡等)rnrn  5、IIS关闭不用的服务,例如asp支持,关闭不用的服务:ftp,smtp,pop3等等,修改网站根目录。设置目录权限。rnrn  6、针对各种攻击,有不同的对策,例如cc攻击。曾经遇到一次,深圳那边有5台连续IP的机器对我的一个视频站发动CC攻击,导致网站打开非常的慢,开始我们还不知道是被攻击,以为程序有漏洞,不停的找程序的问题。后来通过[url=http://www.svnhost.cn/Download/Detail-46.shtml][color=#336699]服务器安全管理软件[/color][/url],查出是这些IP在作怪,通过[url=http://www.svnhost.cn/Article/Detail-36.shtml][color=#336699]站长屏蔽IP访问的几种方法[/color][/url]中提到的“本地安全策略”方法屏蔽掉这5个IP以后服务器恢复正常,网站恢复了往日的速度。rnrn  常用命令:iisapp -a,netstat -nao,tasklist,telnet xxx.xxx.xxx.xxx 端口rnrn  7、远程管理软件不要用默认端口,虽然密码被暴力破解和猜到的可能很小,但是总是有无聊的人尝试。造成日志里一堆垃圾信息。修改端口以后就没有人尝试破解密码了。因为他跟不知道这个端口是做什么的。谈到这里,我想起,不用的服务要关闭,那么用的服务器就要开启吗?那肯定是要启动的,不启动谁都用不了了,这里可以做一个限制,比如我的smtp服务只提供本机使用,那么我从防火墙里把25端口关闭,如果我的SQL SERVER只是供本机使用的。那么我也从防火墙里吧1433端口关闭。这样外部无法连接,自然也不存在暴力破解数据库密码了。windows防火墙还可以针对某一个IP开放某个端口。还是比较强大的。rnrn  以上乱七八糟的谈了一堆,希望对站长和程序员们有所帮助,大家可以加我QQ:4111852交流。我非常的欢迎。rnrn  最后说一下那个网友被挂马的解决建议:rnrn  1、备份好数据库、其他数据。rnrn  2、把所有程序、包括目录全部删除,以确保没有文件被留后门。rnrn  3、如果有可能,检查服务器安全,确保服务器没有被建立后门,例如超级帐号、安装了后门木马。这样的话,你怎么修改你的程序都没用,人家随时可以修改你的程序。rnrn  4、另一个网友提到的办法,上传一个静态文件test.html,访问一下看看,是不是也有木马以排除网络问题。rnrn  5、如果4中,确认不是网络问题,那就是文件被挂马了,全部程序删除,上传自己的安全的备份,恢复数据,检查数据库,确保木马不在数据库中。rnrn  6、查看IIS日志,看谁登录过后台,参考:[url=http://www.svnhost.cn/Download/Detail-71.shtml][color=#336699]iis日志分析视频教程[/color][/url]rnrn  思路特别乱,大家将就看一下吧rnrn  [img]http://www.svnhost.cn/fckeditor/editor/images/smiley/msn/tounge_smile.gif[/img]rnrn  本小站长全职做站1年多,即做运营又做开发,还能做网管、策划。。。。。呵呵。够累的,而且一个人还很难做好所有的事情,不过确实学到不少东西。欢迎大家加我QQ:4111852共同学习进步。rnrn 论坛

安全防范的四大利器

09-25

rn在病毒横行,马儿随意吃草的年代,网民们谈论最多的就要属系统破坏,病毒入侵了。说实话,自己每次出差之前,都要给家人的和邻居们的计算机做一下检查。你也许会说,这不是吃饱了撑的么!没错,我是吃饱了,但绝对不是撑的没事做,因为经常在外出差办事,接到家里打来的电话,通常都是三句:“中招了,电脑开不了了!”、“电脑现在好慢哦!怎么办啊?”第3句话基本上就是问我什么时候回来。 rnrn  能用电脑的人不一定会使用好,装了个杀毒软件就能防范所有病毒么?想抵御黑客攻击,靠防火墙软件就可以么?作为黑客,我不得不说,没那么简单,那么对于大多数人来说,应该做什么样的防范,才能把黑客、病毒、恶意软件统统关在门外呢? rnrn  一、删除垃圾文件,把木马和病毒消灭在温床里 rnrn  一般大家在浏览网站信息的时候,都会在本地机器上残留一些文件,而病毒也经常潜伏在里面,尤其是一些广告代码,恶意脚本和以及木马程序。这些文件集中在c盘的Documents and Settings文件夹下的子文件夹(你经常用的登陆帐号,例如admin,就是你在装机器的时候,填写的那个登陆帐户的名字)下面的local setting里面的temp文件夹。我们只要ctrl + A 全选之后,删除就可以了。 rnrn  注意:local setting文件夹默认是隐藏属性,所以,你必须要让系统显示所有隐藏文件,这点我就不说怎么做了,我想大家都应该会。 rnrn  二、关闭自动播放,避免间接感染 rnrn  DC、DV以及mp3,mp4等娱乐休闲设备大兴其道的同时,也给我们本已脆弱的系统增加了几分凶险。很多人都是习惯性的将这些移动存储设备连接电脑后,直接传输文件、图片和视频,其实这个习惯很容易让你中招。曾经有一次,邻居的电脑发现双击打不开硬盘驱动器,弹出一个“选择打开方式”的对话框,其实是中了autoruan病毒。 rnrn  这类病毒的传播媒介主要是移动存储设备,由于经常要在磁盘内交换数据,很有可能会感染病毒。很多人都知道硬盘有加密区,移动存储设备也一样有,用于存放设备及厂家标识信息的,而且都不大,几十K,最大也不超过几百K。有些病毒和恶意代码程序就是专门针对移动存储设备的加密区而写的,即使你把U盘格式化,他们也依然存在。这无论对于个人还是企业,都有一定的威胁。据我所知,有些大公司和企业为了不让自己的机密信息通过U盘传播出去,就制定了不允许在公司内部使用U盘拷贝文件的规定。个人用户为了读取数据文件的方便,还是要使用移动存储设备的,那么我们怎么做才能把安全风险降到最低呢? rnrn  关闭windows系统的自动播放服务,具体操作方法是:在运行里面,输入gpedit.msc,打开组策略,在用户配置下的管理模板中打开“系统”选项,在里面双击“关闭自动播放”,选择“已启用”,并选择“所有驱动器”,这样就可以关闭自动播放服务了。对于一些初级用户,如果想省事,使用大成的U盘免疫系统,也是不错的选择。 rnrn  三、家用摄象头的安全隐患 rnrn  个人隐私对于任何人来说,都是再重要不过的了,可是现在的黑客,为了money,可谓是无恶不作。如果你碰巧有个摄像头,又恰巧被人安装木马,键盘记录器等小工具,那么恭喜你,你的机器既成为了人家手中的肉鸡,又有可能通过你的摄像头掌握你一切的活动,甚至有些变态的在澡堂和换衣间安装针孔摄象头,来捕获一些信息出售了。 rnrn  摄象头成本低廉,在电信、移动、网通这些“吸血鬼”狂喝我们纳税人血液的时候,voip的诞生,网络通讯软件的广泛应用给我们省了不少money。但是同时也造成了一些安全隐患,在你同别人视频的时候,如果对方在你机器中下了有针对性的木马,那么你所有的活动都将收入人家的眼底。前些时候网上抄的很凶的视频泄密,是真实存在的,只要在木马中加一小段代码,就可以实现远程遥控的你摄像头。使用工具的伪“黑客”们可以捕获你和对方的谈话信息,捕获你的屏幕 ,甚至利用你的摄象头来监视你,这是绝对可以实现的,而且你还不知道。那你也许会问,把摄像头关了,不就可以了么?答案是否定的,同样在木马或病毒中加上一小段脚本,就可以远程开关你的摄像头,你在房间的一举一动都能看的清清楚楚。 rn有句话说的好,不怕贼偷就怕贼惦记。对家用摄像头带来的安全隐患,没有特别好的处理方法,通常都是聊天完毕,立即拔掉摄象头即可避免这样的情况。但对于彻夜不关机的懒人来说,就需要在睡觉的时候给摄像头盖上一块布,或者对着一盆花。 rnrn  四、如何防止个人信息泄露 rnrn  通常个人电脑中发生的密码泄露,游戏帐号泄露等事件都是病毒、木马以及恶意程序造成的,这些程序在你的电脑中植入小小的键盘记录器,来记录你的个人信息。在子明的黑客故事系列的第三篇,黑客窃取银行中就有对键盘记录器的详细介绍。 rnrn  对付键盘记录器的一些个人建议:在输入密码时,前面先多做几次出错。在选择输入框的同时利用鼠标不断变换位置,尽量不要先输入头一位。现在网络银行和QQ登陆帐户都启用了软键盘功能,以前的软键盘输入之后,光标位置不变,而现在的就不错,每次打开输入一次,键盘上的字母和数字就会重新变换一次位置,这就造成了hook(钩子)的失效,那是不是这些黑客就无法破解了呢?答案是一定否定的,但是对于个人用户,这些是足够的了。 rnrn  总结:个人用户在更新系统补丁的同时,一定要及时升级杀毒软件,不要以为杀毒软件能自动完成查杀,它也只能查杀病毒特征库中已知的病毒,对于那些黑客自己编写,尚未流通的病毒是无效的。最好的预防办法就是少一些好奇,尽量不要浏览不明网站和下载不明程序,尤其那些地址看上去非常怪异的,实在想浏览可以利用搜索引擎中的快照功能。对于Emule ,vagaa等P2P软件,也要多加小心,因为这些软件也是更多病毒的温床。最重要的是多为自己增加几分网络安全意识,网络安全防范,防的不是别人,要防的其实是自己,少一些好奇,少一些无知,少一些贪欲,这才是你最好的防范。黑客想进门也不那么容易了。 rnrn  备注:个人计算机的安全防护,有永远说不完的话题,不仅仅是子明介绍的这四个方面需要注意,其他地方也需要注意,比如,系统设置不当也会造成很严重后果。小编就有一次发现朋友的笔记本上所有系统帐户全开,而且共享文件夹多的吓人,这样怎么有安全可言?病毒和木马看了还不乐坏了。总之,个人计算机安全防范,最重要的还是子明那句话,增强个人安全意识,少一些好奇,多一些警觉。 论坛

没有更多推荐了,返回首页