【Docker】phpコンテナの暗号化を有効にする

Dockerでlamp環境を構築しようとする場合、個人の方が公開されている情報が多くとても助かります。 案件によっては、phpで暗号化、複合化が必要になるケースも出てきます。

実現する方法を探していると、Dockerfileに下記と追加すればmcryptが使えるという情報も見受けられます。

RUN docker-php-ext-install -j$(nproc) mcrypt

しかし、PHP7.2以降では、次のようなエラーで有効に出来ません。

error: /usr/src/php/ext/mcrypt does not exist

今回はその理由も踏まえて、暗号化を有効にする方法を記載します。

PHP7.2以降での暗号化について

PHPのバージョン7.2以降は、暗号化の処理をOpenSSLで実装する事が推奨されています。
それは次のような回答によるものだと思われます。

mcrypt 拡張モジュールは十年近くにわたって放置されており、極めて使いづらいものです。 そこで、この拡張モジュールを非推奨にしました。かわりに OpenSSL を使いましょう。 mcryptは PHP 7.2 でコアから削除されて、PECL に移る予定です。

mcrypt自体がアップデートされていない古いモジュールのため、利便性も(恐らく)安全性に問題があるようです。

PHP: PHP 7.1.x で推奨されなくなる機能 - Manual

PECLとは

PHPの拡張モジュールを管理するリポジトリです。
PHPユーザーには馴染みがある、PEARのラッパーのような扱いのようです。

PHP: PECL インストール入門 - Manual
PECL :: The PHP Extension Community Library

本来は、php.iniに追加します。
Dockerのコンテナの場合は、docker-php-ext-enableで追加したモジュールを有効にする事で使えるようになります。

適用用法

方法は2種類あります。

  • OpenSSLで暗号化する(推奨)
  • PECLでmcryptモジュールを追加する

今回はPHPコンテナの7.2-appacheを使用します。
コンテナ内のOSはDebian系のようですので、他のディストリビューションの場合は別途合わせて下さい。

OpenSSLで暗号化する

linuxにapt-getでopensslをインストールします。

Dockerfile

RUN apt-get update
RUN apt-get install -y openssl

PECLでmcryptモジュールを追加する

peclでmcryptモジュールをインストールします。
18年12月時点では、peclで管理するmcryptモジュールの安定板は1.0.1なので、インストール時に安定板のバージョンを指定しています。

Dockerfile

RUN pecl install mcrypt-1.0.1
RUN docker-php-ext-enable mcrypt

©︎2017-2018 WebSandBag