PHP hardening
From CMU ITSC Network
การตั้งค่า PHP เพื่อให้มีความปลอดภัยมากขึ้น
Docker image พื้นฐาน
FROM php:8.2.6-apache
ENV TZ=Asia/Bangkok
RUN set -x \
&& apt-get update \
&& apt-get install -y libmagickwand-dev libldap2-dev libjpeg-dev libpng-dev libzip-dev libicu-dev libbz2-dev \
&& docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu \
&& docker-php-ext-install ldap \
&& docker-php-ext-configure gd --with-jpeg \
&& docker-php-ext-install gd \
&& docker-php-ext-install mysqli \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install opcache \
&& docker-php-ext-install zip \
&& docker-php-ext-install bz2 \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install intl \
&& docker-php-ext-install gettext \
&& pecl install apcu \
&& echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apcu.ini \
&& pecl install -o -f imagick \
&& docker-php-ext-enable imagick \
&& rm -rf /var/lib/apt/lists/*
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \
&& a2enmod remoteip \
&& a2enmod rewrite \
&& a2enmod headers \
&& echo 'LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined' | tee "$APACHE_CONFDIR/conf-available/xff.conf" \
&& a2enconf xff.conf \
&& echo "ServerSignature Off" | tee "$APACHE_CONFDIR/conf-available/serversigoff.conf" \
&& echo "ServerTokens Prod" | tee -a "$APACHE_CONFDIR/conf-available/serversigoff.conf" \
&& echo "SetEnvIf X-Forwarded-Proto \"https\" HTTPS=on" | tee "$APACHE_CONFDIR/conf-available/ssloffload.conf" \
&& a2enconf ssloffload.conf \
&& a2enconf serversigoff.conf \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
จาก Dockerfile จะแบ่งเป็นสองส่วนส่วนแรกเป็นการติดตั้ง package/library/extension สามารถปรับเปลี่ยนได้ตามการใช้งาน
ส่วนที่สองเป็นการ fine tuning apache2 ได้แก่
- การทำให้ apache2 log IP address ของ client เหมือนอยู่หลัง reverse proxy จาก headers x-forwarded-for
- การปิด server signature เพื่อป้องกันการหาข้อมูล
- การตั้ง protocol https สำหรับหลัง reverse proxy
เมื่อได้ Dockerfile สำหรับ image เริ่มต้นแล้วจะ build image ด้วยคำสั่ง
docker build -t my-php:8.2.6 .
tag 8.2.6 นั่นล้อตาม tag ของ php ต้นทาง สามารถเปลี่ยนได้ตาม tag ที่ต้องการใช้งาน image my-php นี่คือตัวตั้งต้นที่จะนำไปใช้งานต่อในหลาย ๆ application