カテゴリー
Linux

【Nginx】Basic 認証をかける方法手順メモ

追記。「ログインページを介さず Basic 認証」シリーズの投稿一覧です♪

  1. 【Nginx】Basic 認証をかける方法手順メモ | oki2a24
  2. cURL を使って Basic 認証が必要な PHP へ JSON データを POST する手順メモ | oki2a24
  3. AngularJS を使って PHP へ JSON データを POST する方法 | oki2a24
  4. AngularJS を使って Basic 認証が必要な PHP へ JSON データを POST できません>< | oki2a24
  5. AngularJS を使って Basic 認証が必要な PHP へ JSON データを POST するサンプルコード! | oki2a24

追記終わり!

nginx で Basic 認証をかけたいですの。まずは、静的な HTML ファイルと簡単な PHP ファイルを表示いたします。

その準備、手順を記していきますわ♪

Nginx で Basic 認証をかけるためのポイント

  • ユーザ名、パスワードを生成するのは nginx とは別のコマンド「htpasswd」を使用すると便利
  • 「htpasswd」は httpd がインストールされていれば使用可能。使えず、Apache をインストールする必要もなければ「httpd-tools」を yum でインストールすると良いとのこと。
  • Basic 認証をかけるには nginx 設定ファイルに「location パス」のディレクティブに auth_basic、auth_basic_user_file を指定すれば良い。

Nginx で Basic 認証をかける手順ポイント

  1. Basic 認証で使用するユーザ名、パスワードを記述したファイルを作成し、適切なディレクトリに置く。
  2. Nginx の設定ファイルに、Basic 認証をかけるパス、Basic 認証の有効化、認証情報ファイルの場所の情報を追記する。
  3. Nginx 設定をリロードし、Basic 認証がかかっていることを確認する。

環境情報。テストの予定

  • 環境
    • CentOS release 5.11 (Final)
    • nginx/1.8.0
  • テスト予定
    • ドキュメントルートには Basic 認証をかけない
    • ドキュメントルート/basictest/ ディレクトリに Basic 認証をかける
    • ユーザ名: basicuser、パスワード: basicpass
    • Basic認証用ファイル: /etc/nginx/.htpasswd

参考

0.準備!Basic 認証用のユーザ名、パスワードを作るための htpasswd コマンドが使えるかどうか、確認しました♪

yum --enablerepo=epel,nginx,remi,remi-php55,rpmforge info httpd

次のように表示され、インストールされていることがわかりました。

Installed Packages
Name       : httpd
Arch       : i386
Version    : 2.2.3
Release    : 91.el5.centos
Size       : 3.0 M
Repo       : installed
Summary    : Apache HTTP Server
URL        : http://httpd.apache.org/
License    : Apache Software License
Description: The Apache HTTP Server is a powerful, efficient, and extensible
           : web server.

したがいまして、httpd に付随する「htpasswd」が使用できることが確認できましたの。

もし、インストールされていなければ yum install httpd-tools で入れることができるそうですわ♪

yum install httpd ですと Apache 本体もインストールされます。けれども、Basic 認証を Nginx で使用したいだけでしたら、Apache のインストールは不要です。

ですので、httpd-tools のインストールをまず行うのがよいと存じます。

0.準備!Basic 認証をかけるページを作成する。

  • ドキュメントルート/basictest/ ディレクトリに Basic 認証をかける

ドキュメントルートへ移動した後、次のコマンドでディレクトリ、ページを作成いたしました。

# mkdir basictest
# cd basictest/
# echo "basic test page" > index.html
# echo "<?php phpinfo(); ?>" > info.php
# cd ..
# chown -R nginx:nginx basictest/

https://oki2a24.com/basictest/ へアクセスし、無事に「basic test page」と書かれたページが表示されたことを確認しました。

これでテストページが完成しましたの♪Basic 認証をかけ、ログインしてから初めてページが表示されるように設定していきますわね♪

1.Basic 認証で使用するユーザ名、パスワードを記述したファイルを作成し、適切なディレクトリに置く。

  • ユーザ名: basicuser、パスワード: basicpass
  • Basic認証用ファイル: /etc/nginx/.htpasswd

