Difference between revisions of "PHP hardening"

From CMU ITSC Network
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
 
= การตั้งค่า PHP เพื่อให้มีความปลอดภัยมากขึ้น =
 
= การตั้งค่า PHP เพื่อให้มีความปลอดภัยมากขึ้น =
 +
บทความนี้จะเป็นตัวอย่างการทำ Docker image ของ php-apache ถ้าเป็นการใช้งาน php แบบติดตั้งเอง สามารถนำเนื้อหาไปประยุกต์ใช้ได้
  
 
== Docker image พื้นฐาน ==
 
== Docker image พื้นฐาน ==
Line 53: Line 54:
 
docker build -t my-php:8.2.6 .
 
docker build -t my-php:8.2.6 .
 
</syntaxhighlight>tag 8.2.6 นั่นล้อตาม tag ของ php ต้นทาง สามารถเปลี่ยนได้ตาม tag ที่ต้องการใช้งาน image my-php นี่คือตัวตั้งต้นที่จะนำไปใช้งานต่อในหลาย ๆ application
 
</syntaxhighlight>tag 8.2.6 นั่นล้อตาม tag ของ php ต้นทาง สามารถเปลี่ยนได้ตาม tag ที่ต้องการใช้งาน image my-php นี่คือตัวตั้งต้นที่จะนำไปใช้งานต่อในหลาย ๆ application
 +
 +
== Config PHP ini ==
 +
<syntaxhighlight lang="dockerfile">
 +
FROM my-php:8.2.6
 +
COPY src/ /var/www/html/
 +
COPY local.ini /usr/local/etc/php/conf.d/
 +
 +
</syntaxhighlight>build image ที่จะใช้งานโดยการนำ source code เข้าไปใน image และ ใช้งาน configuration ของ php ที่อยู่ใน file local.php เข้าไปใน /usr/local/etc/php/conf.d/ เพื่อ overwrite php.ini หลัก ทำให้สามารถปรับแต่ง local.ini ได้ตามต้องการ โดยไม่ต้องแก้ image พื้นฐานทุกรอบที่มีการเปลี่ยนแปลง local configuration หรือเปลี่ยนแปลง source code
 +
 +
== local.ini ==
 +
<syntaxhighlight>
 +
upload_max_filesize = 25M
 +
post_max_size = 25M
 +
enable_dl              = Off
 +
disable_functions      = system, exec, shell_exec, passthru, show_source, highlight_file, popen, proc_open, fopen_with_path, dbmopen, dbase_open, posix_mkfifo
 +
# see also: http://ir.php.net/features.safe-mode
 +
disable_classes        =
 +
allow_url_fopen        = Off
 +
allow_url_include      = Off
 +
variables_order        = "GPCS"
 +
allow_webdav_methods    = Off
 +
</syntaxhighlight>
 +
 +
* upload_max_filesize, post_max_size ปรับได้ตามความเหมาะสม
 +
* disable_functions ลดหรือเพิ่มได้ตามความเหมาะสม หลัก ๆ ที่ควรปิดคือตามตัวอย่างข้างต้น
 +
 +
== Reference ==
 +
https://cheatsheetseries.owasp.org/cheatsheets/PHP_Configuration_Cheat_Sheet.html

Latest revision as of 10:04, 25 May 2023

การตั้งค่า PHP เพื่อให้มีความปลอดภัยมากขึ้น

บทความนี้จะเป็นตัวอย่างการทำ Docker image ของ php-apache ถ้าเป็นการใช้งาน 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

Config PHP ini

FROM my-php:8.2.6
COPY src/ /var/www/html/
COPY local.ini /usr/local/etc/php/conf.d/

build image ที่จะใช้งานโดยการนำ source code เข้าไปใน image และ ใช้งาน configuration ของ php ที่อยู่ใน file local.php เข้าไปใน /usr/local/etc/php/conf.d/ เพื่อ overwrite php.ini หลัก ทำให้สามารถปรับแต่ง local.ini ได้ตามต้องการ โดยไม่ต้องแก้ image พื้นฐานทุกรอบที่มีการเปลี่ยนแปลง local configuration หรือเปลี่ยนแปลง source code

local.ini

upload_max_filesize = 25M
post_max_size = 25M
enable_dl               = Off
disable_functions       = system, exec, shell_exec, passthru, show_source, highlight_file, popen, proc_open, fopen_with_path, dbmopen, dbase_open, posix_mkfifo
# see also: http://ir.php.net/features.safe-mode
disable_classes         =
allow_url_fopen         = Off
allow_url_include       = Off
variables_order         = "GPCS"
allow_webdav_methods    = Off
  • upload_max_filesize, post_max_size ปรับได้ตามความเหมาะสม
  • disable_functions ลดหรือเพิ่มได้ตามความเหมาะสม หลัก ๆ ที่ควรปิดคือตามตัวอย่างข้างต้น

Reference

https://cheatsheetseries.owasp.org/cheatsheets/PHP_Configuration_Cheat_Sheet.html