除了网站本身的用户限制外,当我们在Web服务上要对站点进行限制访问,通常可以采取两种方法:一种是限制访问源地址,一种是使用HTTP基本认证。当认证不通过时,Web服务器就会返回401未授权的响应。
当一个客户端请求一个需要进行身份认证的资源时,服务器可以要求客户端提供用户名和密码进行验证。这种身份认证称为 HTTP 基本认证。基本认证通过检查请求头中的 Authorization 字段来验证用户名和密码。
HTTP 基本认证的过程如下:
- 客户端请求需要进行身份认证的资源。
- 服务器返回 401 Unauthorized 响应,并包含一个
WWW-Authenticate
头,该头部提示客户端需要进行身份认证。 - 客户端将用户名和密码发送到服务器。
- 服务器验证用户名和密码,如果验证通过,返回所请求的资源。
HTTP 基本认证非常简单易懂,但是并不安全。由于用户名和密码不是加密传输的,因此很容易受到网络攻击者的攻击。如果您需要更安全的身份验证机制,可以使用 HTTPS。因为 HTTPS 为所有的 HTTP 请求提供了加密传输的安全通道,从而保护您的用户名和密码不会在网络上被窃取。
CGI(Common Gateway Interface)是一种 Web 技术,它允许 Web 服务器与脚本语言进行交互并生成动态 Web 内容。
认证文件通常使用htpasswd命令来生成和维护,它是apache组件下的一个命令,生成出来的文件格式也很简单。
在Apache上启用CGI并配置认证
修改主配置文件,启用相应模块:
vim httpd.conf
... LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule proxy_scgi_module modules/mod_proxy_scgi.so ...
修改站点配置文件,增加认证:
vim extra/httpd-vhosts.conf
<VirtualHost *:80 _default_> DocumentRoot "/data/www" ServerName dummy-host.com ErrorLog "logs/main-error_log" SetEnvIf Request_URI "\.(gif|jpe?g|png|ico|css|js|swf)$" no_log CustomLog "logs/main-access_log" combined env=!no_log ScriptAlias /cgi-bin/ "/data/www/cgi-bin/" </VirtualHost> <Directory "/data/www/"> SetEnvIfNoCase User-Agent ".*(FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms)" BADBOT Options Indexes FollowSymLinks AllowOverride AuthConfig ALL Require all granted deny from env=BADBOT </Directory> <Directory "/data/www/cgi-bin"> AuthName "Login" AuthType Basic AuthUserFile /data/www/basic-auth/http-user Require user admin Options ExecCGI AllowOverride None Order deny,allow </Directory>
在Nginx上启用CGI并配置认证
Nginx上没有自带cgi模块,需安装使用第三方组件:
yum install -y epel-release yum install -y fcgiwrap vim /usr/lib/systemd/system/fcgiwrap.service
[Unit] Description=Simple CGI Server After=nss-user-lookup.target Requires=fcgiwrap.socket [Service] EnvironmentFile=/etc/sysconfig/fcgiwrap ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS} User=ngx Group=ngx [Install] Also=fcgiwrap.socket
vim /usr/lib/systemd/system/fcgiwrap.socket
[Unit] Description=fcgiwrap Socket [Socket] ListenStream=/run/fcgiwrap.socket [Install] WantedBy=sockets.target
systemctl enable --now fcgiwrap systemctl status fcgiwrap systemctl status fcgiwrap.socket
Nginx配置CGI和认证
server { listen 80 default_server; access_log logs/gpt_access.log; error_log logs/gpt_error.log; location / { auth_basic "Login"; auth_basic_user_file /data/www/basic-auth/http-user; root "/data/www"; index index.html index.htm; } location /cgi-bin/ { auth_basic "Login"; auth_basic_user_file /data/www/basic-auth/http-user; if ($auth_admin = 0) { return 401; } gzip off; root "/data/www"; fastcgi_pass unix:/var/run/fcgiwrap.socket; include fastcgi_params; fastcgi_param FCGI_CHILDREN 2; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
页码: 1 2