

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AL2 チュートリアル
<a name="al2-tutorials"></a>

 以下のチュートリアルでは、AL2 を実行する Amazon EC2 インスタンスを使用して一般的なタスクを実行する方法を示します。動画チュートリアルについては、[AWS の講習動画とラボ](https://www.aws.training/)を参照してください。

AL2023 の手順については、[「Amazon Linux 2023 ユーザーガイド」の「チュートリアル](https://docs.aws.amazon.com/linux/al2023/ug/tutorials-al2023.html)」を参照してください。 **

**Topics**
+ [チュートリアル: AL2 に LAMP サーバーをインストールする](ec2-lamp-amazon-linux-2.md)
+ [チュートリアル: AL2 で SSL/TLS を設定する](SSL-on-amazon-linux-2.md)
+ [チュートリアル: AL2 で WordPress ブログをホストする](hosting-wordpress.md)

# チュートリアル: AL2 に LAMP サーバーをインストールする
<a name="ec2-lamp-amazon-linux-2"></a>

次の手順は、PHP と [MariaDB](https://mariadb.org/about/) (MySQL のコミュニティ開発フォーク) をサポートする Apache ウェブサーバーを AL2 インスタンス (LAMP ウェブサーバーまたは LAMP スタックと呼ばれることもあります) にインストールするのに役立ちます。このサーバーを使用して静的ウェブサイトをホストしたり、データベースとの情報の読み取りと書き込みを行う動的な PHP アプリケーションをデプロイしたりできます。

**重要**  
Ubuntu や Red Hat Enterprise Linux などの別のディストリビューションに LAMP ウェブサーバーを設定しようとすると、このチュートリアルの通りにはなりません。AL2023 については、[AL2023 に LAMP サーバーをインストールする](https://docs.aws.amazon.com//linux/al2023/ug/ec2-lamp-amazon-linux-2023.html)」を参照してください。Ubuntu については、Ubuntu コミュニティドキュメントの [ApacheMySQLPHP](https://help.ubuntu.com/community/ApacheMySQLPHP) を参照してください。その他のディストリビューションについては、それぞれのドキュメントを参照してください。

**オプション: オートメーション を使用してこのチュートリアルを完了する**  
以下のタスクの代わりに AWS Systems Manager Automation を使用してこのチュートリアルを完了するには、[AWS Docs-InstallALAMPServer-AL2 Automation ](https://console.aws.amazon.com/systems-manager/automation/execute/AWSDocs-InstallALAMPServer-AL2)ドキュメントを実行します。

**Topics**
+ [ステップ 1: LAMP サーバーを準備する](#prepare-lamp-server)
+ [ステップ 2: LAMP サーバーをテストする](#test-lamp-server)
+ [ステップ 3: データベースサーバーをセキュリティで保護する](#secure-mariadb-lamp-server)
+ [ステップ 4: (オプション) phpMyAdmin をインストールする](#install-phpmyadmin-lamp-server)
+ [トラブルシューティング](#lamp-troubleshooting)
+ [関連トピック](#lamp-more-info)

## ステップ 1: LAMP サーバーを準備する
<a name="prepare-lamp-server"></a>

**前提条件**
+ このチュートリアルでは、インターネットからアクセスできるパブリック DNS 名を持つ AL2 を使用して新しいインスタンスを既に起動していることを前提としています。詳細については、*Amazon EC2 ユーザーガイド* の [インスタンスの起動](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html) を参照してください。また、セキュリティグループを設定して、SSH (ポート 22)、HTTP (ポート 80)、HTTPS (ポート 443) 接続を有効にしている必要もあります。これらの前提条件の詳細については、*Amazon EC2 ユーザーガイド*」の[「セキュリティグループルール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html)」を参照してください。
+ 次の手順では、AL2 で利用可能な最新の PHP バージョンをインストールします。現在は です`php8.2`。このチュートリアルで説明されている以外の PHP アプリケーションを使用する場合は、`php8.2` と互換性を確認する必要があります。<a name="install_apache-2"></a>

**LAMP サーバーを準備するには**

1. [インスタンスに接続します](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

1. すべてのソフトウェアパッケージが最新の状態であることを確認するため、インスタンスでソフトウェアの更新を実行します。この処理には数分かかりますが、最新の更新とバグ修正を確実に適用することが重要です。

   `-y` オプションを指定すると、確認メッセージを表示せずに更新をインストールします。インストール前に更新を検査する場合は、このオプションを省略できます。

   ```
   [ec2-user ~]$ sudo yum update -y
   ```

1. `mariadb10.5` Amazon Linux Extras リポジトリをインストールして、MariaDB パッケージの最新バージョンを取得します。

   ```
   [ec2-user ~]$ sudo amazon-linux-extras install mariadb10.5
   ```

   `sudo: amazon-linux-extras: command not found` というエラーが表示された場合、インスタンスは Amazon Linux 2 AMI で起動されていません (おそらく、代わりに Amazon Linux AMI を使用しています)。次のコマンドを使用して、Amazon Linux のバージョンを表示できます。

   ```
   cat /etc/system-release
   ```

1. `php8.2` Amazon Linux Extras リポジトリをインストールして、AL2 のPHPパッケージの最新バージョンを取得します。

   ```
   [ec2-user ~]$ sudo amazon-linux-extras install php8.2
   ```

1. これでインスタンスが最新状態になったので、Apache ウェブサーバー、MariaDB、および PHP ソフトウェアパッケージをインストールできます。yum インストールコマンドを使用すると、複数のソフトウェアパッケージと関連するすべての依存関係を同時にインストールできます。

   ```
   [ec2-user ~]$ sudo yum install -y httpd
   ```

   次のコマンドを使用して、これらのパッケージの現在のバージョンを表示できます。

   ```
   yum info package_name
   ```

1. Apache ウェブサーバーを起動します。

   ```
   [ec2-user ~]$ sudo systemctl start httpd
   ```

1.  **systemctl** コマンドを使用して、システムがブートするたびに Apache ウェブサーバーが起動するように設定します。

   ```
   [ec2-user ~]$ sudo systemctl enable httpd
   ```

   **httpd** が有効であることは、次のコマンドを実行して確認できます。

   ```
   [ec2-user ~]$ sudo systemctl is-enabled httpd
   ```

1. インバウンド HTTP (ポート 80) 接続をインスタンスに許可するセキュリティルールを追加していない場合には、このルールを追加します。デフォルトでは、起動時に [**launch-wizard-*N***] セキュリティグループがインスタンスに設定されます。このグループには SSH 接続を許可する単一のルールが含まれます。

   1. Amazon EC2 コンソール ([https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)) を開きます。

   1. [**インスタンス**] を選択し、該当するインスタンスを選択します。

   1. [**セキュリティ**] タブで、インバウンドルールを表示します。次のルールが表示されます。

      ```
      Port range   Protocol     Source
      22           tcp          0.0.0.0/0
      ```
**警告**  
`0.0.0.0/0` を使用すると、すべての IPv4 アドレスからインスタンスへの、SSH によるアクセスが許可されます。これはテスト環境で短時間なら許容できますが、実稼働環境で行うのは安全ではありません。本番環境では、特定の IP アドレスまたは特定のアドレス範囲にのみ、インスタンスへのアクセスを限定します。

   1. セキュリティグループのリンクを選択します。[「セキュリティグループにルールを追加する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)」の手順を使用して、次の値を持つ新しいインバウンドセキュリティルールを追加します。
      + [**Type**]: HTTP
      + [**Protocol**]: TCP
      + **[Port Range**]: 80
      + [**Source**]: Custom

1. ウェブサーバーをテストします。ウェブブラウザで、インスタンスのパブリック DNS アドレス (またはパブリック IP アドレス) を入力します。`/var/www/html` にコンテンツがない場合、Apache テストページが表示されます。インスタンスのパブリック DNS は、Amazon EC2 コンソールを使用して取得できます ([**Public DNS**] 列を確認します。この列が表示されない場合は、[**Show/Hide Columns**] (歯車型のアイコン) をクリックして、[**Public DNS**] を選択します)。

   インスタンスのセキュリティグループに、ポート 80 での HTTP ラフィックを許可するルールが含まれていることを確認します。詳細については、「[セキュリティグループへのルールの追加](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)」を参照してください。
**重要**  
Amazon Linux を使用していない場合は、それらの接続を許可するようにインスタンスのファイアウォールを設定する必要があるかもしれません。ファイアウォールの設定方法の詳細については、ディストリビューション用のドキュメントを参照してください。  
![\[サーバーのテストでは、Apache テストページが表示されます。\]](http://docs.aws.amazon.com/ja_jp/linux/al2/ug/images/apache_test_page_al2_2.4.png)

Apache **httpd** は、Apache ドキュメントルートと呼ばれるディレクトリに維持されるファイルを提供します。Amazon Linux Apache ドキュメントルートは `/var/www/html` であり、デフォルトでは root によって所有されます。

`ec2-user` アカウントがこのディレクトリで複数のファイルを操作することを許可するには、ディレクトリの所有権とアクセス許可を変更する必要があります。このタスクを行うには、複数の方法があります。このチュートリアルでは、`ec2-user` を `apache` グループに追加し、`apache` ディレクトリの所有権を `/var/www` グループに付与し、グループへの書き込み権限を割り当てます。<a name="setting-file-permissions-2"></a>

**ファイルの許可を設定するには**

1. ユーザー (この場合は `ec2-user`) を `apache` グループに追加します。

   ```
   [ec2-user ~]$ sudo usermod -a -G apache ec2-user
   ```

1. ログアウトし、再度ログインして新しいグループを選択し、メンバーシップを確認します。

   1. ログアウトします (**exit** コマンドを使用するか、ターミナルウィンドウを閉じます)。

      ```
      [ec2-user ~]$ exit
      ```

   1. `apache` グループのメンバーシップを検証するには、インスタンスに再接続して次のコマンドを実行します。

      ```
      [ec2-user ~]$ groups
      ec2-user adm wheel apache systemd-journal
      ```

1. `/var/www` とそのコンテンツのグループ所有権を `apache` グループに変更します。

   ```
   [ec2-user ~]$ sudo chown -R ec2-user:apache /var/www
   ```

1. グループの書き込み許可を追加して、これからのサブディレクトにグループ ID を設定するには、`/var/www` とサブディレクトのディレクトリ許可を変更します。

   ```
   [ec2-user ~]$ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

1. グループ書き込み許可を追加するには、`/var/www` とサブディレクトリのファイル許可を再帰的に変更します。

   ```
   [ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} \;
   ```

ここで、`ec2-user` (および `apache` グループの将来のメンバー) は、Apache ドキュメントルートでファイルを追加、削除、編集できるようになります。したがって、静的ウェブサイトや PHP アプリケーションなどのコンテンツを追加できます。

**ウェブサーバーを保護するには (オプション)**  
HTTP プロトコルを実行するウェブサーバーは、送受信したデータのトランスポートセキュリティを提供しません。ウェブブラウザを使用して HTTP サーバーに接続すると、閲覧した URL、受信したウェブページのコンテンツ、送信した HTML フォームの内容 (パスワードなど) はすべて、ネットワーク経路上のだれでも傍受できるようになります。ウェブサーバーを保護するためのベストプラクティスとして、SSL/TLS 暗号化でデータを保護する HTTPS (HTTP Secure) のサポートをインストールしてください。

サーバーで HTTPS を有効にする方法については、「[チュートリアル: AL2 で SSL/TLS を設定する](SSL-on-amazon-linux-2.md)」を参照してください。

## ステップ 2: LAMP サーバーをテストする
<a name="test-lamp-server"></a>

サーバーがインストールおよび実行されており、ファイルのアクセス許可が正しく設定されている場合、`ec2-user` アカウントは、インターネットから使用できる `/var/www/html` ディレクトリに PHP ファイルを作成できます。

**LAMP サーバーをテストするには**

1. Apache ドキュメントルートで PHP ファイルを作成します。

   ```
   [ec2-user ~]$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
   ```

   このコマンドを実行しようとしたときに「許可が拒否されました」というエラーが表示された場合は、ログアウトし、再度ログインして、[ファイルの許可を設定するには](#setting-file-permissions-2) で設定した正しいグループ許可を取得します。

1. ウェブブラウザで、作成したファイルの URL を入力します。この URL は、インスタンスのパブリック DNS アドレスにスラッシュとファイル名を追加したものです。次に例を示します。

   ```
   http://my.public.dns.amazonaws.com/phpinfo.php
   ```

   PHP 情報ページが表示されるはずです。  
![\[LAMP サーバーのテストでは、PHP 情報ページが表示されます。\]](http://docs.aws.amazon.com/ja_jp/linux/al2/ug/images/phpinfo7.2.10.png)

   このページが表示されない場合は、前のステップで `/var/www/html/phpinfo.php` ファイルが正しく作成されたことを確認します。次のコマンドで、必要なパッケージがすべてインストールされたことを確認することもできます。

   ```
   [ec2-user ~]$ sudo yum list installed httpd mariadb-server php-mysqlnd
   ```

   必要なパッケージのいずれかが出力に表示されていない場合は、**sudo yum install *package*** コマンドを使ってインストールします。また、`php7.2` と `lamp-mariadb10.2-php7.2` のエキストラが **amazon-linux-extras** のコマンド出力で有効になっていることを確認してください。

1. `phpinfo.php` ファイルを削除します。これは有用な情報であることもありますが、セキュリティ上の理由から、インターネット上で公表しないでください。

   ```
   [ec2-user ~]$ rm /var/www/html/phpinfo.php
   ```

これで、完全に機能する LAMP ウェブサーバーを設定しました。`/var/www/html` の Apache ドキュメントルートにコンテンツを追加する場合、そのコンテンツはインスタンスのパブリック DNS アドレスで表示できます。

## ステップ 3: データベースサーバーをセキュリティで保護する
<a name="secure-mariadb-lamp-server"></a>

MariaDB サーバーのデフォルトのインストールには、テストおよび開発に役立ついくつかの機能がありますが、実稼働サーバーでは無効にするか削除する必要があります。**mysql\$1secure\$1installation** コマンドを使用すると、ルートパスワードを設定し、安全でない機能をインストールから削除する手順が案内されます。MariaDB サーバーを使用する予定がない場合でも、この手順を実行することが推奨されます。<a name="securing-maria-db"></a>

**MariaDB サーバーをセキュリティで保護するには**

1. MariaDB サーバーを起動します。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. **mysql\$1secure\$1installation** を実行します。

   ```
   [ec2-user ~]$ sudo mysql_secure_installation
   ```

   1. プロンプトが表示されたら、ルートアカウントのパスワードを入力します。

      1. 現在のルートパスワードを入力します。デフォルトでは、ルートアカウントにはパスワードが設定されていません。Enter キーを押します。

      1. 「**Y**」と入力してパスワードを設定し、安全なパスワードを 2 回入力します。安全なパスワード作成の詳細については、「[https://identitysafe.norton.com/password-generator/](https://identitysafe.norton.com/password-generator/)」を参照してください。このパスワードは必ず安全な場所に保管します。

         MariaDB のルートパスワードの設定は、データベースを保護するための最も基本的な手段にすぎません。データベース駆動型アプリケーションを構築またはインストールする必要がある場合、通常はそのアプリケーションのデータベースサービスユーザーを作成します。ルートアカウントは、データベース管理以外には使用しないでください。

   1. 「**Y**」と入力して匿名ユーザーアカウントを削除します。

   1. 「**Y**」と入力してリモートルートログインを無効にします。

   1. 「**Y**」と入力してテストデータベースを削除します。

   1. 「**Y**」と入力して権限テーブルを再ロードし、変更を保存します。

1. (オプション) MariaDB サーバーをすぐに使用する予定がない場合は、これを停止します。再び必要になったときには再起動できます。

   ```
   [ec2-user ~]$ sudo systemctl stop mariadb
   ```

1. (オプション) ブート時に毎回 MariaDB サーバーを起動させる場合は、次のコマンドを入力します。

   ```
   [ec2-user ~]$ sudo systemctl enable mariadb
   ```

## ステップ 4: (オプション) phpMyAdmin をインストールする
<a name="install-phpmyadmin-lamp-server"></a>

[phpMyAdmin](https://www.phpmyadmin.net/) は、EC2 インスタンスで MySQL データベースを表示して編集するために使用できる、ウェブベースのデータベース管理ツールです。Amazon Linux インスタンスで `phpMyAdmin` をインストールして設定するには、以下の手順に従ってください。

**重要**  
Apache で SSL/TLS を有効にしていない場合、LAMP サーバーへのアクセスに `phpMyAdmin` を使用することは推奨されません。そのようにすると、データベース管理者のパスワードや他のデータは、インターネット上を安全ではない状態で送信されます。開発者によるセキュリティ関連の推奨事項については、「[Securing your phpMyAdmin installation](https://docs.phpmyadmin.net/en/latest/setup.html#securing-your-phpmyadmin-installation)」を参照してください。EC2 インスタンスでのウェブサーバーの保護に関する一般的な情報については、「[チュートリアル: AL2 で SSL/TLS を設定する](SSL-on-amazon-linux-2.md)」を参照してください。

**pMyAdmin をインストールするには**

1. 必要な依存ファイルをインストールします。

   ```
   [ec2-user ~]$ sudo yum install php-mbstring php-xml -y
   ```

1. Apache を再起動します。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```

1. `php-fpm` を再起動します。

   ```
   [ec2-user ~]$ sudo systemctl restart php-fpm
   ```

1. `/var/www/html` で Apache ドキュメントルートに移動します。

   ```
   [ec2-user ~]$ cd /var/www/html
   ```

1. [https://www.phpmyadmin.net/downloads](https://www.phpmyadmin.net/downloads) で最新の phpMyAdmin リリース用のソースパッケージを選択します。ファイルディレクトリをインスタンスにダウンロードするには、次の例のようにリンクをコピーして **wget** コマンドに貼り付けます。

   ```
   [ec2-user html]$ wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
   ```

1. `phpMyAdmin` フォルダを作成し、次のコマンドでパッケージを展開します。

   ```
   [ec2-user html]$ mkdir phpMyAdmin && tar -xvzf phpMyAdmin-latest-all-languages.tar.gz -C phpMyAdmin --strip-components 1
   ```

1. *phpMyAdmin-latest-all-languages.tar.gz* Tarball を削除します。

   ```
   [ec2-user html]$ rm phpMyAdmin-latest-all-languages.tar.gz
   ```

1.  (オプション) MySQL サーバーが実行中ではない場合は、今すぐ起動します。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. ウェブブラウザで、phpMyAdmin のインストール URL を入力します。この URL は、インスタンスのパブリック DNS アドレス (または、パブリック IP アドレス) にスラッシュとインストールディレクトリを追加してものです。次に例を示します。

   ```
   http://my.public.dns.amazonaws.com/phpMyAdmin
   ```

   phpMyAdmin ログインページが表示されます。  
![\[phpMyAdmin インストールの URL を入力すると、phpMyAdmin ログイン画面が表示されます。\]](http://docs.aws.amazon.com/ja_jp/linux/al2/ug/images/phpmyadmin_login.png)

1. 前に作成した `root` ユーザー名と MySQL のルートパスワードを使って、phpMyAdmin インストールにログインします。

   インストールは、サービス開始前に設定する必要があります。次の手順に従って、設定ファイルを手動で作成することから始めるのをお勧めします。

   1. 最小の設定ファイルから開始するには、お気に入りのテキストエディタを使用して新しいファイルを作成し、`config.sample.inc.php` の内容をそのファイルにコピーします。

   1. `index.php` を含む phpMyAdmin ディレクトリに、ファイルを `config.inc.php` として保存します。

   1. 追加のセットアップについては、phpMyAdmin のインストール手順の「[セットアップスクリプトの使用](https://docs.phpmyadmin.net/en/latest/setup.html#using-the-setup-script)」セクションにある「ファイル作成後の手順」を参照してください。

    phpMyAdmin の使用に関する情報は、「[phpMyAdmin ユーザーガイド](http://docs.phpmyadmin.net/en/latest/user.html)」を参照してください。

## トラブルシューティング
<a name="lamp-troubleshooting"></a>

このセクションでは、新しい LAMP サーバーの設定時に発生する可能性がある一般的な問題の解決案を提供します。

### ウェブブラウザを使用してサーバーに接続できません。
<a name="is_apache_on"></a>

以下のチェックを行って、Apache ウェブサーバーが実行されていて、アクセス可能であるかどうかを確認します。
+ **ウェブサーバーが実行されていますか?**

  **httpd** が有効であることは、次のコマンドを実行して確認できます。

  ```
  [ec2-user ~]$ sudo systemctl is-enabled httpd
  ```

  **httpd** プロセスが実行されていない場合は、[LAMP サーバーを準備するには](#install_apache-2) に記載されているステップを繰り返します。
+ **ファイアウォールは正しく設定されていますか?**

  インスタンスのセキュリティグループに、ポート 80 での HTTP ラフィックを許可するルールが含まれていることを確認します。詳細については、「[セキュリティグループへのルールの追加](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)」を参照してください。

### HTTPS を使用してサーバーに接続できない
<a name="is-https-enabled"></a>

以下のチェックを行って、Apache ウェブサーバーが HTTPS をサポートするように設定されているかどうかを確認します。
+ **ウェブサーバは正しく設定されていますか?**

  Apache をインストールすると、サーバーは HTTP トラフィック用に設定されます。HTTPS をサポートするには、サーバーで TLS を有効にし、SSL 証明書をインストールします。詳細については、「[チュートリアル: AL2 で SSL/TLS を設定する](SSL-on-amazon-linux-2.md)」を参照してください。
+ **ファイアウォールは正しく設定されていますか?**

  インスタンスのセキュリティグループに、ポート 443 で HTTPS トラフィックを許可するルールが含まれていることを確認します。詳細については、[「セキュリティグループにルールを追加する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)」を参照してください。

## 関連トピック
<a name="lamp-more-info"></a>

インスタンスへのファイルの転送、またはウェブサーバーへの WordPress ブログのインストールの詳細については、次のドキュメントを参照してください。
+ [を使用して Linux インスタンスにファイルを転送するWinSCP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html#Transfer_WinSCP)。
+ [SCP クライアントを使用して Linux インスタンスにファイルを転送する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-ssh.html#linux-file-transfer-scp)。
+ [チュートリアル: AL2 で WordPress ブログをホストする](hosting-wordpress.md)

このチュートリアルで使用されているコマンドおよびソフトウェアの詳細については、次のウェブページを参照してください。
+ Apache ウェブサーバー: [http://httpd.apache.org/](http://httpd.apache.org/)
+ MariaDB データベースサーバー: [https://mariadb.org/](https://mariadb.org/)
+ PHP プログラミング言語: [http://php.net/](http://php.net/)
+ `chmod` コマンド: [https://en.wikipedia.org/wiki/Chmod](https://en.wikipedia.org/wiki/Chmod)
+ `chown` コマンド: [https://en.wikipedia.org/wiki/Chown](https://en.wikipedia.org/wiki/Chown)

ウェブサーバーのドメイン名の登録、または、既存のドメイン名をこのホストに移す方法についての詳細は、『*Amazon Route 53 デベロッパーガイド*』の「[Amazon Route 53 のドメインとサブドメインの作成と移行](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/creating-migrating.html)」を参照してください。

# チュートリアル: AL2 で SSL/TLS を設定する
<a name="SSL-on-amazon-linux-2"></a>

Secure Sockets Layer/Transport Layer Security (SSL/TLS) は、ウェブサーバーとウェブクライアントの間に、転送中のデータが傍受されないように保護する、暗号化されたチャネルを確立します。このチュートリアルでは、AL2 および Apache ウェブサーバーを使用する EC2 インスタンスで SSL/TLS のサポートを手動で追加する方法について説明します。このチュートリアルでは、ロードバランサーを使用していないことを前提としています。Elastic Load Balancing を使用している場合は、代わりに [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/) の証明書を使用して、ロードバランサーで SSL オフロードを設定できます。

歴史的経緯から、ウェブの暗号化は、単純に SSL と呼ばれることが少なくありません。ウェブブラウザでは今でも SSL がサポートされていますが、後継プロトコルである TLS プロトコルの方が攻撃を受けにくくなります。AL2 は、デフォルトですべてのバージョンの SSL のサーバー側のサポートを無効にします。[セキュリティ標準化団体](https://www.ssl.com/article/deprecating-early-tls/)は、TLS 1.0 は安全でないとみなしています。TLS 1.0 および TLS 1.1 は、2021 年 3 月に正式に[非推奨になりました](https://datatracker.ietf.org/doc/rfc8996/)。このチュートリアルは、TLS 1.2 を有効にすることを前提としたガイダンスです。TLS 1.3 は 2018 年に最終化され、基盤となる TLS ライブラリ (このチュートリアルでは OpenSSL) がサポートされているため、有効に設定されている限り、AL2 で利用できます。[クライアントは 2023 年 6 月 28 日までに TLS 1.2 以降をサポートしている必要があります](https://aws.amazon.com/blogs/security/tls-1-2-required-for-aws-endpoints/)。最新の暗号化基準の詳細については、「[RFC 7568](https://tools.ietf.org/html/rfc7568)」および「[RFC 8446](https://tools.ietf.org/html/rfc8446)」を参照してください。

このチュートリアルでは、現代のウェブ暗号化を単に TLS と呼びます。

**重要**  
これらの手順は、AL2 での使用を目的としています。また、新しい Amazon EC2 インスタンスを使用して開始するものと仮定します。別のディストリビューションを実行している EC2 インスタンス、または古いバージョンの AL2 を実行しているインスタンスを設定しようとすると、このチュートリアルの一部の手順が機能しない場合があります。Ubuntu については、[Ubuntu 上の OpenSSL](https://help.ubuntu.com/community/OpenSSL) に関するコミュニティドキュメントを参照してください。Red Hat Enterprise Linux については、以下を参照してください。[Apache HTTP Web サーバーの設定](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/setting-apache-http-server_deploying-different-types-of-servers)。その他のディストリビューションについては、それぞれのドキュメントを参照してください。

**注記**  
または、 AWS Nitro Enclaves に AWS Certificate Manager (ACM) を使用することもできます。これは、 AWS Nitro Enclaves で Amazon EC2 インスタンスで実行されているウェブアプリケーションとサーバーでパブリックおよびプライベートの SSL/TLS 証明書を使用できるようにするエンクレーブアプリケーションです。Nitro Enclavesは、SSL/TLS 証明書やプライベートキーなどの機密性の高いデータを保護し、安全に処理するために、分離されたコンピューティング環境を作成できる Amazon EC2 の機能です。  
Nitro Enclaves 向け ACM では、Amazon EC2 Linux インスタンスで実行する **nginx** を使用することで、プライベートキーの作成、証明書とプライベートキーの配布、および証明書の更新を実行します。  
Nitro Enclaves 向け ACM を使用するには、エンクレーブ対応の Linux インスタンスを使用する必要があります。  
詳細については、[AWS 「Nitro Enclaves とは」を参照してください。](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html) [AWS Certificate Manager Nitro Enclaves ユーザーガイド](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html)*AWS の Nitro Enclaves* 用 および 。

**Topics**
+ [前提条件](#ssl_prereq)
+ [ステップ 1: サーバーで TLS を有効にする](#ssl_enable)
+ [ステップ 2: CA 署名証明書を取得する](#ssl_certificate)
+ [ステップ 3: セキュリティ設定をテストして強化する](#ssl_test)
+ [トラブルシューティング](#troubleshooting)

## 前提条件
<a name="ssl_prereq"></a>

このチュートリアルを開始する前に、次のステップを完了してください。
+ Amazon EBS ベースの AL2 インスタンスを起動します。詳細については、*Amazon EC2 ユーザーガイド* の [インスタンスの起動](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html) を参照してください。
+ インスタンスが以下の TCP ポートで接続を受け付けるようにセキュリティグループを設定します。
  + SSH (ポート 22)
  + HTTP (ポート 80)
  + HTTPS (ポート 443)

  詳細については、「*Amazon EC2 ユーザーガイド*」の「[セキュリティグループのルール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html)」を参照してください。
+ Apache ウェブサーバーをインストールします。step-by-stepの手順については、[「チュートリアル: AL2 に LAMP ウェブサーバーをインストールする](ec2-lamp-amazon-linux-2.md)」を参照してください。必要なのは httpd パッケージおよび対応する従属コンポーネントのみです。PHP および MariaDB に関連する手順は無視してかまいません。
+ ウェブサイトの識別と認証を行うため、TLS の公開鍵基盤 (PKI) ではドメインネームシステム (DNS) を使用します。EC2 インスタンスを使用してパブリックウェブサイトをホストするには、ウェブサーバーのドメイン名を登録するか、既存のドメイン名を Amazon EC2 ホストに移す必要があります。これについては、ドメイン登録および DNS ホスティングに関するサードパーティのサービスが多数存在します。[Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) を使用することもできます。

## ステップ 1: サーバーで TLS を有効にする
<a name="ssl_enable"></a>

**オプション: オートメーション を使用してこのチュートリアルを完了する**  
以下のタスクの代わりに AWS Systems Manager 自動化を使用してこのチュートリアルを完了するには、[自動化ドキュメント](https://console.aws.amazon.com/systems-manager/documents/AWSDocs-Configure-SSL-TLS-AL2/)を実行します。

この手順では、自己署名デジタル証明書を使用して AL2 で TLS を設定するプロセスについて説明します。

**注記**  
自己署名証明書はテスト用であり、本稼働環境では使用できません。インターネットに自己署名証明書を公開すると、サイトへの訪問者にセキュリティ警告が表示されます。

**サーバーで TLS を有効にするには**

1. [インスタンスに接続](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)し、Apache が実行されていることを確認します。

   ```
   [ec2-user ~]$ sudo systemctl is-enabled httpd
   ```

   返される値が「enabled」でない場合、Apache を起動し、システムブート時に毎回起動されるように設定します。

   ```
   [ec2-user ~]$ sudo systemctl start httpd && sudo systemctl enable httpd
   ```

1. すべてのソフトウェアパッケージが最新の状態であることを確認するため、インスタンスでソフトウェアの更新を実行します。この処理には数分かかりますが、最新の更新とバグ修正を確実に適用することが重要です。
**注記**  
`-y` オプションを指定すると、確認メッセージを表示せずに更新をインストールします。インストール前に更新を検査する場合は、このオプションを省略できます。

   ```
   [ec2-user ~]$ sudo yum update -y
   ```

1. これでインスタンスが最新状態になったため、Apache モジュール `mod_ssl` をインストールして TLS サポートを追加します。

   ```
   [ec2-user ~]$ sudo yum install -y mod_ssl
   ```

   次のファイルがインスタンスに作成されました。このファイルは、セキュアサーバーの設定とテスト用の証明書の作成に使用します。
   +  `/etc/httpd/conf.d/ssl.conf` 

     mod\$1ssl の設定ファイル。このファイルには、暗号化キーと証明書の場所、許可する TLS プロトコル、受け入れる暗号化アルゴリズムを Apache に指示する*ディレクティブ*が含まれています。
   + `/etc/pki/tls/certs/make-dummy-cert`

     サーバーホスト用の自己署名 X.509 証明書とプライベートキーを生成するためのスクリプト。この証明書は、TLS を使用するように Apache が正しくセットアップされているかどうかをテストする場合に役立ちます。アイデンティティは証明されないため、本稼働環境では使用しないでください。本稼働環境で使用すると、ウェブブラウザで警告が表示されます。

1. テスト用に自己署名のダミー証明書とキーを生成するためのスクリプトを実行します。

   ```
   [ec2-user ~]$ cd /etc/pki/tls/certs
   sudo ./make-dummy-cert localhost.crt
   ```

   `/etc/pki/tls/certs/` ディレクトリに新しいファイル `localhost.crt` が生成されます。指定されたファイル名は、**SSLCertificateFile** の `/etc/httpd/conf.d/ssl.conf` ディレクティブで割り当てたデフォルトの名前と一致します。

   このファイルには、自己署名証明書と証明書のプライベートキーのいずれも含まれます。Apache では、証明書とキーを PEM 形式にする必要があります。これは、次の短縮化された例のように、"BEGIN" 行と "END" 行で囲まれた Base64 エンコードの ASCII 文字で構成されます。

   ```
   -----BEGIN PRIVATE KEY-----
   MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD2KKx/8Zk94m1q
   3gQMZF9ZN66Ls19+3tHAgQ5Fpo9KJDhzLjOOCI8u1PTcGmAah5kEitCEc0wzmNeo
   BCl0wYR6G0rGaKtK9Dn7CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vr
   GvwnKoMh3DlK44D9dX7IDua2PlYx5+eroA+1Lqf32ZSaAO0bBIMIYTHigwbHMZoT
   ...
   56tE7THvH7vOEf4/iUOsIrEzaMaJ0mqkmY1A70qQGQKBgBF3H1qNRNHuyMcPODFs
   27hDzPDinrquSEvoZIggkDMlh2irTiipJ/GhkvTpoQlv0fK/VXw8vSgeaBuhwJvS
   LXU9HvYq0U6O4FgD3nAyB9hI0BE13r1HjUvbjT7moH+RhnNz6eqqdscCS09VtRAo
   4QQvAqOa8UheYeoXLdWcHaLP
   -----END PRIVATE KEY-----                    
   
   -----BEGIN CERTIFICATE-----
   MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t
   MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK
   DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV
   bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy
   ...
   z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0
   CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vrGvwnKoMh3DlK44D9dlU3
   WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak
   3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg==
   -----END CERTIFICATE-----
   ```

   ファイル名および拡張子は利便性のためであり、機能には影響しません。例えば、`cert.crt` または `cert.pem` などのファイル名で証明書を呼び出すことができます。ただし、`ssl.conf` ファイルの関連ディレクティブが同じ名前を使用している場合に限ります。
**注記**  
デフォルトの TLS ファイルを独自にカスタマイズしたファイルに置き換える場合は、PEM 形式であることを確認してください。

1. ルートユーザーとしてお好みのテキストエディタ (**vim**、**nano**など) を使用して `/etc/httpd/conf.d/ssl.conf` ファイルを開き、次の行をコメントアウトします。ダミーの自己署名証明書にも同じキーが含まれているためです。次のステップに進む前にこの行をコメントアウトしないと、Apache サービスは起動に失敗します。

   ```
   SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
   ```

1. Apache を再起動します。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```
**注記**  
前述のとおり、TCP 443 番ポートが EC2 インスタンスでアクセス可能であることを確認してください。

1. Apache ウェブサーバーではポート 443 経由で HTTPS (セキュア HTTP) がサポートされるようになっています。これをテストするには、ブラウザの URL バーに、**https://** というプレフィックスを指定して、EC2 インスタンスの IP アドレスまたは完全修飾ドメイン名を入力します。

   信頼されていない自己署名ホスト証明書を使用してサイトに接続しようとしているため、ブラウザには一連のセキュリティ警告が表示されることがあります。これの警告を無視し、サイトに進みます。

   サーバーで TLS を正しく設定できていれば、Apache のデフォルトのテストページが開きます。これで、ブラウザとサーバーの間でやり取りされるすべてのデータが暗号化されるようになります。
**注記**  
サイト訪問者に対して警告画面が表示されないようにするには、暗号化だけではなく、サイト所有者のパブリック認証を行うための信頼された CA 署名証明書を取得する必要があります。

## ステップ 2: CA 署名証明書を取得する
<a name="ssl_certificate"></a>

CA 署名証明書を取得するには、次の手順に従います。
+ プライベートキーから証明書署名リクエスト (CSR) を作成します。
+ 作成した CSR を認証機関 (CA) に送信します。
+ 署名付きホスト証明書を入手する
+ 証明書を使用するように Apache を設定します

自己署名 TLS X.509 ホスト証明書は、暗号化技術上は CA 署名証明書と同じです。これらの相違は数学的なものではなく、社会的なものです。CA では、最低でもドメイン所有権を検証してから申請者に証明書を発行することを保証しています。そのため、各ウェブブラウザには、ブラウザベンダーが信頼する CA のリストが含まれています。X.509 証明書は主に、プライベートサーバーキーに対応するパブリックキーと、このパブリックキーに暗号で関連付けられている CA による署名で構成されています。HTTPS 経由でブラウザがウェブサーバーに接続すると、サーバーは、信頼された CA のリストをブラウザが確認できるように、証明書を提示します。Signerがリストに含まれている場合や、他の信頼された署名者の*信頼チェーン*を通じてアクセス可能である場合、ブラウザはサーバーと、高速暗号化データチャネルのネゴシエーションを行い、ページをロードします。

証明書には、リクエストの確認作業が必要であり、一般的に費用がかかるため、各社を比較することをお勧めします。いくつかの CA では、基本レベル証明書が無料で提供されます。これらの CA で最も注目すべきは [Let's Encrypt](https://letsencrypt.org/) プロジェクトです。このプロジェクトでは、証明書の作成および更新プロセスの自動化もサポートしています。Let's Encrypt 証明書の使用の詳細については、「[Certbot の取得](https://eff-certbot.readthedocs.io/en/stable/install.html)」を参照してください。

商業グレードのサービスを提供する予定がある場合は、[AWS Certificate Manager](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) は良い選択肢です。

ホスト証明書の基盤にはキーがあります。2019 年時点で、[政府](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf)および[業界グループ](https://cabforum.org/wp-content/uploads/CA-Browser-Forum-BR-1.6.5.pdf)は、2030 年まで、ドキュメントを保護するための RSA キーに 2048 ビットの最小キー (モジュロ) サイズを使用することを推奨しています。AL2 で OpenSSL によって生成されるデフォルトのモジュラスサイズは 2048 ビットで、CA 署名証明書での使用に適しています。次の手順では、モジュラスサイズを大きくする、別の暗号化アルゴリズムを使用するなど、キーのカスタマイズが必要な場合のオプションのステップを提供しています。

**重要**  
CA 署名ホスト証明書を取得するための手順は、登録およびホスト済みの DNS ドメインを所有している場合を除き、使用しません。

**CA 署名証明書を取得するには**

1.  [インスタンスに接続](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)して、/etc/pki/tls/private/ に移動します。サーバーの TLS 用プライベートキーは、このディレクトリに格納されます。既存のホストキーを使用して CSR を生成する場合は、ステップ 3 に進みます。

1. (オプション) 新しいプライベートキーを生成します。キー設定のいくつかのサンプルを次に示します。生成されたキーのどれもウェブサーバーで機能しますが、実装されるセキュリティの強度とタイプはそれぞれ異なります。
   + **例 1:** デフォルトの RSA ホストキーを作成します。結果として生成されるファイル **custom.key** が、2048 ビットの RSA プライベートキーです。

     ```
     [ec2-user ~]$ sudo openssl genrsa -out custom.key
     ```
   + **例 2:** これより大きなモジュラサイズを使用して、より強力な RSA キーを作成します。結果として生成されるファイル **custom.key** が、4096 ビットの RSA プライベートキーです。

     ```
     [ec2-user ~]$ sudo openssl genrsa -out custom.key 4096
     ```
   + **例 3:** パスワードで保護された 4096 ビット暗号化 RSA キーを作成します。結果のファイル、**custom.key** は、AES-128 暗号で暗号化された 4096 ビットの RSA プライベートキーです。
**重要**  
キーを暗号化するとセキュリティを強化できますが、暗号化キーにはパスワードが必要であるため、暗号化に依存するサービスを自動的に開始することはできません。このキーを使用するたびに、SSH 接続でパスワード (前述の例では、"abcde12345") を指定する必要があります。

     ```
     [ec2-user ~]$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096
     ```
   + **例 4:** 非 RSA 暗号を使用してキーを作成します。RSA 暗号化は、2 つの大きな素数の積に基づくパブリックキーのサイズのために、比較的遅くなる可能性があります。ただし、非 RSA 暗号化方式を使用する TLS 用のキーを作成することも可能です。同等レベルのセキュリティを提供する場合は、楕円曲線の計算に基づいたキーのほうが小さく計算処理も高速です。

     ```
     [ec2-user ~]$ sudo openssl ecparam -name prime256v1 -out custom.key -genkey
     ```

     結果は、prime256v1 (OpenSSL でサポートされる "名前付き曲線") を使用した 256 ビットの楕円曲線プライベートキーです。暗号化強度は ([NIST](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf) によると) 2048 ビットの RSA キーよりやや優れています。
**注記**  
すべての CA で、楕円曲線ベースのキーに対して RSA キーと同じレベルのサポートが提供されているわけではありません。

   新しいプライベートキーには、制限の厳しい所有権とアクセス権を設定します (所有者 = root、グループ = root、所有者のみの読み取り/書き込み)。コマンドは次の例のようになります。

   ```
   [ec2-user ~]$ sudo chown root:root custom.key
   [ec2-user ~]$ sudo chmod 600 custom.key
   [ec2-user ~]$ ls -al custom.key
   ```

   上記のコマンドにより、次のような結果が得られます。

   ```
   -rw------- root root custom.key
   ```

    適切なキーを作成し、設定できたら、CSR を作成できます。

1. 好みのキーを使用して CSR を作成します。次の例では **custom.key** を使用しています。

   ```
   [ec2-user ~]$ sudo openssl req -new -key custom.key -out csr.pem
   ```

   OpenSSL によりダイアログが開かれ、次の表に示されている情報の入力が求められます。基本的なドメイン検証済みホスト証明書については、[**共通名**] 以外のフィールドはすべてオプションです。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/linux/al2/ug/SSL-on-amazon-linux-2.html)

   最後に、OpenSSL により、オプションのチャレンジパスワードが求められます。このパスワードは CSR と、ユーザーと CA の間のトランザクションのみに適用されるため、このフィールドと、もう 1 つのオプションフィールドである、オプションの会社名については、CA の推奨事項に従ってください。CSR のチャレンジパスワードは、サーバー操作には影響しません。

   結果として生成されるファイル **csr.pem** には、パブリックキー、パブリックキーのデジタル署名、入札したメタデータが含まれています。

1. CA に CSR を送信します。この作業は通常、テキストエディタで CSR ファイルを開く動作と、内容をウェブフォームにコピーする動作で構成されています。このとき、証明書に適用する 1 つ以上のサブジェクト代替名 (SAN) を指定するように求められることがあります。共通名が **www.example.com** の場合、有効な SAN は **example.com** になります (逆も同様です)。サイトへの訪問者がこれら名前のいずれかを入力すると、エラーなしの接続が提示されます。CA のウェブフォームで許可される場合は、SAN のリストに共通名を含めます 一部の CA では自動的に含められます。

   リクエストが承認されると、CA によって署名された新しいホスト証明書が届きます。CA の信頼チェーンを完成するために必要な、追加の証明書が含まれている*中間証明書*ファイルをダウンロードするよう指示されることもあります。
**注記**  
多様な用途向けに複数の形式のファイルを送信してくる CA もあります。このチュートリアルでは、PEM 形式の証明書ファイルのみ使用してください。PEM 形式のファイルには通常、`.pem` または `.crt` ファイル拡張子が使用されます (ただし、常にこれらの拡張子が使用されるわけではありません)。どのファイルを使用すべきかわからない場合は、テキストエディタでファイルを開き、以下の行で始まる 1 つ以上のブロックを含むファイルを見つけてください。  

   ```
   - - - - -BEGIN CERTIFICATE - - - - - 
   ```
ファイルの末尾は次のような行になっている必要があります。  

   ```
   - - - -END CERTIFICATE - - - - -
   ```
以下に示すように、コマンドラインでファイルをテストすることもできます。  

   ```
   [ec2-user certs]$ openssl x509 -in certificate.crt -text
   ```
これらの行がファイルに表示されていることを確認してください。`.p7b`、`.p7c`、または類似のファイル拡張子で終了するファイルは使用しないでください。

1. 新しい CA 署名証明書と任意の中間証明書を `/etc/pki/tls/certs` ディレクトリに配置します。
**注記**  
EC2 インスタンスに新しい証明書をアップロードする方法は複数ありますが、最も簡単でわかりやすい方法は、テキストエディタ (vi、nano、またはメモ帳など) をローカルコンピュータとインスタンスの両方で開いて、両者の間でファイルの内容をコピーして貼り付けることです。EC2 インスタンス内でこれらの操作を実行する際には、root [sudo] アクセス許可が必要です。こうすることで、許可やパスに問題があるかどうかをすぐに確認できます。ただし、内容をコピーする際に行を追加したり、内容を変更したりしないでください。

   `/etc/pki/tls/certs` ディレクトリ内から、ファイルの所有権、グループ、およびアクセス許可の設定が、制限の厳しい AL2 のデフォルト (所有者 = ルート、グループ = ルート、所有者のみの読み取り/書き込み) と一致していることを確認します。以下の例では、使用するコマンドを示しています。

   ```
   [ec2-user certs]$ sudo chown root:root custom.crt
   [ec2-user certs]$ sudo chmod 600 custom.crt
   [ec2-user certs]$ ls -al custom.crt
   ```

   これらのコマンドによって、次の結果が得られます。

   ```
   -rw------- root root custom.crt
   ```

   中間証明書ファイルのアクセス権は、比較的厳しくありません (所有者 = root、グループ = root、所有者による書き込み可、グループによる読み取り可、その他による読み取り可)。以下の例では、使用するコマンドを示しています。

   ```
   [ec2-user certs]$ sudo chown root:root intermediate.crt
   [ec2-user certs]$ sudo chmod 644 intermediate.crt
   [ec2-user certs]$ ls -al intermediate.crt
   ```

   これらのコマンドによって、次の結果が得られます。

   ```
   -rw-r--r-- root root intermediate.crt
   ```

1. CSR の作成に使用したプライベートキーを `/etc/pki/tls/private/` ディレクトリに配置します。
**注記**  
EC2 インスタンスにカスタムキーをアップロードする方法は複数ありますが、最も簡単でわかりやすい方法は、テキストエディタ (vi、nano、メモ帳など) をローカルコンピュータとインスタンスの両方で開いて、両者の間でファイルの内容をコピーして貼り付けることです。EC2 インスタンス内でこれらの操作を実行する際には、root [sudo] アクセス許可が必要です。こうすることで、許可やパスに問題があるかどうかをすぐに確認できます。ただし、内容をコピーする際に行を追加したり、内容を変更したりしないでください。

   `/etc/pki/tls/private` ディレクトリ内から、次のコマンドを使用して、ファイルの所有権、グループ、およびアクセス許可の設定が、制限の厳しい AL2 のデフォルト (所有者 = ルート、グループ = ルート、所有者のみの読み取り/書き込み) と一致することを確認します。

   ```
   [ec2-user private]$ sudo chown root:root custom.key
   [ec2-user private]$ sudo chmod 600 custom.key
   [ec2-user private]$ ls -al custom.key
   ```

   これらのコマンドによって、次の結果が得られます。

   ```
   -rw------- root root custom.key
   ```

1. 新しい証明書とキーファイルに合わせるには、`/etc/httpd/conf.d/ssl.conf` を編集します。

   1. CA 署名のホスト証明書のパスとファイル名を Apache の `SSLCertificateFile` ディレクティブで指定します。

      ```
      SSLCertificateFile /etc/pki/tls/certs/custom.crt
      ```

   1. 中間証明書ファイル (この例では `intermediate.crt`) を受け取ったら、Apache の `SSLCACertificateFile` ディレクティブを使用して、次のファイルのパスとファイル名を指定します。

      ```
      SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt
      ```
**注記**  
一部の CA では、ホスト証明書と中間証明書を組み合わせて 1 つのファイルを作成するため、この `SSLCACertificateFile` ディレクティブは必要ありません。CA が提供している手順を参照してください。

   1. プライベートキー (この例では `custom.key`) のパスとファイル名を Apache の `SSLCertificateKeyFile` ディレクティブで指定します。

      ```
      SSLCertificateKeyFile /etc/pki/tls/private/custom.key
      ```

1. `/etc/httpd/conf.d/ssl.conf` を保存して、Apache を再起動します。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```

1. サーバーをテストするには、ブラウザの URL バーにドメイン名を入力し、プレフィックス `https://` を指定します。ブラウザによって、エラーが生成されることなく、HTTPS 経由でテストページがロードされます。

## ステップ 3: セキュリティ設定をテストして強化する
<a name="ssl_test"></a>

TLS が運用可能になりパブリックに公開されたら、実際の安全性をテストする必要があります。セキュリティセットアップの詳細な分析を無料で行うことのできる [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) などのオンラインサービスを使用すると簡単です。その結果に基づき、受け入れるプロトコル、優先する暗号化方式、除外する暗号化方式を制御することによって、デフォルトのセキュリティ設定を強化するかどうかを決定できます。詳細については、「[Qualys のスコアの計算方法](https://github.com/ssllabs/research/wiki/SSL-Server-Rating-Guide)」を参照してください。

**重要**  
サーバーのセキュリティを確保するには、実際のテストが非常に重要です。小さな設定エラーによって、深刻なセキュリティ侵害やデータの損失が生じる可能性があります。調査や新たな脅威に応じて、推奨されるセキュリティ管理方法は常に変化するため、適切なサーバー管理を行うには、定期的なセキュリティ監査が不可欠です。

[Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) のサイトで、サーバーの完全修飾ドメイン名を **www.example.com** という形式で入力します。約 2 分後に、サイトに関するグレード (A から F) と、結果の詳細な内訳が届きます。次の表は、AL2 のデフォルトの Apache 設定と同じ設定で、デフォルトの Certbot 証明書を持つドメインのレポートをまとめたものです。


|  |  | 
| --- |--- |
| 総合評価 | B | 
| 証明書 | 100% | 
| プロトコルサポート | 95% | 
| キー交換 | 70% | 
| 暗号強度 | 90% | 

概要は設定がほとんど正常であることを示していますが、詳細レポートでは、いくつかの潜在的な問題が指摘されています。重大度の高い順に以下に示します。

**RC4 暗号は、特定の古いブラウザでの使用がサポートされています。**暗号は、暗号化アルゴリズムの計算の中核です。TLS データストリームの暗号化に使用される高速の暗号化方式である RC4 は、いくつかの[重大な脆弱性](http://www.imperva.com/docs/hii_attacking_ssl_when_using_rc4.pdf)を持つことで知られています。従来のブラウザをサポートするもっともな理由がない限り、この暗号化方式を無効にする必要があります。

✗**旧バージョンの TLS がサポートされています。**設定では TLS 1.0 (すでに廃止されています) と TLS 1.1 (廃止予定) がサポートされています。2018 年以降は、TLS 1.2 のみ推奨されています。

**前方秘匿性は完全にサポートされていません。**[前方秘匿性](https://en.wikipedia.org/wiki/Forward_secrecy)は、プライベートキーから派生した一時 (エフェメラル) セッションキーを使用して暗号化を行う、アルゴリズムの機能です。これは、攻撃者がウェブサーバーの長期的なプライベートキーを所有していても、HTTPS データを復号できないことを意味します。

**TLS 設定を修正し、将来への対応性を確保するには**

1. 設定ファイル `/etc/httpd/conf.d/ssl.conf` を開き、行頭に \$1 を付けて以下の行をコメントアウトしてください。

   ```
   #SSLProtocol all -SSLv3
   ```

1. 次のディレクティブを追加します。

   ```
   #SSLProtocol all -SSLv3
   SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2
   ```

   このディレクティブにより、SSL バージョン 2、3、および TLS バージョン 1.0、1.1 が明示的に無効化されます。これで、サーバーでは、TLS 1.2 以外を使用した、クライアントとの暗号化された接続の受け入れが拒否されます。ディレクティブに含める指定が多くなるほど、サーバーの動作に対する設定内容が明確に伝わります。
**注記**  
このようにして、TLS バージョン 1.0 および 1.1 を無効にすると、ごく一部の古くなったウェブブラウザによるサイトへのアクセスがブロックされるようになります。

**許可された暗号のリストを変更するには**

1. 設定ファイル `/etc/httpd/conf.d/ssl.conf` で、**SSLCipherSuite** ディレクティブを含むセクションを探し、行頭に \$1 を付けて既存の行をコメントアウトします。

   ```
   #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
   ```

1. 明示的な暗号スイートと、前方秘匿性を優先し、安全でない暗号を禁止する暗号順序を指定します。ここで使用される `SSLCipherSuite` ディレクティブは、[Mozilla SSL Configuration Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/)の出力に基づいています。これは、お客様のサーバーで実行されている特定のソフトウェアに合わせて TLS 設定を調整します。まず、以下のコマンドの出力を使用して、Apache と OpenSSL のバージョンを確認します。

   ```
   [ec2-user ~]$ yum list installed | grep httpd
   
   [ec2-user ~]$ yum list installed | grep openssl
   ```

   例えば、返された情報が Apache 2.4.34 および OpenSSL 1.0.2 である場合、これをジェネレーターに入力します。"最新" 互換性モデルを選択すると、`SSLCipherSuite` ディレクティブが作成されます。このディレクティブは、積極的にセキュリティを適用しますが、ほとんどのブラウザで使用できます。ソフトウェアで最新互換性モデルがサポートされていない場合は、ソフトウェアを更新するか、"中間" の構成を選択します。

   ```
   SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:
   ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
   ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
   ```

   選択された暗号化方式の名前には、*ECDHE* が含まれています (*Elliptic Curve Diffie-Hellman Ephemeral* の略語です)。*ephemeral* は前方秘匿性を示します。また、これらの暗号化方式では、RC4 はサポートされていません。

   デフォルトや、内容が見えない簡単なディレクティブに依存するのではなく、暗号化方式の明示的なリストを使用することをお勧めします。

   生成されたディレクティブを `/etc/httpd/conf.d/ssl.conf` にコピーします。
**注記**  
ここでは読みやすくするために数行に分けて示していますが、このディレクティブは、`/etc/httpd/conf.d/ssl.conf` にコピーする際に、暗号化方式名の間をコロンのみ (スペースなし) で区切り、1 行に指定する必要があります。

1. 最後に、次の行について、行頭の \$1 を削除してコメント解除します。

   ```
   #SSLHonorCipherOrder on
   ```

   このディレクティブは、(この場合) 前方秘匿性をサポートするものも含めて、ランクの高い暗号化方式を優先するようサーバーに強制します。このディレクティブが有効になると、サーバーは、セキュリティの弱い暗号化方式に戻る前に、セキュリティが強力な接続を確立しようとします。

これらの手順がいずれも完了したら、変更内容を `/etc/httpd/conf.d/ssl.conf` に保存し、Apache を再起動します。

[Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) でドメインをもう一度テストすると、RC4 脆弱性やその他の警告は解決し、次のようなサマリレポートが出力されます。


|  |  | 
| --- |--- |
| 総合評価 | A | 
| 証明書 | 100% | 
| プロトコルサポート | 100% | 
| キー交換 | 90% | 
| 暗号強度 | 90% | 

OpenSSL の更新ごとに、新しい暗号化方式が導入され古い暗号化方式のサポートが削除されます。EC2 AL2 インスタンスup-to-date保ち、[OpenSSL](https://www.openssl.org/) からのセキュリティに関する発表を監視し、テクニカルメディアで新しいセキュリティエクスプロイトのレポートに注意してください。

## トラブルシューティング
<a name="troubleshooting"></a>
+ **パスワードを指定しないと Apache ウェブサーバーが起動しません**

  これは、パスワードで保護された暗号化プライベート サーバー キーをインストールした場合は正常な動作です。

  暗号化とパスワードの要件をキーから削除できます。デフォルトディレクトリに `custom.key` という暗号化プライベート RSA キーがあり、そのパスワードが **abcde12345** であるとすると、EC2 インスタンスで次のコマンドを実行し、このキーの非暗号化バージョンを生成してください。

  ```
  [ec2-user ~]$ cd /etc/pki/tls/private/
  [ec2-user private]$ sudo cp custom.key custom.key.bak
  [ec2-user private]$ sudo openssl rsa -in custom.key -passin pass:abcde12345 -out custom.key.nocrypt 
  [ec2-user private]$ sudo mv custom.key.nocrypt custom.key
  [ec2-user private]$ sudo chown root:root custom.key
  [ec2-user private]$ sudo chmod 600 custom.key
  [ec2-user private]$ sudo systemctl restart httpd
  ```

  パスワードが求められずに Apache が起動するようになります。
+  **sudo yum install -y mod\$1ssl を実行するとエラーが発生します。**

  SSL に必要なパッケージをインストールすると、次のようなエラーが表示されることがあります。

  ```
  Error: httpd24-tools conflicts with httpd-tools-2.2.34-1.16.amzn1.x86_64
  Error: httpd24 conflicts with httpd-2.2.34-1.16.amzn1.x86_64
  ```

  これは通常、EC2 インスタンスが AL2 を実行していないことを意味します。このチュートリアルでは、公式の AL2 AMI から新しく作成されたインスタンスのみをサポートします。

# チュートリアル: AL2 で WordPress ブログをホストする
<a name="hosting-wordpress"></a>

次の手順は、AL2 インスタンスに WordPress ブログをインストール、設定、保護するのに役立ちます。このチュートリアルは、WordPress ブログをホストするウェブサーバーを完全に制御する (これは従来のホスティングサービスでは一般的なことではありません) という点で、Amazon EC2 を使用するための優れた手引きになります。

サーバーに対するソフトウェアパッケージの更新とセキュリティパッチの維持は、お客様の責任となります。ウェブサーバー設定と直接やり取りする必要のない、より自動化された WordPress インストールの場合、この CloudFormation サービスには WordPress テンプレートが用意されており、すぐに開始することもできます。詳細については、 *AWS CloudFormation ユーザーガイド*の「[開始方法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.Walkthrough.html)」を参照してください。データベースが疎結合化された高可用性のソリューションが必要な場合は、*AWS Elastic Beanstalk デベロッパーガイド*の「[高可用性の WordPress ウェブサイトをデプロイする](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/php-hawordpress-tutorial.html)」を参照してください。

**重要**  
これらの手順は、AL2 での使用を目的としています。その他のディストリビューションの詳細については、各ドキュメントを参照してください。このチュートリアルの多くの手順は、Ubuntu インスタンスには使用できません。Ubuntu インスタンスでの WordPress のインストールについては、Ubuntu のドキュメントの「[WordPress](https://help.ubuntu.com/community/WordPress)」を参照してください。[CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorials-wordpress-launch-instance.html) を使用して、Amazon Linux、macOS、または Unix システムでこのタスクを実行することもできます。

**Topics**
+ [前提条件](#hosting-wordpress-prereqs)
+ [WordPress のインストール](#install-wordpress)
+ [次のステップ](#wordpress-next-steps)
+ [ヘルプ\$1 パブリック DNS 名が変更されたため、ブログが壊れました](#wordpress-troubleshooting)

## 前提条件
<a name="hosting-wordpress-prereqs"></a>

このチュートリアルでは、「」のすべてのステップに従って、PHP とデータベース (MySQL または MariaDB) をサポートする機能的なウェブサーバーで AL2 インスタンスを起動していることを前提としています[チュートリアル: AL2 に LAMP サーバーをインストールする](ec2-lamp-amazon-linux-2.md)。このチュートリアルでは、セキュリティグループで `HTTP` および `HTTPS` トラフィックを許可するように設定する手順や、ウェブサーバー用にファイルアクセス許可が正しく設定されていることを確認する手順も示します。セキュリティグループへのルールの追加の詳細については、「[セキュリティグループへのルールの追加](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)」を参照してください。

Elastic IP アドレス (EIP) は、WordPress ブログのホストに使用しているインスタンスに関連付けることを強くお勧めします。これにより、インスタンスのパブリック DNS アドレスが変更されて、インストールが破損することを防止できます。ドメイン名を所有していてそのドメインをブログに使用する場合、EIP アドレスをポイントするようにドメイン名の DNS レコードを更新できます (これを行うには、ドメイン名レジストラに問い合わせてください)。実行中のインスタンスに関連付けられた EIP アドレスを無料で 1 つ取得できます。詳細については、*「Amazon EC2 ユーザーガイド」*の[「Elastic IP アドレス」](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)を参照してください。

ブログのドメイン名がまだない場合は、Route 53 にドメイン名を登録し、そのドメイン名にインスタンスの EIP アドレスを関連付けることができます。詳細については、*Amazon Route 53 デベロッパーガイド* の「[Amazon Route 53 を使用したドメイン名の登録](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/registrar.html)」を参照してください。

## WordPress のインストール
<a name="install-wordpress"></a>

**オプション: オートメーション を使用してこのチュートリアルを完了する**  
以下のタスクの代わりに AWS Systems Manager 自動化を使用してこのチュートリアルを完了するには、[自動化ドキュメント](https://console.aws.amazon.com/systems-manager/documents/AWSDocs-HostingAWordPressBlog/)を実行します。

インスタンスに接続して、WordPress インストールパッケージをダウンロードします。

**WordPress インストールパッケージをダウンロードして解凍するには**

1. **wget** コマンドを使って、最新の WordPress インストールパッケージをダウンロードします。次のコマンドを実行すると、最新リリースが必ずダウンロードされます。

   ```
   [ec2-user ~]$ wget https://wordpress.org/latest.tar.gz
   ```

1. インストールパッケージを解凍します。インストールフォルダは、`wordpress` という名前のフォルダに解凍されます。

   ```
   [ec2-user ~]$ tar -xzf latest.tar.gz
   ```<a name="create_user_and_database"></a>

**WordPress インストール用にデータベースユーザーとデータベースを作成するには**

WordPress インストールは、ブログの投稿、ユーザーコメントなどの情報をデータベースに格納する必要があります。この手順を実行すると、ブログのデータベースを作成するのに役立ち、このデータベースに対して情報の読み取りや保存を許可されたユーザーにも有用です。

1. データベースサーバーを起動します。
   + 

     ```
     [ec2-user ~]$ sudo systemctl start mariadb
     ```

1. データベースサーバーに `root` ユーザーとしてログインします。メッセージが表示されたら、データベース `root` パスワードを入力します。これは通常の `root` システムパスワードと異なることもあれば、データベースサーバーのセキュリティ確保を実行していない場合は、空のときもあります。

   データベースサーバーのセキュリティを確保していない場合、セキュリティ確保を行うことは重要です。詳細については、 [MariaDB サーバーをセキュリティで保護するには](ec2-lamp-amazon-linux-2.md#securing-maria-db) (AL2) を参照してください。

   ```
   [ec2-user ~]$ mysql -u root -p
   ```

1. <a name="create_database_user"></a>MySQL データベースのユーザーとパスワードを作成します。WordPress インストールは、これらの値を使って、MySQL データベースと通信を行います。

   ユーザー用に強力なパスワードを作成してください。パスワードに一重引用符 (') を使用しないでください。この文字は前述のコマンドを中断させるためです。既存のパスワードを再利用しないでください。また、このパスワードは必ず安全な場所に保管してください。

   一意のユーザー名とパスワードを入力して、次のコマンドを入力します。

   ```
   CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'your_strong_password';
   ```

1. <a name="create_database"></a>データベースを作成します。`wordpress-db` など、データベースにはわかりやすい名前を使用します。
**注記**  
次のコマンドのデータベース名を囲む区切り記号は、「バックティック」と呼ばれています。バックティック (```) キーは通常、標準キーボードの `Tab` キーの上に配置されています。バックティックは必ずしも必要ではありませんが、データベース名では使用できない文字 (ハイフンなど) の代わりに使用できます。

   ```
   CREATE DATABASE `wordpress-db`;
   ```

1. データベースに対して、以前作成した WordPress ユーザーに対する完全な権限を付与します。

   ```
   GRANT ALL PRIVILEGES ON `wordpress-db`.* TO "wordpress-user"@"localhost";
   ```

1. すべての変更を有効にするため、データベース権限をフラッシュします。

   ```
   FLUSH PRIVILEGES;
   ```

1. `mysql` クライアントを終了します。

   ```
   exit
   ```

**wp-config.php ファイルの作成と編集を行うには**

WordPress インストールフォルダには、`wp-config-sample.php` という名前の構成ファイル例が格納されています。この手順では、このファイルをコピーして、特定の構成に合うように編集します。

1. `wp-config-sample.php` ファイルを `wp-config.php` という名前でコピーします。この操作を実行すると、新しい構成ファイルが作成され、元のファイルがバックアップとしてそのまま保持されます。

   ```
   [ec2-user ~]$ cp wordpress/wp-config-sample.php wordpress/wp-config.php
   ```

1. お好みのテキストエディタ (`wp-config.php`、**nano** など) を使って **vim** ファイルを編集し、インストール用の値を入力します。お好みのテキストエディタがない場合、`nano` が初心者に適しています。

   ```
   [ec2-user ~]$ nano wordpress/wp-config.php
   ```

   1. `DB_NAME` を定義する行を探して、`database_name_here` を [Step 4](#create_database) の [WordPress インストール用にデータベースユーザーとデータベースを作成するには](#create_user_and_database) で作成したデータベース名に変更します。

      ```
      define('DB_NAME', 'wordpress-db');
      ```

   1. `DB_USER` を定義する行を探して、`username_here` を [Step 3](#create_database_user) の [WordPress インストール用にデータベースユーザーとデータベースを作成するには](#create_user_and_database) で作成したデータベースユーザーに変更します。

      ```
      define('DB_USER', 'wordpress-user');
      ```

   1. `DB_PASSWORD` を定義する行を探して、`password_here` を [Step 3](#create_database_user) の [WordPress インストール用にデータベースユーザーとデータベースを作成するには](#create_user_and_database) で作成した強力なパスワードに変更します。

      ```
      define('DB_PASSWORD', 'your_strong_password');
      ```

   1. `Authentication Unique Keys and Salts` というセクションを見つけます。これらの `KEY` と `SALT` の値は、WordPress ユーザーがローカルマシンに保存したブラウザクッキーに対する暗号化レイヤーを提供します。基本的に、ここで長くてランダムな値を指定すると、サイトのセキュリティが向上します。[https://api.wordpress.org/secret-key/1.1/salt/](https://api.wordpress.org/secret-key/1.1/salt/) にアクセスして、ランダムに生成されるキーセット値を取得し、`wp-config.php` ファイルにコピーして貼り付けることができます。PuTTY 端末にテキストを貼り付けるには、テキストを貼り付ける場所にカーソルを置き、PuTTY 端末内でマウスを右クリックします。

      セキュリティキーの詳細については、「[https://wordpress.org/support/article/editing-wp-config-php/\$1security-keys](https://wordpress.org/support/article/editing-wp-config-php/#security-keys)」にアクセスしてください。
**注記**  
次の値はサンプル専用です。これらの値を実際のインストールには使わないでください。

      ```
      define('AUTH_KEY',         ' #U$$+[RXN8:b^-L 0(WU_+ c+WFkI~c]o]-bHw+)/Aj[wTwSiZ<Qb[mghEXcRh-');
      define('SECURE_AUTH_KEY',  'Zsz._P=l/|y.Lq)XjlkwS1y5NJ76E6EJ.AV0pCKZZB,*~*r ?6OP$eJT@;+(ndLg');
      define('LOGGED_IN_KEY',    'ju}qwre3V*+8f_zOWf?{LlGsQ]Ye@2Jh^,8x>)Y |;(^[Iw]Pi+LG#A4R?7N`YB3');
      define('NONCE_KEY',        'P(g62HeZxEes|LnI^i=H,[XwK9I&[2s|:?0N}VJM%?;v2v]v+;+^9eXUahg@::Cj');
      define('AUTH_SALT',        'C$DpB4Hj[JK:?{ql`sRVa:{:7yShy(9A@5wg+`JJVb1fk%_-Bx*M4(qc[Qg%JT!h');
      define('SECURE_AUTH_SALT', 'd!uRu#}+q#{f$Z?Z9uFPG.${+S{n~1M&%@~gL>U>NV<zpD-@2-Es7Q1O-bp28EKv');
      define('LOGGED_IN_SALT',   ';j{00P*owZf)kVD+FVLn-~ >.|Y%Ug4#I^*LVd9QeZ^&XmK|e(76miC+&W&+^0P/');
      define('NONCE_SALT',       '-97r*V/cgxLmp?Zy4zUU4r99QQ_rGs2LTd%P;|_e1tS)8_B/,.6[=UK<J_y9?JWG');
      ```

   1. ファイルを保存し、テキストエディタを終了します。

**WordPress ファイルを Apache ドキュメントルートの下にインストールするには**
+ インストールフォルダの解凍、MySQL データベースとユーザーの作成、WordPress 構成ファイルのカスタマイズが終了したため、インストールファイルをウェブサーバーのドキュメントルートにコピーし、インストールスクリプトを実行して、インストールを終了する準備ができました。これらのファイルの場所は、ウェブサーバーの実際のルートで WordPress ブログを使用できるようにするかどうか (`my.public.dns.amazonaws.com` など)、またはルートの下のサブディレクトリやフォルダに格納するか (`my.public.dns.amazonaws.com/blog` など) によって異なります。
  + WordPress をドキュメントルートで実行する場合は、WordPress のインストールディレクトリのコンテンツを次のようにコピーします (ただし、ディレクトリ自体はコピーしません)。

    ```
    [ec2-user ~]$ cp -r wordpress/* /var/www/html/
    ```
  + WordPress をドキュメントルートの下の別のディレクトリで実行する場合、まず、そのディレクトリを作成してから、そこにファイルをコピーします。この例では、WordPress はディレクトリ `blog` から実行されます。

    ```
    [ec2-user ~]$ mkdir /var/www/html/blog
    [ec2-user ~]$ cp -r wordpress/* /var/www/html/blog/
    ```

**重要**  
セキュリティ上の理由から、次の手順にすぐに進まない場合は、Apache ウェブサーバー (`httpd`) を直ちに停止してください。インストールを Apache ドキュメントルートの下に移動すると、WordPress インストールスクリプトは保護されなくなり、Apache ウェブサーバーが実行している場合、攻撃者はブログへのアクセス権を取得する可能性があります。Apache ウェブサーバーを停止するには、**sudo systemctl stop httpd** コマンドを入力します。次の手順に移動する場合、Apache ウェブサーバーを停止する必要はありません。

**WordPress がパーマリンクを使用できるようにするには**

WordPress のパーマリンクが正しく機能するには Apache の `.htaccess` ファイルを使用する必要がありますが、Amazon Linux ではデフォルトで有効になっていません。Apache ドキュメントルートですべての上書きできるようにするには、次の手順を使用します。

1. お好みのテキストエディタ (`httpd.conf` や **nano** など) で、**vim** ファイルを開きます。お好みのテキストエディタがない場合、`nano` が初心者に適しています。

   ```
   [ec2-user ~]$ sudo vim /etc/httpd/conf/httpd.conf
   ```

1. `<Directory "/var/www/html">` で始まるセクションを見つけます。

   ```
   <Directory "/var/www/html">
       #
       # Possible values for the Options directive are "None", "All",
       # or any combination of:
       #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
       #
       # Note that "MultiViews" must be named *explicitly* --- "Options All"
       # doesn't give it to you.
       #
       # The Options directive is both complicated and important.  Please see
       # http://httpd.apache.org/docs/2.4/mod/core.html#options
       # for more information.
       #
       Options Indexes FollowSymLinks
   
       #
       # AllowOverride controls what directives may be placed in .htaccess files.
       # It can be "All", "None", or any combination of the keywords:
       #   Options FileInfo AuthConfig Limit
       #
       AllowOverride None
   
       #
       # Controls who can get stuff from this server.
       #
       Require all granted
   </Directory>
   ```

1. 上のセクションの `AllowOverride None` 行を `AllowOverride All` に変更します。
**注記**  
このファイルには複数の `AllowOverride` 行があります。必ず `<Directory "/var/www/html">` セクションの行を変更してください。

   ```
   AllowOverride All
   ```

1. ファイルを保存し、テキストエディタを終了します。

**PHP グラフィック描画ライブラリを AL2 にインストールするには**  
PHP 用の GD ライブラリを使用すると、イメージを変更することができます。ブログのヘッダーイメージをトリミングする必要がある場合は、このライブラリをインストールします。インストールするバージョンの phpMyAdmin は、このライブラリの特定の最小バージョン (バージョン 7.2 など) を必要とする場合があります。

次のコマンドを使用して、PHP グラフィック描画ライブラリを AL2 にインストールします。例えば、LAMP スタックをインストールする一環として amazon-linux-extras から php7.2 をインストールした場合、このコマンドは PHP グラフィック描画ライブラリのバージョン 7.2 をインストールします。

```
[ec2-user ~]$ sudo yum install php-gd
```

インストールしたバージョンを検証するには、次のコマンドを使用します。

```
[ec2-user ~]$ sudo yum list installed php-gd
```

出力例を次に示します。

```
php-gd.x86_64                     7.2.30-1.amzn2             @amzn2extra-php7.2
```

**Apache ウェブサーバーのファイル許可を修正するには**

WordPress で使用できる機能の中には、Apache ドキュメントルートへの書き込み権限が必要なものがあります (管理画面を使った、メディアのアップロードなど)。まだ適用していない場合は、次のグループメンバーシップとアクセス許可を適用します (詳細については、「」を参照してください[チュートリアル: AL2 に LAMP サーバーをインストールする](ec2-lamp-amazon-linux-2.md))。

1. `/var/www` とそのコンテンツのファイル所有権を `apache` ユーザーに付与します。

   ```
   [ec2-user ~]$ sudo chown -R apache /var/www
   ```

1. `/var/www` とそのコンテンツのグループ所有権を `apache` グループに付与します。

   ```
   [ec2-user ~]$ sudo chgrp -R apache /var/www
   ```

1. `/var/www` およびそのサブディレクトリのディレクトリ許可を変更してグループの書き込み許可を設定し、将来のサブディレクトリにグループ ID を設定します。

   ```
   [ec2-user ~]$ sudo chmod 2775 /var/www
   [ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

1. `/var/www` およびそのサブディレクトリのファイル許可を繰り返し変更します。

   ```
   [ec2-user ~]$ find /var/www -type f -exec sudo chmod 0644 {} \;
   ```
**注記**  
 WordPress を FTP サーバーとして使用する場合も、これよりも制限の少ないグループ設定が必要になります。これを実行するには、「[WordPress で推奨されている手順とセキュリティ設定](https://wordpress.org/support/article/changing-file-permissions/)」を参照してください。

1. Apache ウェブサーバーを再起動して、新しいグループと許可を有効にします。
   + 

     ```
     [ec2-user ~]$ sudo systemctl restart httpd
     ```

**AL2 で WordPress インストールスクリプトを実行する**

WordPress をインストールする準備ができました。使用するコマンドは、オペレーティングシステムによって異なります。この手順のコマンドは、AL2 で使用するためのものです。

1. **systemctl** コマンドを使って、`httpd` サービスとデータベースサービスがシステムブート時に起動することを確認します。

   ```
   [ec2-user ~]$ sudo systemctl enable httpd && sudo systemctl enable mariadb
   ```

1. データベースサーバーが実行中であることを確認します。

   ```
   [ec2-user ~]$ sudo systemctl status mariadb
   ```

   データベースサービスが実行されていない場合は、起動します。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. Apache ウェブサーバー (`httpd`) が実行中であることを確認します。

   ```
   [ec2-user ~]$ sudo systemctl status httpd
   ```

   `httpd` サービスが実行されていない場合は、起動します。

   ```
   [ec2-user ~]$ sudo systemctl start httpd
   ```

1. ウェブブラウザで WordPress ブログの URL を入力します (インスタンスのパブリック DNS アドレス、または `blog` フォルダに続くアドレス)。WordPress インストールスクリプトが表示されます。WordPress のインストールに必要な情報を入力します。[**WordPress のインストール**] を選択して、インストールを完了します。詳細については、WordPress のウェブサイトの [Step 5: Run the Install Script](https://wordpress.org/support/article/how-to-install-wordpress/#step-5-run-the-install-script) を参照してください。

## 次のステップ
<a name="wordpress-next-steps"></a>

WordPress ブログをテストしたら、設定の更新を検討します。

**カスタムドメイン名を使用する**  
EC2 インスタンスの EIP アドレスに関連付けられたドメイン名がある場合、EC2 パブリック DNS アドレスの代わりにその名前を使用するようにブログを設定できます。詳細については、WordPress ウェブサイトの「[サイトの URL の変更](https://wordpress.org/support/article/changing-the-site-url/)」を参照してください。

**ブログを設定する**  
読者にパーソナライズされた体験を提供するため、さまざまな[テーマ](https://wordpress.org/themes/)や[プラグイン](https://wordpress.org/plugins/)を使用するようにブログを設定できます。ただし、インストールプロセスで問題が発生してブログ全体が失われることがあります。インストール中に問題が発生した場合もブログを復元できるように、テーマやプラグインを員ストーする前にインスタンスのバックアップ Amazon マシンイメージ (AMI) を作成しておくことを強くお勧めします。詳細については、[「独自の AMI を作成する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html#creating-an-ami)」を参照してください。

**容量を増やす**  
WordPress ブログが人気になり処理能力やストレージを増やす必要がある場合は、次のステップを検討してください。
+ インスタンスストレージ領域を拡張する。詳細については、「Amazon EBS ユーザーガイド」の「[Amazon EBS Elastic Volumes](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-modify-volume.html)」を参照してください。
+ MySQL データベースを [Amazon RDS](https://aws.amazon.com/rds) に移動して、サービスが持つ容易にスケールする機能を活用する。

**インターネットトラフィックのネットワークパフォーマンスを向上させる**  
ブログにより世界中のユーザーからのトラフィックが増加すると予想される場合は、[AWS Global Accelerator](https://aws.amazon.com/global-accelerator) をご検討ください。Global Accelerator を使用すると、ユーザーのクライアントデバイスと AWSで実行中の WordPress アプリケーションとの間で、インターネットトラフィックのパフォーマンスを向上でき、低レイテンシーを実現できます。Global Accelerator は、 [AWS グローバルネットワーク](https://aws.amazon.com/about-aws/global-infrastructure/global_network/)を使用して、クライアントに最も近い AWS リージョンの正常なアプリケーションエンドポイントにトラフィックを誘導します。

**WordPress の詳細**  
WordPress の詳細については、「[http://codex.wordpress.org/](http://codex.wordpress.org/)」にある WordPress Codex ヘルプ文書を参照してください。

インストールのトラブルシューティングの詳細については、[「一般的なインストールの問題](https://wordpress.org/support/article/how-to-install-wordpress/#common-installation-problems)」を参照してください。

WordPress ブログのセキュリティを強化する方法については、[「WordPress の強化](https://wordpress.org/support/article/hardening-wordpress/)」を参照してください。

WordPress ブログをup-to-date状態に保つ方法については、[WordPress の更新](https://wordpress.org/support/article/updating-wordpress/)」を参照してください。

## ヘルプ\$1 パブリック DNS 名が変更されたため、ブログが壊れました
<a name="wordpress-troubleshooting"></a>

WordPress のインストールは、EC2 インスタンスのパブリック DNS アドレスを使用して自動的に設定されます。インスタンスを停止および再開した場合、パブリック DNS アドレスが変更され (Elastic IP アドレスに関連付けられている場合を除く)、ブログが存在しなくなった (または別の EC2 インスタンスに割り当てられた) アドレスにあるリソースを参照することになるため、ブログは機能しなくなります。問題の詳細な説明と考えられる解決策については、[「サイト URL の変更](https://wordpress.org/support/article/changing-the-site-url/)」を参照してください。

WordPress のインストールでこの問題が発生した場合は、WordPress の**wp-cli**コマンドラインインターフェイスを使用する以下の手順でブログを復元できる場合があります。

****wp-cli** を使用して WordPress のサイト URL を変更するには**

1. SSH を使って EC2 インスタンスに接続します。

1. インスタンスの古いサイト URL と新しいサイト URL を書き留めます。古いサイト URL は、WordPress をインストールした時点での EC2 インスタンスのパブリック DNS 名と考えられます。新しいサイト URL は、EC2 インスタンスの現在のパブリック DNS 名です。古いサイト URL が不明な場合、次のコマンドで **curl** を使用して調べることができます。

   ```
   [ec2-user ~]$ curl localhost | grep wp-content
   ```

   古いパブリック DNS 名への参照が出力に表示されます。次に例を示します (古いサイト URL は赤色になっています)。

   ```
   <script type='text/javascript' src='http://ec2-52-8-139-223.us-west-1.compute.amazonaws.com/wp-content/themes/twentyfifteen/js/functions.js?ver=20150330'></script>
   ```

1. 次のコマンドを使って **wp-cli** をダウンロードします。

   ```
   [ec2-user ~]$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
   ```

1. 次のコマンドを使って、WordPress インストールの古いサイト URL を検索し、置き換えます。EC2 インスタンスの古いサイト URL と新しいサイト URL、および WordPress のインストールパス (通常は `/var/www/html` または `/var/www/html/blog`) を置き換えます。

   ```
   [ec2-user ~]$ php wp-cli.phar search-replace 'old_site_url' 'new_site_url' --path=/path/to/wordpress/installation --skip-columns=guid
   ```

1. ウェブブラウザで、WordPress ブログの新しいサイト URL を入力し、サイトが再び正しく動作していることを確認します。そうでない場合は、[「サイト URL の変更](https://wordpress.org/support/article/changing-the-site-url/)」と[「一般的なインストールの問題](https://wordpress.org/support/article/how-to-install-wordpress/#common-installation-problems)」を参照してください。