LoginSignup
7
6

Nginx と Apache の、Basic認証 と IP制限 の様々な設定方法まとめ (ELBの有無も考慮)

Last updated at Posted at 2021-08-29

はじめに

NginxとApacheのBasic認証と,
NginxとApacheのIP制限(ELBの有無も考慮)の設定方法についてまとめました。

AWS EC2のAmazon Linux2Windowsサーバー2通りの設定方法もまとめています

IP制限の前提条件

111.111.111.111222.222.222.222は、許可したいIP
他のIPアドレスは全て拒否

10.0.0.0/16 = ELBが設置されているvpcのIPアドレス範囲(IPv4 CIDR等)
#IP制限(ELB使用時)

Nginx(ELB使用時)

nginx.conf
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...)→ELB IP(yyy...)→サーバー
サーバーは、yyy...に対してIP制限をする

X-Forwarded-For使用時
クライアントIP(xxx...)→ELB IP(xxx...とyyy...)→サーバー
サーバーは、xxx...に対してIP制限する

Apache(ELB使用時)

.htaccess
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アドレスを指定します。
また、正規表現で確認するため、ピリオドはエスケープすることが必要です。
今回は、.httaccessファイル内に記載しており、.htaccessはディレクトリ毎で制限を行うことができます。
apache全体に制限したい場合、apache2.conf(httpd.conf)に記載しましょう。

IP制限(ELB不使用)

Nginx(ELB不使用)

nginx.conf
server {
    listen 80;

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

サーバー単位で制限をかけました。allowdenyを使用するのみであり、ディレクトリ単位で制限するときは、ディレクトリ内に入れるだけです。

Apache(ELB不使用)

.htaccess
# 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のコマンドで確認できます。

Basic認証

Nginx (すべてのアクセスに適用)

nginx.confに必要事項を記載

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のみBasic認証をかけるパターンです。

nginx.conf
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のみBasic認証をかけないパターンです。

nginx.conf
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

Basic認証 (ELB不使用)

Apache + Windows(ELB使用しない場合、.htaccessに記入)

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

Apache + EC2(ELB使用しない場合、.htaccessに記入)

.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は、Basic認証のユーザー名とパスワードを記載した.htpasswdファイルのフルパスになります。
AuthNameは、認証時に表示されるメッセージです。
AuthTypeは認証方式です。BASIC認証を使うのでBasicと記載します。
require valid-userとは認証された全ユーザーのアクセスを許可するという意味です。

<Files>は、.htpasswd.htpasswdを見せたくありませんので、記載します。
必須ではありません。

.htpasswd
aaaaa:$apr1$pzWRunvc$tq0UpVBXVjSJjLnLM9LGY.

.htpasswdには、Basic認証時に必要なユーザー名とパスワードをユーザー名:ハッシュ化されたパスワードとして記載します。

こちらのサイトでは、Basic認証用の.htaccess.htpasswdファイルを自動生成できます

AuthGroupFile /dev/nullは、グループごとにアクセスを許可する、という指定。「/dev/null」とは、そのようなファイルは存在しないという意味。つまりグループごとでのアクセス制限はしないという意味。

サーバーによって記載するとエラーになる場合、記載しないでおきましょう。

Apache + EC2(ELB使用しない場合、httpd.confに記入)

Directory/var/www/htmlとした場合

/etc/httpd/conf/httpd.conf
<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

Apache + Windowsサーバー(ELB使用しない場合で、httpd.confに記入)

windowsサーバーの場合上記の方法が使えなかったため、httpd.confに記入します。

Locationの詳細説明はこちら

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

LocationでBasic認証したいパスを選択できます。今回は、"/"ですが、"/index.php"と記載すると、index.phpのみBasic認証がかけられます。

パスワードの作成方法は先程の方法と同様です。
.htpasswdは、適切な箇所に配置しましょう。

そして、コマンドプロンプトでapacheを再起動します。

C:\Apache24\bin> httpd -k restart

Basic認証 (ELB使用、ヘルスチェックを通す)

Nginx

Nginx(ELB使用時、ヘルスチェックを通す)

全てのパスでBasic認証されます。
nginx.confに設定し、/etc/nginx/配下に、.htpasswdを設置します。
ヘルスチェックのみ、Basic認証をパスします。

nginx.conf
server {
  listen 80;

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

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

Nginx(ELB使用時、特定のパスを除外)

ヘルスチェックと/test/パスを除き、Basic認証する設定になります。
/etc/nginx/配下に、.htpasswdを設置します。

nginx.conf
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のヘルスチェックのみ通してあげる設定になります。

.htaccess
# リクエスト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のフルパスに合わせることに注意しましょう。

Apache + Windowsサーバー(ELB使用時、httpd.confに記入)①

healthcheck.htmlファイルのヘルスチェックを通す設定になります。

httpd.conf
# 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認証をなしにする設定

httpd.conf
# 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認証をなしにする設定

httpd.conf
# 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 に Basic 認証を設定する方法
こんばんは、X-Forwarded-For警察です
Apache 2.4系でIP制限の設定方法
Nginx で Basic 認証

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6