暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

nginx身份验证

运维DevOps 2024-04-30
2

NGINX 能够对客户端进行身份验证。使用 NGINX 对客户端请求进行身份验证可以减轻服务器的工作负载,并能够阻止未经身份验证的请求到达应用服务器。NGINX 开源版模块包括基本身份验证和身份验证子请求。NGINX Plus 专有的 JSON Web Tokens(JWT)验证模块可与使用身份验证标准 OpenID Connect 的第三方身份验证提供商集成

本例子演示都是NGINX开源版

HTTP 基本身份验证

NGINX可以理解如下的密码格式:

    user1:passwd1:comment  #comment为可选的
    user2:passwd2
    user3:passwd3
    复制

    使用openssl passwd 对字符串进行加密:

    1、安装openssl后,在命令行执行如下命令:

      openssl passwd 'Test121$'
      复制

      2、在conf.d目录下创建passwd.txt,将用户名和密码写入,如图:

      注:openssl passwd生成的密码是针对当前用户的,我在root下执行,因此用户就是root

      3、编辑nginx.conf,给server模块添加认证,如图:

      • auth_basic:类似一个提示作用

      • auth_basic_user_file:指定密码文件位置


      4、通过IP访问NGINX,提示输入账号密码,如图:

      使用htpasswd来配置用户名和密码:

      除了openssl passwd外,还可以使用htpasswd来设置用户名和密码

      1、安装htpasswd,命令如下:

        yum -y install apache2-utils    #centos
        apt install apache2-utils #ubuntu
        复制

        2、执行htpasswd命令生成用户名和密码文件,testuser是用户名,如图:

        3、将/root/passwd.txt内容粘贴到conf.d/passwd.txt中,如图:

        4、再次登录NGINX,提示输入用户名和密码,如图:

        输入后即可登录到页面

        注意:auth_basic认证可使用在http、server、location中,针对不同场景认证

        身份验证内部子请求

        通过第三方身份验证来对请求进行身份验证,需要用到的模块为http_auth_request_module,此模块默认不带,需要在编译安装的时候通过如下方式指定:

          --with-http_auth_request_module   #with前面是两个横岗
          复制

          1、在conf.d下定义auth.conf文件,内容如下:

          • auth_request:启用基于子请求结果的授权,设为off表示不启动,可配置在http、server、location中

          • auth_status:  保存认证请求的状态码,那就是/authservice的状态码

          • upstream_status:保存上游代理的返回状态码,也就是http://192.168.49.83:8989/auth返回的状态码

          • internal:只允许NGINX内部请求,不能通过外部请求

          • proxy_pass_request_body off:禁止将请求体传递给上游服务器

          • proxy_set_header Content-Length “”; 不将请求头内容传递给上游服务器

          • proxy_set_header X-Original-URI $request_uri; 自定义的 HTTP 头 X-Original-URI
            ,其值为当前请求的 URI(由变量 $request_uri
            表示)。$request_uri
            变量包含了原始请求的 URI。通过设置这个头,你可以将原始请求的 URI 信息传递给上游服务器。这在调试或当后端服务需要知道原始请求路径时非常有用

          原理:首先请求进来后,先到达子请求/authservice,子请求的认证服务为http://192.168.49.83:8989/auth,如果子请求返回的状态码为2xx,表示请求成功,然后继续后面的root /usr/share/nginx/html,如果返回3xx或者4xx等,则表示请求不成功,认证不通过

          2、编辑auth_8989.conf文件,定义路由返回状态码为200,内容如下:

          3、通过IP访问,如图:

          4、修改第2步,将返回状态码修改为401,再次请求,如图:

          从上图看出,当子请求返回状态码不是2xx的时候,认证就会失败

          文章转载自运维DevOps,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论