zoukankan      html  css  js  c++  java
  • LNMP环境搭建及服务器加固

    文章主要分为以下三个部分:

    • LNMP 环境搭建
    • PHP 连接 MySQL
    • Linux服务器加固

    LNMP 环境搭建

    利用腾讯云服务器搭建LNMP环境。

    步骤一:准备工作

    操作系统:centOS7

    1. 远程登录Linux实例(我使用的是Xshell配合密钥登录)。
    2. 查看linux发行版本
    cat /etc/redhat-release  # 查看centOS版本
    

    步骤二:安装Nginx

    1. 安装Nginx
    yum -y install nginx
    
    1. 查看安装的Nginx版本
    nginx -v
    

    返回结果如下所示,表示安装成功。

    image-20210925151807801

    步骤三:安装MySQL

    由于之前安装过MySQL,所以需卸载后重新安装一次。(未安装的可以直接从第4步开始)

    1. 查询是否安装了MySQL
    rpm -qa |grep mysql
    

    返回结果如下

    image-20210925154308236

    1. 卸载MySQL,将上述查询出来的全部删除
    rpm -e --nodeps mysql-community-libs-5.6.51-2.el7.x86_64
    rpm -e --nodeps mysql-community-client-5.6.51-2.el7.x86_64
    rpm -e --nodeps mysql-community-release-el7-5.noarch
    rpm -e --nodeps mysql-community-common-5.6.51-2.el7.x86_64
    rpm -e --nodeps mysql-community-server-5.6.51-2.el7.x86_64
    

    使用rpm -qa | grep mysql 查询无返回后即卸载成功。

    1. 删除相关目录

    查找MySQL相关目录

    find / -name mysql
    

    image-20210925155234221

    删除上述查询到的相关目录

    rm -rf /etc/selinux/targeted/active/modules/100/mysql
    rm -rf /usr/share/mysql
    rm -rf /usr/lib64/mysql
    rm -rf /var/lib/mysql
    rm -rf /var/lib/mysql/mysql
    
    # 删除/etc/my.cnf
    rm -rf /etc/my.cnf
    # 删除 /var/log/mysqld.log(如果不删除,会导致新安装的mysql无法生成新密码,无法登陆)
    rm -rf /var/log/mysqld.log
    
    1. 运行以下命令更新YUM源
    rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
    
    1. 安装MySQL(安装时间较长)
    yum -y install mysql-community-server
    
    1. 查看MySQL版本号
    mysql -V
    

    返回结果如下,表示安装成功。

    image-20210925172035768

    1. 启动MySQL
    systemctl start mysqld
    
    1. 设置开机启动
    systemctl enable mysqld
    systemctl daemon-reload
    

    步骤四:安装PHP

    1. 更新 yum 中 PHP 的软件源
    rpm -Uvh https://mirrors.cloud.tencent.com/epel/epel-release-latest-7.noarch.rpm
    rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
    
    1. 安装PHP
    yum -y install mod_php72w.x86_64 php72w-cli.x86_64 php72w-common.x86_64 php72w-mysqlnd php72w-fpm.x86_64
    
    1. 查看PHP版本
    php -v
    

    返回如下结果,表示安装成功

    image-20210925173657087

    步骤五:配置Nginx

    1. 首先备份Nginx配置文件。
    cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
    
    1. 修改Nginx配置文件,添加Nginx对PHP的支持。
    • 打开配置文件
    vim /etc/nginx/nginx.conf
    
    • i 进入编辑模式
    • server 大括号内,添加如下配置信息
            #除下面提及的需要添加的配置信息外,其他配置保持默认值即可。
            #将location / 大括号内的信息修改为以下所示,配置网站被访问时的默认首页。
            location / {
                index index.php index.html index.htm;
            }
    
            #添加下列信息,配置Nginx通过fastcgi方式处理您的PHP请求。
            location ~ .php$ {
                root /usr/share/nginx/html;    #将/usr/share/nginx/html替换为您的网站根目录,本教程使用/usr/share/nginx/html作为网站根目录。
                fastcgi_pass 127.0.0.1:9000;   #Nginx通过本机的9000端口将PHP请求转发给PHP-FPM进行处理。
                fastcgi_index index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include fastcgi_params;   #Nginx调用fastcgi接口处理PHP请求。
            }                
    

    添加配置信息后,最终结果如下所示

    image-20210925210434801

    • 按下 Esc 键后,输入 :wq 并回车保存编辑并关闭配置文件。
    1. 查看与启动Nginx服务
    systemctl status nginx
    systemctl start nginx
    
    1. 设置Nginx服务开机自动启动
    systemctl enable nginx
    
    1. 在本地浏览器中访问云服务器IP地址,查看Nginx服务是否正常运行。
    http://云服务器IP
    

    显示如下,则说明Nginx安装配置成功

    image-20210925224101640

    步骤六:配置MySQL

    1. 运行以下命令查看/var/log/mysqld.log文件,获取并记录root用户初始密码
    grep 'temporary password' /var/log/mysqld.log
    

    返回结果如下:

    image-20210925214007165

    1. 配置MySQL的安全性
    mysql_secure_installation
    

    安全性的配置包含以下五个方面:

    • 重置root账号密码
    Enter password for user root: #输入上一步获取的root用户初始密码
    The 'validate_password' plugin is installed on the server.
    The subsequent steps will run with the existing configuration of the plugin.
    Using existing password for root.
    Estimated strength of the password: 100 
    Change the password for root ? (Press y|Y for Yes, any other key for No) : Y #是否更改root用户密码,输入Y
    New password: #输入新密码,长度为8至30个字符,必须同时包含大小写英文字母、数字和特殊符号。特殊符号可以是()` ~!@#$%^&*-+=|{}[]:;‘<>,.?/
    Re-enter new password: #再次输入新密码
    Estimated strength of the password: 100 
    Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
    
    • 输入 y 删除匿名用户账号
    By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment.
    Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y  #是否删除匿名用户,输入Y
    Success.
    
    • 输入 y 禁止root账号远程登录
    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y #禁止root远程登录,输入Y
    Success.
    
    • 输入 y 删除test库以及对test库的访问权限
    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y #是否删除test库和对它的访问权限,输入Y
    - Dropping test database...
    Success.
    
    • 输入 y 重新加载授权表
    Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y #是否重新加载授权表,输入Y
    Success.
    All done!
    

    步骤七:配置PHP

    1. 新建phpinfo.php文件,用于展示PHP信息
    • 运行以下命令新建文件
    vim <网站根目录>/phpinfo.php  #将<网站根目录>替换为您配置的网站根目录。
    

    网站根目录是在nginx.conf文件中location ~ .php$ 括号内配置的 root 值,本教程配置的网站根目录为/usr/share/nginx/html,因此命令为

    vim /usr/share/nginx/html/phpinfo.php
    
    • 输入以下内容,函数 phpinfo() 会展示PHP的所有配置信息
    <?php echo phpinfo(); ?>
    

    保存退出

    1. 启动PHP-FPM
    systemctl start php-fpm
    
    1. 设置开机自启动
    systemctl enable php-fpm
    

    步骤八:测试访问LNMP平台

    1. 打开浏览器
    2. 在地址栏输入http://<ECS实例公网IP地址>/phpinfo.php

    返回结果如下,表示LNMP环境部署成功。

    image-20210925223642234

    测试完成后,运行以下命令将phpinfo.php文件删除,消除安全隐患。

    rm -rf /usr/share/nginx/html/phpinfo.php
    

    参考文档:https://help.aliyun.com/document_detail/97251.html

    https://cloud.tencent.com/document/product/213/38056

    PHP 连接MySQL

    PHP 5及以上版本可以使用以下两种方式连接MySQL:

    • MySQLi extension
    • PDO (PHP Data Objects)

    两者有自己的优势,PDO应用在多种不同数据库中,如果项目需要在多种数据库中切换,建议使用PDO,MySQLi只针对MySQL数据库。

    其中MySQLi和PDO在安装MySQL时已自动安装,可以再phpinfo页面查看

    image-20210927212936250

    image-20210927213013720

    包含以上页面即已安装成功。

    MySQLi 连接数据库

    PHP访问MySQL数据库的步骤如图所示:

    PHP 访问数据库的步骤

    使用扩展中的 mysqli_connct() 函数可以实现 MySQL 数据库的连接,函数语法格式如下:

    mysqli_connect(
        [string $host = ini_get("mysqli.default_host")
        [, string $username = ini_get("mysqli.default_user")
        [, string $password = ini_get("mysqli.default_pw")
        [, string $dbname = ""
        [, int $port = ini_get("mysqli.default_port")
        [, string $socket = ini_get("mysqli.default_socket")
    ]]]]]] )
    

    参数说明如下:

    • $host: 可选参数,要连接的服务器。可以是主机名或IP地址
    • $username: 可选参数,登录MySQL使用的用户名
    • $password: 可选参数,登录密码
    • $dbname: 可选参数,执行查询时使用的默认数据库
    • $port: 可选参数,指定连接到MySQL服务器的端口号
    • $socket: 可选参数,指定socket或要使用的已命名pipe,很少用到

    以下通过一个简单的代码实现连接数据库

    1)面向过程风格的写法

    <?php
        $host = 'localhost';
    	$username = 'root';
    	$password = 'root';
    	$dbname = 'test';
    	$port = '3306';
    	$link = @mysqli_connect($host,$username,$password,$dbname,$port); //连接到数据库
    	if($link){
            mysqli_set_charset($link,'UTF-8');	//设置数据库字符集
            $sql = 'select * from user';		//SQL 语句
            $result = mysqli_query($link, $sql);	//执行 SQL 语句,并返回结果
            $data = mysqli_fetch_all($result);	//从结果中获取所有数据
            mysqli_close($link);
        }else{
            die('数据库连接失败!');
        }
    	echo '<pre>';
    	print_r($data);
    ?>
    

    在命令行中可以使用php -l phptest.php来检查语法错误。

    2)面向对象风格写法

    <?php
        $host = 'localhost';
    	$username = 'root';
    	$password = 'root';
    	$dbname = 'test';
        $mysql = new mysqli($host,$username,$password,$dbname);
    	if($mysql -> connect_errno){
            die('数据库连接失败:'.$mysql->connect_errno);
        }else{
            $mysql -> set_charset('UTF-8');
            $sql = 'select * from user';
            $result = $mysql -> query($sql);
            $data = $result -> fetch_all();
            $mysql -> close();
        }
    	echo '<pre>';
    	print_r($data);
    ?>
    

    PDO 连接MySQL数据库

    使用PDO连接数据库流程入下:

    PDO 访问流程

    代码如下

    <?php
    	$servername = 'localhost';
    	$username = 'root';
    	$password = 'root';
    
    	try {
            $conn = new PDO("mysql:host=$servername;",$username,$password);
            echo "连接成功";
        }
    	catch(PDOException $e)
        {
            echo $e->getMessage();
        }   
    ?>
    

    参考:

    PHP连接数据库

    PHP使用PDO连接数据库

    PHP 连接 MySQL

    服务器加固

    Linux系统被应用与大部分企业的服务器上,因此在等保测评中主机加固也是必须要完成的一项环节。

    Linux的主机加固可以分为:账号安全,认证安全,协议安全,审计安全。

    账号安全

    1. 口令生存期

    修改文件 /etc/login.defs

    • PASS_MAX_DAYS 90 密码最长有效期
    • PASS_MIN_DAYS 10 密码修改之间的最小天数
    • PASS_MIN_LEN 8 密码最小长度
    • PASS_WARN_AGE 7 口令失效前多少天开始通知用户修改密码

    image-20211002103132557

    2. 口令复杂度

    编辑文件 /etc/pam.d/password-auth ,修改如下

    password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=  difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1
    
    • difok 定义新密码中必须要有几个字符和旧密码不同
    • minlen 新密码的最小长度
    • ucredit 新密码中可以包含的大写字母的最大数目。-1 至少一个
    • lcredit 新密码中可以包含的小写字母的最大数
    • dcredit 新密码中可以包含的数字的最大数目

    image-20211002103958499

    注:这个密码强度的设定只对"普通用户"有限制作用,root用户无论修改自己的密码还是修改普通用户的时候,不符合强度设置依然可以设置成功

    3. 对用户登录次数进行限制

    编辑文件 /etc/pam.d/sshd

    auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300
    

    image-20211002105000766

    • pam_tally2 查看被锁定的用户
    • pam_tally2 --reset -u username 将被锁定的用户解锁

    4. 禁止root用户远程登录(看是否需要)

    编辑文件 /etc/ssh/sshd_config

    PermitRootLogin   no
    
    • PermitRootLogin no 不允许root登陆

    • Protocol 2 修改ssh使用的协议版本

    • MaxAuthTries 3 修改允许密码错误次数

    生效要重启sshd进程

    5. 设置历史命令保存条数和账户超时时间

    打开 /etc/profile ,修改如下

    HISTSIZE=1000
    TMOUT=600
    

    image-20211002110522493

    6. 禁用无用账户

    cat /etc/passwd 命令查看口令文件,确认不必要的账号

    使用 passwd -l user 锁定不必要的账号

    协议安全

    1. openssh升级(按需做)

    yum update openssh
    

    2. 定时任务(防止病毒感染)

    定时任务检查:

    crontab -l
    

    一次性任务检查:

    at -l
    

    3. 防止flood攻击

    vim /etc/sysctl.conf
    

    增加 net.ipv4.tcp_sysncookies = 1 ,然后 sysctl -p

    4. 检查异常进程

    # 检查cpu占用前10
    ps aux|sort -rn -k +3|head
    # 检查内存占用前10
    ps aux|sort -rn -k +4|head
    

    认证权限

    1. 配置用户最小权限

    chmod 644 /etc/passwd
    chmod 400 /etc/shadow
    chmod 644 /etc/group
    

    2. 文件与目录缺省权限 控制

    cp /etc/profile /etc/profile.bak #备份
    vim /etc/profile
    

    增加如下内容

    umask 027
    source /etc/profile
    

    日志审计

    1. 定期查看系统日志

    cat /var/log/messages
    cat /var/log/secure
    

    重要服务器可以将日志定向传输到指定服务器进行分析

    2. 启用远程日志功能

    vim /etc/rsyslog.conf
    

    你想把哪种类型的日志文件发送给服务端,你就把它原来对应的目录改为: @日志服务器IP

    把所有日志文件都发送给服务器的话,在文件最后加上

    *.*	@@syslog日志服务器IP
    

    注意:*和@之间是tab键。

    参考:

    浅谈Linux主机加固:https://www.freebuf.com/articles/system/250501.html

    Linux服务器安全加固10条建议:https://cloud.tencent.com/developer/article/1623140

    Linux服务器安全加固:https://blog.csdn.net/qq_36119192/article/details/82906799

  • 相关阅读:
    eslint and stylelint config
    CSS3 animaion 和 transition 比较
    css之px、em、rem
    Three.js 中 相机的常用参数含义
    ES6中函数调用自身需要注意的问题
    MySQL数据库迁移之data目录
    ES6扩展运算符(三点运算符)...的用法
    Vue 组件通信方案
    关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出
    Ubuntu 使用gps
  • 原文地址:https://www.cnblogs.com/augustine0654/p/15467707.html
Copyright © 2011-2022 走看看