CentOS7中编译PHP及开启JIT

实施过程

1、安装相关依赖
yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses curl gdbm-devel db4-devel libXpm-devel libX11-devel gd-devel gmp-devel expat-devel xmlrpc-c xmlrpc-c-devel libicu-devel libmcrypt-devel libmemcached-devel

2、下载并解压
建议查看官网release 版本
wget https://www.php.net/distributions/php-8.0.30.tar.gz
tar -zxvf php-8.0.30.tar.gz

3、预编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
./configure \
--with-config-file-path=/usr/local/php80/etc \
--with-config-file-scan-dir=/usr/local/php80/etc/php.d \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-curl \
--with-freetype-dir=/usr/local/freetype \
--enable-gd \
--enable-gd-jis-conv \
--with-gettext \
--with-iconv=/usr/local/libiconv \
--with-libxml-dir=/usr \
--with-kerberos \
--with-libdir=/usr/lib64 \
--with-mysqli \
--with-openssl \
--with-pcre-regex \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--enable-pdo \
--with-pdo-mysql \
--with-pdo-sqlite \
--with-pear \
--with-png-dir \
--with-jpeg-dir \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--with-bz2 \
--with-mhash \
--with-password-argon2 \
--with-sodium=/usr/local \
--disable-rpath \
--disable-fileinfo \
--disable-debug \
--enable-intl \
--enable-exif \
--enable-ftp \
--enable-cli \
--enable-bcmath \
--enable-libxml \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-opcache \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-xml \
--enable-zip

如果看到以下提示信息,说明 configure 成功。

4、安装
sudo make && make install
到安装目录查看版本
/usr/local/php80/bin/php -v

5、编辑配置
复制 php.ini
cp php.ini-production /usr/local/php80/etc/php.ini
复制 php-fpm
cp /usr/local/php80/etc/php-fpm.conf.default /usr/local/php80/etc/php-fpm.conf
cp /usr/local/php80/etc/php-fpm.d/www.conf.default /usr/local/php80/etc/php-fpm.d/www.conf
修改 php-fpm 配置,在 php-fpm.conf 中开启 pid = run/php-fpm.pid 配置项

6、配置启动 php-fpm
复制 php-fpm 的启动脚本
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
授权执行权限
chmod +x /etc/init.d/php-fpm
启动 php-fpm
/etc/init.d/php-fpm start 或者service php-fpm start

7、开启 openche 和 JIT

1
2
3
4
5
6
7
8
9
10
11
12
13
zend_extension=/usr/local/php80/lib/php/extensions/no-debug-non-zts-20231015/opcache.so

[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=192
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000

***

opcache.jit=1205
opcache.jit_buffer_size=64M

记录问题

Q: 编译时候出现错误,configure: error: Please reinstall the iconv library.
没有安装 iconv 库,iconv –version

iconv (GNU libiconv 1.17)
Copyright (C) 2000-2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Bruno Haible.

下载并编译

1
2
3
4
5
6
7
8
9
10
11
wget https://ftp.gnu.org/gnu/libiconv/libiconv-1.17.tar.gz
tar -zxvf libiconv-1.17.tar.gz
cd ./libiconv-1.17
./configure --prefix=/usr/local/libiconv --enable-static --enable-shared
#--prefix 参数表示安装目录,默认为 /usr/local;--enable-static 和 --enable-shared 参数表示编译时同时生成静态和动态库文件。
make
sudo make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/libiconv.conf
echo "/usr/local/libiconv/lib" > /etc/ld.so.conf.d/libiconv.conf
sudo ldconfig -v
sudo ldconfig

若还是出现问题,建议先--without-iconv再后面 make 的时候
make ZEND_EXTRA_LIBS='-liconv'

Q: 编译时候出现错误,configure: error: Package requirements (libsodium >= 1.0.8) were not met:
libsodium 版本低了直接上yum install libsodium libsodium-devel解决
不行的话可以继续手动编译

1
2
3
4
5
6
wget https://github.com/jedisct1/libsodium/releases/download/1.0.18-RELEASE/libsodium-1.0.18.tar.gz
tar -zxvf libsodium-1.0.18.tar.gz
cd libsodium-1.0.18
./configure CC="gcc -m64" --prefix=/usr/local/libsodium --libdir=/usr/lib64
sudo make
sudo make install

Q: 提示 OpenSSL 找不到 / libssl.so.1.1: cannot open shared object file: No such file or directory:
请果断升级 openssl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -xvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl
make && make install
echo "/usr/local/lib64/" >> /etc/ld.so.conf
ldconfig
openssl version
# 如果不行继续敲入
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/lib/openssl /usr/lib/openssl.old
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
sudo ldconfig -v
sudo ldconfig
openssl version
# OpenSSL 1.1.1w 11 Sep 2023

CentOS7中升级gcc

先情提要

Centos 7 默认 gcc 版本为 4.8,根本满足不了实际需求,使用 yum 也只会更新到维护期 15 年版本

实施过程

1、安装 centos-release-scl
sudo yum install centos-release-scl-rh

2、安装 devtoolset,注意,如果想安装 7._版本的,就改成 devtoolset-7-gcc_,以此类推,这里安装 Version 9
sudo yum install devtoolset-9*

3、激活对应的 devtoolset
scl enable devtoolset-9 bash

4、注册 devtoolset
进入/opt/rh 目录,source ./devtoolset-9/enable
记得注册成开机启动(/etc/rc.d/rc.local)
source /opt/rh/devtoolset-9/enable

5、替换旧版 gcc

1
2
3
4
5
6
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-9/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-9/root/bin/g++ /usr/bin/g++
gcc --version
g++ --version

6、二次确认安装是否就绪
查看当前 gcc
which gcc

/opt/rh/devtoolset-9/root/usr/bin/gcc

在 yum 查看 gcc 资讯
yum info devtoolset-9-gcc-c++

Installed Packages
Name : devtoolset-9-gcc-c++
Arch : x86_64
Version : 9.3.1
Release : 2.2.el7
Size : 31 M
Repo : installed
From repo : centos-sclo-rh
Summary : C++ support for GCC version 9
URL : http://gcc.gnu.org
License : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
Description : This package adds C++ support to the GNU Compiler Collection
: version 9. It includes support for most of the current C++ specification
and a lot of support for the upcoming C++ specification.

查看 gcc 版本
gcc -v

Thread model: posix
gcc version 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC)

