利用源码编译搭建lnmp环境

[TOC]

搭建环境

lamp倒是常用,只有自己的博客是用的Nginx搭的(hexo真的很好看)

在虚拟机安装Ubuntu18(Macos主题真的好看)

下载18.04镜像,创建新虚拟机

挂上镜像

安装配置步骤略。。。

备份,换国内源,更新软件

1
2
3
4
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak  
sudo vi /etc/apt/sources.list
sudo apt-get update
sudo apt-get upgrade

竟然没有Python2,只有python3,安装python2好了
顺便装下常用库

1
2
3
apt-get isntall python
apt-get install python3-pip
pip install numpy selenium beautifulsoup4 pandas matplotlib seaborn scipy requests selenium beautifulsoup4 pyquery pymysql pymongo redis flask django jupyter

安装python完成

安装gcc,g++编译环境

1
2
apt-get install gcc-8
apt-get install g++-8

安装缺少的软件

1
2
apt install curl
apt install git

美化,安装MacOs主题略。。。

安装nginx

1、安装依赖项

1
2
3
4
5
6
7
8
#安装依赖:gcc、g++依赖库
sudo apt-get install build-essential libtool
#安装 pcre依赖库(http://www.pcre.org/)
sudo apt-get install libpcre3 libpcre3-dev
#安装 zlib依赖库(http://www.zlib.net)
sudo apt-get install zlib1g-dev
#安装ssl依赖库
sudo apt-get install openssl

2、下载解压源码

1
2
wget http://nginx.org/download/nginx-1.17.2.tar.gz
tar -xvzf nginx-1.17.2.tar.gz

3、编译

1
2
3
4
#创建Makefile
sudo ./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock
#编译
sudo make && make install

4、启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo nginx
groupadd nobody
#查看Nginx进程
ps -ef|grep nginx
#Nginx常见命令
sudo nginx -s stop
sudo nginx -s quit
sudo nginx -s reload
#-s都是采用向 Nginx 发送信号的方式
#在/var/run目录下创建nginx目录
mkdir /var/run/nginx
#设置pid目录
vim nginx.conf
pid /var/run/nginx.pid

5、成功

6、附录,./configure参数说明

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
编译选项官方提供的有:
–prefix=path 定义一个目录来保存你的nginx的提供功能的文件夹,就这好比我们安装软件的时候软件存放的目录,如果我们在编译的不指定安装位置,那么默认的位置/usr/local/nginx 目录
–sbin-path=path 设置nginx执行脚本的位置,这里如果设置在path变量里面,就可以在bash环境下,任意使用nginx命令,默认位置prefix/sbin/nginx 注意这里的prefix是
在配置文件里面配置的路径
–conf-path=path 配置nginx配置文件的路径,如果不指定这个选项,那么配置文件的默认路径就会是 prefix/conf/nginx.conf
–pid-path =path 配置nginx.pid file的路径,一般来说,进程在运行的时候的时候有一个进程id,这个id会保存在pid file里面,默认的pid file的放置位置是prefix/logs/nginx.pid
–error-log-path=path 设置错误日志的存放路径,如果不指定,就默认 prefix/logs/error.log
–http-log-path= path 设置http访问日志的路径,如果不指定,就默认 prefix/logs/access.log
–user=name 设置默认启动进程的用户,如果不指定,就默认 nobody
–group=name 设置这个用户所在的用户组,如果不指定,依然是nobody
这些是我们常用的编译选项,其他的可以均保持默认,如需特殊指定,可上nginx官网查阅 http://nginx.org/en/docs/configure.html
下面是一些不常用的选项
–with-http_ssl_module -开启HTTP SSL模块,使NGINX可以支持HTTPS请求。需要安装了OPENSSL
–with-http_flv_module
–with-http_stub_status_module - 启用 “server status” 页(可有可无)
–without-http_gzip_module - 禁用 ngx_http_gzip_module. 如果启用,需要 zlib 。
–without-http_ssi_module - 禁用 ngx_http_ssi_module
–without-http_referer_module - 禁用 ngx_http_referer_module
–without-http_rewrite_module - 禁用 ngx_http_rewrite_module. 如果启用需要 PCRE 。
–without-http_proxy_module - 禁用 ngx_http_proxy_module
–without-http_fastcgi_module - 禁用 ngx_http_fastcgi_module
–without-http_memcached_module - 禁用 ngx_http_memcached_module
–without-http_browser_module - 禁用 ngx_http_browser_module
–http-proxy-temp-path=PATH - Set path to the http proxy temporary files
–http-fastcgi-temp-path=PATH - Set path to the http fastcgi temporary files
–without-http - 禁用 HTTP server(用作代理或反向代理)
–with-mail - 启用 IMAP4/POP3/SMTP 代理模块
–with-mail_ssl_module - 启用 ngx_mail_ssl_module
–with-openssl=DIR - Set path to OpenSSL library sources

