Ubuntu20.04でApacheを使用してパスワード認証を設定する方法
序章
Web管理者は、一時的であろうと恒久的であろうと、Webサイトの一部を訪問者から制限することが有益であると感じるかもしれません。 Webアプリケーションは独自の認証および承認方法を提供する場合がありますが、これらが不十分または利用できない場合は、Webサーバー自体に依存してアクセスを制限することもできます。
このチュートリアルでは、Ubuntu20.04で実行されているApacheWebサーバー上のパスワード保護アセットについて説明します。 これにより、サーバーに追加のセキュリティレイヤーが提供されます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
sudo
権限とファイアウォールが有効になっているroot以外のユーザーでセットアップされた1台のUbuntu20.04サーバー。 これを行うには、Ubuntu20.04初期サーバーセットアップガイドに従ってください。 -
UbuntuサーバーにインストールされているApacheWebサーバー。 まだ設定していない場合は、 Ubuntu20.04チュートリアルにApacheWebサーバーをインストールする方法をガイドできます。 必ずステップ5を完了し、ドメインの仮想ホストファイルを用意してください。 このチュートリアルでは、全体を通して例として your_domain を参照し、仮想ホストファイルに
/etc/apache2/sites-available/your_domain.conf
を使用します。 -
SSLで保護された仮想ホスト。 これを設定することはあなたがあなたのサイトのドメイン名を持っているかどうかに依存します。
- ドメイン名をお持ちの場合は、無料の信頼できる証明書を提供するLet’sEncryptを使用してサイトを保護できます。 これを設定するには、 Let’s Encrypt Guide forApacheに従ってください。
- ドメインがなく、この構成をテストまたは個人使用に使用している場合は、代わりに自己署名証明書を使用できます。 これは同じタイプの暗号化を提供しますが、ドメイン検証はありません。 セットアップするには、Apacheの自己署名SSLガイドに従ってください。
-
ドメインを設定する場合(オプション)、 Namecheap でドメイン名を購入するか、 Freenom でドメイン名を無料で取得するか、のドメイン登録事業者を使用してください。選択。 さらに、サーバー用に次のDNSレコードの両方を設定する必要があります。 それらを追加する方法の詳細については、この DigitalOceanDNSの紹介に従ってください。
- サーバーのパブリックIPアドレスを指す
your_domain
のAレコード。 - サーバーのパブリックIPアドレスを指す
www.your_domain
のAレコード。
- サーバーのパブリックIPアドレスを指す
これらの前提条件を完了したら、sudo
ユーザーとしてサーバーにログインし、最初の手順に進みます。
ステップ1—Apacheユーティリティパッケージのインストール
サーバーを更新し、必要なパッケージをインストールすることから始めましょう。 このチュートリアルを完了するために、htpasswd
というユーティリティを使用してapache2-utils
パッケージの一部としてファイルを作成し、制限されたコンテンツにアクセスするために必要なユーザー名とパスワードを管理します。
まず、サーバーのパッケージインデックスを更新します。
- sudo apt update
次に、Apacheユーティリティパッケージをインストールします。
- sudo apt install apache2-utils
これをインストールすると、htpasswd
コマンドにアクセスできるようになります。
ステップ2—パスワードファイルを作成する
htpasswd
コマンドを使用すると、Apacheがユーザーの認証に使用できるパスワードファイルを作成できます。 この目的のために、/etc/apache2
構成ディレクトリ内に.htpasswd
という隠しファイルを作成します。
このユーティリティを初めて使用するときは、-c
オプションを追加して、指定したpasswdfile
を作成する必要があります。 ここでは、コマンドの最後にユーザー名(この例ではsammy
)を指定して、ファイル内に新しいエントリを作成します。
- sudo htpasswd -c /etc/apache2/.htpasswd sammy
ユーザーのパスワードを入力して確認するように求められます。
次の例のように、追加する追加ユーザーの-c
引数は省略して、ファイルを上書きしないようにします。
- sudo htpasswd /etc/apache2/.htpasswd another_user
ファイルの内容を確認すると、各レコードのユーザー名と暗号化されたパスワードが含まれています。
- cat /etc/apache2/.htpasswd
Outputsammy:$apr1$eponJaBR$9uyVIRpDpbHoseI.hS1cq/
another_user:$apr1$dDXiQxte$RGn3CVfFLQOPf5lSJgNvV1
これで、Apacheが読み取れる形式のユーザーとパスワードが得られました。
ステップ3—Apacheパスワード認証の設定
このステップでは、保護されたコンテンツを提供する前に、.htpasswd
ファイルをチェックするようにApacheを構成する必要があります。 これは、サイトの仮想ホストファイルに直接配置するか、制限が必要なディレクトリに.htaccess
ファイルを配置するかのいずれかの方法で実行できます。 通常は仮想ホストファイルを使用するのが最善ですが、 root 以外のユーザーが自分のアクセス制限を管理できるようにする必要がある場合は、2番目のオプションを参照して、Webサイトと一緒にバージョン管理の制限を確認するか、すでに他の目的で.htaccess
ファイルを使用しているWebアプリケーションがあります。
注:アクティブな仮想ホストに対して次のオプションを実行できます。 独自のものを使用している場合は、構成を反映するようにコマンドと値を必ず変更してください。
ニーズに最適なオプションを選択してください。
オプション1:仮想ホスト定義内でのアクセス制御の構成(推奨)
最初のオプションは、Apache構成を編集し、仮想ホストファイルにパスワード保護を追加することです。 これにより、分散構成ファイルを読み取る費用が回避されるため、通常、パフォーマンスが向上します。 このオプションでは、構成へのアクセスが必要です。これは常に利用できるとは限りませんが、アクセスできる場合は、このオプションをお勧めします。
制限を追加する仮想ホストファイルを開くことから始めます。 この例では、仮想ホストを保持する/etc/apache2/sites-available/your_domain.conf
ファイルを使用します。 nano
などのコマンドラインテキストエディタでファイルを開きます。
- sudo nano /etc/apache2/sites-available/your_domain.conf
内部では、コメントが削除された状態で、ファイルは次のようになります。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
認証はディレクトリごとに行われます。 認証を設定するには、制限するディレクトリを<Directory ___>
ブロックでターゲットにする必要があります。 この例では、ドキュメントルート全体を制限しますが、このリストを変更して、Webスペース内の特定のディレクトリのみをターゲットにすることができます。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/your_domain">
</Directory>
</VirtualHost>
このディレクトリブロック内で、Basic
認証を設定することを指定します。 AuthName
には、資格情報の入力を求めるときにユーザーに表示されるレルム名を選択します。 AuthUserFile
ディレクティブを使用して、作成したパスワードファイルをApacheにポイントします。 最後に、valid-user
のみがこのリソースにアクセスできることを要件にします。つまり、パスワードを使用して自分のIDを確認できる人は誰でも次の場所で許可されます。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/your_domain">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
</VirtualHost>
終了したら、ファイルを保存して閉じます。 nano
を使用している場合は、CTRL + X
、Y
、ENTER
の順に押すと使用できます。
Webサーバーを再起動する前に、次のコマンドで構成を確認できます。
- sudo apache2ctl configtest
すべてがチェックアウトされ、出力としてSyntax OK
が表示された場合は、サーバーを再起動してパスワードポリシーを実装できます。
- sudo systemctl restart apache2
systemctl
はすべてのサービス管理コマンドの結果を表示しないため、status
コマンドを使用して、サーバーが実行されていることを確認します。
- sudo systemctl status apache2
Output● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>
Active: active (running) since Fri 2022-04-29 17:12:24 UTC; 4s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 4493 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SU>
Main PID: 4514 (apache2)
Tasks: 55 (limit: 9508)
Memory: 5.8M
CGroup: /system.slice/apache2.service
├─4514 /usr/sbin/apache2 -k start
├─4516 /usr/sbin/apache2 -k start
└─4517 /usr/sbin/apache2 -k start
これで、指定したディレクトリはパスワードで保護されているはずです。
オプション2:.htaccessファイルを使用したアクセス制御の構成
Apacheは、.htaccess
ファイルを使用して、特定の構成アイテムをコンテンツディレクトリ内に設定できるようにすることができます。 Apacheは、ディレクトリを含むすべてのリクエストでこれらのファイルを再読み取りする必要があり、パフォーマンスに悪影響を与える可能性があるため、オプション1 をお勧めしますが、すでに.htaccess
ファイルを使用している場合、またはroot以外のユーザーが制限を管理できるようにします。.htaccess
ファイルは理にかなっています。
.htaccess
ファイルを使用してパスワード保護を有効にするには、nano
などのコマンドラインテキストエディターでメインのApache構成ファイルを開きます。
- sudo nano /etc/apache2/apache2.conf
ドキュメントルートを保持する/var/www/
ディレクトリの<Directory>
ブロックを見つけます。 この行を更新して、ドキュメントルートを反映させます。 次に、そのブロック内のAllowOverride
ディレクティブをNone
からAll
に変更して、.htaccess
処理をオンにします。 この<Directory>
ブロックの内容は、次のようになります。
. . .
<Directory /var/www/your_domain>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
. . .
終了したら、ファイルを保存して閉じます。
次に、制限したいディレクトリに.htaccess
ファイルを追加します。 このデモでは、/var/www/your_domain
に基づくドキュメントルート全体(Webサイト全体)を制限しますが、このファイルは、アクセスを制限する任意のディレクトリに配置できます。
- sudo nano /var/www/your_domain/.htaccess
このファイル内で、Basic
認証を設定することを指定します。 AuthName
には、資格情報の入力を求めるときにユーザーに表示されるレルム名を選択します。 AuthUserFile
ディレクティブを使用して、作成したパスワードファイルをApacheにポイントします。 最後に、このリソースにアクセスするにはvalid-user
が必要です。つまり、パスワードで身元を確認できる人は誰でも次の場所で許可されます。
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
ファイルを保存して閉じます。 Webサーバーを再起動して、.htaccess
ファイルを使用してディレクトリ内またはその下のすべてのコンテンツをパスワードで保護します。
- sudo systemctl restart apache2
次に、systemctl status
を実行して、再起動が成功したことを確認します。
- sudo systemctl status apache2
Output● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>
Active: active (running) since Fri 2022-04-29 17:18:17 UTC; 3s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 4721 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SU>
Main PID: 4744 (apache2)
Tasks: 55 (limit: 9508)
Memory: 5.9M
CGroup: /system.slice/apache2.service
├─4744 /usr/sbin/apache2 -k start
├─4745 /usr/sbin/apache2 -k start
└─4746 /usr/sbin/apache2 -k start
これで、指定したディレクトリがパスワードで保護されているはずです。
ステップ4—パスワード認証の確認
コンテンツが保護されていることを確認するには、https://your_domain_or_server_IP
に移動して、Webブラウザで制限されたコンテンツにアクセスしてみてください。
次のようなユーザー名とパスワードのプロンプトが表示されます。
正しいクレデンシャルを入力すると、コンテンツにアクセスできるようになります。 間違ったクレデンシャルを入力するか、「キャンセル」をクリックすると、「未承認」エラーページが表示されます。
結論
これで、サイトの基本認証が設定されました。
Apache構成と.htaccess
でできることはもっとたくさんあります。 Apache構成で利用できる柔軟性とパワーの詳細については、次のいずれかのチュートリアルを試してください。
-
メインの設定ファイルの理解を深めるには、Apacheインストールガイドの重要なApacheファイルとディレクトリの理解に関するセクションをお読みください。
-
Apacheで仮想ホストファイルを設定する方法の詳細
-
URLの書き換え、前の「未承認」メッセージのようなエラーページのカスタマイズ、またはサーバーサイドインクルードを使用してすべてのページに共通の要素を含める方法については、ガイド.htaccessファイルの使用方法をご覧ください。