LNMP環境搭建及伺服器加固
文章主要分為以下三個部分:
- LNMP 環境搭建
- PHP 連線 MySQL
- Linux伺服器加固
LNMP 環境搭建
利用騰訊雲伺服器搭建LNMP環境。
步驟一:準備工作
作業系統:centOS7
- 遠端登入Linux例項(我使用的是Xshell配合金鑰登入)。
- 檢視linux發行版本
cat /etc/redhat-release # 檢視centOS版本
步驟二:安裝Nginx
- 安裝Nginx
yum -y install nginx
- 檢視安裝的Nginx版本
nginx -v
返回結果如下所示,表示安裝成功。
步驟三:安裝MySQL
由於之前安裝過MySQL,所以需解除安裝後重新安裝一次。(未安裝的可以直接從第4步開始)
- 查詢是否安裝了MySQL
rpm -qa |grep mysql
返回結果如下
- 解除安裝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
查詢無返回後即解除安裝成功。
- 刪除相關目錄
查詢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
- 執行以下命令更新YUM源
rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
- 安裝MySQL(安裝時間較長)
yum -y install mysql-community-server
- 檢視MySQL版本號
mysql -V
返回結果如下,表示安裝成功。
- 啟動MySQL
systemctl start mysqld
- 設定開機啟動
systemctl enable mysqld
systemctl daemon-reload
步驟四:安裝PHP
- 更新 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
- 安裝PHP
yum -y install mod_php72w.x86_64 php72w-cli.x86_64 php72w-common.x86_64 php72w-mysqlnd php72w-fpm.x86_64
- 檢視PHP版本
php -v
返回如下結果,表示安裝成功
步驟五:配置Nginx
- 首先備份Nginx配置檔案。
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
- 修改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
並回車儲存編輯並關閉配置檔案。
- 檢視與啟動Nginx服務
systemctl status nginx
systemctl start nginx
- 設定Nginx服務開機自動啟動
systemctl enable nginx
- 在本地瀏覽器中訪問雲伺服器IP地址,檢視Nginx服務是否正常執行。
http://雲伺服器IP
顯示如下,則說明Nginx安裝配置成功
步驟六:配置MySQL
- 執行以下命令檢視/var/log/mysqld.log檔案,獲取並記錄root使用者初始密碼
grep 'temporary password' /var/log/mysqld.log
返回結果如下:
- 配置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
- 新建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(); ?>
儲存退出
- 啟動PHP-FPM
systemctl start php-fpm
- 設定開機自啟動
systemctl enable php-fpm
步驟八:測試訪問LNMP平臺
- 開啟瀏覽器
- 在位址列輸入
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();
}
?>
參考:
伺服器加固
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