apache Basic認証を検証してみた

# はじめに
実務でapache Basic認証が出てきたため、イメージが付かないため検証してみることにしました。

Basic認証とは基本認証と呼ばれていてパスワードが暗号化されない認証です。

以下の記事を参考にしました。
https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/698apachebasic.html

LPICレベル2 小豆本を参考にしました。
「Linux教科書 LPICレベル2 Version 4.5対応」
https://amzn.asia/d/iz08jei

# 構築手順
### VPCを作成する

サービス >> VPC >> 左ペインのお使いのVPCを選択して、「VPCを作成」をクリックする

基本的にはデフォルトVPCがありますが誤って削除した場合は再度作成されることはありません。
以下の手順で新規にVPCを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/4cafc0e7-5805-35cd-1f24-73207ff38fad.png)

VPC作成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/fb866bf4-4838-a028-62d2-b064f2f84ca1.png)

### EC2を作成する

サービス >> EC2 >> 左ペインのインスタンスを選択する
t2.microで作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/bbca555d-e8b3-e1b7-9011-fa9121157baf.png)


### セキュリティグループを作成する

インバウンドは自分のホストからしかアクセスしないため、MyIPでapacheのため80ポートとSSH接続を許可しました。
※今回443ポートは使用しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/d6ba8a55-d7c8-9d50-9ee8-e87360e7154b.png)

**EC2のサブネットのルートテーブルにインターネットゲートウェイのルートが入っていない場合は
SSH接続できません。注意してください**

## apacheのインストール
rootに昇格する
```
$ sudo su -
```
apacheのインストールを行う
```
# yum install httpd
```
apacheのインストール後、以下が出力されたらOKです。
```
Installed:
  httpd.x86_64 0:2.4.57-1.amzn2

Dependency Installed:
  apr.x86_64 0:1.7.2-1.amzn2                      apr-util.x86_64 0:1.6.3-1.amzn2.0.1        apr-util-bdb.x86_64 0:1.6.3-1.amzn2.0.1        generic-logos-httpd.noarch 0:18.0.0-4.amzn2
  httpd-filesystem.noarch 0:2.4.57-1.amzn2        httpd-tools.x86_64 0:2.4.57-1.amzn2        mailcap.noarch 0:2.1.41-2.amzn2                mod_http2.x86_64 0:1.15.19-1.amzn2.0.1

Complete!
```
## apacheサービスを起動しました
```
# systemctl start httpd
```

## apacheサービスを自動起動設定しました
```
# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
```
## apacheサービスを状態を確認しました
```
# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-05-19 23:50:44 UTC; 2min 39s ago
     Docs: man:httpd.service(8)
 Main PID: 3588 (httpd)
   Status: "Total requests: 2; Idle/Busy workers 100/0;Requests/sec: 0.0126; Bytes served/sec:  10 B/sec"
   CGroup: /system.slice/httpd.service
           tq3588 /usr/sbin/httpd -DFOREGROUND
           tq3589 /usr/sbin/httpd -DFOREGROUND
           tq3590 /usr/sbin/httpd -DFOREGROUND
           tq3591 /usr/sbin/httpd -DFOREGROUND
           tq3592 /usr/sbin/httpd -DFOREGROUND
           tq3593 /usr/sbin/httpd -DFOREGROUND
           mq3656 /usr/sbin/httpd -DFOREGROUND

May 19 23:50:44 ip-10-0-149-64.ap-northeast-1.compute.internal systemd[1]: Starting The Apache HTTP Server...
May 19 23:50:44 ip-10-0-149-64.ap-northeast-1.compute.internal systemd[1]: Started The Apache HTTP Server.
[root@ip-10-0-149-64 ~]#
```
## index.htmlを作成する

Basic認証用のフォルダとそのフォルダ配下にindex.htmlを作成しました。
```
# cd /var/www/html
```
Basic認証のフォルダ作成
```
# mkdir test
# ls -tlr
total 4
-rw-r--r-- 1 root root 183 May 19 23:48 index.html
drwxr-xr-x 2 root root  24 May 20 00:09 test
```
Basic認証のフォルダ配下にindex.htmlを作成する

Hello wordの作成方法は以下のサイトから引用
https://b3s.be-s.co.jp/nocategory/3359/
```
# cd test
[root@ip-10-0-149-64 test]# ls -tlr
total 4
-rw-r--r-- 1 root root 183 May 19 23:48 index.html
[root@ip-10-0-149-64 test]#
[root@ip-10-0-149-64 test]#
[root@ip-10-0-149-64 test]# cat index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
      <title>テスト</title>
  </head>
  <body>
    <h1>Hello World!!</h1>
  </body>
</html>>
  </body>
</html>
```

## apache 設定ファイルにBasic認証を入れる

apacheの設定ファイルのバックアップを取得する
```
# cd /etc/httpd/conf/
# cp -p httpd.conf httpd.confbk
```

apache 設定ファイルにBasic認証を追記しました。

```
# vi httpd.conf

161行目～168行目に追加
161 <Directory "/var/www/html/test">
162
163    AuthType Basic
164    AuthName "Please Enter Your ID and Password"
165    AuthUserFile /etc/httpd/conf/htpasswd
166    Require valid-user
167
168 </Directory>
```

左側が設定ファイル　右側が変更前の設定ファイルです。
```
# sdiff -s httpd.conf httpd.confbk

                                                              <
                                                              <
                                                              <
<Directory "/var/www/html/test">                              <
                                                              <
   AuthType Basic                                             <
   AuthName "Please Enter Your ID and Password"               <
   AuthUserFile /etc/httpd/conf/htpasswd                      <
   Require valid-user                                         <
                                                              <
</Directory>                                                  <                                                              
```
## ユーザーアカウント登録

以下のコマンドでBasic認証のユーザーを作成されます。
/etc/httpd/conf/htpasswdファイルも新規に作成されます。

**「/etc/httpd/conf/htpasswd」が既に現行サーバーに存在する場合は
ユーザー追加前に念のため、バックアップを取っておいた方が良さそうです。**
```
# htpasswd -c /etc/httpd/conf/htpasswd test
New password:
Re-type new password:
Adding password for user test
```
アカウントが作成されました。パスワードは暗号化されています。
```
# cat /etc/httpd/conf/htpasswd
test:$apr1$0ZfL72is$0meCXhfZKBKzEiKX18M580
```


**-cを付けるとhtpasswdが新規に作成され過去設定したユーザーが消えてしまいます。注意してください**
既存のユーザーの場合はパスワードが変更できます。

以下は既存のhtpasswdファイルに対してtest2ユーザーを新規に登録した場合です。
※パスワード変更する際も以下のコマンドを使用します。
```
# htpasswd  /etc/httpd/conf/htpasswd test2
New password:
Re-type new password:
Adding password for user test2
```
test2ユーザーが追加されました。
```
# cat /etc/httpd/conf/htpasswd
test:$apr1$0ZfL72is$0meCXhfZKBKzEiKX18M580
test2:$apr1$6zTl2wXa$wmng9A66R9e6YxWXWYAfS/
```

## htpasswdの権限変更
```
# cd /etc/httpd/conf
# chown apache:apache htpasswd
```

## ブラウザにアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/ab058558-23af-9f34-a08a-cd55e61b1e85.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/3b736516-6050-5858-5da3-c73481f7c948.png)