【问题标题】:Password protect AWS Node EB application密码保护 AWS Node EB 应用程序
【发布时间】:2014-09-01 04:39:16
【问题描述】:

我已经启动并运行了一个 Node Elastic Beanstalk 应用程序(虽然是 ELB)。现在它只是服务器上的 AWS 示例节点应用程序。由于这是一个开发服务器,在我可以将我的实际代码推送到服务器之前,我需要对整个事情进行密码保护(这将用于客户审查等)。

我在试图弄清楚如何做到这一点时遇到了很多麻烦。似乎应用程序代码被丢弃在/var/app/ 中,而/var/www/html/ 中没有任何内容(没有隐藏文件),我通常会在其中设置一个 htaccess 文件。它使用的是我从未使用过的 nginx 代理,而且我不确定文件是如何提供的。

锁定此服务器的最佳方法是什么?安全组?访问?还有什么?

【问题讨论】:

    标签: node.js amazon-web-services amazon-elastic-beanstalk


    【解决方案1】:

    如果您使用Express.js,您可以使用basic-auth package 添加轻量级中间件。就我而言,我只需要一个用户名和密码就可以锁定该网站,不让公众知道。在 Elastic Beanstalk 上使用 Node.js 服务器时,这是该场景最简单的解决方案。

    var auth = require('basic-auth');
    
    app.use(function(req, res, next) {
      var credentials = auth(req);
    
      if (!credentials || credentials.name !== 'buster' || credentials.pass !== 'getinfree') {
        res.statusCode = 401;
        res.setHeader('WWW-Authenticate', 'Basic realm="example"');
        res.end('Access denied.');
      } else {
        next();
      }
    });
    

    请注意,此解决方案需要在您的 Node 应用程序中添加代码,而不是直接干扰 nginx。

    【讨论】:

      【解决方案2】:

      在您的 Node.js Beanstalk 应用程序中,您的实例的 /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf 设置如下:

      server {
          listen 8080;
      
          location / {
              proxy_pass  http://nodejs;
              proxy_set_header   Connection "";
              proxy_http_version 1.1;
              proxy_set_header        Host            $host;
              proxy_set_header        X-Real-IP       $remote_addr;
              proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
          }
          gzip on;
      }
      

      你想要的是这样设置:

      server {
          listen 8080;
      
          location / {
              proxy_pass  http://nodejs;
              proxy_set_header   Connection "";
              proxy_http_version 1.1;
              proxy_set_header        Host            $host;
              proxy_set_header        X-Real-IP       $remote_addr;
              proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
              auth_basic "Restricted";
              auth_basic_user_file /etc/nginx/.htpasswd;
          }
          gzip on;
      }
      

      在 /etc/nginx/.htpasswd 有一个单独的密码文件,其中包含您的登录凭据。

      第 1 步: 进入你本地的linux环境,进入

      sudo htpasswd -c .htpasswd someusernameofyourchoice
      

      导航到该 .htpasswd 文件并提取您生成的用户名和密码行。它看起来像这样:

      someusernameofyourchoice:$apr1$.1EAU7DD$rt9jdihy1U.cFuBzJTMed.
      

      第 2 步:

      现在在您的节点应用程序的根目录(您的 .git/ 目录所在的位置)创建一个名为 .ebextensions/ 的隐藏目录

      导航到 .ebextensions/ 目录,因为您需要创建 2 个文件。

      第 3 步:

      第一个文件将是配置文件,它将在您的 beanstalk 应用程序上生成您的 .htpasswd 文件。将您之前生成的用户名和密码哈希放入此文件中,并将其命名如下:

      00_nginx_htpasswd.config

      files:
        "/etc/nginx/.htpasswd" :
          mode: "000755"
          owner: root
          group: root
          content: |
            someusernameofyourchoice:$apr1$.1EAU7DD$rt9jdihy1U.cFuBzJTMed.
      

      第 4 步:

      您将在 .ebextensions/ 目录中创建的第二个文件将更新弹性 beanstalk 环境中的 00_elastic_beanstalk_proxy.conf 文件。名称如下:

      01_nginx_auth.config

      files:
        /tmp/deployment/nginx_auth.sh:
          mode: "000755"
          content: |
              sed -i 's/$proxy_add_x_forwarded_for;/$proxy_add_x_forwarded_for;\n     auth_basic "Restricted";\n  auth_basic_user_file \/etc\/nginx\/.htpasswd;\n/' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
      container_commands:
        nginx_auth:
          command: "/tmp/deployment/nginx_auth.sh"
      

      注意:如果您只希望密码保护在特定环境(例如您的开发环境)上。您可以将环境变量传递到您的环境中(在 beanstalk 仪表板上的配置 > 软件配置面板中),然后您可以向该文件的命令添加一个条件,在该环境变量运行之前检查该环境变量。通过这种方式,您可以使用密码保护您的开发环境,同时让您的生产环境免费供公众访问。当您将所有内容放入 git 以将其推送到您的 beanstalk 环境时,这非常方便。以下是修改后的文件,添加了这些内容:

      01_nginx_auth.config

      files:
        /tmp/deployment/nginx_auth.sh:
          mode: "000755"
          content: |
            if [ "$NODE_ENV" == "development" ]; then
              sed -i 's/$proxy_add_x_forwarded_for;/$proxy_add_x_forwarded_for;\n     auth_basic "Restricted";\n  auth_basic_user_file \/etc\/nginx\/.htpasswd;\n/' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
            fi
      container_commands:
        nginx_auth:
          command: "/tmp/deployment/nginx_auth.sh"
      

      第 5 步:

      在 .ebextensions/ 目录中创建这两个文件后,提交它们并将它们推送到弹性 beanstalk。现在应该会提示您输入在第 1 步中生成的用户名和密码组合。

      【讨论】:

      • 很棒的指南!我只是尝试这样做,在我的实例上没有/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf,我修改/etc/nginx/conf.d/webapp.conf。另外我认为这条线的末尾有些东西搞砸了,对吧? /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
      • 亚马逊改变了访问环境变量的方式。现在你必须添加一行:NODE_ENV=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'NODE_ENV: \K\w+'` grep 因为由于某种原因 get-config --key 选项似乎不适用于environment
      • 很好的答案!我最终将 .htpasswd 文件保存到 S3,并以这种方式将其拉出,因此我在源代码管理中没有文件的内容。就像将 00_nginx_htpasswd.config 的“content: ...”行替换为“source: [S3 URL Here]”一样简单(假设您已经按照此处所述提供了适当的访问权限:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
      • 这很好用,但是登录提示由于某种原因出现了两次。您必须登录两次才能登录两个登录框。一个接一个地显示。还有其他人遇到这种情况吗?
      • 如何进入可以看到 /etc/ 目录的实例?
      【解决方案3】:

      安全组只会根据源IP进行拦截,nginx不支持htaccess。相反,它们支持这样的配置:

      server {
          ...
          auth_basic "closed website";
          auth_basic_user_file conf/htpasswd;
      }
      

      但要实现这一点,您需要使用弹性 beanstalk 的.ebextensions 来修改默认的 nginx 配置。这一点都不容易。

      对您来说最快的方法可能是在您的节点应用程序本身中支持 HTTP 身份验证。这方面有很多指南,但这里有一个:http://www.sitepoint.com/http-authentication-in-node-js/

      【讨论】:

      • 我最终也来到了这里。 Passport 是实现这一目标的正确方法,尤其是使用 Express。
      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      相关资源
      最近更新 更多