メモ > サーバ > 構築: 攻撃からの防御 > Basic認証でアクセス制限
■Basic認証でアクセス制限
■Apache
ユーザ名「test」、パスワード「1234」で制限をかける例
# vi .htaccess
Basic認証設定ツール | refirio.org
http://refirio.org/view/368
htpasswdファイル生成(作成)
http://www.luft.co.jp/cgi/htpasswd.php
.htaccessファイルの利用が許可されていない場合、あらかじめ許可しておく必要がある
以下は /home/test 内で.htaccessの利用を許可する例(「AllowOverride All」を指定すると許可される)
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/html/secret/.htpasswd
Require valid-user
# vi .htpasswd
test:ZM56IZdqDMwjY
# vi /etc/httpd/conf/httpd.conf
設定したら、Apacheの設定ファイルを再読み込みする
<Directory "/home/test">
AllowOverride All
</Directory>
# service httpd reload
■Apache 2.4(特定のディレクトリ配下のみ)
※未検証
ディレクトリが存在する場合、そのディレクトリ直下に .htaccess を作成してBasic認証を設定すればいい
実際にはディレクトリが存在しない場合(URLルーティングを使用している場合など)、以下のように指定することで対応できる
この場合、「/basic/secret」内にのみBasic認証をかけている
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/html/example/html/basic/.htpasswd
#Require valid-user
SetEnvIf Request_URI '/basic/secret' secret
<RequireAny>
Require valid-user
Require env secret
</RequireAny>
特定のURLだけBasic認証を掛けない #Apache - Qiita
https://qiita.com/SHIN_DEVELOP/items/1cb7845fbfcd4bba3d69
■Apache 2.4(特定のディレクトリは除外)
※「.htaccess でアクセス制限」も参考に
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/html/secret/.htpasswd
Require valid-user
SetEnvIf Request_URI "/upload/image/" isImage
<RequireAny>
Require env isImage
Require valid-user
</RequireAny>
■Apache 2.4(特定のユーザーエージェントは除外)
※「.htaccess でアクセス制限」も参考に
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/html/secret/.htpasswd
Require valid-user
SetEnvIf User-Agent "Edg/89.0" isEdge
SetEnvIf User-Agent "Selenium" isSelenium
<RequireAny>
Require env isEdge
Require env isSelenium
Require valid-user
</RequireAny>
Apache 2.4 アクセス制御 - eastforest
https://www.eastforest.jp/vps/4943
■Apache 2.4(特定のIPアドレスは除外)
※「.htaccess でアクセス制限」も参考に
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/html/secret/.htpasswd
Require valid-user
<RequireAny>
Require ip 127.0.0.1
Require ip 203.0.113.1
Require valid-user
</RequireAny>
Apache 2.4 アクセス制御 - eastforest
https://www.eastforest.jp/vps/4943
MYN - 2016/05/30 14:21 / Apache 2.4.10 Satisfy Any
http://myn.meganecco.org/1464585660.html
【.htaccess】特定のIPを除外してベーシック認証をかける方法 | web関連 | 勉強ブログ「二色人日記。」
https://twotone.me/web/3312/
■Apache 2.2(特定のディレクトリ配下のみ)
ディレクトリが存在する場合、そのディレクトリ直下に .htaccess を作成してBasic認証を設定すればいい
実際にはディレクトリが存在しない場合(URLルーティングを使用している場合など)、以下のように指定することで対応できる
この場合、「/basic/secret」内にのみBasic認証をかけている
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile /var/www/html/example/html/basic/.htpasswd
Require valid-user
SetEnvIf Request_URI '^/basic/secret' secret
Satisfy any
Order Deny,Allow
Deny from all
Allow from env=!secret
【Wordpress】特定URLにマッチするときにベーシック認証をするよ! - やったこと
https://absg.hatenablog.com/entry/2020/02/18/211922
■Apache 2.2(特定のディレクトリは除外)
※「.htaccess でアクセス制限」も参考に
Basic認証配下のディレクトリに、以下を記述した.htaccessを置くと、そのディレクトリをBasic認証対象外にできる
Satisfy any
order allow,deny
allow from all
.htaccessで特定のファイルやディレクトリのみBASIC認証を解除する | ザ サイベース
https://thesaibase.com/server/htaccess-basic-auth
■Apache 2.2(特定のユーザーエージェントは除外)
※「.htaccess でアクセス制限」も参考に
以下のようにすれば、特定のユーザーエージェントからのみBasic認証なしでアクセスできる
以下は「Edg/89.0」もしくは「Selenium」を含むものを許可する例
Satisfy Any
BrowserMatchNoCase Edg/89.0 isEdge=1
BrowserMatchNoCase Selenium isSelenium=1
Order Deny,Allow
Deny from all
Allow from env=isEdge
Allow from env=isSelenium
AuthUserFile /var/www/html/secret/.htpasswd
AuthGroupFile /dev/null
AuthName "Input ID and Password."
AuthType Basic
require valid-user
<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
Apache で特定の User-Agent だけ BASIC 認証をバイパスする方法 - アクトインディ開発者ブログ
https://tech.actindi.net/2010/05/14/3482790616
■Apache 2.2(特定のIPアドレスは除外)
※「.htaccess でアクセス制限」も参考に
以下のようにすれば、特定のIPアドレスからのみBasic認証なしでアクセスできる
以下は「127.0.0.1」と「203.0.113.1」を許可する例
Satisfy Any
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from 203.0.113.1
AuthUserFile /var/www/html/secret/.htpasswd
AuthGroupFile /dev/null
AuthName "Input ID and Password."
AuthType Basic
require valid-user
<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
■nginx
.htaccessで設定することはできないので、nginxの設定ファイルを編集して再起動する
例えば nginx.conf で以下のように設定すると、「/secret/」がBasic認証の対象になる
.htpasswd の内容はApacheと同じ要領で作成できる
server {
listen 80 default_server;
server_name _;
index index.html;
root /var/www/html;
sendfile off;
location / {
}
location ^~ /secret/ {
auth_basic "Auth";
auth_basic_user_file /var/www/html/secret/.htpasswd;
}
}
以下で設定ファイルの文法チェックができる
# nginx -t -c /etc/nginx/nginx.conf
設定できたら以下のコマンドで設定ファイルを再読込する
# service nginx reload
再読込で大丈夫だが、もし反映されなければ再起動も試す
# service nginx restart
それでも駄目なら、いったん停止してから起動する
# service nginx stop
# service nginx start
Nginx で Basic 認証 - Qiita
https://qiita.com/kotarella1110/items/be76b17cdbe61ff7b5ca
htpasswdファイル生成(作成)
http://www.luft.co.jp/cgi/htpasswd.php
nginxで設定ファイルチェック - Qiita
https://qiita.com/yaotti/items/bd6774888a790c00e6fd
Nginxでベーシック認証を行う際の注意点
http://wpnote.link/notes-when-performing-basic-authentication-with-nginx/
上の手順でPHPページに対してBasic認証を設定すると、対象ページではPHPが実行されなくなる
冗長だが、以下のようにここにもPHPの設定を書く必要があるみたい
location ^~ /secret/ {
auth_basic "Auth";
auth_basic_user_file /var/www/vhosts/test/public/tool/.htpasswd;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/test/public$fastcgi_script_name;
include fastcgi_params;
}
}
nginxだとphp scriptファイルにbasci認証がかからないんで すけどー - オレンジの国
http://technical.live-on.net/archives/1414
ただしLaravelなどURLルーティング機能のあるフレームワークを使っている場合、
/index.php がリクエストを受け取って処理を始めるため、上記の方法で個別にBasic認証を制御できないみたい
それでも設定すると、フレームワークから /secret/ のURLを呼び出したときに404エラーとなってしまう
対処方法があるかは要調査
以下は可能性がありそう?未検証
NginxでBasic認証(Laravel) | Qrunch(クランチ)
https://qrunch.net/@G8AaKC38xzUeSbBe/entries/u9XM60aUWnMgTkts
■nginx(特定のディレクトリは除外)
以下のようにすれば、「.well-known」ディレクトリ内には認証なしでアクセスできる
location / {
try_files $uri /index.php?$query_string;
auth_basic "Auth";
auth_basic_user_file /var/www/main/.htpasswd;
location /.well-known/ {
satisfy any;
allow all;
}
}
[Nginx] 特定 URL を Basic 認証から除外する方法 | CodeNote
https://codenote.net/nginx/4204.html
■nginx(特定のユーザーエージェントは除外)
以下のようにすれば、特定のユーザーエージェントからのみBasic認証なしでアクセスできる
以下は「Chrome-Lighthouse」もしくは「Selenium」を含むものを許可する例
(なお「Chrome-Lighthouse」を許可すると、Basic認証をかけたサイトでもPageSpeed Insightsでの計測ができる)
location / {
auth_basic "Auth";
↓
set $auth "Auth";
if ($http_user_agent ~ (Chrome-Lighthouse|Selenium)) {
set $auth off;
}
location / {
auth_basic $auth;
Nginxでbotからのアクセス時にBasic認証を外す #nginx - Qiita
https://qiita.com/maruware/items/63574425900010a1b37a
■nginx(特定のIPアドレスは除外)
以下のようにすれば、特定のIPアドレスからのみBasic認証なしでアクセスできる
以下は「203.0.113.1」と「203.0.113.2」を許可する例
location / {
satisfy any;
allow 203.0.113.1;
allow 203.0.113.2;
deny all;
auth_basic "Auth";
auth_basic_user_file /var/www/vhosts/test/.htpasswd;
}
nginx 一部のアドレスにbasic認証を掛けない。 - podhmoの日記
http://d.hatena.ne.jp/podhmo/20110311/1299817584
nginxで特定のIPからは公開したいけどそれ以外はBASIC認証にしたいときの設定 - Qiita
https://qiita.com/katamuki/items/9a0a5f288d041b421f4c
■AWS ALB+Lambda
AWS.txt の「ロードバランサー」の「Basic認証」を参照
■「AuthName」の値
上記で記載している「AuthName "Input ID and Password."」のような内容は正確では無さそう
Apache | Basic認証を使ったアクセス制限を行う
https://www.javadrive.jp/apache/allow/index3.html
AuthNameの説明は
「認証領域」
「一度認証が通ったあと同じ認証領域の名前が設定されている Basic 認証が必要なページへアクセスしたときに認証が不要となります。」
とある
よってここは「Developer」「Admin」「Sales」のような区分を設定すべきだと思われる
ここの文字列が認証ダイアログに表示されるブラウザもあるが、少なくともChromeでは表示されない
(「認証領域をユーザに告知する」という意味では、表示される方が自然な気はするが)
よって何かしらの案内を書く場所でも無いのかもしれない
■.htpasswdの解析
htpasswdファイルに書かれたパスワードは非可逆な暗号化(ハッシュ化)されているため、復号化できない
ただし入力したパスワードはBase64してヘッダ内に付与してやりとりされるため、ここからならパスワードを抜き出すことはできる
つまりBasic認証の情報は暗号化されずに平文でやりとりされるため、SSL無しでBasic認証を使用するのは好ましくない
以下は具体例
とあるページで認証してからヘッダ情報を確認すると以下が記載されていた
Authorization: Basic ZGVtbzplbnRyeQ==
この「ZGVtbzplbnRyeQ==」をBase64デコードすると「demo:entry」となる
これがBasic認証の認証情報
とあるページで認証してからヘッダ情報を確認すると以下が記載されていた
authorization: Basic c3RhZ2luZzpxYXp3c3hlZGM=
この「c3RhZ2luZzpxYXp3c3hlZGM=」をBase64デコードすると「staging:qazwsxedc」となる
これがBasic認証の認証情報
.htpasswdファイルの解析(デコード)は無理。 | クズリーマンのカス備忘録
https://it-afi.com/apache/post-1054/