最近想把电脑系统换成Linux系统,所以搭个LNMP环境,熟悉下Linux,再尝试一下安全加固
0.准备
0.1更改Yum源
1  | mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak  | 

参考:
[1] Centos-7修改yum源为国内的yum源
0.2更新
1  | yum -y update  | 
1.安装Nginx
1.1添加Yum源
默认情况下CentOS中无Nginx的源

需要自己添加Yum源来进行下载
1  | rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm  | 

执行完成之后,会在/etc/yum.respos.d下多出一个nginx.repo

再执行命令进行安装
1  | yum install -y nginx  | 

安装完成之后,查看nginx的安装目录
1  | whereis nginx  | 

Nginx的默认路径
Nginx配置路径:/etc/nginx/
PID目录:/var/run/nginx.pid
错误日志:/var/log/nginx/error.log
访问日志:/var/log/nginx/access.log
默认站点目录:/usr/share/nginx/html
浏览器查看

启动Nginx并设置开机自动启动
1  | systemctl status nginx  | 

查看Nginx的安装路径
1  | rpm -ql nginx  | 

卸载的时候可以使用
1  | rpm -e nginx  | 
源码安装和Yum安装的区别
a.Yum安装可以直接使用systemctl status nginx;源码安装需要自己创建软链接
b.Yum安装会创建很多目录,卸载时比较麻烦;源码安装可以自己设定参数,卸载时直接删除目录
c.Yum安装由于源的问题,可能不是最新版本;源码安装可自行选择安装版本
参考:
[1] centos7通过yum安装nginx
[2] CentOS7中使用yum安装Nginx的方法
[3] CentOS7yum或源码包安装Nginx的异同(有具体安装过程)
[4] How to install and use Nginx on CentOS 7 / RHEL 7
2.安装PHP-fpm
2.1安装php
安装epel源
1  | yum install epel-release  | 

安装这个软件包后,会自动配置Yum的软件仓库
安装remi源
1  | yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm  | 
remi源保证了软件的最新版

添加完源之后,使用yum update更新一下
安装Yum-utils,协助管理Yum
1  | yum install yum-utils  | 

提示已经安装过了
激活remi库
1  | yum-config-manager --enable remi-php72  | 


查找Yum源中php 7.2的扩展
1  | yum search php72 | more #用more显示  | 

安装php 7.2
1  | yum install php72  | 

确认php安装是否正确
1  | php72 --version  | 

安装php 7.2扩展
1  | yum install php72-php-fpm php72-php-gd php72-php-json php72-php-mbstring php72-php-mysqlnd php72-php-xml php72-php-xmlrpc php72-php-opcache  | 

查看php模块
1  | php72 --modules  | 

开启php-fpm
1  | systemctl status php72-php-fpm  | 

2.2配置Nginx
查询Nginx的用户和用户组
1  | egrep '^(user|group)' /etc/nginx/nginx.conf  | 

修改php-fpm配置文件,设置用户为Nginx
1  | vi /etc/opt/remi/php72/php-fpm.d/www.conf  | 

保存修改,重启php-fpm服务
1  | systemctl restart php72-php-fpm  | 

修改Nginx配置文件
1  | vim /etc/nginx/conf.d/default.conf  | 

保存修改,重启Nginx服务

创建一个测试页面phpinfo.php
1  | touch /usr/share/nginx/html/phpinfo.php  | 

浏览器访问http://localhost/phpinfo.php

CentOS 7 开启80端口
1  | firewall-cmd --zone=public --add-port=80/tcp --permanent  | 
参考:
[1] How to install PHP 7.2 on CentOS 7/RHEL 7
3.安装Mariadb
Mariadb是MySQL的分支,在Oracle收购了MySQL后,MySQL有闭源的潜在风险,因此社区采用分支的方式避免MySQL闭源。MariaDB完全兼容MySQL
CentOS7自带了MariaDB,可以卸载了重新安装
1  | rpm -qa | grep mariadb  | 

卸载完成之后,使用Yum安装
1  | yum install mariadb-server  | 

开启Maria DB
1  | systemctl start mariadb  | 

对数据库进行配置
1  | mysql_secure_installation  | 

测试登录
1  | mysql -uroot -p  | 
进入Maria DB界面即安装成功

设置Maria DB字符集为utf-8
1  | vim /etc/my.cnf  | 
1  | vim /etc/my.cnf.d/client.cnf  | 
1  | vim /etc/my.cnf.d/mysql-clients.cnf  | 
重启服务
1  | systemctl restart mariadb  | 
进入Maria DB查看字符集
1  | show variables like "%character%";  | 

参考:
[1] centos7 安装Mariadb
4.PHP连接Maria DB
4.1添加数据库
创建一个Emerald数据库
1  | create database Emerald;  | 
使用Emerald数据库
1  | use Emerald;  | 
创建Member表
1  | create table `Member`(`ID` int(20) auto_increment,`userName` varchar(50) not null,`Password` varchar(50) not null,`nickname` varchar(50) not null,primary key(`ID`,`userName`))engine=innodb default charset=utf8;  | 
查看Member表结构
1  | desc Member;  | 

添加数据
1  | insert into `Member`(userName,Password,nickname) values('chessur','Druid','chessur');  | 
查询数据
1  | select * from Member;  | 

在网站根目录创建一个test.php,测试数据库是否正常使用
1  | touch /usr/share/nginx/html/test.php  | 
使用PDO连接数据库
1  | <?php  | 

查看网页是否正常显示数据

显示数据和数据库中一致,PHP连接Maria DB正常
5.安全加固
5.1Nginx
禁止目录遍历
1  | http{  | 
1.16.0默认禁止目录遍历
删除错误信息中的版本信息
1  | http{  | 
未修改前

修改后

关闭存放数据上传等目录的PHP解析
1  | server{  | 
限制HTTP请求方法
1  | server{  | 
1  | server{  | 
在Nginx1.9.9上两种方法均可实现,但1.16.0上无法实现
设置timeout来防御DOS攻击
1  | http{  | 
设置日志记录文件、记录内容、记录格式
1  | http{  | 

Nginx测试配置文件是否正确
1  | nginx -t -c /etc/nginx/nginx.conf  | 
5.2PHP-fpm
php-fpm.conf配置文件优先级高于php.ini
1  | #php.ini参数设置  | 
禁用危险函数

5.3Maria DB
确保运行Maria DB的用户为一般用户,存放数据目录权限为mysql
1  | vim /etc/my.cnf  | 
开启Maria DB二进制日志,在误删除数据的情况下,可以通过二进制日志恢复到某个时间点
1  | vim /etc/my.cnf  | 
禁止root账号远程访问,root账号只允许来自本地主机的登录
1  | MariaDB>grant all privileges on *.* to root@localhost identified by 'password' with grant option;  | 
删除匿名账号和空口令账号
1  | MariaDB>use mysql;  | 
设置活动目录
1  | secure-file-priv=NULL  | 
为null时,不允许导入导出
指定文件夹时,只能导入导出到指定文件夹
为空时,没有任何限制