安装mysql

1、安装依赖项

1
apt-get install libncurses5 libncurses5-dev build-essential flex bison cmake mpi-default-dev libicu-dev python-dev libbz2-dev libaio-dev

2、下载解压源码

1
2
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26.tar.gz
tar xzvf mysql-5.7.26.tar.gz

下载boost依赖

1
2
wget https://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
tar -xzvf boost_1_59_0.tar.gz

3、编译
安装boost

1
2
3
4
cd boost_1_59_0
./bootstrap.sh
#稍等片刻。。。。
./b2 install

boost安装完成标志:

正式编译

1
2
3
4
5
6
7
#预编译
cmake .
cmake . -DBUILD_CONFIG=mysql_release -DCPACK_MONOLITHIC_INSTALL=ON -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQLX_TCP_PORT=33060 -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DMYSQLX_UNIX_ADDR=/usr/local/mysql/mysqlx.sock -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/usr/local/mysql/etc -DENABLE_DOWNLOADS=ON -DWITH_BOOST=system -DWITH_EMBEDDED_SERVER=OFF -DWITH_OPENMP=ON

#编译
make -j4
make install

4、配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#创建用户和组
groupadd mysql
useradd -g mysql mysql

#设置目录权限
cd /usr/local/mysql
chown -R mysql:mysql ./
chgrp -R mysql .

#放置mysql服务
cp support-files/mysql.server /etc/init.d/mysql.server

#进入mysql
support-files/mysql.server start
bin/mysql -u root -p

#修改root密码
set password for root@localhost = password('密码');

安装php7

1、安装依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt-get install libxml2-dev
sudo apt-get install libcurl3-openssl-dev
sudo apt-get install libcurl4-gnutls-dev
sudo apt-get install libbz2-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libpng-dev
sudo apt-get install libxpm-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install libt1-dev
sudo apt-get install libmcrypt-dev
sudo apt-get install libmysql++-dev
sudo apt-get install libxslt1-dev
sudo apt-get install libssl-dev

2、下载解压源码

1
2
3
4
wget http://cn2.php.net/get/php-7.3.2.tar.xz/from/this/mirror
#慢的要死,找了个国内镜像站下的
http://mirrors.sohu.com/php/
tar -xvJf php-7.3.2.tar.xz

3、编译

1
2
3
./configure --prefix=/usr/local/php --exec-prefix=/usr/local/php --with-mysqli --with-pdo-mysql --with-gd --bindir=/usr/local/php/bin --sbindir=/usr/local/php/sbin --includedir=/usr/local/php/include --libdir=/usr/local/php/lib/php --mandir=/usr/local/php/php/man --with-config-file-path=/usr/local/php/etc --with-openssl --enable-mbstring --enable-fpm

make && make install

4、配置

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
#设置php.ini
cp php.ini-production /usr/local/php/etc/php.ini

#拷贝php-fpm服务并赋予执行权限
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm

#拷贝php-fpm进程服务的配置文件和扩展配置文件
cp /usr/local/php/etc/php-fpm.conf.default  /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default  /usr/local/php/etc/php-fpm.d/www.conf

#设置php环境变量
vi /etc/profile.d/php.sh
export PATH=$PATH:/usr/local/php/bin/:/usr/local/php/sbin/
source /etc/profile.d/php.sh

#启动php-fpm
/usr/local/php/sbin/php-fpm
chkconfig php-fpm on

#linux 下PHP服务操作
service php-fpm start 开启
service php-fpm stop 停止
service php-fpm restart 重启