若无误,则升级成功。

倘若服务器被入侵了,要检查哪些地方?

其实可以一句话概括:
检查可疑网络链接,可疑进程,可疑文件,可疑脚本任务
不过对于小白,还是建议重装,重装可以解决 99%问题。

1.查看异常进程活动-查找是否有异常进程和端口占用

1.1 查找占用 cpu 最多的进程

运行 top 命令后,键入大写字母 P 按 cpu 排序

1.2 查找占用内存最多的进程

运行 top 命令后,键入大写字母 M
ps aux | sort -k4nr

1.3 查找进程对应的文件

ls -la /proc/$pid/exe
ls -la /proc/$pid

1.4 跟踪异常进程运行情况

strace -tt -T -e trace=all -p $pid

1.5 查看进程打开的文件

lsof -p $pid

1.6 查看进程端口情况

查看所有端口
netstat -anltp
查看指定进程的端口
netstat -anltp | grep $pid
netstat -apn|more

1.7 清除恶意进程

清除可疑进程的进程链: ps -elf | grep [pid] kill -9 [pid]

2.查看账号安全

2.1 查看是否有存在新增异常账号

查找特权用户
awk -F ":" '$3==0{print $1}' /etc/passwd
查找可以远程登录的账号信息
awk '/\$1|\$6/{print $1}' /etc/shadow
查找 sudo 权限账户
cat /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

2.2 查看是否有账号异常登录情况

查看当前登录用户和其行为
w
查看所有用户最后一次登录的时间
lastlog
查看错误登陆信息
lasstb
查看所有用户的登录注销信息及系统的启动、重启及关机事件
last
查看登录成功的日期、用户名及 ip
grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'
查看试图爆破主机的 ip
grep refused /var/log/secure* | awk {'print $9'} | sort | uniq -c |sort -nr | more
grep "Failed password" /var/log/secure* | grep -E -o "(([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}))" | uniq -c
查看有哪些 ip 在爆破主机的 root 账号
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort
查看爆破使用的用户名字典
grep "Failed password" /var/log/secure | awk {'print $9'} | sort | uniq -c | sort -nr

3.检查开机启动项

一般通过crontab -l命令即可检测到定时任务后门。不同的 linux 发行版可能查看开机启动项的文件不大相同,Debian 系 linux 系统一般是通过查看/etc/init.d目录有无最近修改和异常的开机启动项。而 Redhat 系的 linux 系统一般是查看/etc/rc.d/init.d或者/etc/systemd/system等目录。
依次排查:

1
2
3
4
5
6
7
8
9
/var/spool/cron/*
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*

其后键入
cat /etc/rc.local
cat /etc/init.d/rc.local
chkconfig --list
ls -alt /etc/init.d
查看 anacron 异步定时任务 cat/etc/anacrontab
枚举主机所有服务 service--status-all

4.查找异常文件

4.1 查看最近一段时间内被修改的系统文件

查找find /etc/ /usr/bin/ /usr/sbin/ /bin/ /usr/local/bin/ -type f -mtime -T | xargs ls -la

4.2 按时间排序,确认最近是否有命令被替换,可以结合 rpm -Va 命令

ls -alt /usr/bin /usr/sbin /bin /usr/local/bin
rpm -Va>rpm.log

4.3 查看指定目录下文件时间的排序

ls -alt | head -n 10

4.4 使用 find 指令查找限定时间范围的文件

sudo find ./ -cmin -10 -name "*.php"

5.排查恶意 alias

检查 ~/.bashrc~/.bash_profile

6.排查恶意 ssh 公钥

/etc/.ssh/AuthorizedKeys
~/.ssh/AuthorizedKeys

7.系统文件被替换的情况下使用busybox

被替换的系统文件通常为 ld.so.preload
busybox ps -ef|grep watchdogs
busybox ps -ef|grep ksoftirqds

8.借助工具查杀病毒和 rootkit

8.1 查杀 rootkit

chkrootkit
(下载地址:http://www.chkrootkit.org)
rkhunter
(下载地址:http://rkhunter.sourceforge.net)

8.2 查杀病毒

clamav
(下载地址:http://www.clamav.net/download.html)

8.3 查杀 webshell

cloudwalker
(下载地址:http://github.com/chaitin/cloudwalker)

9. 添加命令审计

为历史的命令增加登录的 IP 地址、执行命令时间等信息

9.1 保存 1 万条命令:

sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile

9.2 在/etc/profile 的文件尾部添加如下行数配置信息

1
2
3
4
5
6
7
8
9
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi

export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"

写在最后

RootKit Hunter 後端偵測軟體之架設與執行
emergency-response-checklist