Nginxで.htpasswdで認証設定をしてみました


- 私は韓国人として、日本語の勉強とコンピュータの勉強を同時に行うために、ここに文章を書きます
- 翻訳機の助けを借りて書かれた文章なので、誤りがあるかもしれません
## はじめに

現在のプロジェクトで簡単なモニタリングツールとしてNetdataを導入することに決定しましたが、ポート19999が外部に公開される問題がありました。これを解決するために、.htpasswdファイルを使用してNginxを介してNetdataへのアクセスを制限する方法を適用しました。この方法で、認証されたユーザーのみがNetdataダッシュボードにアクセスできるように設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/46e80961-bb3a-8de5-58b4-8cc710bfddfb.png)

---

## 導入方法

### apache2-utilsパッケージのインストール
```
sudo apt update
sudo apt install apache2-utils
```
まず、Netdataダッシュボードへのアクセスを制限するために.htpasswdファイルを作成する必要があります。そのためには、apache2-utilsパッケージをインストールする必要があります。

### htpasswdの使用方法

```
htpasswd -c .htpasswd {id}
```

任意の場所に任意の名前でhtpasswdコマンドを使用してファイルを作成します。


[htpasswdコマンドの参考](https://manpages.ubuntu.com/manpages/bionic/man1/htpasswd.1.html)
[Apacheドキュメント](https://httpd.apache.org/docs/trunk/en/programs/htpasswd.html)

:::note info
htpasswdとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/a778c835-cff8-2b94-4a07-e9b88a52d69c.png)
- htpasswdは、HTTPユーザーの基本認証のために、ユーザー名とパスワードを保存するプレーンテキストファイルを作成および更新するツールです
- パスワードはbcrypt、MD5、SHA-1、またはシステムのcrypt()関数を使用して暗号化されます。このツールは、プレーンテキストファイルでのみユーザー名とパスワードを管理し、ファイルにアクセスできない場合はエラーを返します
```
cat .htpasswd
{id}:$apr1$6z/mxy4D$LIQF3E6UluYUZunNnMQd00
```
- 次のような形式で保存されます
:::

### Nginx設定を通じて認証を適用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/d077a701-4953-a50e-f409-af89793b5920.png)


```diff
 nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - certbot_conf:/etc/letsencrypt
      - certbot_www:/var/www/certbot
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
+     - ./.htpasswd:/etc/nginx/.htpasswd:ro
    environment:
      - TZ=Asia/Seoul
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
    networks:
      - hubo-network
```

現在、.htpasswdファイルを生成したパスに合わせて、Docker Composeファイルでそのファイルをnginxコンテナにマッピングするために、コンテナ内部の/etc/nginx/.htpasswdパスに読み取り専用でマッピングされるように設定しました。

```
	location /netdata/ {
    		auth_basic "Administrator's Area";
    		auth_basic_user_file /etc/nginx/.htpasswd;
    		proxy_pass http://hubo-netdata:19999/;
    		proxy_set_header Host $host;
    		proxy_set_header X-Forwarded-Host $host;
    		proxy_set_header X-Forwarded-Server $host;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		proxy_http_version 1.1;
    		proxy_pass_request_headers on;
    		proxy_set_header Connection "keep-alive";
 	   	proxy_store off;
	}
 ```

 Nginx設定ファイルを通じてNetdataダッシュボードへのアクセスを保護するために基本認証を追加し、/netdata/パスへのリクエストをNetdataサービスにプロキシして転送するようにしました。

 ### 適用

 ```
 docker compose up -d --no-deps --force-recreate nginx
```

適用のためにコンテナを再作成しました。

:::note warn
**なぜdocker restartコマンドを使用しないのですか？**
docker restartは既存のコンテナを停止して再起動するだけなので、コンテナの設定やファイルシステムに対する変更が適用されません。
:::

コンテナが起動したら、正しくマッピングされているか確認します。
```
docker exec -it hubo-nginx-1 sh -c "cat /etc/nginx/.htpasswd"
```

```
{id}:$apr1$6z/mxy4D$LIQF3E6UluYUZunNnMQd00
```

次のようにコンテナ内にコピーされた/etc/nginx/.htpasswdを開いて、IDとパスワード（暗号化されたもの）を確認できれば成功です。

## 確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815412/9e50a78e-e1bd-f4a9-3087-9c2dbf242359.png)

**success**