昔我往矣

使用Nginx的Basic Auth认证实现不同的登录用户内容隔离

2020年07月8日

上传和下载文件是企业经常要面对的场景,本文提供了一个新思路,使用企业具备的现有工具(Linux和Nginx),不需要安装任何其他软件,可以快速建立一个简单、可靠、带认证和用户隔离的文件上传下载系统。

upload and download

需求场景:产品人员上传文件到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_basicauth_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的账号密码简单许多。。希望本文也能让你有所收获。

当前暂无评论 »

添加新评论 »