需求背景:
由於對網絡安全的監督和管控越來越嚴格,chrome等瀏覽器強制要求https看樣子也是大勢所趨,所以我們遇到了服務http升級爲https協議的需求。我們企業對外的服務早已經是https協議了,但是內部一些工具的改造還在起步階段,本篇的改造策略只是拿jira和confluence來舉個實戰例子,其思想和步驟可以試用於其他場景。
http存在的漏洞和https是如何解決這些安全問題的可以詳見我前面的一篇博文《https://blog.csdn.net/yejingtao703/article/details/78723276》,這裏不再詳細論述。
詳細步驟:
1 準備證書和私鑰
Openssl命令創建出key和csr,其中csr提供給認證機構換取crt證書文件,key留給自己祕密保管。
爲了避免SHA-1,確保更強的安全性,我們還會採取Diffie-Hellman密鑰交換。
cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 2048 # 如果你的機器性能足夠強大,可以用 4096 位
所生成的文件也許要妥善保管,nginx配置時會用到。
2 https轉http
總體分爲兩大解決方案:服務端直接提供https服務和通過轉換層來實現,前者我們不推薦,因爲這個需要改造代碼,後者也有多種實現方式,我所知的就有3種。
本地代理:Nginx
通過本地的Nginx做https解析和轉發,優點是成型快,缺點是會暴露敏感信息,不方便擴展,適用於單個的web服務。
雲平臺LoadBalance:
直接在雲平臺的LoadBalance配置https監聽,優點是配置簡單,敏感信息權限可控且可複用,缺點是服務必須建設在雲平臺上。
WAF(Web公用防火牆):
本質上跟第一種方案差不多,只是把https轉http這一層從本地抽走專門拿出一層來做處理,帶來的優點是避免敏感信息泄露,省去了服務端配置,缺點是需要專人搭建WAF環境。
本文采用Nginx方案,這裏分享下相關配置:
server {
listen 80;
server_name wiki.demo.tv;
#charset koi8-r;
#access_log logs/host.access.log main;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
if ( $args ~ decoratorName=file ){
return 403;
}
proxy_pass http://ip:port;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name wiki.demo.tv;
rewrite ^ https://$http_host$request_uri? permanent;
server_tokens off;
}
server {
listen 443;
ssl on;
ssl_certificate /etc/nginx/ssl/demo.com.crt;
ssl_certificate_key /etc/nginx/ssl/demo.com.key;
server_name wiki.demo.tv;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:5m;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# secure settings (A+ at SSL Labs ssltest at time of writing)
# see https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
ssl_prefer_server_ciphers on;
proxy_set_header X-Forwarded-For $remote_addr;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
server_tokens off;
location / {
proxy_pass http://ip:port;
proxy_set_header Host $host:443;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
access_log /var/log/nginx/wiki.access.log;
error_log /var/log/nginx/wiki.error.log;
proxy_read_timeout 1200s;
client_max_body_size 0;
}
}
其中80端口配置二選一,一種是強制要求https,將80轉發到443;一種是https和http同時支持。
3 jira和confluence的系統配置
這個是Atlassian產品需要配置的,對於我們自己開發的web服務來說這一步是非必需的。
修改jira配置:
cd ${JIRA_HOME}/conf/server.xml
<Connector port="8080" relaxedPathChars="[]|" relaxedQueryChars="[]|{}^\`"<>"
maxThreads="150" minSpareThreads="25" connectionTimeout="20000" enableLookups="false"
maxHttpHeaderSize="8192" protocol="HTTP/1.1" useBodyEncodingForURI="true" redirectPort="8443"
acceptCount="100" disableUploadTimeout="true" bindOnInit="false" secure="true" scheme="https"
proxyName="jira.demo.tv" proxyPort="443"/>
修改confluence配置:
cd ${CONFLUENCE_HOME}/conf/server.xml
<Connector port="8090" connectionTimeout="20000" redirectPort="8443"
maxThreads="48" minSpareThreads="10"
enableLookups="false" acceptCount="10" debug="0" URIEncoding="UTF-8"
protocol="org.apache.coyote.http11.Http11NioProtocol"
scheme="https" secure="true" proxyName="wiki.demo.tv" proxyPort="443"/>
4 jira和confluence其他配置
1 基礎路徑
baseurl,由http修改爲https
Jira:管理à系統à一般設置à基本URL
Confluence:管理à一般配置à站點配置à服務器主頁URL
2 遠程應用程序
應用程序à集成à配置應用程序鏈接à遠程應用程序
注意事項
Iptables、防火牆放開443端口
這個是最容易被忽略的,當改爲https協議後你對外服務的端口變更了,一定要保證你機器內部和所在雲的安全組放通新的端口,否則將導致整個服務不可用,一次升級最終變成了一個故障。