注:最近部門領導要求梳理一份常用工具的安全加固參考手冊,基於此需求,針對工作中經常遇到的被漏掃發現的問題,進行了梳理,參考了官網內容及網上各位大神的內容,不足之處,還望指正,版本環境爲nginx1.18穩定版,若有參數不能正常使用,請參考nginx官網。
Nginx部署規範
常用編譯參考
--with-pcre=/asop/soft/pcre-8.43
--with-zlib=/asop/soft/zlib-1.2.11
--with-openssl=/asop/soft/openssl-1.0.1j
--with-http_geoip_module
可選:
#啓用https支持支持
--with-http_ssl_module
#啓用http狀態信息查看
--with-http_stub_status_module
Nginx優化及加固參考
版本信息隱藏
1、隱藏版本信息
配置參考:
vi conf/nginx.conf
#在http段中加入如下信息
server_tokens off;
2、隱藏http響應頭中的server信息
配置參考:
#隱藏server信息需要修改源碼重新編譯
1、src/core/nginx.h
#define nginx_version 000000
#define NGINX_VERSION "0.00"
#define NGINX_VER "GW/" NGINX_VERSION
2、src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: GW" CRLF;
開啓CPU親和
#開啓CPU親和是爲了將nginx的進程綁定到對應的CPU核心上,使各核心的使用率基本均衡,避免多個核心同時運行着多個進程。
#開啓親和需要先確認CPU數量
配置參考:
#查詢當前服務器的物理CPU數量
cat /proc/cpuinfo | grep "physical id"|sort|uniq|wc -l
#查看每CPU的邏輯核數
cat /proc/cpuinfo | grep "cpu cores"|uniq
#worker_processes 定義nginx啓動的進程數,對應等於CPU的總的核數(物理數量* 單CPU核數)
#worker_cpu_affinity 綁定CPU 此處爲八核的綁法,幾核就對應幾組(例如:4核 0001 0010 0100 1000),也可以設置爲auto,自動分配
vi conf/nginx.conf
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
**增加nginx進程可打開的最大文件數**
worker_rlimit_nofile 65535;
日誌格式定義
配置參考:
1、定義日誌格式
vi conf/nginx.conf 取消如下內容註釋,使所有server主機都可以使用
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
2、定義日誌路徑
vi conf/nginx.conf 在每個server段內定義或者修改
access_log logs/host.access.log main
禁止目錄列出
配置參考:
vi conf/nginx.conf 在http段中加入如下信息:
autoindex off;
禁用不安全的http方法
配置參考:
location塊中加入如下信息
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
}
防DOS攻擊
控制超時時間
#設置客戶端請求主體讀取超時時間
client_body_timeout 10;
#設置客戶端請求頭讀取超時時間
client_header_timeout 10;
#設置長連接的超時時間
keepalive_timeout 5;
#指定響應客戶端的超時時間
send_timeout 10;
限制連接數
#涉及http_limit_conn_module
#限制客戶端與服務器的連接數
配置參考:
#定義一個共享內存區conip,大小爲10M,配置於http段中可以複用
limit_conn_zone $binary_remote_addr zone=conip:10m;
#限制每個客戶端與服務器的連接數,需要在server主機中加入如下內容
#限制每個客戶端IP可以與服務器建立的連接數,perip 爲上面再http段中定義的zone 名字,針對的爲單個ip
limit_conn conip 10;
限制連接速率
#涉及http_limit_req_module,默認即構建
#限制單ip請求的處理速度
#定義一個共享內存區one,大小爲10M,每個客戶端每秒接收的請求數不超過5個,http段中加入如下內容:
配置參考:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
#以下配置可以放置於server段中,也可放置於location段中,進行目錄級別的限制,
#限制突發請求不超過8個,每秒的請求數會從上方的http段中的配置中繼承
配置參考:
limit_req zone=one burst=8;
#以上限制爲針對的所有ip地址,若需要限制單獨的ip地址,則需要編譯–with-http_geoip_module 模塊,並在http段中增加如下內容
配置參考:
geo $wip {
default 0;
127.0.0.1 1;
172.16.0.0 1;
}
map $wip $limit{
0 $binary_remote_addr
1 "";
}
防止點擊劫持
#增加如下配置至server段,可以防止iframe嵌套導致的點擊劫持
配置參考:
add_header X-Frame-Options SAMEORIGIN;