尝试在Nginx上进行摘要认证

Digest认证是什么意思

在此之前,让我们先看看其他的身份验证方式。

基本认证

这种常见的身份验证方式非常方便,适用于所有的Web服务器和浏览器,因此经常用于简易的身份验证。基本身份验证是将ID和密码进行base64编码并发送,因此如果在中途被窃听,只需对其进行base64解码即可轻松解读ID和密码。为了防止这种情况,需要通过HTTPS进行加密通信。

表单验证

以下是一种使用HTML表单发送明文ID和密码的方法,正如其名称所示。
为了防止中间人攻击,还需要通过HTTPS进行加密通信。

Digest认证

今回の目玉でBasic認証の平文でIDとPasswordを送るというのを改善した認証方式でハッシュ化して送信します。
IDとPasswordをMD5でハッシュ化し送信しするため盗聴されてもパスワードの解析が困難です。
HTTPSで通信を行えばBasic認証で良いのでDigest認証は基本的にHTTPS通信ができないときのHTTP認証方式です。

请实际尝试一下。

由于Nginx默认不支持Digest认证,因此需要使用外部模块。
如果要安装外部模块,需要从源码编译安装Nginx。

需要安装必要的软件包。

    • gcc →コンパイル

 

    • make→インストールで必要

 

    • pcre-devel→Perl互換正規表現ライブラリ

 

    httpd-tools→Digest認証で使うhtdigestファイルを作成するため
# yum install gcc pcre pcre-devel make perl httpd-tools

由于Nginx使用摘要认证,因此需要从源代码进行安装。

Nginx核心

# wget "http://nginx.org/download/nginx-1.20.0.tar.gz" -O /tmp/nginx-1.20.0.tar.gz

手动验证

# wget "https://github.com/atomx/nginx-http-auth-digest/archive/master.zip" -O /tmp/nginx-http-auth-digest.zip

将文件/文件夹解压缩到/usr/local/src/目录下。

# tar zxvf /tmp/nginx-1.20.0.tar.gz -C /usr/local/src/
# unzip /tmp/nginx-http-auth-digest.zip -d /usr/local/src/

编译和安装

# cd /usr/local/src/nginx-1.20.0
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache
/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --add-module=../nginx-http-auth-digest-master/
# make && make install

将 nginx.service 添加到 systemd。

$ vi nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
Restart=always

[Install]
WantedBy=multi-user.target

自动启动

systemctl enable nginx.service     

开始

systemctl start nginx.service

请在此处进行摘要认证的设置。

创建密码文件

# htdigest -c /etc/nginx/.htdigest_test "test" test
Adding password for user in realm test.
New password: candidate
Re-type new password: testpassword

编辑 /etc/nginx/nginx.conf

下記を追記
location /secret {
    root   html;
    index  index.html index.htm;
    auth_digest "test";  パスワードファイルのrelm名を
    auth_digest_user_file /etc/nginx/.htdigest_test; パスワードファイルのパスを
}

创建/etc/nginx/html/secret/index.html,并写入”Digest认证成功”。

如果没有进行摘要认证,则返回401错误。

# curl http://<public ip>/secret/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.20.0</center>
</body>
</html>
# curl --digest -u test:testpassword http://35.75.22.153/secret/
Digest認証成功
广告
将在 10 秒后关闭
bannerAds