整理了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中使用基本认证。