安全加固之https

背景

去年的Struts漏洞,今年的oneday wannaCry勒索病毒,越来越多的安全事件在全球发生,随着很多的大型互联网站逐步的迁移到全战https,甚至越来越多的安全厂商,安全系统踊跃而出,安全慢慢成为一个衡量系统的指标。

什么是https

先来一段度娘的解释

HTTP为超文件传输协议(HyperTextTransfer Protocol),为应用层协议。SSL(SecuritySockets Layer)/TLS(TransportLayer Security)为安全套接层/传输层安全协议,TLS为SSL的继任者。SSL记录协议工作在会话层,SSL握手协议工作在表示层。

HTPPS即为HTTP+SSL/TLS的组合。(HyperText Transfer Protocol over Secure Socket Layer),提供身份验证和通讯加密功能。加密方法采用对称加密方式(加密和解密采用相同秘钥AES)或非对称加密方式(加密和解密采用不同秘钥,公钥和私钥RSA)

方案选型

Nginx是一个高性能的HTTP和反向代理服务器,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。还有丰富的module扩展能力。而nginx实现https,主要是将http请求通过301/302/307重定向到https请求,再由nginx反向代理到后台的服务器。
这样做的优势在于:

  • 不用每个tomcat都加证书,代码改动少
  • Nginx本身针对安全方面有比较成熟的解决方案,网上资源多。
  • Nginx支持lua module扩展,通过编写lua脚本来扩展Nginx,可以快速开发出高性能的web服务

本次采用的Nginx版本为OpenResty1.11.2.3版本,采用openResty主要是因为扩展了lua 库以及第三方模块,通过使用lua脚本,可以方便搭建高并发、扩展性高的动态web应用、动态网关以及WAF

实现

Nginx 实现https的方案图如下:


https_nginx.jpg

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向拥有CA认证的组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面
比如说:
1、浏览器授信的


safe.jpg

2、浏览器不授信的


unsafe.jpg

而目前证书的方案一般有两种:

  • 互联网证书
    是拥有CA认证的机构签发的二级证书
    拥有CA认证的权威机构,浏览器会默认导入它的根证书,所以由它签发的证书都是授信的,客户端不需要导入证书,浏览就即可直接访问,将不弹警告(这些证书需要花钱买)
  • 银行
    通过使用exe的安装方式安装证书
    银行使用的根证书是自行制作的,不是权威的CA认证机构颁发,所以由它签发的证书,不在客户端进行导入,浏览器访问将会弹出警告,不可直接访问。所以通常银行都会下载网银助手来安装证书(这些证书不需要花钱买)

我们采用的是跟银行的方案一致,毕竟它免费。

1、制作自签名的SSL证书

1、生成自签名根证书

openssl req-x509 -nodes -days 3650 -newkey rsa:2048 -keyout root.key -out root.crt -subj"/C=CN/ST=ZheJiang/L=HangZhou/O=Xiaobaxi/OU=GA/CN=XIAOBAXI-ROOT-V1"-config openssl.cnf

2、生成服务端私钥和证书申请请求

openssl genrsa-out server.key 2048

openssl req-new -key server.key -subj"/C=CN/ST=ZheJiang/L=HangZhou/O=Xiaobaxi/OU=GA/CN=xiaobaxi.com"-out server.csr -config openssl.cnf

3、生成san.cnf文件

echo.[SAN] > san.cnf
echo.subjectAltName=@alt_name >> san.cnf
echo.[alt_name] >> san.cnf
echo.IP.1=192.168.2.222 >> san.cnf
echo.DNS.1=192.168.2.222 >> san.cnf

4、使用根证书签发服务端证书

openssl x509-req -in server.csr -CA root.crt -CAkey root.key -CAcreateserial -outserver.crt -days 1825 -extensions SAN -extfile san.cnf

5、将根证书内容追加到服务端证书后面,形成证书链

cat root.crt >> server.crt

6、查看证书信息

openssl x509-noout -text -in server.crt

2、Nginx配置ssl

在server模块中作如下配置:

