如何给内网站点加个登录鉴权
背景
这个问题的来源是有两点:
- 我有一个内网穿透的nps/npc在运行,所以基本上外网的开放端口会直接把数据丢到内网来,有一些是探测有一些则是攻击,我想做一个基本的保护。
- 我自己用的一些工具,比如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
注意你的容器名称是否跟我一样。
现在,打开网站会要求输入密码了