Featured image of post 给内网站点加个登录鉴权

给内网站点加个登录鉴权

如何给内网站点加个登录鉴权

背景

这个问题的来源是有两点:

  1. 我有一个内网穿透的nps/npc在运行,所以基本上外网的开放端口会直接把数据丢到内网来,有一些是探测有一些则是攻击,我想做一个基本的保护。
  2. 我自己用的一些工具,比如excildraw等本身没有登录功能,我希望用登录鉴权保护一下。

正好我自己的NUC上最前端是一个Nginx,那么我就可以在nginx上添加一个basic auth。

实现方法

给Nginx添加basic auth的基本思路是用htpassword来加密用户名和密码然后让Nginx去加载和匹配。

制作密码文件

由于我的Nginx是运行在docker容器里面,在不重新build docker的情况下,无法直接使用htpassword,这里我就使用了一个变通的方法

  • Host上安装htpassword

这里我的NUC系统是Ubuntu,所以运行如下命令

sudo apt install apache-utils
  • 运行htpassword,在当前目录生成密码文件draw.box.home.db,你可以用自己喜欢的文件名。
htpassword -bc draw.box.home.db admin 登录密码
  • 拷贝到Nginx的挂载卷(volume)所对应的本机路径里,我的是如下路径
sudo mv password.db /usr/local/opt/nginx/ssl

修改Nginx配置文件

我只针对我自己的一个本地站点来加鉴权,我的站点域名叫draw.box.home

server {
    listen       80;
    listen  [::]:80;
    server_name  draw.box.home;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen  [::]:443 ssl;
    server_name  draw.box.home;
    include /etc/nginx/conf.d/shared.ssl.txt;

    location / {
	auth_basic "User Authentication";
	auth_basic_user_file /etc/nginx/ssl/draw.box.home.db;
        proxy_redirect off;
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        proxy_pass http://excalidraw:80/;
    }
}

其中就是第15行和16行起作用

auth_basic "User Authentication";
	auth_basic_user_file /etc/nginx/ssl/draw.box.home.db;

效果

重启Nginx容器,可以通过Portainer找到容器点击“重启”或者“restart”按钮,或者运行如下命令

sudo docker restart nginx

注意你的容器名称是否跟我一样。

现在,打开网站会要求输入密码了

提示用户输入登录密码

完成!

By 大可出奇迹