Nginx訪問控制的原理及實現(xiàn)
什么是訪問控制?
訪問控制是一種安全機制,旨在限制系統(tǒng)或網(wǎng)絡(luò)資源的訪問權(quán)限,確保只有經(jīng)過授權(quán)的用戶或系統(tǒng)可以訪問這些資源。對訪問控制的理解可能包括以下幾個關(guān)鍵方面:
身份驗證(Authentication): 訪問控制的第一步是確認用戶或系統(tǒng)的身份。這通常涉及到使用用戶名、密碼、密鑰或其他身份驗證手段來驗證用戶的身份。合法的身份驗證是訪問控制的基礎(chǔ)。
授權(quán)(Authorization): 一旦用戶身份得到驗證,接下來的步驟是確定用戶被授予的權(quán)限范圍。這包括確定用戶可以訪問的資源、可以執(zhí)行的操作以及其他相關(guān)權(quán)限。授權(quán)確保用戶只能訪問其被明確允許的資源和功能。
訪問級別(Access Levels): 訪問控制通常涉及定義不同的訪問級別,如讀取、寫入、執(zhí)行等。每個用戶或系統(tǒng)被授予的訪問級別取決于其角色和權(quán)限配置。精細的訪問級別有助于確保安全性和數(shù)據(jù)完整性。
訪問策略(Access Policies): 訪問策略是一組規(guī)則和規(guī)范,用于定義系統(tǒng)中的訪問控制規(guī)則。這可能包括規(guī)定誰可以訪問什么資源、在什么條件下可以訪問等。訪問策略是實施訪問控制的具體指南。
審計和監(jiān)控(Auditing and Monitoring): 訪問控制不僅僅是在用戶嘗試訪問資源時的阻止和允許,還包括對訪問活動的審計和監(jiān)控。記錄和分析訪問日志有助于檢測潛在的安全威脅或違規(guī)行為。
單點登錄(Single Sign-On,SSO): SSO是一種訪問控制方法,允許用戶通過一次身份驗證獲得對多個系統(tǒng)的訪問權(quán)限,而不需要在每個系統(tǒng)中單獨登錄。這提高了用戶體驗并簡化了訪問管理。
1. Nginx 訪問控制模塊
Nginx 是一款高性能的 Web 服務(wù)器,支持多種操作系統(tǒng)。通過 HTTP 模塊、TCP 模塊、UDP 模塊等多種模塊的支持,Nginx 提供了很多靈活的訪問控制配置選項。
Nginx提供了2種最常用的訪問控制方法
(1)基于IP的訪問控制:http_access_module
可以使用 Nginx 的 allow 和 deny 指令,來控制對來自特定 IP 地址的客戶端的訪問權(quán)限。
例: location /admin { allow 192.168.1.100; deny all; }
(2)基于用戶的信任登錄:http_auth_basic_module
可以使用 Nginx 的 auth_basic
和 auth_basic_user_file
指令,來啟用基于 HTTP 認證的訪問控制。
例: location /admin { auth_basic "Restricted Area"; auth_basic_user_file /path/to/password/file; }
2. 基于 IP 的訪問控制
2.1. 配置語法
#allow允許IP Syntax:allow address | all; default:默認無 Context:http,server,location ? #deny拒絕IP Syntax:deny address | all; default:默認無 Context:http,server,location ======================================================================= allow 允許 ip或者網(wǎng)段 deny 拒絕 ip或者網(wǎng)段
2.2. allow 允許配置實驗
編輯/etc/nginx/conf.d/access_mod.conf
內(nèi)容如下:
[root@localhost ~]# hostname -I 192.168.221.138 ? [root@localhost ~]# vim /etc/nginx/conf.d/allow.conf server { listen 80; server_name localhost; #注意域名不要有沖突 location / { root /usr/share/nginx/html; index index.html index.hml; deny 192.168.221.136; #不允許136訪問 allow all; } } ? [root@localhost conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost conf.d]# systemctl restart nginx ? //136訪問測試: [root@localhost ~]# hostname -I 192.168.221.136 [root@localhost ~]# curl -I http://192.168.221.138 HTTP/1.1 403 Forbidden //403訪問被拒絕 Server: nginx/1.24.0 Date: Sun, 30 Jul 2023 23:24:08 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive ? //130訪問測試: [root@localhost ~]# hostname -I 192.168.221.130 [root@localhost ~]# curl -I http://192.168.221.138 HTTP/1.1 200 OK //200訪問ok Server: nginx/1.24.0 Date: Sun, 30 Jul 2023 23:24:28 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Tue, 11 Apr 2023 17:22:34 GMT Connection: keep-alive ETag: "6435975a-267" Accept-Ranges: bytes
?需要注意:
1.按順序匹配,已經(jīng)被匹配的ip或者網(wǎng)段,后面不再被匹配。
2.如果先允許所有ip訪問,在定義拒絕訪問。那么拒絕訪問不生效。
3.默認為allow all
- 被拒絕的IP為192.168.221.136,配置拒絕的虛擬機IP為192.168.221.138,這里禁止136訪問,允許其他所有IP訪問。
- 主機136訪問http://192.168.221.138,顯示403 Forbidden。
- 當(dāng)然也可以反向配置,同時也可以使用IP網(wǎng)段的配置方式,如
allow 192.168.17.0/24; deny all;
,表示滿足此網(wǎng)段的IP都可以訪問。
2.3. deny 拒絕配置實驗
如果你想拒絕某個指定URL地址的所有請求,只需要在location塊中配置deny all
指令:
[root@localhost conf.d]# hostname -I 192.168.221.138 [root@localhost conf.d]# vim /etc/nginx/conf.d/deny.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.hml; allow 192.168.221.136; #只允許136可以訪問 deny all; #拒絕所有 } } [root@localhost conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost conf.d]# systemctl restart nginx //136訪問測試 [root@localhost ~]# hostname -I 192.168.221.136 [root@localhost ~]# curl -I http://192.168.221.138 HTTP/1.1 200 OK Server: nginx/1.24.0 Date: Sun, 30 Jul 2023 23:38:18 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Tue, 11 Apr 2023 17:22:34 GMT Connection: keep-alive ETag: "6435975a-267" Accept-Ranges: bytes //130訪問測試 [root@localhost ~]# hostname -I 192.168.221.130 [root@localhost ~]# curl -I http://192.168.221.138 HTTP/1.1 403 Forbidden Server: nginx/1.24.0 Date: Mon, 31 Jul 2023 00:51:10 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive //windows宿主機curl測試 C:\Users\TZH>curl -I http://192.168.221.138 HTTP/1.1 403 Forbidden Server: nginx/1.24.0 Date: Mon, 31 Jul 2023 00:51:49 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive
3. 基于用戶的信任登錄
基于用戶的信任登錄模塊:http_auth_basic_module
有時候我們會有這么一種需求,就是你的網(wǎng)站的某些頁面不希望對所有人公開訪問,我們希望的是某些特定的客戶端可以訪問。
那么我們可以在訪問時要求進行身份認證,就如給你自己的家門加一把鎖,以拒絕那些不速之客。
3.1. 配置語法
Syntax:auth_basic string | off;
default:auth_basic off;
Context:http,server,location
auth_basic string; 設(shè)置基本驗證的描述信息
Syntax:auth_basic_user_file file;
default:默認無
Context:http,server,location
file:設(shè)置存儲用戶名密碼信息的文件。
密碼文件格式 username:password
例:
server { location /private { auth_basic "Private area"; auth_basic_user_file /etc/nginx/passwords; } }
這就要求用戶訪問 /private 路徑時輸入密碼才能訪問。
用戶密碼文件也可以放在其他位置,只要 auth_basic_user_file
指令指向正確的文件即可。
3.2. 配置示例
[root@localhost conf.d]# hostname -I 192.168.221.138 [root@localhost ~]# vim /etc/nginx/conf.d/auth_mod.conf server { listen 80; server_name localhost; location ~ /admin { root /var/www/html; index index.html index.hml; auth_basic "Auth access test!"; auth_basic_user_file /etc/nginx/auth_conf; } } [root@localhost conf.d]# mkdir /var/www/html/admin //創(chuàng)建目錄 [root@localhost conf.d]# echo "auth..." > /var/www/html/index.html/admin //創(chuàng)建文件 [root@localhost conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost conf.d]# systemctl restart nginx //做好本地windows的host文件解析 192.168.221.138 www.Jltauth.com
auth_basic
不為 off 時,開啟登錄驗證功能,auth_basic_user_file
加載賬號密碼文件。
瀏覽器訪問測試
3.3. 創(chuàng)建登錄的口令文件
[root@localhost ~]# yum install -y httpd-tools //htpasswd 是開源 http 服務(wù)器 apache httpd 的一個命令工具,用于生成 http 基本認證的密碼文件 [root@localhost conf.d]# htpasswd -cm /etc/nginx/auth_conf jack New password: Re-type new password: Adding password for user jack //jack:用戶 //-c: 創(chuàng)建一個新的密碼文件,如果密碼文件已存在,則會直接覆蓋。 //-m: 在已有的密碼文件中添加用戶,不會覆蓋已有用戶。 //該命令中,會創(chuàng)建密碼文件 auth_conf,并寫入用戶 jack 的密碼記錄 [root@localhost conf.d]# htpasswd -m /etc/nginx/auth_conf tom New password: Re-type new password: Adding password for user tom //該命令中,會在已有的密碼文件 auth_conf 中追加用戶 tom 的密碼記錄 [root@localhost nginx]# cat /etc/nginx/auth_conf jack:$apr1$YmpHMEkH$OtjswnIL5F.E7HUGKBi6U/ tom:$apr1$S8Q.Csg.$JQ6hQSExltiB9x/vlQURb0
瀏覽器訪問測試
到此這篇關(guān)于Nginx 訪問控制的原理及實現(xiàn)的文章就介紹到這了,更多相關(guān)Nginx 訪問控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx反向代理轉(zhuǎn)發(fā)tomcat的實現(xiàn)
本文主要介紹了Nginx反向代理轉(zhuǎn)發(fā)tomcat的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Nginx 代理轉(zhuǎn)發(fā)阿里云OSS上傳的實現(xiàn)代碼
這篇文章主要介紹了Nginx 代理轉(zhuǎn)發(fā)阿里云OSS上傳的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09Nginx中使用gzip_http_version解決CDN只支持http 1.0問題
這篇文章主要介紹了Nginx中使用gzip_http_version解決CDN只支持http 1.0問題,問題原因是在Header信息中看到Transfer-Encoding: chunked,使用本文方法就可以解決這個問題,需要的朋友可以參考下2014-09-09nginx用正則表達式實現(xiàn)泛域名自動匹配目錄的方法
這篇文章主要介紹了nginx用正則表達式實現(xiàn)泛域名自動匹配目錄的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05