序章

Web管理者は、一時的であろうと恒久的であろうと、Webサイトの一部を訪問者から制限することが有益であると感じるかもしれません。 Webアプリケーションは独自の認証および承認方法を提供する場合がありますが、これらが不十分または利用できない場合は、Webサーバー自体に依存してアクセスを制限することもできます。

このチュートリアルでは、サーバーに追加のセキュリティを提供するために、Ubuntu18.04で実行されているApacheWebサーバーのパスワード保護アセットについて説明します。

前提条件

このチュートリアルを完了するには、Ubuntu18.04サーバーにアクセスする必要があります。

さらに、開始する前に、次の設定が必要になります。

  • サーバー上のsudoユーザー Ubuntu 18.04初期サーバーセットアップガイドに従って、sudo権限を持つユーザーを作成できます。

  • Apache2 Webサーバー:まだセットアップしていない場合は、 Ubuntu18.04チュートリアルにApacheWebサーバーをインストールする方法をガイドできます。

  • SSLで保護されたサイト:これをどのように設定するかは、サイトのドメイン名があるかどうかによって異なります。

    • ドメイン名をお持ちの場合は、無料の信頼できる証明書を提供するLet’sEncryptを使用してサイトを保護できます。 これを設定するには、 Let’s Encrypt Guide forApacheに従ってください。
    • ドメインがなく、この構成をテストまたは個人使用に使用している場合は、代わりに自己署名証明書を使用できます。 これは同じタイプの暗号化を提供しますが、ドメイン検証はありません。 セットアップするには、Apacheの自己署名SSLガイドに従ってください。

これらがすべて整ったら、sudoユーザーとしてサーバーにログインし、以下を続行します。

ステップ1—Apacheユーティリティパッケージのインストール

サーバーを更新し、必要なパッケージをインストールすることから始めましょう。 このチュートリアルを完了するために、htpasswdというユーティリティを使用してapache2-utilsパッケージの一部としてファイルを作成し、制限されたコンテンツにアクセスするために必要なユーザー名とパスワードを管理します。

  1. sudo apt update
  2. sudo apt install apache2-utils

これをインストールすると、htpasswdコマンドにアクセスできるようになります。

ステップ2—パスワードファイルを作成する

htpasswdコマンドを使用すると、Apacheがユーザーの認証に使用できるパスワードファイルを作成できます。 この目的のために、/etc/apache2構成ディレクトリ内に.htpasswdという隠しファイルを作成します。

このユーティリティを初めて使用するときは、-cオプションを追加して、指定したpasswdfileを作成する必要があります。 コマンドの最後にユーザー名(この例ではsammy)を指定して、ファイル内に新しいエントリを作成します。

  1. sudo htpasswd -c /etc/apache2/.htpasswd sammy

ユーザーのパスワードを入力して確認するように求められます。

追加する追加ユーザーの-c引数は省略して、ファイルを上書きしないようにします。

  1. sudo htpasswd /etc/apache2/.htpasswd another_user

ファイルの内容を表示すると、各レコードのユーザー名と暗号化されたパスワードを確認できます。

  1. cat /etc/apache2/.htpasswd
Output
sammy:$apr1$.0CAabqX$rb8lueIORA/p8UzGPYtGs/ another_user:$apr1$fqH7UG8a$SrUxurp/Atfq6j7GL/VEC1

これで、Apacheが読み取れる形式のユーザーとパスワードが用意されました。

ステップ3—Apacheパスワード認証の設定

このステップでは、保護されたコンテンツを提供する前に、このファイルをチェックするようにApacheを構成する必要があります。 これは、サイトの仮想ホストファイルに直接配置するか、制限が必要なディレクトリに.htaccessファイルを配置するかのいずれかの方法で実行できます。 通常は仮想ホストファイルを使用するのが最善ですが、root以外のユーザーが自分のアクセス制限を管理できるようにする必要がある場合は、Webサイトと一緒にバージョン管理で制限を確認するか、.htaccessファイルを使用するWebアプリケーションを作成してくださいすでに他の目的のために、2番目のオプションをチェックしてください。

ニーズに最適なオプションを選択してください。

オプション1:仮想ホスト定義内でのアクセス制御の構成(推奨)

最初のオプションは、Apache構成を編集し、仮想ホストファイルにパスワード保護を追加することです。 これにより、分散構成ファイルを読み取る費用が回避されるため、通常、パフォーマンスが向上します。 このオプションでは、構成へのアクセスが必要です。これは常に利用できるとは限りませんが、アクセスできる場合は、このオプションをお勧めします。

制限を追加する仮想ホストファイルを開くことから始めます。 この例では、Ubuntuのapacheパッケージを介してインストールされたデフォルトの仮想ホストを保持するdefault-ssl.confファイルを使用します。 nanoなどのコマンドラインテキストエディタでファイルを開きます。

  1. sudo nano /etc/apache2/sites-enabled/default-ssl.conf

内部では、コメントが削除され、ファイルは次のようになります。

/etc/apache2/sites-enabled/default-ssl.conf
<VirtualHost *:80>
  ServerAdmin [email protected]
  DocumentRoot /var/www/html
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