上記のファイルを作成いたします。

# cd /etc/nginx/
# htpasswd -c .htpasswd basicuser
New password: 
Re-type new password: 
Adding password for user basicuser
#

作成されたこと、そして、内容を確認します。

# ll -a
total 52
drwxr-xr-x  3 root root 4096 Jul 26 12:31 .
drwxr-xr-x 62 root root 4096 Jul 26 12:07 ..
-rw-r--r--  1 root root   24 Jul 26 12:31 .htpasswd
... 略 ...
# cat .htpasswd 
basicuser:FVOTRttpas0ln
#

無事確認できました。パスワードは暗号化されておりますわね。

2.Nginx の設定ファイルに、Basic 認証をかけるパス、Basic 認証の有効化、認証情報ファイルの場所の情報を追記する。

バックアップをとった後、編集いたします。

# cp -a /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bk
# vim /etc/nginx/conf.d/default.conf

編集内容です。

  • Basic 認証に関係するのは auth_basic、auth_basic_user_file
  • proxy_pass は Basic 認証自体には関係ない。PHP を実行するために必要。静的 HTML ファイルだけなら不要な行
# Basic 認証
location /basictest {
    auth_basic "Basic Test";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://unix:/var/run/nginx.sock;
}

補足いたします。proxy_pass の行が無い状態で PHP を実行しますと、PHP ファイルがダウンロードされ、プログラムが実行されません。

これは、location /basictest ディレクティブを実行しますと、これを囲っている server ディレクティブの処理が終了し、以後に書いた部分が実行されないためですわね。そこで、PHP を実行させるために、同じファイルの後半に書いたウェブサーバ設定のポートを指定することで処理が引き継がれるようにしております。

※PHP 実行の原理として正しいかについてはうろ覚えのまま未確認ですので自信がありません。誤っている可能性があることを予めお断りいたします。

ちなみに、”Basic Test” は認証画面で表示されるメッセージですの。日本語を交えてみましたら、文字化けしてしまいましたので半角英数のみで表現しております。

なお、編集したファイル default.conf の全体像としては次のようになりました(今回の変更を入れる前の詳細はこちら)。Basic 認証設定は、プロキシサーバ設定部分に入れました。

# ドキュメントルート
root   /var/www/html/oki2a24.com;
# インデックスファイル指定
index  index.php index.html index.htm;

# キャッシュ設定 ... 略 ...

# プロキシサーバ設定
server {
    listen 80 default_server;

    # Basic 認証
    location /basictest {
        auth_basic "Basic Test";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://unix:/var/run/nginx.sock;
    }

    # ログ設定、キャッシュ設定、キャッシュ実行、PHP 実行 ...略...
}

# ウェブサーバ設定
server {
    # ポートを指定
    listen unix:/var/run/nginx.sock;

    # パーマネントリンク設定、PHP-FPM 設定 ...略...
}

これがベターなのかどうかは自信がありません><。とはいえ、ウェブサーバ設定の server ディレクティブでも proxy_pass は外して同様に試しましたところ、HTML 静的ファイルは Basic 認証がかかりましたけれども、PHP ファイルにはかかりませんでした。

ですので、プロキシサーバ設定のディレクティブに書くのがよさそうですの。

3.Nginx 設定をリロードし、Basic 認証がかかっていることを確認する。

編集の文法チェックを行い、設定ファイルのリロードをいたします。

# /etc/init.d/nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# /etc/rc.d/init.d/nginx reload
Reloading nginx:                                           [  OK  ]
#

https://oki2a24.com/basictest/ へアクセスし、Basic 認証が要求されたこと、正しい情報を入力すればページヘアクセスできること、誤った情報なら弾かれることを確認できました♪

Basic 認証が要求されたことを確認できました。

おわりに。参考書籍、ウェブページ

今回の試みは、次のステップへの布石の位置づけですの。静的ページと簡単な PHP プログラムを実行したページを表示しましたけれども、Basic 認証がかかった状態で、POST データを送るようにしたいですの♪

以上です。