尝试在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認証成功