#配置nginx支持php
编辑php-fpm.conf,翻到php-fpm.conf最后一行,include的路径要对应于自己的安装目录

/usr/local/php/etc/php-fpm.d/www.conf 的user、group和nginx配置文件nginx.conf的user要对应

配置nginx的nginx.conf , 这两处地方修改为

location / {
            root   html;
            index  index.html index.htm index.php;
        }


location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
#目录一定要正确
            fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
            include        fastcgi_params;
        }

去掉对应注释,并修改

成功解析php

测试php连接mysql

修改php.ini配置中的mysqli.default_socket值为下图中UNIX socket值

新建mysql用户test,密码123456(以后会改的)
配置权限

1
grant select,delete,update,create,drop on *.* to test@"localhost" identified by "123456";

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$servername = "localhost";
$username = "test";
$password = "123456";

// 创建连接
$conn = mysqli_connect($servername, $username, $password);

// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功</br>";

?>

连接成功

小结

至此,搭建环境完成,中间遇到了许多错误,通过百度等搜索引擎也解决了,错误解决方法直接放在搭建步骤里了,没有单独写出来。
接下来是加固环节。


加固环境

加固linux

1
2
3
4
5
6
7
8
9
#更改root密码,修改密码有效期
vim /etc/login.defs
PASS_MAX_DAYS 90 密码最长有效期
PASS_MIN_DAYS 10 密码修改之间最小的天数
PASS_MIN_LEN 8 密码长度
PASS_WARN_AGE 7 口令失效前多少天开始通知用户修改密码
#限制登陆次数,在 #%PAM-1.0 的下面,加入下面的内容,表示当密码输入错误达到3次,就锁定用户150秒,如果root用户输入密码错误达到3次,锁定300秒。
vim /etc/pam.d/sshd
auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300

加固Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
配置nginx.conf:
#隐藏服务器版本信息(于http模块下添加)
server_tokens off;

#限制http请求方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}

#禁止目录浏览(于http模块下添加)
autoindex off;

#封杀特定文件
location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ {
rewrite ^/(.*)$ $host permanent;}

#封杀特定user-agent
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {
return 403;
}
if ($http_user_agent ~* "" ) {
return 403;
}

(还有一些过滤关键字之类的配置,作用于waf冲突,稍后再写)

加固mysql

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
#root用户以及其他用户使用复杂的密码,避免弱口令
#为web服务创建单独的mysql账号,单独分配权限
见上
#禁止root用户远程登录
use mysql;
update user set host = "localhost" where user = "root" and host = "%";
flush privileges;

#删除密码为空的用户
delect from mysql.user where user='用户名' or password='';

#禁止mysql的文件导入导出(修改my.cnf的[mysqld]下)
show global variables like '%secure%';
若secure_file_priv为NULL,则无需修改

#配置mysql日志
查看是否启用日志
show variables like 'log_%';

配置日志(my.cnf的[mysqld]下添加)
#log
log-error=/var/log/mysql_error.log
log=/var/log/mysql.log
long_query_time=2
log-slow-queries= /var/log/slowquery.log

加固php

1
2
3
4
5
6
7
8
9
10
11
修改php.ini
#禁用不安全的php函数
disable_functions = show_source,system,shell_exec,passthru,exec,popen,proc_open,proc_get_status,eval

#关闭php错误信息,避免输出错误
expose_php = Off
#打开错误日志记录
log_errors = On
error_log = /var/log/php_error.log
#PHP版本信息
expose_php = off

总结

编译安装是真的麻烦。。。各种目录啊,默认配置问题搞得头大,但是也确实接触到了许多新的东西,那些用apt,yum一键安装涉及不到的东西。而且源码编译安装也能对各个软件做到更精确的配置

加固方面做得不是很到位,也不知道该怎么做,就结合自己打ctf遇到的问题简单写了些,不算太多,从网上找的资料都是些挺全面的生产环境中用到的方案。
例如阿里云的安全部署指南
很全面,单纯的copy过来就没啥意思了(笑)

就CTF来看,有不少问题就是安全加固做的不到位引起的,例如通过sql注入上传一句话,源码泄露等情况。

希望自己在接下来的学习过程中多多加油吧。