Basic認証（WEBサーバ構築シリーズ③）

## はじめに

今までの通信はCLのブラウザーからWebサーバへ認証無しでアクセスできた。
しかしこれだと悪意あるユーザがWebサーバにアクセスできてしまう。
今回は【ベーシック認証】という、Webサイトに対して必要最低限の認証設定をかける。
http（Apache）の機能が持つ認証システムで、手軽に制限をかける認証方法です。

## Basic認証 特徴

Basic認証はページやファイルなど、特定の領域に制限をかけられる点。
Basic認証で制限されたページは認証ダイアログが起動し、ユーザーIDとパスワードの入力を求めます。
正しい値が入力されると認証され、ユーザーは閲覧が可能となる。

下図のBasic認証が可能になるようWebサーバ側で設定し、CL側で動作確認する。

![Basic認証.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/69556842-f9ec-d1dd-1245-86fda9e4533b.png)

誰にもprivateディレクトリにアクセスはさせません。
然るべきIDとPWを知っている人のみアクセスできるようにBasic認証設定をする。

Basic認証には設定方法が次の2通りある。
- `httpd.conf`に認証設定を追記
- 外部設定ファイル`.htaccess`の利用
※設定方法が違うが記述方法はほぼ同じ

両方のやり方で動作確認するが、まず前者から。

## `httpd.conf`に対するbasic認証設定

①Webサーバ側でuser1&2&3がないのでアカウント追加作成する。

```
[root@sv ~]# grep "^user" /etc/passwd
[root@sv ~]# useradd user1
[root@sv ~]# passwd user1
(割愛)
```

アカウント・グループ・パスワード作成されたか念のため確認
```
[root@sv ~]# tail -n 3 /etc/{passwd,group,shadow}
==> /etc/passwd <==
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user3:x:1003:1003::/home/user3:/bin/bash

==> /etc/group <==
user1:x:1001:
user2:x:1002:
user3:x:1003:

==> /etc/shadow <==
user1:$6$qsd9tP4qlK6daU.O$uSNnH.7mIX7h3dzpGKa43CpGHdWZ4n9R9iJm.8FD5mjiKclb.o9JjMoEYPnPby6n9gvHHpiiRt4iagp2im20R.:19337:0:99999:7:::
user2:$6$ZJUPSwAfGV1wN1L9$IDTEK9QSXRa/uGZQGdKrqz6qCSiHaR.h9XCr7Hjg4prxVFEH5t51rkKB1w3jpUcFd42Vq4/VnIMg9tW5xASXD/:19337:0:99999:7:::
user3:$6$qeI0mqbw7BGRLvdX$fuWsGGF2BsxnHEVy4Ot26CmP6d8Tc3GjFsho6.Fe8Yrr5SmE9q0CHNCk/hNdBX/Go5Nf1zVop8y0IscHBX3Fd.:19337:0:99999:7:::
```
②公開dir・コンテンツの作成

`/var/www/html`配下に新に`private`ディレクトリを作り（公開dir）、
その配下にコンテンツtest.htmlを作成する。

```
[root@sv ~]# cd /var/www/html/ ; pwd
/var/www/html
[root@sv html]# mkdir private
[root@sv html]# vim private/test.html 
```

③Basic認証の設定（①設定ファイルの利用）

初めに設定ファイルに直接定義するやり方。

apacheの設定ファイル`httpd.conf`の最終行に以下を追記。

```:vim /etc/httpd/conf/httpd.conf
361 ##########   Basic Authetication    ########## 
362 <Directory "/var/www/html/private">   ←basic認証対象の公開dir
363 AuthType Basic   ←認証タイプ：今回はbasic認証を指定
364 AuthName "Please enter your ID and PW"  ←同公開dirにアクセスした時に表示するメッセージ
365 AuthUserFile /etc/httpd/conf/.htpasswd ←basic認証対象ユーザを'.htpasswd'ファイルに登録する
366 require valid-user ← /etc/passwdに登録されてるユーザが対象
367 </Directory>
368 ############################################## 
```

今回はbasic認証でアクセス制御するが、その他に
- Digest（ダイジェスト）認証
- Form（フォーム）認証
などがある。

