Jira的終極應用--Http升級爲Https

需求背景:

由於對網絡安全的監督和管控越來越嚴格,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="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"
                   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協議後你對外服務的端口變更了,一定要保證你機器內部和所在雲的安全組放通新的端口,否則將導致整個服務不可用,一次升級最終變成了一個故障。

 

發佈了169 篇原創文章 · 獲贊 190 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章