SourceGuardian 安全组件是 PHP 中较为重要和安全级别较高的安全组件,目前大部分 php 官方镜像未安装或启用 SG11,所以如果你的项目需要此组件,则可以参照此文档
一、配置 Dockerfile
在你原有的 Dockerfile 中,FROM 下面一行添加下述命令,
RUN PHP_VERSION=$(php -v | head -n1 | cut -d' ' -f2 | cut -d. -f1-2) \
&& mkdir -p /tmp/sourceguardian \
&& cd /tmp/sourceguardian \
&& curl -Os https://www.sourceguardian.com/loaders/download/loaders.linux-x86_64.tar.gz \
&& tar xzf loaders.linux-x86_64.tar.gz \
&& cp ixed.${PHP_VERSION}.lin "$(php -i | grep '^extension_dir =' | cut -d' ' -f3)/sourceguardian.so" \
&& echo "extension=sourceguardian.so" > $PHP_INI_DIR/conf.d/15-sourceguardian.ini \
&& rm -rf /tmp/sourceguardian
注意要放在 COPY 你的代码之前,避免每次构建重新剥离层。
如果基础镜像用的是alpine,可能会缺少libudev库,这是因为alpine默认使用的是mdev,建议替换基础镜像非alpine的,本文方案只测试过基于非alpine镜像的php镜像
二、验证是否开启
当访问时查看是否存在如下信息,如果有则证明添加成功
三、完整示例
本示例是一个Typecho的运行环境,新建一个文件 Dockerfile,内容如下,构建后运行,将typecho目录挂载到 /var/www/html 即可
FROM php:7.4-fpm
RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && apt-get install -y pkg-config zlib1g-dev libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev \
tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& docker-php-ext-configure gd \
--with-freetype=/usr/include/freetype2 \
--with-jpeg=/usr/include/ \
--with-webp=/usr/include/webp \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable mysqli
# 安装sourceguardian对应版本loader
RUN PHP_VERSION=$(php -v | head -n1 | cut -d' ' -f2 | cut -d. -f1-2) \
&& mkdir -p /tmp/sourceguardian \
&& cd /tmp/sourceguardian \
&& curl -Os https://www.sourceguardian.com/loaders/download/loaders.linux-x86_64.tar.gz \
&& tar xzf loaders.linux-x86_64.tar.gz \
&& cp ixed.${PHP_VERSION}.lin "$(php -i | grep '^extension_dir =' | cut -d' ' -f3)/sourceguardian.so" \
&& echo "extension=sourceguardian.so" > $PHP_INI_DIR/conf.d/15-sourceguardian.ini \
&& rm -rf /tmp/sourceguardian
RUN sed -i '2i\chown www-data:www-data -R /var/www/html&&chmod 755 -R /var/www/html' \
/usr/local/bin/docker-php-entrypoint
运行
# 构建
docker build -t typecho:v1 -f Dockerfile .
# 运行
docker run --restart=always -itd -p 9000:9000 -v ./typecho:/var/www/html typecho:v1