クラウドで簡単画像アノテーション ～vol.2 Apache2を使ってCVATにHTTPS通信を実装しよう！ 

## はじめに

こんにちは、京セラコミュニケーションシステム 寳来（ほうらい）（@kccs_teruya-horai）です。
vol.1では  Google Cloud のVMインスタンスに画像アノテーションツールである CVAT を構築し接続する方法をご紹介しました。

vol.2となる本記事では、vol.1で構築したVMインスタンスへの証明書と鍵の適用によるSSL化、およびリバースプロキシ機能の有効化によって、__HTTPS通信を用いた CVAT への接続__ を可能にする方法をご紹介いたします。
vol.1までの環境と違い暗号化を施した通信を行うことができるようになるので、より __セキュアなアノテーション環境を構築__ することができます。

:::note warn
本記事は 2024 年 2 月ごろに作成しております。
よって、引用している文章などはこの時点での最新となります。ご了承ください。
:::

## 連載記事一覧
[クラウドで簡単画像アノテーション ～vol.1 Google Compute EngineにCVATを構築しよう！](https://qiita.com/kccs_teruya-horai/items/f849e5f5a461e1ade36a "クラウドで簡単画像アノテーション ～vol.1 Google Compute EngineにCVATを構築しよう！")
クラウドで簡単画像アノテーション ～vol.2 Apacheを使ってCVATにHTTPS通信を実装しよう！  　<font color="Tomato">★本記事★</font>

## 完成イメージ

VMインスタンスに __Apache2__ をインストールし、__SSL__ 化と __リバースプロキシ__ 機能を使ってCVATへの __HTTPS通信接続__ を実装します。

まず、CVATを構築したVMインスタンスにApacheをインストールします。次に、設定ファイルを用いてApacheにサーバー証明書ファイル、中間CA証明書ファイル、秘密鍵ファイルの3つを適用することでSSL化を行います。さらにリバースプロキシ機能も使用して、443ポートへのリクエストをCVATのために開かれている8080ポートへ転送するように設定を行います。

以上を完了させてから証明書に紐づいたドメインへアクセスすると、HTTPS通信でCVATへのアクセスが行われるようになります。

![概要図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/f8d813e0-056f-a177-7303-4ba46159e45f.png)

## この記事の対象者

- クラウド上に構築したCVATに対して、セキュアな通信で接続したい方
- Apacheを用いたSSLの適用とリバースプロキシの実装方法にお悩みの方

## 手順の説明に入る前に… 
HTTPS通信実装の手順の説明へと入る前に、今回の記事で重要となる2つの技術である __SSL__ と __リバースプロキシ__ について簡単にですが解説いたします。

### SSLって何？

SSLとは(Secure Socket Layer)とは、インターネット上でのデータの送受信を暗号化するための仕組みです。暗号化によって悪意のある第三者による通信の盗聴やなりすましを防ぐことができます。WEBブラウザからSSLを使ったサイトに接続すると、アドレスの冒頭は http://… ではなく __https://…__ となります。
さらにSSLには、認証局より発行された電子証明書を使ってそのウェブサイトが信用に足るものであるとアクセス者に証明する機能もあります。

本記事ではApache2に電子証明書と秘密鍵を適用することでSSL化を行います。

### リバースプロキシって何？

リバースプロキシとは、クライアントからのリクエストを各サーバーへ転送するためのサーバーのことを指します。通信のセキュリティやパフォーマンス、信頼性の向上のために用いられます。

本記事では、インスタンスの443ポートで受信するブラウザからのHTTPSによるリクエストを、リバースプロキシによってCVATの8080ポートへ転送します。

## 用意するもの

実装に先立って各自でご用意していただく4つのものをご説明します。

#### 1. ドメイン

Webサイトがどこにあるかを人が判断しやすくするための情報で、インターネット上の住所のようなものです。「0.0.0.0」のような数字だけで構成されるIPアドレスではわかりづらいので、一般的なサイトではIPアドレスと紐づけられたドメイン名でアクセスを行います。たとえば、Qiitaのドメインは `qiita.com` となります。

今回は、構築したVMインスタンスの外部IPアドレスに紐づいたドメインの取得を事前に行っています。

#### 2. サーバー証明書ファイル

認証局によって発行されるもので、SSL/TLSサーバー証明書とも呼びます。証明書に紐づいたドメインが安全であるという証明を行うファイルです。
これをVMインスタンス内へアップロードしておいてください。

なお、本記事ではこのサーバー証明書ファイルを `my_SSL_Certificate_File.crt` と定義しています。

#### 3. 中間CA証明書ファイル

サーバー証明書を発行している認証局自体に対する証明書です。認証局が信頼に足ると証明する `.crt` ファイルです。
こちらのファイルもVMインスタンスへアップロードをお願いします。

本記事では `my_SSL_Certificate_Chain_File.crt` と定義しています。

#### 4. 秘密鍵ファイル

サイト証明書の中に含まれている公開鍵と対になるもので、安全な通信を行うために使用される鍵です。
このファイルもアップロードしてください。

本記事ではこの鍵を `my_SSL_Certificate_Key_File.key` と定義しています。

## CVATにHTTPS通信を実装しよう
### Apache の構築
リバースプロキシ機能とSSL化の実装のために、Webサーバとして一般的に使われている Apache の構築を行っていきます。

[前回の記事](https://qiita.com/kccs_teruya-horai/items/f849e5f5a461e1ade36a)を参考にCVATを構築したVMインスタンスにSSH接続を行い、コンソールを呼び出してコマンドを入力します。

Apacheをインストールします。

```
$ sudo apt update
$ sudo apt install apache2
```

Apacheのプロキシ機能とhttpでのプロキシ機能を有効化するために、以下のコマンドを実行します。
```
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
```

Apacheでヘッダーを編集する機能を有効化します。
```
$ sudo a2enmod headers
```

Apacheの自動転送機能を有効化します。
```
$ sudo a2enmod rewrite
```

変更した設定を反映するために、Apacheを再起動します。
```
$ sudo systemctl restart apache2
```

VMインスタンスの外部IPアドレスをブラウザに入力してアクセスし以下のような画面が表示されたら、Apache の構築は成功です。

![apache_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/d669cc30-977d-74cc-f413-6956b644cdbb.png)


### SSL化とリバースプロキシの実装

構築した Apache を使って、SSL化とリバースプロキシを実装します。

事前に準備した __サーバー証明書ファイル__ 、 __中間CA証明書ファイル__ 、 __秘密鍵ファイル__ を、VMインスタス上の分かりやすい場所にアップロードしてください。

次に、ApacheでSSL化とリバースプロキシを行うための設定ファイルを`/etc/apache2/sites-enabled/`の下に作成します。ファイル名は`cvat-ssl-reverseproxy.conf`とします。

```
$ vi /etc/apache2/sites-enabled/cvat-ssl-reverseproxy.conf
```

コマンドライン内でテキストエディタが立ち上がりますので、以下の内容を入力して保存します。__ドメイン名__ `ServerName`、__サーバー証明書ファイルのパス__ `SSLCertificateFile`、__秘密鍵ファイルのパス__ `SSLCertificateKeyFile` __中間CA証明書ファイルのパス__ `SSLCertificateChainFile` 、以上4つの項目の内容をお手元の環境に合わせて __書き換え__ てください。 

```conf
<VirtualHost *:443>
    ServerName domain-example-cvat-ssl-reverseproxy.jp
    SSLEngine on
    SSLCertificateFile /home/teruya_horai/myfiles/my_SSL_Certificate_File.crt
    SSLCertificateKeyFile /home/teruya_horai/myfiles/my_SSL_Certificate_Key_File.key
    SSLCertificateChainFile /home/teruya_horai/myfiles/my_SSL_Certificate_Chain_File.crt
    ProxyRequests Off
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    <Proxy *>
        Allow from all
    </Proxy>
</VirtualHost>
```

変更した設定を反映させるために、Apacheを再起動します。
```
$ sudo systemctl restart apache2
```

以上でApacheでのSSL化とリバースプロキシを行うためのセットアップは完了です。

### HTTPS通信でCVATにアクセスしてみよう

それでは、CVATを立ち上げてHTTPS通信で接続してみましょう。

Apacheのconfファイルではlocalhostの8080ポートへ転送するように設定しましたので、CVATへのアクセスに使用するアドレスを指定する環境変数 `CVAT_HOST` もlocalhostに設定します。

```:
$ export CVAT_HOST=localhost
```

CVAT をダウンロードしたディレクトリに移動し、コンテナを起動します。
```
docker compose up -d
```

ドメインをブラウザに入力してアクセスし、__保護された接続__ でCVATが表示されればHTTPS通信の実装は成功です！
お疲れ様でした！

![cvat_https.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641067/f68197f9-bac4-d68b-a695-bcb224d81cbf.png)

## まとめ

いかがでしたでしょうか？
本記事では構築した CVAT 用のインスタンスにSSLとリバースプロキシを適用することでHTTPS通信を可能にする方法をご紹介いたしました。

弊社では他にもデジタルトランスフォーメーション(DX)に関する様々な技術情報をご紹介しております。もし今回の記事が参考になった方は、ぜひ[他の記事](https://qiita.com/organizations/kccs-digital-solution)もご覧ください！


## おしらせ

弊社X（旧：Twitter）では、Qiita投稿に関する情報や各種セミナー情報をお届けしております。情報収集や学びの場を求める皆さん！ぜひフォローしていただき、最新情報を手に入れてください:grinning:

https://x.com/kccs_digital