EC2上のApacheでBASIC認証をやってみる[.htaccess]


20160127加筆修正

AWS環境上のWEBサイトにBASIC認証をつけてみました。
キーワード [ AWS Apache BASIC認証 .htaccess .htpasswd ]

###0.目標
WEBサイトのページにユーザー/パスワードでアクセス認証を付けたいことってあるかと思います。
今回はApacheのルートディレクトリ配下に認証をつけていこうと思います。

---

###1.準備
Apacheの設定までみていきます。

####セキュリティグループ

|プロトコル|ポート|ソース|
|:------|:------|:------|
|TCP|22|0.0.0.0/0|
|TCP|80|0.0.0.0/0|

---
###2.Apacheのインストールとhttpd.confの編集

```bash:Apacheのインストール
sudo yum update -y
sudo yum install httpd -y
sudo chkconfig httpd on
```
EC2にApache（httpd）をインストールします。
インストールが完了したら、Apacheの設定ファイル（/etc/httpd/conf/httpd.conf）を編集します
今回はApacheのルートディレクトリを（/var/www/html）から（/var/www/html/sample）に変更します。

```bash:httpd.conf置換用変数
MAKE_DIR="/var/www/html/sample"
ORG_DOCUMENT_ROOT="\/var\/www\/html"
CHANGE_DOCUMENT_ROOT="\/var\/www\/\html\/sample"
ORG_DIRECTORY_INDEX="DirectoryIndex index.html index.html.var"
CHANGE_DIRECTORY_INDEX="DirectoryIndex index.html index.html.var index.php"
AUTH_USER_FILE="/var/www/html/.htpasswd"
EXCLUSEION_PASS="/elb-test.txt"
SET_ENV_NAME="healthcheck"
```

```bash:httpd.conf
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
sudo sed -i -e "/^DocumentRoot/s/$ORG_DOCUMENT_ROOT/$CHANGE_DOCUMENT_ROOT/g" /etc/httpd/conf/httpd.conf
sudo sed -i -e "/^DirectoryIndex/s/$ORG_DIRECTORY_INDEX/$CHANGE_DIRECTORY_INDEX/g" /etc/httpd/conf/httpd.conf

cat << EOF >> /etc/httpd/conf/httpd.conf
<Location />
        AllowOverride all
        Satisfy Any
 
        AuthType Basic
        AuthName "Login"
        AuthUserFile ${AUTH_USER_FILE}
        Require valid-user
 
        SetEnvIf Request_URI "${EXCLUSEION_PASS}" ${SET_ENV_NAME}
        Order Deny,Allow
        Deny from all
        Allow from env=${SET_ENV_NAME}
</Location>
EOF

sudo mkdir ${MAKE_DIR}
```
catで書き込む際ですが、sudo su でrootにスイッチしたのち、変数を設定し、cat以下をコピペすれば使えます。

---
###3. .htaccess .htpasswd の作成と編集
/var/www/html/.htaccessを作成します。


```bash:.htaccess/.htpasswd用変数
AUTH_USER_CONF_FILE="/var/www/html/.htaccess"
USER_NAME="user01"
USER_PASSWD="user01-passwd"
HTPASSWD_PATH="/var/www/html/.htpasswd"
```
USER_NAME：認証用のユーザー
USER_PASSWD：パスワード


```bash:.htaccess/.htpasswd
sudo su

touch ${AUTH_USER_CONF_FILE}
chmod 604 ${AUTH_USER_CONF_FILE}
cat << EOF >> /var/www/html/.htaccess
AuthUserfile ${AUTH_USER_CONF_FILE}
AuthGroupfile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
EOF

htpasswd -c -b ${HTPASSWD_PATH} ${USER_NAME} ${USER_PASSWD}
chmod 604 ${HTPASSWD_PATH}
```
rootになってから変数を指定してください。

---
###4.テスト

```sudo service httpd start```
Apacheを起動してEC2のパブリックIPにアクセスしてください。
認証画面が出てきて設定したユーザー名、パスワードでサンプルページへログインができるはずです。

---
###5.ELBヘルスチェック用ページ作成とBLBへのインスタンス登録

