1. 程式人生 > 其它 >LNMP環境搭建及伺服器加固

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

返回結果如下所示,表示安裝成功。

步驟三:安裝MySQL

由於之前安裝過MySQL,所以需解除安裝後重新安裝一次。(未安裝的可以直接從第4步開始)

  1. 查詢是否安裝了MySQL
rpm -qa |grep mysql

返回結果如下

  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

刪除上述查詢到的相關目錄

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

返回結果如下,表示安裝成功。

  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

返回如下結果,表示安裝成功

步驟五:配置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請求。
        }                

新增配置資訊後,最終結果如下所示

  • 按下 Esc 鍵後,輸入 :wq 並回車儲存編輯並關閉配置檔案。
  1. 檢視與啟動Nginx服務
systemctl status nginx
systemctl start nginx
  1. 設定Nginx服務開機自動啟動
systemctl enable nginx
  1. 在本地瀏覽器中訪問雲伺服器IP地址,檢視Nginx服務是否正常執行。
http://雲伺服器IP

顯示如下,則說明Nginx安裝配置成功

步驟六:配置MySQL

  1. 執行以下命令檢視/var/log/mysqld.log檔案,獲取並記錄root使用者初始密碼
grep 'temporary password' /var/log/mysqld.log

返回結果如下:

  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環境部署成功。

測試完成後,執行以下命令將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頁面檢視

包含以上頁面即已安裝成功。

MySQLi 連線資料庫

PHP訪問MySQL資料庫的步驟如圖所示:

使用擴充套件中的 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連線資料庫流程入下:

程式碼如下

<?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 口令失效前多少天開始通知使用者修改密碼

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 新密碼中可以包含的數字的最大數目

注:這個密碼強度的設定只對"普通使用者"有限制作用,root使用者無論修改自己的密碼還是修改普通使用者的時候,不符合強度設定依然可以設定成功

3. 對使用者登入次數進行限制

編輯檔案 /etc/pam.d/sshd

auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300
  • 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

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