近期服务器经常被暴力扫描、攻击, 故周末花时间打理下服务器, 将一些可能存在的风险处理掉. 笔者根据实践总结出一份简单的防范措施列表, 希望能对你有帮助.
阅读本文你能收获到:
防火墙采用白名单策略, 只开放必要端口. 如: 80/443以及ssh登录端口.
而数据库、缓存等端口, 最好只允许本地访问, 若需要调试, 建议使用白名单IP、代理等方法进行连接.
参考文档: https://github.com/fatedier/frp/
对于有调试需求的服务器而言, 数据库、缓存、消息队列等端口需要开放. 而直接开放端口会给服务器带来不必要的安全隐患. 此时我们必须对访问者进行限制, 如: IP白名单、V**等. 除此之外, 笔者推荐一个内网穿透工具用来辅助建立调试环境 —— FRP
FRP是一个可用于内网穿透的高性能的反向代理应用, 有多种穿透方式, 可以指定端口进行代理. 我们可以在服务器启动服务端(frps)和客户端(frpc)两个服务, 本地客户端的frpc通过frps监听的唯一端口与服务端的frpc建立连接, 这样就能将服务器上只能内部访问的端口映射到开发者电脑本地端口.
使用FRP的优势: 指定端口、可压缩流量、可加密、服务端只需要暴露frps的端口.
参考文档: 1). http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_hide_header 2). http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens 3. http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_hide_header
通过服务器返回的信息, 攻击者能从中发现一些漏洞, 比如nginx版本、所使用的web服务器等. 而这些信息对于用户来说都是非必要的. 笔者随便找了个网站查看, 如图:
这些细节都可能为攻击者提供途径. 所以有必要屏蔽掉这些信息.
配置完成后执行nginx -s reload
后配置即生效.
参考文档: http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
用户正常的访问行为, 不会产生过于频繁的请求, 限流可以防止某些不安分的IP因某些目的而频繁访问服务器而导致资源耗尽, 影响正常用户的访问体验.
一般地, 我们可以通过nginx配置ngx_http_limit_req_module进行限流:
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=5; }
$binary_remote_addr
即IP, 访问速率限制为1次/秒.
总之一句话, 引流到扛得住高并发的静态页. 比如GitPage. 参考文章: 我是如何通过Nginx日志实时封禁风险IP的
相信不少站长都了解被cc或ddos攻击支配的恐惧.
尤其对于个人主页等小站来说, 购买高防服务器或购买各种防护服务可能性价比并不高. 但普通服务器遇到稍大规模的攻击(也许这规模并不是真的很大), 可能服务器直接就挂了, 就算配置了页面的静态缓存, 也不一定能扛得住多大规模的攻击, 况且流量挺贵的.
对此笔者的方案是:
ipset+iptables
封禁之所以对于一般危险等级的IP进行重定向, 主要目的是:
下图引自我的前一篇文章《我是如何通过Nginx日志实时封禁风险IP的》
禁止使用root用户远程登录, 仅允许某个权限少的普通用户远程登录, 登录后再执行su
提权.
对于允许远程登录的账户, 建议不要使用密码登录, 更不能使用简单密码. 建议使用秘钥登录.
ssh-keygen
生成秘钥对, 将公钥放入authorized_keys
文件中即可.
服务器安全事大, 对于开发、运维、测试等工作来说, 安全都是重点关注的问题, 养成良好的习惯, 防患于未然.