1. 程式人生 > >如何讓nginx修改Response HTTP Header中的server的值

如何讓nginx修改Response HTTP Header中的server的值

伺服器的作業系統版本、提供HTTP服務的軟體版本等資訊屬於伺服器安全資訊,防止它們的資訊洩露有助於防止黑客定向尋找特定作業系統或軟體版本存在的漏洞,伺服器也就多一重保障。nginx在每個Response中寫入了Server這個Header,Server的值明確標示了伺服器軟體和版本資訊(1.9.11版本後只寫入了伺服器軟體名稱,沒有寫入版本資訊)。問題在於nginx不允許通過proxy_set_header指令修改修改server。nginx官方提供了一個可選的nginx模組來任意修改Header。CentOS系統提供的nginx、OpenSSL、GCC的版本較低。因此在這一次升級操作包含它們的升級操作。GCC的升級方法請參照:

CentOS 7 升級GCC編譯器。下文直接開始升級OpenSSL。工作目錄是:/usr/local/nginx。所有的原始碼的下載檔案和解壓檔案都存放在這個工作目錄下。

一、升級OpenSSL

CentOS7自帶的SSL庫的版本還是1.0.1e版本。OpenSSL的升級工作的難處不是OpenSSL如何編譯,而是如何換掉正在被無數軟體正在使用的舊版本的OpenSSL,這些軟體包含你正在使用的OpenSSH。解除安裝?包含 正在使用的桌面gnome都得停止執行。如下圖所示:
這裡寫圖片描述
OpenSSL的原始碼下載地址是:https://www.openssl.org/source/。它的編譯操作不難,總體思路是編譯安裝後用新的執行庫檔案換掉舊的庫檔案。操作過程如下:

tar zxf openssl-1.0.2k.tar.gz
cd openssl-1.0.2
./Configure linux-x86_64 shared zlib
make
make install
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
ln -s /usr/local/lib64/libssl.so.1.1
/usr/lib64/libssl.so.1.1 ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1 echo “/usr/local/openssl/lib” >> /etc/ld.so.conf ldconfig -v ldd /usr/bin/openssl

執行openssl version或者openssl version -a,回顯如下圖所示則表示成功。
這裡寫圖片描述
如果出現錯誤:openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory。請執行:

ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

二、準備nginx編譯環境

nginx功能強大,依賴項也比較多。尋找依賴項的方法是不斷的執行configure命令,提示內容包含缺少的依賴項。我總結後把所有依賴項的安裝放到一行命令中,命令列是:

yum install libxml2-devel libxslt-devel gd-devel perl-ExtUtils-* GeoIP-data GeoIP-devel GeoIP-update gperftools gperftools-devel gperftools-libs

安裝成功的截圖如下:
這裡寫圖片描述

三、編譯並安裝nginx

njs可以在nginx配置裡啟用javascript編寫的伺服器配置,cookie_flag可有效防止cookie劫持,Server Header的值的修改依賴more_header,它們都沒有整合到nginx原始碼,所以下載和附加的編譯依賴項有三個。nginx當前最新版本是1.13.5,下面是下載和解壓命令。

wget http://nginx.org/download/nginx-1.13.5.tar.gz
tar -xvf nginx-1.13.5.tar.gz
wget https://github.com/nginx/njs/archive/master.zip
unzip master.zip
rm master.zip
wget https://github.com/AirisX/nginx_cookie_flag_module/archive/master.zip
unzip master.zip
rm master.zip
wget https://github.com/openresty/headers-more-nginx-module/archive/master.zip
unzip master.zip
rm master.zip

接下來要做的是編譯nginx。編譯之前需要特別說明的是:nginx從1.9.11版本開始修改了–add-module靜態編譯附加模組的約定,這裡所有附加的功能模組以dynamic的方法編譯。如果nginx正在執行中,請執行sudo systemctl stop nginx使nginx處於停止執行的狀態。cdnginx-1.13.5,執行命令:

./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E' --add-dynamic-module=/usr/local/nginx/njs-master/nginx --add-dynamic-module=/usr/local/nginx/nginx_cookie_flag_module-master --add-dynamic-module=/usr/local/nginx/headers-more-nginx-module-master
make
sudo make install

編譯成功截圖如下:
這裡寫圖片描述
驗證一下編譯和安裝結果:
這裡寫圖片描述

四、配置nginx

編輯nginx配置檔案,在http上面插入三行load_module指令:

# load_module /usr/lib64/nginx/modules/ngx_stream_js_module.so;# 暫時用不上。
load_module /usr/lib64/nginx/modules/ngx_http_js_module.so;
load_module /usr/lib64/nginx/modules/ngx_http_cookie_flag_filter_module.so;
load_module /usr/lib64/nginx/modules/ngx_http_headers_more_filter_module.so;

這裡的配置的作用是簡單隱藏server名稱,把Server的值改為。在http指令作用域內server指令作用域外加入一行指令:

more_set_headers 'Server: -';

儲存,執行命令:

sudo nginx -t
sudo nginx -s reload

驗證一下結果,成功截圖如下(Chrome Browser偵錯程式):
這裡寫圖片描述