ssl_certificate     ../CA/server.crt;
ssl_certificate_key  ../CA/ server.key;
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers  on;
ssl_ciphers         HIGH:!aNULL:!MD5;
ssl_session_cache    shared:SSL:10m;
ssl_session_timeout  10m;
ssl_dhparam ../CA/dhparam.pem;

3、增加一些安全相关的response header

  1. HTTP Strict Transport Security,简称HSTS,要求浏览器总是通过HTTPS协议访问一个网站,如果用户输入HTTP,则由浏览器重定向为HTTPS,这个重定向由浏览器在本地完成,节省了一次HTTP请求,也避免被劫持的风险:
add_header Strict-Transport-Security"max-age=31536000;includeSubdomains";
  1. 禁止嗅探文件类型:
add_headerX-Content-Type-Options nosniff;
  1. 防跨站脚本攻击(XSS)
add_header X-XSS-Protection"1; mode=block";
  1. 防csrf攻击, 通过请求头里的Referer来防csrf攻击
valid_referers none blocked 192.168.2.222;
if ($invalid_referer) {
    return 403;
}

4、HTTP自动重定向到HTTPS

用户使用浏览器访问网站时通常只输入http://或默认浏览器缺省,因此需要让网站支持从http重定向到https。需配置nginx将http请求自动重定向到https:

server{
      listen 80;
      error_page 497 https://$host$request_uri;
      location / {
           set $redirect_to_https"${http_upgrade_insecure_requests}${https}";
           if ($redirect_to_https ="1") {
             add_header VaryUpgrade-Insecure-Requests;
              return 307https://$host$request_uri;
           }

           if ($server_port = 80) {
              return 307 https://$host$request_uri;
           }

           if ($scheme = http) {
              return 307 https://$host$request_uri;
           }

       }

}

5、告诉Tomcat识别请求参数

在nginx的反向代理下,如果不做任何配置Tomcat 认为所有的请求都是 Nginx 发出来的,这样会导致如下的错误结果:

request.getScheme()  //总是 http,而不是实际的http或https
request.isSecure()  //总是false(因为总是http)
request.getRemoteAddr()  //总是 nginx 请求的 IP,而不是用户的IP
request.getRequestURL()  //总是 nginx 请求的URL 而不是用户实际请求的 URL
response.sendRedirect(相对url )  //总是重定向到 http 上 (因为认为当前是 http 请求)

如果程序中把这些当作实际的用户请求做处理就有问题了。解决方法很简单,只需要分别配置一下 Nginx 和 Tomcat 就好了,不用修改程序。

配置 Nginx 的转发选项:

proxy_set_header       Host $host;
proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_headerX-Forwarded-Proto  $scheme;
proxy_set_headerX-Server-Port $server_port;

配置Tomcat的server.xml,配置Engine模块:

 <ValveclassName="org.apache.catalina.valves.RemoteIpValve" 
   remoteIpHeader="X-Forwarded-For" 
   protocolHeader="X-Forwarded-Proto"
   portHeader="X-Server-Port" />

而在所有配置实现之后,由于证书是我们自行制作,需要在客户端的浏览器中导入根证书,nginx服务端要导入服务器端证书。而手工操作导入就非常的繁琐,所以通过一定工具化的操作来简化。

6、来几个工具流程

解决客户端授信问题:


install.png

解决服务端授信问题:


cert.png

总结

通过nginx来改造平台安全加固,能在最少修改代码的情况实现https。后续可以通过更加方便的方式来进行客户端,服务器端证书的配置,比如说通过部署态解决服务器端证书配置,通过ocx控件或者浏览器插件方式来配置客户端证书。

在上面选型的时候提到,OpenResty集成了Lua库,通过使用lua脚本,可以操作更多的例如zookeeper,redis等中间件。而在安全攻击方面,现有的配置简单的实现了xss,csrf等攻击,而为了更高的安全性,可以通过OpenResty + lua来实现WAF(web application firewall)web应用防火墙。同时,平台自身可以通过filter,参数校验等从代码层面上,防止XSS等攻击。

BTW:感谢吴童鞋的研究~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容