🐕
Apacheを導入し、Basic認証を設定した後、3通りの方法で認証する(FetchAPI,cURL,URL直入力)
Basic認証を試す
Basic認証は、シンプルで手軽な認証方式として、特に開発環境やテスト環境での一時的なセキュリティ対策として広く利用されています。本記事では、Basic認証の導入手順から実際の認証の実施までを解説します。また、筆者の検証中に発生した問題やその解決策についても紹介します。
導入
-
サーバ作成
検証時のスペックは基本デフォルトです。
入力が必要な項目は以下を設定しています。名前: test AMI: (デフォルト)Amazon Linux 2023 AMI 2023.6.20241010.0 x86_64 HVM kernel-6.1 インスタンスタイプ: (デフォルト)t2.micro キーペア名: 1026test.pem パブリック IP の自動割り当て: 有効 任意の場所からのSSHトラフィックを許可: checked インターネットからの HTTP トラフィックを許可: checked
-
サーバ接続
ssh -i 1026test.pem ec2-user@<パブリックIP>
(EC2インスタンスコネクトやセッションマネージャなどなんでもよいです) -
Apache導入
sudo yum install httpd -y
-
Apache:Basic認証設定
-
sudo vi /etc/httpd/conf/httpd.conf
(ファイルの末尾に以下を追加します)<Directory "/var/www/html/"> AuthUserFile /etc/httpd/conf/.htpasswd AuthGroupFile /dev/null AuthName "Basic Auth" AuthType Basic Require valid-user </Directory>
- Basic認証用ユーザ・パスワード追加
sudo htpasswd -c -b /etc/httpd/conf/.htpasswd user1 pass
sudo htpasswd -b /etc/httpd/conf/.htpasswd user2 pass@@
- HTMLページ作成
sudo vi /var/www/html/index.html
<h1>var www html</h1>
- Apache起動
sudo systemctl start httpd
-
-
確認
- ブラウザのURLに
http://<パブリックIP>
を入力すると、認証画面が表示されます
- 以下の認証情報を入力すると、HTMLページが表示されます
ユーザ名: user1
パスワード: pass
Apache,Basic認証の導入は以上です。
- ブラウザのURLに
3通りの方法で認証を実施
- ブラウザにURL直入力
http://user1:pass@<パブリックIP>/
http://user2:pass%40%40@<パブリックIP>/
- コンソールでcurlコマンドを実行
- curl(-u)
curl -u user1:pass http://<パブリックIP>/
curl -u user2:pass@@ http://<パブリックIP>/
- curl(-H)
curl http://<パブリックIP>/ -H "Authorization: Basic $(echo -n 'user1:pass' | base64)"
curl http://<パブリックIP>/ -H "Authorization: Basic $(echo -n 'user2:pass@@' | base64)"
- curl(-u)
- ブラウザのコンソールでFetchAPIを実行
fetch('http://<パブリックIP>/', { method: "GET", headers: { "Authorization": "Basic " + btoa("user1:pass") } });
fetch('http://54.150.239.232/', { method: "GET", headers: { "Authorization": "Basic " + btoa("user2:pass@@") } });
以上が3通りの認証方法になります。
遭遇したエラーと解決方法
- レスポンスが403になる
Apacheがデフォルトページのレスポンスコードを403にしているためでした。
/var/html/index.htmlを作成すると、レスポンスコードが正常を表すものになります。
設定ファイル: /etc/httpd/conf.d/welcome.conf<LocationMatch "^/+$"> Options -Indexes ErrorDocument 403 /.noindex.html </LocationMatch>
- FetchAPIでCORSが返ってくる
javascriptでブラウザが表示しているURL以外へアクセスしようとすると、chromeなどほぼすべてのブラウザがブロックします。そのため、今回の例でいうと、新しいタブを開いてFetchAPIを実行してもCORSエラーになります。
このブラウザの仕様下でFetchAPIを動かすには一度ブラウザでBasic認証を行い、その後キャッシュを消して実質ログアウトを行い、その後同じブラウザのコンソールでFetchAPIを実行する必要があります。
上記手順を踏む必要があるため、基本的にはFetchAPIで認証することはできないのではないかという気がします。 - パブリックIPを入力しても、BasicHTMLページが表示できない
https://<パブリックIP>にアクセスしていたためでした。
以下のオープンアドレスをクリックすると、httpsにアクセスします。
- ブラウザ直入力の場合認証が通らない
パスワードにURLで特別扱いされる文字が含まれていたためでした。
URLエンコードを行う必要があります。
今回の例でいうと、
http://user2:pass@@@@<パブリックIP>/
ではアクセスできなくて、
http://user2:pass%40%40@<パブリックIP>/
ならアクセスできます。
参考サイト
Discussion