MENU

在PHP容器环境安装PHP-SG11扩展

April 16, 2024 • 博文

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镜像

二、验证是否开启

当访问时查看是否存在如下信息,如果有则证明添加成功

phpsg.0ab97d85.png

三、完整示例

本示例是一个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