使用Nginx的Basic Auth认证实现不同的登录用户内容隔离
上传和下载文件是企业经常要面对的场景,本文提供了一个新思路,使用企业具备的现有工具(Linux和Nginx),不需要安装任何其他软件,可以快速建立一个简单、可靠、带认证和用户隔离的文件上传下载系统。
需求场景:产品人员上传文件到ftp,外部用户下载对应的文件。
- 不同外部用户之间的文件需要隔离,不能互相访问。
- 产品人员希望只有一个管理账户用于上传,而不是为每个外部用户维护上传账号。
- 产品人员的账号主要用户上传,外部用户的账号只能查看和下载本账号下的文件。
接到需求的时候,第一反应是使用ftp,创建父账号目录和子账号目录。但是这样管理起来其实很复杂,尤其ftp的权限控制、账号管理、和后续维护都挺麻烦的。后面采用了偷懒的办法,用nginx实现不同登录用户可以看到自己的用户数据。
方法如下
sftp用户创建
创建一个Linux
系统普通用户,用于产品人员使用sftp
登录和上传文件,用户的家目录设置为 /data/useradmin/。
# useradd wwwadmin -d /data/wwwadmin
产品人员可以在家目录下为不同的外部用户创建对应用户名的目录,用来上传用户需要的资料,比如如下的目录结构:
$ tree /data/wwwadmin/
/data/wwwadmin/
├── user01
└── user02
创建Basic Auth用户
网上创建Basic Auth
用户的办法基本上都是使用htpasswd
这个工具,需要单独安装,也挺麻烦的。但是我建议使用大多数Linux服务器都会自带的openssl来创建,不需要安装额外的工具,命令如下。
$ openssl passwd 123456 # 123456 是弱口令,请不要在生产环境使用
SKrvtZqMGukZA
把生成的密码和用户名整理成如下格式的文件,取一个见名知意的名字,放到Nginx
的配置目录下,比如 /etc/nginx/www_passwd.txt
:
# username:password
user01:SKrvtZqMGukZA
user02:WBpv9qckPkMRM
除注释外,这个文件中,每一行是一个Basic Auth
格式的用户。以:
分割,前一部分是用户名,后一部分是加密后的密码。
Nginx配置
接下来是关键内容,先把配置贴出来,后面再解释。这里只包含了Nginx配置中location
的部分,其他配置块无关,所以不贴出来了。
location /files/ {
auth_basic "passport";
auth_basic_user_file www_passwd.txt;
autoindex on;
alias /data/wwwadmin/$remote_user/;
}
- 此处使用了Nginx自带的内置模块
ngx_http_auth_basic_module
,该模块是用来实现Basic Auth
的。auth_basic
和auth_basic_user_file
是该模块的两个指令。关于该模块的用法,可以参考官方文档 http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html - 在
alias
一行的末尾使用了$remote_user
这个变量,它是用来获取Basic Auth
的登录用户的用户名。也就是上面www_passwd.txt密码文件中配置的user01和user02用户。 - 用户user01通过
Basic Auth
登录之后,Nginx
通过$remote_user
变量存放了用户名,然后alias
指令会把wwwadmin用户家目录下的,对应用户名的目录内容返回给浏览器。
注意,www_passwd.txt中的用户名和 /data/wwwadmin 目录下的子目录名称应该一一对应。
配置完成后reload Nginx
,然后打开 http://<domain>/files
的路径,此时可以进入登录过程,登录完成之后,就能看见不同用户对应的不同文件了。
以上就是本文的所有内容,本文的核心其实是在于$remote_user
这个变量获取登录用户,而且维护 www_passwd.txt 文本文件中的账号密码显然比维护ftp的账号密码简单许多。。希望本文也能让你有所收获。
当前暂无评论 »