いまさらながらcentOS7.2でベーシック認証を設定する

#環境
**プラットフォーム**
さくらのクラウド
CPU：2core　Memory：2GB
ストレージ：SSD20GB

**OS**

```:/etc/redhat-release                                                                                          
CentOS Linux release 7.2.1511 (Core) 
version 7.0.6
```

**Apache**

```
# httpd -v
Server version: Apache/2.4.6 (CentOS)
```

#準備

Apacheをインストール

```
# yum install -y httpd
```

Apacheを起動

```
# systemctl start httpd.service
# systemctl enable httpd.service
```

ベーシック認証を設定するディレクティブ **Authtype** が使用できるコンテキストは**ディレクトリ(Directory)**と**外部設定ファイル**でしたので、その２パターンで設定してみたいと思います。

####ドキュメントルート

```:/etc/httpd/conf.d/httpd.conf
DocumentRoot "/var/www/html"
```





####外部設定ファイルでのディレクティブ許可設定
デフォルトだと***/var/www/html/***ディレクトリには3箇所、**AllowOverride none**の設定でしてありました。ディレクティブタイプをピンポイントで指定できますが、面倒なので**all**(すべてのディレクティブを許可)に設定してます。

103行目

```:/etc/httpd/conf.d/httpd.conf
<Directory />
    AllowOverride all                                                                                                                 
    Require all denied
</Directory>
```

125行目

```:/etc/httpd/conf.d/httpd.conf
<Directory "/var/www">
   AllowOverride all
   # Allow open access:
   Require all granted
</Directory>
```

151行目

```:/etc/httpd/conf.d/httpd.conf
 AllowOverride all
```

#**外部設定ファイル（.htaccess）**での設定

認証に使うユーザ情報のファイルを作成

```:/var/www/html/
# htpasswd -c /var/www/html/.htpasswd basictestuser
New password: 
Re-type new password: 
Adding password for user basictestuser
```

外部設定ファイルを作成。
外部設定ファイルが置いてあるカレントディレクトリ以下がベーシック認証の対象となります。外部設定ファイル名は**AccessFileName**ディレクティブで設定できます。何も設定していない場合は、デフォルトで**.htaccess**になります。

```:/var/www/html/
# vi .htaccess
```



```:/var/www/html/.htaccess
AuthType basic
AuthName "Auth"
AuthUserFile /var/www/html/.htpasswd
Require valid-user
```


各ディレクティブの役割

|ディレクティブ|役割|
|:---|:---|:---|
|AuthType|認証の種類。ベーシック認証はBasic、ダイジェスト認証はDigest。|
|AuthName|認証の領域の名前（なんでもOK）|
|AuthUserFile|認証に使うユーザ情報のファイル|
|Require|ベーシック認証された中で、どのユーザがアクセスできるか指定|


HTTPリクエストでテストします。

```html:
# curl http://59.106.222.210/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>
```

IDとパスワードを指定していないので、401Unauthorizedが返ってきてます。
ブラウザでアクセスして確認してみてください。

#**ディレクトリ（Directory）**での設定
認証に使うユーザ情報のファイルを作成

```:/etc/httpd/conf.d/
# htpasswd -c /etc/httpd/conf/htpasswd basictestuser
```

設定ファイルを作成

```:/etc/httpd/conf.d/
# vi basic_auth.conf
```

**Directory**でベーシック認証をかけたいディレクトリを指定します。
指定したディレクトリ以下がベーシック認証の対象となります。

```:/etc/httpd/conf.d/basic_auth.conf
<Directory /var/www/html/>
    AuthType basic
    AuthName "Auth"
    AuthUserFile /etc/httpd/conf/.htpasswd
    Require valid-user
</Directory>
```

設定ファイルをhttpdに読み込むため再起動

```:/etc/httpd/conf.d/
# systemctl restart httpd.service
```

HTTPリクエストでテスト。

```html:
# curl http://59.106.222.210/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>
```

.htaccessの場合と同じく401Unauthorizedが返ってきてます。

#IPアドレスでのアクセス制限
特定のIPアドレスからのアクセスを許可、拒否することができます。
先ほどの設定ファイルに追記します。（.htaccessに記述しても同様の効果がでます）

```:/etc/httpd/conf.d/basic_auth.conf
<Directory /var/www/html/>
    AuthType basic
    AuthName "Auth"
    AuthUserFile /etc/httpd/conf/.htpasswd
    Require valid-user
    Allow from 192.168.0.1
    Deny from all
    Order Deny,Allow
    Satisfy all
</Directory>
```


各ディレクティブの役割

|ディレクティブ|役割|
|:---|:---|:---|
|Allow|アクセスを許可するホスト(IP)|
|Deny|アクセスを拒否するホスト(IP)|
|Order|AllowとDenyの評価される順番|
|Satisfy|AuthTypeとAllow,Denyが指定されている時のアクセスポリシー|

**Allow**と**Deny**で許可、拒否の設定をします。

**Order**ディレクティブでは**Allow**と**Deny**の評価される順番を指定できます。
>例）
>**Order Deny,Allow**
>→**Deny**されないIPと**Allow**されたIPを許可。それ以外は拒否。

>**Order Allow,Deny**
>→**Allow**されないIPと**Deny**されたIPを拒否。それ以外は許可。


**Satisfy**ディレクティブでは**ベーシック認証**と**IPアドレスでのアクセス制限**が設定されている場合のアクセス設定を指定します。
>例）
>**Satisfy Any**
>→**Allow**と**Require**のどちらかを満たせば許可。

>**Satisfy all**
>→**Allow**と**Require**の両方を満たせば許可。

設定ファイルをhttpdに読み込むため再起動

```:/etc/httpd/conf.d/
# systemctl restart httpd.service
```