使用Caddy在反代层面实现身份验证

背景

在部署开源 Web 项目的过程中,我们常常会遇到这样一个问题:项目本身没有用户认证功能,默认对所有人开放访问。如果这些项目部署在公网服务器上,可能存在一定的安全隐患。

我最近在部署 StreamCap 这个开源项目时就遇到了这个问题:该项目默认没有用户登录系统,部署在服务器上就等于对外开放了,所有人都可以访问。

于是我想,能不能在不改动项目本身的代码的情况下,在反向代理层面增加身份验证?我猜测是可行的,因为在反代这个层面上有很大的操作空间。

我这边使用的反代是Caddy,查了一下Caddy 的文档,它能实现一个 Basic Auth(基础认证)功能,让客户端在每次请求时,发送用户名和密码(经过 Base64 编码)到服务器验证,验证成功才能访问对应页面。

如果是其他反代应该也有类似的功能,我印象中nginx能够实现更加高级的功能配置。

Caddy + Basic Auth实现访问控制

  • 目标项目地址:运行在本地的 http://localhost:8080
  • 对外访问域名example.com
  • 需求:访问域名时弹出用户名密码验证框,验证成功后再转发请求到后台项目

1、使用Caddy自带命令生成加密串:

caddy hash-password --plaintext “your_password”
$2a$14$z4Rv9R4tEgmxyz/Wxs1awODQJMFLyDEmc8vySdFTD1CSoifX2RhGa

2、复制加密串,在服务器编辑Caddyfile 来定义反代和认证逻辑:

vi /etc/caddy/Caddyfile

在Caddyfile中,加入以下配置:

example.com {
 reverse_proxy localhost:8080
   basicauth {
       admin $2a$14$z4Rv9R4tEgmxyz/Wxs1awODQJMFLyDEmc8vySdFTD1CSoifX2RhGa
   }
}

reverse_proxy:反向代理到本地服务

basicauth:开启 Basic Auth 用户认证,用户名是 admin

密码为第一步生成的 bcrypt 加密后的密文,不能直接写明文

3、重载Caddy配置:

systemctl reload caddy

重载成功后,访问对应域名/ip会跳出身份验证

 

 

 

 


目录