```bash:elbヘルスチェック作成用変数(設定したものと同じものを使ってください)
ELB_PATH="${MAKE_DIR}${EXCLUSEION_PASS}"
```
```bash:elb用ヘルスチェックページ作成
sudo touch ${ELB_PATH}
```

ELBを作成してください。

![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/52141/6cd1200e-9ab1-d2a7-027f-34eddfd13fff.png "EC2_Management_Console.png")

ヘルスチェックのところで指定すれば完了です。

---
###参考
http://dev.classmethod.jp/cloud/elb-exclude-health-check-url/
http://qiita.com/yuwaita/items/e406c645ae8d0cc3c3fa
　
　　
　　　
　　　
　　　
　　　
　　　
---
###おまけ
下記スクリプトを作成して実行権限を付与し、実行すれば一気に作成できます。

```sh:basic.sh
#!/bin/bash
MAKE_DIR="/var/www/html/sample"
ORG_DOCUMENT_ROOT="\/var\/www\/html"
CHANGE_DOCUMENT_ROOT="\/var\/www\/\html\/sample"
ORG_DIRECTORY_INDEX="DirectoryIndex index.html index.html.var"
CHANGE_DIRECTORY_INDEX="DirectoryIndex index.html index.html.var index.php"
AUTH_USER_FILE="/var/www/html/.htpasswd"
EXCLUSEION_PASS="/elb-test.txt"
SET_ENV_NAME="healthcheck"
AUTH_USER_CONF_FILE="/var/www/html/.htaccess"
USER_NAME="user01"
USER_PASSWD="user01-passwd"
HTPASSWD_PATH="/var/www/html/.htpasswd"
ELB_PATH="${MAKE_DIR}${EXCLUSEION_PASS}"

sudo yum update -y
sudo yum install httpd -y
sudo chkconfig httpd on

sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
sudo sed -i -e "/^DocumentRoot/s/$ORG_DOCUMENT_ROOT/$CHANGE_DOCUMENT_ROOT/g" /etc/httpd/conf/httpd.conf
sudo sed -i -e "/^DirectoryIndex/s/$ORG_DIRECTORY_INDEX/$CHANGE_DIRECTORY_INDEX/g" /etc/httpd/conf/httpd.conf

sudo sh -c "cat << EOF >> /etc/httpd/conf/httpd.conf
# <Location>
<Location />
        AllowOverride all
        Satisfy Any
 
        AuthType Basic
        AuthName \"Login\"
        AuthUserFile ${AUTH_USER_FILE}
        Require valid-user
 
        SetEnvIf Request_URI \"${EXCLUSEION_PASS}\" ${SET_ENV_NAME}
        Order Deny,Allow
        Deny from all
        Allow from env=${SET_ENV_NAME}
</Location>
EOF"

sudo mkdir ${MAKE_DIR}

sudo touch ${AUTH_USER_CONF_FILE}

sudo sh -c "cat << EOF >> ${AUTH_USER_CONF_FILE}

AuthUserfile ${AUTH_USER_CONF_FILE}
AuthGroupfile /dev/null
AuthName \"Please enter your ID and password\"
AuthType Basic
require valid-user

EOF"

sudo chmod 604 ${AUTH_USER_CONF_FILE}

sudo htpasswd -c -b ${HTPASSWD_PATH} ${USER_NAME} ${USER_PASSWD}
sudo chmod 604 ${HTPASSWD_PATH}
sudo touch ${ELB_PATH}
sudo service httpd start
```


---
####修正

httpd.conf内に

```
        AllowOverride all
        AuthType Basic
        AuthName \"Login\"
        AuthUserFile ${AUTH_USER_FILE}
        Require valid-user
```
このように設定を書き加えるよりも、conf内は```AllowOverride all```のみにし、__.htaccess__ファイルにて管理をしたほうがよさ気。

参考：バーチャルホストを使用している場合

```apache:httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www/exampleDoc
ServerName www.example.dns
  <Directory "/www/exampleDoc">
    AllowOverride all
  </Directory>
</VirtualHost>
```

このようにして指定ディレクトリで.htaccessを読み込むようにし（AllowOverride all）.htaccess内で設定を書く。（先に書いている内容で良い）