使用shell创建cgi脚本实现HTTP基本认证用户管理

除了网站本身的用户限制外,当我们在Web服务上要对站点进行限制访问,通常可以采取两种方法:一种是限制访问源地址,一种是使用HTTP基本认证。当认证不通过时,Web服务器就会返回401未授权的响应。

当一个客户端请求一个需要进行身份认证的资源时,服务器可以要求客户端提供用户名和密码进行验证。这种身份认证称为 HTTP 基本认证。基本认证通过检查请求头中的 Authorization 字段来验证用户名和密码。

HTTP 基本认证的过程如下:

  1. 客户端请求需要进行身份认证的资源。
  2. 服务器返回 401 Unauthorized 响应,并包含一个 WWW-Authenticate 头,该头部提示客户端需要进行身份认证。
  3. 客户端将用户名和密码发送到服务器。
  4. 服务器验证用户名和密码,如果验证通过,返回所请求的资源。

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;
    }
}

 

发表评论

error: Content is protected !!