Nginx站點安全
一、nginx簡介
Nginx("engine x") 是一個高性能的 HTTP 和反向代理伺服器,也是一個IMAP/POP3/SMTP 代理伺服器。Nginx由Igor Sysoev 為俄羅斯通路量第二的Rambler.ru 站點開發。
Nginx ("engine x") 是一個高性能的 HTTP 和反向代理伺服器,也是一個 IMAP/POP3/SMTP代理伺服器。 Nginx 是由 Igor Sysoev 為俄羅斯通路量第二的 Rambler.ru 站點開發的,第一個公開版本0.1.0釋出于2004年10月4日。其将源代碼以類BSD許可證的形式釋出,因它的穩定性、豐富的功能集、示例配置檔案和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4釋出。
支援高并發連接配接.官方測試的是5w并發連接配接但在實際生産中可制成2-4w并發連接配接數,得益于nginx使用最新的epoll(linux 2.6核心)和kqueue(freebsd)網絡I/O模型.而apache使用的則是傳統的select模型,其比較穩定的prefork模式為多程序模式,需要經常派生子程序,所消耗的CPU等伺服器資源要比nginx高的多.
二、安裝nginx
安裝環境:虛拟機vmware10下centos6.4-64位作業系統最小化安裝
軟體版本:nginx-1.4.4.tar 下載下傳位址:www.nginx.org
還需要我們安裝事件庫,因為nginx是事件觸發機制。軟體包版本:libevent-2.0.16-stable.tar
還需要注意的是預編譯環境,在安裝時會檢測預編譯環境的,如果出錯,一定要檢測自己自己的預編譯環境。
安裝過程:
[root@ahao~]# tar -zxvf nginx-1.4.4.tar.gz -C /usr/local/src
[root@ahao~]# cd /usr/local/src/nginx-1.4.4/
[[email protected]]# groupadd -r nginx
[[email protected]]# useradd -r -g nginx -s /sbin/nologin -M nginx
[[email protected]]# yum install pcre-devel
[root@ahao~]# tar -zxvf libevent-2.0.16-stable.tar.gz -C /usr/local/src
[root@ahao~]# cd /usr/local/src/libevent-2.0.16-stable/
[[email protected]]# ./configure --prefix=/usr/local/libevent
[[email protected]]# make && make install
[[email protected]]# cd /usr/local/libevent
[root@ahaolibevent]# ll lib
[root@ahaolibevent]# vim /etc/ld.so.conf.d/libevent.conf//添加如下目錄:
/usr/local/libevent/lib
[root@ahaolibevent]# ldconfig /重新配置
[root@ahaolibevent]# ldconfig -pv |grep libevent 檢視一下
[root@ahao nginx-1.4.4]# ./configure --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/--http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --with-pcre
[root@ahao nginx-1.4.4]# yum install openssl-devel //出現錯誤,需要安裝openssl-devel包
[[email protected]]# make && make install
[root@ahaonginx]# cd /usr/local/nginx/sbin/
[root@ahaosbin]# ./nginx –t /測試安裝之後的配置檔案是否有錯,
mkdir:cannot create directory `/var/tmp/nginx/client': No such file or directory
[root@ahaosbin]# mkdir -pv /var/tmp/nginx/client
[root@ahaosbin]# ./nginx –t
nginx:the configuration file /etc/nginx/nginx.conf syntax is ok
nginx:configuration file /etc/nginx/nginx.conf test is successful
編寫控制腳本:
#!/bin/bash
# ./etc/init.d/functions
prog=/usr/local/nginx/sbin/nginx
lockfile=/var/lock/nginx.lock
start (){
if [ -e $lockfile ];then
echo "the nginx server isstarted"
else
echo -n "the nginx server isstarting......"
sleep 1
$prog && echo -e"[\033[32mOK\033[0m] " && touch $lockfile ||echo"failer"
fi
}
stop () {
if [ ! -e $lockfile ];then
echo "the nginx server isstoped"
echo -n "the nginx server isstoping......"
$prog -s stop && echo "OK" && rm-rf $lockfile || echo "failer"
fi
restart(){
if [ -e $lockfile ]; then
echo -n "the nginx isstoping..."
$prog -s stop && echo "OK" && rm -rf $lockfile ||echo "failer"
echo -n "the nginx isstarting..."
$prog && echo "OK"&& touch $lockfile ||echo "failer"
fi
case"$1" in
start)
start
;;
stop)
stop
restart)
stop
start
;;
*)
echo"USAGE:start|stop|restart"
esac
service nginx start//啟動
先測試通路web伺服器:
三、站點安全
Nginx站點安全是基于子產品實作的不同的安全設定需要不同的子產品。
1、身份驗證
身份驗證需要Auth Basic子產品。
參考網站:http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
配置如下:
vim /etc/nginx/nginx.conf /編輯nginx主配置檔案添加
server {
listen 192.168.1.199:80;
server_name tec.abc.com;
location / {
root /usr/local/nginx/tec;
index index.html index.htm;
}
auth_basic "a-hao";
auth_badic_user_file /usr/local/nginx/tec/.htpasswd;
這裡需要我們知道.htpasswd檔案的産生,需要httpd-tools軟體包,是以需要在主機上安裝這樣軟體包。
[root@ahao init.d]# yum install httpd-tools
[root@ahao init.d]# mkdir/usr/local/nginx/tec
[root@ahao init.d]# cd /usr/local/nginx/tec
[root@ahao tec]# vim index.html //在檔案添加一行顯示就可以。比如:tec
現在我們生成.htpasswd檔案
[root@ahao tec]# htpasswd -c /usr/local/nginx/tec/.htpasswdaaa
完成之後我們可以在浏覽器中通路一下(實驗環境虛拟機ip是:192.168.1.199)
證明身份驗證成功。
2、來源控制
來源控制是基于access子產品實作的
參考網站:http://nginx.org/en/docs/http/ngx_http_access_module.html
Access可以在server裡引用,也可以在location中引用。
為了便于實作的需要,我先安裝一個文本編輯器------lynx
vim/etc/nginx/nginx.conf /編輯nginx主配置檔案添加
lynx /etc/hosts中添加
192.168.1.199 www.abc.com
192.168.1.199 tec.abc.com
完成之後你可以測試:
root@ahao tec]# lynx http://tec.abc.com
這個頁面是需要經過身份驗證的,測試中,成功的話會讓你身份驗證的。
[root@ahao tec]# vim /etc/nginx/nginx.conf
[root@ahao tec]# service nginx restart
重新開機之後測試:(本地實體位址是192.168.1.105)
是以在我們實體機上是可以通路的。
這樣就達到目的,實體機192.168.1.105可以通路服務,但是在虛拟機中192.168.1.199就不能通路伺服器。
3、加密通路
加密通路使用的子產品是:ssl
參考網站:http://nginx.org/en/docs/http/ngx_http_ssl_module.html
配置:
CA伺服器配置:
[root@ahao~]# vim /etc/pki/tls/openssl.cnf
首先我們要簡單的配置ssl子產品檔案:
根據檔案中需要一個資料檔案來記錄證書頒發的情況。是以我們就建立這樣的 檔案,
[root@ahao~]# cd /etc/pki/CA
[root@ahao CA]# touch index.txt
[root@ahaoCA]# touch serial //這是記錄證書序号的檔案,也需要手動建立
[root@ahaoCA]# echo "01">serial //加入序号,以“01”開始
在openssl.cnf檔案中還需要更改證書頒發所允許的地區,要給成不受限的。
countryName = optional
stateOrProvinceName =optional
organizationName = optional
還可以根據自己的需要更改預設頒發證書的國家,省份,城市。
[root@ahaoCA]# openssl genrsa 1024 >private/cakey.pem //産生私鑰檔案
[root@ahaoCA]# chmod 600 private/cakey.pem //更改權限
//産生公鑰檔案
[root@ahaoCA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem
You are about to be asked to enter information that will beincorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Nameor a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [BEIJING]:
Locality Name (eg, city) [BEIJING]:
Organization Name (eg, company) [Default Company Ltd]:CA
Organizational Unit Name (eg, section) []:tec
Common Name (eg, your name or your server's hostname) []:rootca.org
Email Address []:
Web伺服器現在需要向CA伺服器獲驗證書(證書的擷取是需要個過程,證書上要有web服務 的公鑰,公鑰從哪裡來呢,公鑰是從私鑰中産生的,是以在請求的過程中,必須要先 有WEB服務的私鑰,再發送請求,獲得證書。)
//産生web服務的私鑰檔案
[root@ahao CA]# mkdir -pv /etc/nginx/certs
mkdir: created directory `/etc/nginx/certs'
[root@ahao CA]# cd /etc/nginx/certs/
[root@ahao certs]# openssl genrsa 1024 >nginx.key
[root@ahaocerts]# chmod 600 nginx.key //更改權限
[root@ahaocerts]# openssl req -new -key nginx.key-out nginx.crq // 公鑰檔案的建立
You are about to be asked to enter information that will beincorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Nameor a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [BEIJING]:HENAN
Locality Name (eg, city) [BEIJING]:ZHENGZHOU
Organization Name (eg, company) [Default CompanyLtd]:TUOYUANEDU
Organizational Unit Name (eg, section) []:tec
Common Name (eg, your name or your server's hostname) []:tec.abc.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@ahaocerts]# openssl ca -in nginx.crq -out nginx.cert //建立請求 檔案
Usingconfiguration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Nov 30 00:17:54 2013 GMT
Not After : Nov 30 00:17:54 2014 GMT
Subject:
countryName = CN
stateOrProvinceName = HENAN
organizationName =TUOYUANEDU
organizationalUnitName = tec
commonName =tec.abc.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
D1:DD:F8:9A:46:B1:01:1D:ED:B2:19:49:6C:7A:E8:48:47:CE:A9:CB
X509v3 Authority Key Identifier:
keyid:3E:A6:CE:D8:37:0C:F8:2E:5B:6C:59:2A:DE:39:EF:F9:AF:F3:34:45
Certificate is to be certified until Nov 30 00:17:54 2014 GMT (365days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@ahao certs]# cat /etc/pki/CA/index.txt //檢視是否有證書檔案
V 141130001754Z 01 unknown /C=CN/ST=HENAN/O=TUOYUANEDU/OU=tec/CN=tec.abc.com
我們還需要将證書與web伺服器綁定,
[root@ahao nginx]# vim /etc/nginx/nginx.conf //在主配置文檔中添加綁定項:
我們現在啟動一台windowsxp虛拟機,以它來通路web服務,事先在C:\windows\system32\drives\etc\hosts檔案中添加192.168.1.199 tec.abc.com
設定之後我們可以通路試試:出現下面的情況
出現這樣的情況,是主機不能識别證書是哪個權威機構頒發的,就是不認可證書,這樣的情況在nginx中有一種方法就是需要我們将CA伺服器證書與web服務中的證書合成一張證書。
[root@ahao certs]# cp /etc/pki/CA/cacert.pem ./ //将CA憑證拷貝過來
[root@ahao certs]# mv nginx.cert nginx.cert.bak //改名字便于區分,
[root@ahao certs]# cat nginx.cert.bak cacert.pem >nginx.cert // 合成一張證書,合成名字還是原來WEB服務的證書名字。
出現CA服務證書,就證明對了,我們就安裝證書就可以了