Difference between revisions of "PHP hardening"
(Created page with "= การตั้งค่า PHP เพื่อให้มีความปลอดภัยมากขึ้น = == Docker image พื้นฐาน == FROM php:...") |
|||
(3 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
= การตั้งค่า PHP เพื่อให้มีความปลอดภัยมากขึ้น = | = การตั้งค่า PHP เพื่อให้มีความปลอดภัยมากขึ้น = | ||
+ | บทความนี้จะเป็นตัวอย่างการทำ Docker image ของ php-apache ถ้าเป็นการใช้งาน php แบบติดตั้งเอง สามารถนำเนื้อหาไปประยุกต์ใช้ได้ | ||
== Docker image พื้นฐาน == | == Docker image พื้นฐาน == | ||
+ | <syntaxhighlight lang=dockerfile> | ||
FROM php:8.2.6-apache | FROM php:8.2.6-apache | ||
Line 7: | Line 9: | ||
RUN set -x \ | 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" \ | RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \ | ||
− | |||
&& a2enmod remoteip \ | && a2enmod remoteip \ | ||
− | |||
&& a2enmod rewrite \ | && 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 | ||
+ | </syntaxhighlight> | ||
− | + | จาก 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 ด้วยคำสั่ง<syntaxhighlight lang="bash"> | |
+ | docker build -t my-php:8.2.6 . | ||
+ | </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