剪藏#剪藏#羊刀仙

为NAS:服务器补上认证缺口:Tinyauth快速实现外网登录保护

2025 年 9 月 16 日1 分钟
分享Twitter / XTelegram微博

之前介绍过非常多的Docker应用,有的应用会自带一个前端认证。用NAS举例,本身的WEB自带登陆认证,还支持配置两步验证到WEB各种应用服务。再比如QB、TR、EMBY这些常见Docker服务都内置了登陆验证,但很多轻量级的工具类服务可能并没有(IT- tools等),别人知道你的服务域名后就能直接白嫖。

本期咱们就来介绍一款中间认证服务:Tinyauth,用于保护我们的应用服务。大家看看动图演示应该就能了解效果~

Notion image

Tinyauth 正在积极开发中,配置可能会经常更改。

更新前请务必仔细阅读发行说明。如果只是个人使用,Nginx/Caddy/Lucky 等自带的 BasicAuth 其实已经非常方便。

因为Lucky自带认证,并且Tinyauth官方文档明确对于Nginx Proxy Manager有很好的支持,所以就承接上一篇文章,我们基于NPM进行改造。

Lucky的认证如下图所示。大家如果觉得够用且不在意颜值的话,则无需部署Tinyauth。但如果你想要关联谷歌或GITHUB联动登录,那本项目还是挺不错滴~

Notion image

Notion image

Tinyauth 简介 Tinyauth 是一个由 Go 语言开发的 轻量级身份认证中间件,主要用于在自托管或容器化环境中为 Web 应用快速增加访问控制功能。它不需要修改原有应用,只需通过反向代理(如 Traefik、Nginx、Caddy)接入,就能实现登录保护。✨ 主要特点轻量简洁:单个二进制文件即可运行,无额外依赖,资源占用极低。即开即用:配置简单,常见场景只需设置环境变量即可完成部署。多种认证方式:支持用户名密码认证,也支持 OAuth 登录(如 Google、GitHub)。反向代理友好:可与 Traefik、Nginx、Caddy 等无缝集成,适合 Homelab 和企业小型应用。Cookie 统一认证:基于域名设置 Cookie,实现同一主域下多个应用的单点登录。🔧 应用场景给 个人 NAS 服务(如 QNAP)增加外网访问保护。保护 内部工具(如 Portainer、Grafana、Whoami 等)。在 家庭实验室 或 小团队项目 中快速加一层身份验证,而无需搭建复杂的 OAuth 服务。

准备工作 我们需要准备生成用户名/密码哈希以及32字节随机密钥。SSH工具连接NAS,依次输入以下命令。将生成的内容复制备用。可参考图片docker run -it --rm ghcr.io/steveiliop56/tinyauth:v3 user create --interactive

Notion image

Notion image

部署流程 先创建一个专用网络,方便需要反代的应用与NPM连通。查阅官方文档后,我给出的推荐代码如下,注意我创建了专属网桥。

JAVASCRIPT
services:
  app:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    restart: always
    environment:
      TZ: Asia/Shanghai
      DISABLE_IPV6"true"
    volumes:
      - /share/Container/npm/data:/data
      - /share/Container/npm/letsencrypt:/etc/letsencrypt
    ports:
      - "81:81"      # NPM面板(仅内网)
      - "8442:80"    # 公网HTTP(非常用端口)
      - "8443:443"   # 公网HTTPS(非常用端口)
    networks:
      - npm-net

  tinyauth:
    image: ghcr.io/steveiliop56/tinyauth:v3
    container_name: tinyauth
    restart: always
    environment:
      - APP_URL=https://auth.19960509.xyz:8443    # 走NPM的8443
      - USERS=ydxian:$$2a$$10$$9Yc/rH90cPJEJjemF6oRmu9tbnClFyDhjSSjlRyJFPstuFqxr45Ky
      - SECRET=597c4353178836b87f78c5588fc6fc60
    networks:
      - npm-net
    ports:
      - "5202:3000"
networks:
  npm-net:
    externaltrue

需要注意的是,咱们国内用非标准端口号,APP_URL也要进行补齐。将上面代码改写后,打开Container Station 创建新的应用程序。

Notion image

成功的日志参考。

Notion image

反向代理 这步是必要的~打开NPM,我们要为Tinyauth进行反向代理。如下图填写相关信息后保存。要注意别勾选Block Common Exploits,如果启用,nginx 将不允许在查询参数中使用 URL,而这正是 Tinyauth 正常运行所必需的。

Notion image

再次对这条反代进行编辑。因为上一篇我们申请了泛域名证书,这次就方便很多~保存即可。

Notion image

Notion image

接着浏览器输入域名+8443就能访问Tinyauth。

Notion image

为应用添加验证 我的主NAS中部署了IT-Tools万能工具箱,这个服务是不带登录认证的,咱们就拿它来演示。

Notion image

为了方便容器互通,部署代码:

JAVASCRIPT
services:
  it-tools:
    image: ghcr.io/corentinth/it-tools:latest
    container_name: it-tools
    ports:
      - "8864:80"       
    networks:
      - npm-net
    restart: always
networks:
  npm-net:
    externaltrue

重复上面步骤,为该服务做好反向代理。然后对其进行编辑,将下面的内容修改后粘贴进框内并保存。需要修改的位置已用中文标注。修改完后建议将注释都删除。

JAVASCRIPT
# Root location
location / {
  # Pass the request to the app
  proxy_pass          $forward_scheme://$server:$port;
  # Add other app specific config here
  # Tinyauth auth request
  auth_request /tinyauth;
  error_page 401 = @tinyauth_login;
}
# Tinyauth auth request
location /tinyauth {
  # Pass request to Tinyauth
  proxy_pass http://tinyauth:3000/api/auth/nginx;
  # Pass the request headers
  proxy_set_header x-forwarded-proto $scheme;
  proxy_set_header x-forwarded-host $http_host;
  proxy_set_header x-forwarded-uri $request_uri;
}
# Tinyauth login redirect
# 下面这个域名改成你自己的Tinyauth服务
location @tinyauth_login {
  return 302 https://auth.xxx.xyz:8443/login?redirect_uri=$scheme://$http_host$request_uri; 
}

换到最后一栏,我们将参数编辑后粘贴进框内后保存。

Notion image

浏览器输入域名访问工具箱。

Notion image

我从Chrome换成了Safari,因为缓存问题。其实新开个无痕也能验证。会自动跳转到验证界面,速度大家不用担心,很快~丝滑~

Notion image

输入上文SSH设置的账户密码,不要输入哈希值啊~回车登录~如下图所示,点击继续。

Notion image

然后就成功进入应用咯。

Notion image

最后

如果咱们是国内NAS,这种验证建议Lucky直接搞定吧~如果想要关联谷歌之类,然后想颜值高些,可以用用。

原文地址: https://mp.weixin.qq.com/s?__biz=Mzk0MTgyMTgwOQ==&mid=2247485768&idx=1&sn=1c9359f9d6dcf5d3a352e9db23d30a68&chksm=c394717fd7356fa6537257ceeac4eb81f170132e9aae6cbe3938be4c1e290c21a061c5801ca7&mpshare=1&scene=1&srcid=0916egHEK5JXzUDwPmuHf2dR&sharer_shareinfo=3093f90cd2e3bba76a192821958e2f17&sharer_shareinfo_first=3093f90cd2e3bba76a192821958e2f17#rd

相关文章