詳しくは以下リンク参照
[Basic認証とは？その仕組みとすり抜けできるなど脆弱性についても解説](https://www.cybersolutions.co.jp/blog/basic/#:~:text=Basic%E8%AA%8D%E8%A8%BC%E3%81%A8%E3%81%AFWeb,%E3%82%89%E3%82%8C%E3%82%8B%E7%82%B9%E3%81%8C%E7%89%B9%E5%BE%B4%E3%81%A7%E3%81%99%E3%80%82)

編集したら保存して構文チェック

```
[root@sv html]# apachectl configtest
Syntax OK
[root@sv html]# systemctl restart httpd ; systemctl status httpd
● httpd.service - The Apache HTTP Server
   Active: active (running) 
```

③認証時に使用する(ID,PWD)の設定 '.htpasswd'

このファイルはvimで編集できず、次の専用のコマンド`htpasswd`でBasic
認証対象のユーザ（つまりアクセスを許すuser）の登録をする。

htpasswdコマンドのマニュアルをmanコマンドで確認するとそれらしき事記述されてますね
```
HTPASSWD(1)                                                      htpasswd                                                     HTPASSWD(1)

NAME
       htpasswd - Manage user files for basic authentication

SUMMARY
       htpasswd  is used to create and update the flat-files used to store usernames and password for basic authentication of HTTP users.
       If htpasswd cannot access a file, such as not being able to write to the output file or not being able to read the file  in  order
       to update it, it returns an error status and makes no changes.
```

デフォルトでは、`/etc/httpd/conf/.htpasswd`ファイルはないので新規作成する。

```
[root@sv html]# ls -l /etc/httpd/conf/.htpasswd
ls: '/etc/httpd/conf/.htpasswd' にアクセスできません: そのようなファイルやディレクトリはありません
[root@sv html]# htpasswd -c /etc/httpd/conf/.htpasswd user1
New password: 
Re-type new password: 
Adding password for user user1
[root@sv html]# ls -l /etc/httpd/conf/.htpasswd
-rw-r--r--. 1 root root 44 12月 12 01:58 /etc/httpd/conf/.htpasswd
```
-c : 新規作成（create）
pwは'basicuser1'にした（任意）

user2も同様に登録する
```
[root@sv html]# htpasswd /etc/httpd/conf/.htpasswd user2
New password: 
Re-type new password: 
Adding password for user user2
```
追加でユーザ登録する場合は、-cオプションつけない。
つけると上書きされてしまうので注意！

新規作成した2つのユーザの確認
```
[root@sv html]# cat /etc/httpd/conf/.htpasswd 
user1:$apr1$sch8AOCc$EX/GhxyrrUm6L3e2A9lme/
user2:$apr1$26ZMc/xM$4QNo/iK53dreeYcXTktR1/
```
以上、Webサーバ側でのBasic認証の設定終わり。
これで`/var/www/html/private`配下にアクセスできるユーザは、user1とuser2のみのはず。

動作確認に移る。

## CLからアクセス

ブラウザーでhttps://www.d000.mgt.local/privateへアクセス

![スクリーンショット 2022-12-12 022502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/31f7ac81-0a6e-6b80-4042-0b63afaa62ba.png)

ユーザ名とパスワードを求められる。
`/etc/httpd/conf/.htpasswd`ファイルで定義したユーザー以外はログインできないことを確認

user1&user2:認証成功

![スクリーンショット 2022-12-12 022807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/2c3de705-fbad-5fec-87f3-75a3d7584300.png)

user3:認証失敗

![スクリーンショット 2022-12-12 023107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/ddec47d2-4a37-3873-e15a-77f02d14cb61.png)

401のエラーが返ってくる。

※上記の動作確認には都度キャッシュクリア必須。


⑥user2にBasic認証の抹消をする

前述からわかるように、現在user1とuser2がbasic認証の対象になっていて、公開dirにアクセス
できることを確認した。ここでuser2をその対象から外し、アクセス拒否にする。

Webサーバ側で次のコマンドを叩く

```
[root@sv html]# cat /etc/httpd/conf/.htpasswd 
user1:$apr1$sch8AOCc$EX/GhxyrrUm6L3e2A9lme/
user2:$apr1$26ZMc/xM$4QNo/iK53dreeYcXTktR1/
[root@sv html]# htpasswd -D /etc/httpd/conf/.htpasswd user2
Deleting password for user user2
[root@sv html]# cat /etc/httpd/conf/.htpasswd 
user1:$apr1$sch8AOCc$EX/GhxyrrUm6L3e2A9lme/
```

user2が.htpasswdファイルから抹消されたことを確認。

CLで動作確認

user2のIDで認証されないことを確認↓
![スクリーンショット 2022-12-12 024252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/d4f27277-c559-106f-54e1-f2c9f10ce0d9.png)

user1では問題なくログインできた。

`httpd.conf`に認証設定を追記する方法でのBasic認証は以上。

次に、外部設定ファイル`.htaccess`の利用してのBasic認証に進む

## 外部設定ファイル`.htaccess`の利用してのBasic認証

別のファイルに認証情報を登録しておいて、それをメインのファイルで読む込むというやり方。

①公開ディレクトリの配下に`.htaccess`ファイルを作成する。

```:/var/www/html/
[root@sv html]# vim private/.htaccess
  1 AuthType Basic
  2 AuthName "Please type your ID and PW (Basic):"
  3 AuthUserFile /etc/httpd/conf/.htpasswd
  4 Require valid-user
```

記載内容自体は先ほど設定ファイルの文末に書いた内容を同じですね。
ただ外部ファイルに今回が記載しただけの違いです。

②メインの設定ファイル/etc/httpd/conf/httpd.conf への追記

前述の方法の最終行に追記した設定を#でコメントアウト

```
361 ##########   Basic Authetication    ########## 
362 ###<Directory "/var/www/html/private">
363 ###AuthType Basic
364 ###AuthName "Please enter your ID and PW"
365 ###AuthUserFile /etc/httpd/conf/.htpasswd
366 ###require valid-user
367 ###</Directory>
368 ##########   Basic Authetication    ########## 
369 
370 <Directory "/var/www/html/private">
371 AllowOverride AuthConfig  ←外部ファイル.htaccessファイルの内容を読み込みますよって意味
372 </Directory>
```

保存して構文チェックし、デーモン再起動

```
[root@sv html]# apachectl configtest
Syntax OK
[root@sv html]# systemctl restart httpd
[root@sv html]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running)
```
CL側で動作確認
割愛

以上、Basic認証を使ってのアクセス制御でした

実務ではどちらでBasic認証設定するんでしょうね。
今の所、メインの設定ファイルに余計な情報記述して無駄に長くしたくないので
私なら2番目に説明した外部設定ファイル.htaccessの利用した設定をするかなと思います。