整理了Nginx和Apache的基本认证和IP限制的各种设置方法(考虑到ELB的存在与否)

首先

我整理了关于Nginx和Apache的基本认证以及IP限制(也考虑到Elastic Load Balancer的情况)的配置方法。

我还为AWS EC2的Amazon Linux2和Windows服务器提供了两种配置方法的总结。

IP限制的前提条件 (IP de

111.111.111.111和222.222.222.222是允许的IP地址
其他所有IP地址都要被拒绝

10.0.0.0/16 = 使用Elastic Load Balancer(ELB)的虚拟私有云的 IP 地址范围(IPv4 CIDR 等)
#IP限制(使用ELB时)

当使用ELB时,替代方案是Nginx。

server {
    listen 80;
 
    set_real_ip_from 10.0.0.0/16; # ELBを設置しているVPCのIPアドレスを指定
    real_ip_header  X-Forwarded-For;

    location /制限先ディレクトリ/ {
        allow 111.111.111.111;
        allow 222.222.222.222;
        deny all;
    }
}

由于服务器是从ELB访问的,所以需要将ELB的IP替换为客户端的IP。
因此,需要在set_real_ip_from中指定安装ELB的VPC的IP地址,并在X-Forwarded-For中存储客户端的IP,从而在real_ip_header中设置该值。
如果想要按服务器而不是目录限制权限,可以在server {}内放置allow和deny。

简易构成图
· 通常
客户端IP(xxx…)→负载均衡器IP(yyy…)→服务器
服务器对于yyy…设定IP限制

当使用X-Forwarded-For时,
客户端IP(xxx…)→ ELB IP(xxx…和yyy…)→ 服务器
服务器对xxx…进行IP限制。

当使用Apache(在ELB上)时

SetEnvIf X-Forwarded-For "111\.111\.111\.111" allowedip
SetEnvIf X-Forwarded-For "222\.222\.222\.222" allowedip
order deny,allow
deny from all
allow from env=allowedip

由于X-Forwarded-For包含客户端ID,因此需要指定要允许的IP地址。
另外,为了进行正则表达式验证,需要对句点进行转义。
本次情况下,我们将在.htaccess文件中进行设置,.htaccess可以对每个目录进行限制。
如果想要对整个Apache进行限制,则应该将其配置在apache2.conf(httpd.conf)中。

只限制IP地址(不使用负载均衡器ELB)

Nginx(不使用ELB)

server {
    listen 80;

    allow 111.111.111.111;
    allow 222.222.222.222;
    deny all;
 
    location / {
    }
}

我們已經在伺服器層面進行了限制。只需要使用「允許(allow)」和「拒絕(deny)」,如果要在目錄層面進行限制,只需把它放入目錄內即可。

Apache(未使用 ELB)

# 2.2系以前のApache
Order deny,allow
Deny from all
Allow from 111.111.111.111
Allow from 222.222.222.222

# 2.4系以降のApache
Require all denied
Require ip 111.111.111.111
Require ip 222.222.222.222

Apache的版本,其写法因版本而异。您可以使用httpd -v命令进行确认。

基本认证

Nginx(对所有访问适用)

将必要的配置内容记录在nginx.conf文件中。

server {
    listen       80;

    auth_basic "Restricted";    # 認証時に表示されるメッセージ
    auth_basic_user_file /etc/nginx/.htpasswd;  # .htpasswdファイルのパス
}

修改完nginx.conf文件后,要进行语法检查并重新启动。

$ nginx -t -c /etc/nginx/nginx.conf 
$ sudo nginx -s reload

在Nginx中(仅适用于一部分访问)

这是只对index.php应用基本认证的模式。

server {
    listen 80;

    location /index.php {
        auth_basic "Restricted";                   # 認証時に表示されるメッセージ
        auth_basic_user_file /etc/nginx/.htpasswd; # .htpasswdファイルのパス
    }
}
$ nginx -t -c /etc/nginx/nginx.conf 
$ sudo nginx -s reload

Nginx(除去一部分,适用于所有访问)

这是只对index.php不进行基本身份验证的模式。

server {
    listen 80;

    auth_basic "Restricted";    # 認証時に表示されるメッセージ
    auth_basic_user_file /etc/nginx/.htpasswd;  # .htpasswdファイルのパス

    location /index.php {
        satisfy any;  # IP制限 または Basic認証のいずれかがOKなら通す設定
        allow   all;  # すべて許可
    }
}
$ nginx -t -c /etc/nginx/nginx.conf 
$ sudo nginx -s reload

基本认证(ELB不使用)

如果不使用ELB,请在.htaccess中输入Apache + Windows。

AuthUserFile C:\Apache24\htpasswd\.htpasswd
AuthGroupfile /dev/null
AuthName "TEST WEB"
AuthType Basic
require valid-user

如果不使用ELB,则将Apache + EC2的配置信息写入.htaccess文件。

<RequireAny>
    AuthUserFile /home/xxxx/htpasswd/.htpasswd
    AuthName "Please enter your ID and password"
    AuthType Basic

    Require valid-user
</RequireAny>

<Files ~ "^\.(htaccess|htpasswd)$">
    Require all denied
</Files>

AuthUserFile是指完整路径名为.htpasswd的文件,该文件包含Basic认证的用户名和密码。
AuthName是在认证时显示的消息。
AuthType是认证类型的选择。选择Basic表示使用BASIC认证。
require valid-user表示允许经过认证的所有用户访问。

由于不希望公开显示.htpasswd文件,部分将不予列出。此部分非强制。

aaaaa:$apr1$pzWRunvc$tq0UpVBXVjSJjLnLM9LGY.

在.htpasswd文件中,将Basic认证所需的用户名和密码以用户名:经过哈希运算的密码的形式进行记录。

您可以在这个网站上自动生成用于Basic认证的.htaccess和.htpasswd文件。

AuthGroupFile /dev/null指定允许每个组访问。 “/dev/null”表示这样的文件不存在。即表示不限制每个组的访问。

如果在特定的服务器上进行记录会出现错误的情况下,请不要进行记录。

如果不使用ELB,则在httpd.conf中添加Apache + EC2的配置。

如果将目录设置为/var/www/html

<Directory "/var/www/html">
    Options FollowSymLinks
    AllowOverride All

    AuthType Basic
    AuthName "basic auth"
    AuthUserfile /etc/httpd/conf/.htpasswd
    Require valid-user
</Directory>

在中国境内,AuthUserfile的密码路径可以在任何地方都可以。

修复完 httpd.conf 文件后,请重新启动 Apache 服务。

$ systemctl restart httpd.service

如果不使用ELB,并且需要在httpd.conf中进行配置,那么Apache + Windows Server可以如下表述:

由于在Windows服务器上无法使用上述方法,因此请在httpd.conf文件中完成配置。

以下是有关位置的详细说明。

 

#Basic Auth
<Location "/">
    AuthType Basic
    AuthName "test basic auth"
    AuthUserFile "C:\Apache24\htpasswd\.htpasswd"
    Require valid-user
</Location>

您可以在“位置”中选择要进行基本身份验证的路径。例如,本次选择的路径是”/”,如果您填写为”/index.php”,则只有index.php会进行基本身份验证。

密码的创建方法与之前的方法相同。
.htpasswd应该放置在适当的位置。

然后,在命令提示符中重新启动Apache。

C:\Apache24\bin> httpd -k restart

基本认证(通过ELB使用并通过健康检查)

Nginx

在使用ELB时,将流量引导至Nginx并进行健康检查。

在所有路径上都进行基本身份验证。
配置在nginx.conf文件中,并将.htpasswd文件放置在/etc/nginx/目录下。
只有健康检查会通过基本身份验证。

server {
  listen 80;

  if ($http_user_agent = "ELB-HealthChecker/*") {
    set $auth off;
  }

  location / {
    auth_basic $auth;
    auth_basic_user_file /etc/nginx/.htpasswd; # .htpasswdファイルのパス
  }

在使用ELB时,排除特定路径的方式是通过Nginx来实现。

除了/test/路径,其他都需要进行基本身份验证。将.htpasswd文件放置在/etc/nginx/目录下。

server {
  listen 80;

  if ($http_user_agent = "ELB-HealthChecker/*") {
    set $auth off;
  }

  location /test/ {
    try_files $uri $uri/ /index.php?$query_string;
    satisfy any;
    allow   all;
  }

  location / {
    auth_basic $auth;
    auth_basic_user_file /etc/nginx/.htpasswd;
  }

Apache 可以被解释为阿帕奇。

当使用Apache和EC2(在ELB上)时,在.htaccess中进行配置。

设置仅通过ELB的健康检查。

# リクエストURLがヘルスチェック先の場合は、アクセスを許可
SetEnvIf User-Agent "^ELB-HealthChecker.*$" healthcheck

<RequireAny>
    AuthUserFile /home/xxxxx/htpasswd/.htpasswd
    AuthName "Please enter your ID and password"
    AuthType Basic

    # いずれかの条件を満たせばアクセス可
    Require env healthcheck
    Require valid-user
</RequireAny>

<Files ~ "^\.(htaccess|htpasswd)$">
    Require all denied
</Files>

Satisfy Any表示只要满足任何一个条件,就可以访问。

在使用Docker时,需要注意将AuthUserFile的完整路径根据Docker的路径进行调整,而不是服务器的路径。

使用Windows服务器时,将Apache与ELB配合使用(在httpd.conf文件中填写)。

这是一个设置通过 healthcheck.html 文件进行健康检查的配置。

# Basic Auth
<Location "/">
    AuthType Basic
    AuthName "test basic auth"
    AuthUserFile "C:\Apache24\htpasswd\.htpasswd"
    Require valid-user

    SetEnvIf Request_URI "/healthcheck.html" healthcheck

   # 以下の条件にマッチする場合はBasic認証なし
   <RequireAny>
     Require valid-user
     Require env healthcheck
   </RequireAny>
</Location>

Apache + Windows服务器(在使用ELB时,在httpd.conf中写入)②

如果需要通过 healthcheck.html 文件的健康检查,并且仅路由特定的子域名,则需要进行无基本认证的设置。

# Basic Auth
<Location "/">
    AuthType Basic
    AuthName "test basic auth"
    AuthUserFile "C:\Apache24\htpasswd\.htpasswd"
    Require valid-user

    SetEnvIf Request_URI "/healthcheck.html" healthcheck
    SetEnvIf Host "^do1.api\." host_ok

   # 以下の条件にマッチする場合はBasic認証なし
   <RequireAny>
     Require valid-user
     Require env healthcheck
     Require env host_ok
   </RequireAny>
</Location>

Apache与Windows服务器(在使用ELB时需在httpd.conf中填写).

除了通过healthcheck.html文件进行健康检查,还需要仅将特定的子域名进行路由,以及在特定的IP情况下,设置为无需基本认证。

# Basic Auth
<Location "/">
    AuthType Basic
    AuthName "test basic auth"
    AuthUserFile "C:\Apache24\htpasswd\.htpasswd"
    Require valid-user

    SetEnvIf REMOTE_ADDR 222.222.222.222 valid-ip
    SetEnvIf Request_URI "/healthcheck.html" healthcheck
    SetEnvIf Host "^do1.api\." host_ok

   # 以下の条件にマッチする場合はBasic認証なし
   <RequireAny>
     Require valid-user
     Require env healthcheck
     Require env host_ok
          Require env valid-ip
   </RequireAny>
</Location>

文献列表

 

    apacheは↑こちらの記事を参考にしました

 

在Linux系统中,如何设置Nginx的基本认证。
晚上好,我是X-Forwarded-For警察。
在Apache 2.4版本中,如何设置IP限制。
在Nginx中使用基本认证。