認証はディレクトリごとに行われます。 認証を設定するには、制限するディレクトリを<Directory ___>ブロックでターゲットにする必要があります。 この例では、ドキュメントルート全体を制限しますが、このリストを変更して、Webスペース内の特定のディレクトリのみをターゲットにすることができます。

/etc/apache2/sites-enabled/default-ssl.conf
<VirtualHost *:80>
  ServerAdmin [email protected]
  DocumentRoot /var/www/html
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  <Directory "/var/www/html">
  </Directory>
</VirtualHost>

このディレクトリブロック内で、Basic認証を設定することを指定します。 AuthNameには、資格情報の入力を求めるときにユーザーに表示されるレルム名を選択します。 AuthUserFileディレクティブを使用して、作成したパスワードファイルをApacheにポイントします。 最後に、valid-userのみがこのリソースにアクセスできることを要件にします。つまり、パスワードを使用して自分のIDを確認できる人は誰でも許可されます。

/etc/apache2/sites-enabled/default-ssl.conf
<VirtualHost *:80>
  ServerAdmin [email protected]
  DocumentRoot /var/www/html
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  <Directory "/var/www/html">
      AuthType Basic
      AuthName "Restricted Content"
      AuthUserFile /etc/apache2/.htpasswd
      Require valid-user
  </Directory>
</VirtualHost>

終了したら、ファイルを保存して閉じます。 nanoを使用している場合は、CTRL+XYENTERの順に押すと使用できます。

Webサーバーを再起動する前に、次のコマンドで構成を確認できます。

  1. sudo apache2ctl configtest

すべてがチェックアウトされ、Syntax OKが出力として表示されたら、サーバーを再起動してパスワードポリシーを実装できます。 systemctlはすべてのサービス管理コマンドの結果を表示しないため、statusを使用して、サーバーが実行されていることを確認します。

  1. sudo systemctl restart apache2
  2. sudo systemctl status apache2

これで、指定したディレクトリはパスワードで保護されているはずです。

オプション2:.htaccessファイルを使用したアクセス制御の構成

Apacheは、.htaccessファイルを使用して、特定の構成アイテムをコンテンツディレクトリ内に設定できるようにすることができます。 Apacheは、ディレクトリを含むすべてのリクエストでこれらのファイルを再読み取りする必要があり、パフォーマンスに悪影響を与える可能性があるため、オプション1をお勧めしますが、すでに.htaccessファイルを使用している場合、またはroot以外のユーザーに制限を管理し、.htaccessファイルは理にかなっています。

.htaccessファイルを使用してパスワード保護を有効にするには、nanoなどのコマンドラインテキストエディターでメインのApache構成ファイルを開きます。

  1. sudo nano /etc/apache2/apache2.conf

ドキュメントルートを保持する/var/wwwディレクトリの<Directory>ブロックを見つけます。 そのブロック内のAllowOverrideディレクティブをNoneからAllに変更して、.htaccess処理をオンにします。

/etc/apache2/apache2.conf
. . .

<Directory /var/www/>
  Options Indexes FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>

. . .

終了したら、ファイルを保存して閉じます。 nanoを使用している場合は、CTRL+XYENTERの順に押すと使用できます。

次に、制限したいディレクトリに.htaccessファイルを追加する必要があります。 このデモでは、/var/www/htmlに基づくドキュメントルート全体(Webサイト全体)を制限しますが、このファイルは、アクセスを制限する任意のディレクトリに配置できます。

  1. sudo nano /var/www/html/.htaccess

このファイル内で、Basic認証を設定することを指定します。 AuthNameには、資格情報の入力を求めるときにユーザーに表示されるレルム名を選択します。 AuthUserFileディレクティブを使用して、作成したパスワードファイルをApacheにポイントします。 最後に、このリソースにアクセスするにはvalid-userが必要です。つまり、パスワードで身元を確認できる人は誰でも次の場所で許可されます。

/var/www/html/.htaccess
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user

ファイルを保存して閉じます。 Webサーバーを再起動して、.htaccessファイルを使用してディレクトリ内またはその下のすべてのコンテンツをパスワードで保護し、systemctl statusを使用して再起動が成功したことを確認します。

  1. sudo systemctl restart apache2
  2. sudo systemctl status apache2

これで、指定したディレクトリがパスワードで保護されているはずです。

ステップ4—パスワード認証の確認

コンテンツが保護されていることを確認するには、Webブラウザで制限されたコンテンツにアクセスしてみてください。 次のようなユーザー名とパスワードのプロンプトが表示されます。

Apache2 password prompt

正しいクレデンシャルを入力すると、コンテンツにアクセスできるようになります。 間違ったクレデンシャルを入力するか、「キャンセル」をクリックすると、「未承認」エラーページが表示されます。

Apache2 unauthorized error

結論

おめでとう! これで、サイトの基本認証を設定できました。

Apache構成と.htaccessでできることはもっとたくさんあります。 Apache構成で利用できる柔軟性とパワーの詳細については、次のチュートリアルのいずれかを試してください。