本文章為原創(chuàng)非復(fù)制行為
前言
nginx可以開(kāi)啟目錄瀏覽做文件服務(wù)器乱顾,但有時(shí)不想讓所有人都能訪問(wèn)占用服務(wù)器資源,或者對(duì)某個(gè)子目錄做一個(gè)私人的文件分享观蜗,可以加上一個(gè)簡(jiǎn)單的認(rèn)證basic auth静汤,使用簡(jiǎn)單適合安全性要求不高的地方。這種認(rèn)證在舊路由器固件上能經(jīng)常見(jiàn)到与倡,因?yàn)樵诰钟蚓W(wǎng)傳輸數(shù)據(jù)無(wú)傷大雅,但在公網(wǎng)非常不安全疚察,basic auth會(huì)以明文的方式傳輸賬號(hào)和密碼,長(zhǎng)久以來(lái)多次暴露密碼添加認(rèn)證也就無(wú)意義了仇奶,所以必須要為文件服務(wù)器配置ssl貌嫡,配置ssl還可以避免傳輸?shù)奈募驗(yàn)g覽的內(nèi)容被攻擊者知曉。
先說(shuō)一說(shuō)basic auth一些比較明顯的缺點(diǎn)
- 雖然賬號(hào)和密碼經(jīng)過(guò)base64轉(zhuǎn)換该溯,實(shí)際上還是明文傳輸
- 本身不能防止暴力破解岛抄,需要配合fail2ban等工具
- 不能控制用戶注銷
配置完成用瀏覽器訪問(wèn)就會(huì)彈出這樣的認(rèn)證窗口
- chrome瀏覽器不會(huì)顯示"Server require user and password"的內(nèi)容
配置
本文章的目錄結(jié)構(gòu)
配置賬戶密碼,生成密碼文件
獲取htpasswd工具狈茉,centos安裝httpd-tools夫椭,debain系安裝apache2-utils
[root@ykxz ~]# yum install -y httpd-tools
[root@ykxz ~]# apt-get install -y apache2-utils
官方給出的用法參考:
htpasswd [-cimBdpsDv] [-C cost] passwordfile username
htpasswd -b[cmBdpsDv] [-C cost] passwordfile username passwordhtpasswd -n[imBdps] [-C cost] username
htpasswd -nb[mBdps] [-C cost] username password
這里將basic auth認(rèn)證文件放在nginx.conf同級(jí)目錄cert下,密碼使用bcrypt加密(-B參數(shù))氯庆,將賬號(hào)和密碼保存到y(tǒng)ourhtpasswd文件蹭秋。不建議賬號(hào)設(shè)置為Admin,網(wǎng)絡(luò)攻擊常以Admin賬號(hào)試圖登入
- 新建用戶ykxz
[root@ykxz ~]# htpasswd -Bbc /etc/nginx/cert/yourhtpasswd ykxz 123456
- 添加用戶ykxz2
[root@ykxz ~]# htpasswd -Bb /etc/nginx/cert/yourhtpasswd ykxz2 123456
- 刪除用戶ykxz2
[root@ykxz ~]# htpasswd -D /etc/nginx/cert/yourhtpasswd ykxz2
給需要的目錄添加basic auth認(rèn)證堤撵,在配置文件的location中添加
auth_basic "Server require user and password";
auth_basic_user_file cert/yourhtpasswd;
配置ssl
這里使用了已經(jīng)購(gòu)買的域名證書仁讨,也可以在Let's Encrypt申請(qǐng)免費(fèi)的ssl證書(需要三個(gè)月更新一次證書),沒(méi)有購(gòu)買域名自簽ipssl證書也是可以的乌奇。
這里將ssl證書文件.pem歼秽、.key放在了nginx.conf同級(jí)目錄cert下榨呆,在listen一行將“ssl”添加在端口7000后啟用ssl,此時(shí)的設(shè)置不允許http訪問(wèn)
listen 7000 ssl;
如果使用http訪問(wèn)則返回400錯(cuò)誤
并進(jìn)行一些ssl設(shè)置
ssl_certificate cert/123456_your.domain.com.pem;
ssl_certificate_key cert/123456_your.domain.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
這是我的配置文件參考丈挟,為頂層目錄添加了認(rèn)證,可直接復(fù)制志电,必須修改的地方為
listen 7000 ssl; ?nginx監(jiān)聽(tīng)的端口
server_name your.domain.com; ?修改為你的域名
alias file_server/; ?文件服務(wù)器頂層目錄曙咽,/不可以刪除
# vim: ft=conf
server {
listen 7000 ssl;
server_name your.domain.com;
ssl_certificate cert/123456_your.domain.com.pem;
ssl_certificate_key cert/123456_your.domain.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
charset utf-8;
location / {
auth_basic "Server require user and password";
auth_basic_user_file auth/testpasswd;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
alias fileServer/;
}
error_log logs/error_your.domain.com:7000.log error;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
為多個(gè)目錄添加認(rèn)證
如果不僅認(rèn)證頂層目錄還要認(rèn)證子目錄,并采用不同的賬戶密碼挑辆,可以采用以下配置
location ^~ /subdirectory/ {
auth_basic "Subdirectory require user and password";
auth_basic_user_file cert/yourhtpasswd2;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
alias file_server/subdirectory/;
}
因?yàn)閍uth_basic不能寫在if里面通過(guò)判斷請(qǐng)求路徑添加認(rèn)證桐绒,所以要在server里面添加一個(gè)location夺脾,當(dāng)請(qǐng)求的uri匹配到這個(gè)location則認(rèn)證及開(kāi)啟目錄瀏覽