帶你深入了解nginx基本登錄認證(包含配置步驟)
http基本驗證的作用
- http基本身份驗證會從瀏覽器彈出登錄窗口,
- 簡單明了,容易理解,
- 對於面向終端用戶的前台來說,不夠友好,
- 但對於內部員工操作的后台還是很有用,通常作為一層安全措施應用。
這個登錄認證安全嗎?
auth_basic作為一個認證模塊,在apache和nginx中都很常用,在許多沒有自帶認證的系統中,使用nginx的auth_basic做一個簡單的認證,是常見的操作,開啟了auth_basic認證之后,在訪問的時候,會提示輸入用戶名密碼進行認證。
通常和auth_basic配合使用的一個工具是htpasswd,該工具來源於httpd-tools包,主要用於生成用戶及其密碼加密文件
可能存在的問題
但是在htpasswd在生成密碼時有一個問題
可以看到htpasswd總共有4種加密算法,分別是MD5、bcrypt、CRYPT、SHA,在httpd-tools 2.2的版本中,默認使用的是CRYPT加密算法來進行密碼加密的,而httpd-tools 2.4的版本中,默認是使用MD5來進行密碼加密的
有人說明明SHA比MD5加密要安全性高,為什么新版本中用MD5作為默認加密算法?
在httpd-tools 2.4的圖中,最后一句話“The SHA algorithm does not use a salt and is less secure than the MD5 algorithm”翻譯一下就是,沒有加salt的SHA算法,並沒有MD5安全
salt在密碼學中,叫做鹽,是一個隨機生成的字符串,在不加鹽的哈希中,有一種破解方法就是彩虹表碰撞,原始密碼通過加鹽之后再進行散列,可以有效避免彩虹表攻擊的暴力破解
解決辦法
安全的處理方法是,更新httpd-tools到2.4版本,然后重新生成用戶密碼對,或在htpasswd生成密鑰時,通過參數-m選擇md5加密方式生成新的用戶密碼對
模擬驗證演示
這里為了例子我們新建一個站點
域名: nginx_basic_auth.msy.plus
登錄名: admin
密碼: 12345678
僅作為演示,生產環境不能使用這種極簡單的密碼
生成供測試文件
echo "<h1>welcome to nginx_basic_auth.msy.plus</h1>" >> ./nginx_basic_auth/index.html
配置nginx的http基本驗證
在nginx.conf中檢查是否有對conf.d目錄的支持如不存在,添加它
include /usr/local/soft/nginx-1.18.0/conf/conf.d/*.conf;
說明:生產環境中,為了管理方便,會把每個server放到專用的conf文件中,不要混在一起而全寫到nginx.conf中,修改和查找都不方便
創建網站的server文件
server {
auth_basic "lhdtest.com admin";
auth_basic_user_file /usr/local/soft/nginx-1.18.0/conf/conf.d/admin.pwd;
listen 80;
server_name nginx_basic_auth.msy.plus
root /data/site/admin/html;
index index.html index.shtml index.htm;
access_log /data/nginx/logs/admin.access_log;
error_log /data/nginx/logs/admin.error_log;
}
生成密碼
nginx僅需要一個密碼文件作為驗證,而該密碼文件在何處生成並不重要,所以你只需要一個可以生成該密鑰的方法即可
方法很多,可以用python 可以用go 或者用c
這里我用的是windows下的centos子系統,直接生成該密鑰上傳到服務器即可
生成工具選擇htpasswd,htpasswd 是開源 http 服務器 apache httpd 的一個命令工具,用於生成 http 基本認證的密碼文件。
安裝htpasswd
ubuntu安裝:
sudo apt-get install apache2-utils
centos安裝:
yum -y install httpd
密鑰生成選項
這里使用如下生成選項
#-n:Don't update file; display results on stdout //不更新文件;在標准輸出上顯示結果
#-b:Use the password from the command line //從命令行使用密碼
#-m:Force MD5 encryption of the password //強制對密碼進行MD5加密
輸入命令生成密鑰
htpasswd -nbm admin 12345678
可以看到輸出有密鑰
admin:$apr1$nkxLxBPa$EGa.u5yKuQ08m6g/8bGb9.
在你之前所指定的密碼文件中,輸入生成的內容即可
auth_basic_user_file /usr/local/soft/nginx-1.18.0/conf/conf.d/admin.pwd; // 對於windows server用戶來說,路徑可能略有不同
測試效果
進入網站輸入正確的用戶名和密碼即可進入網站
參考文章
你的nginx登錄認證安全嗎?
配置http基本驗證(Basic Auth)
Centos安裝htpasswd_Nginx中使用htpasswd