一、准备工作
1.查看内核,升级内核,删除内核,切换内核
查看发布版本号
cat /etc/issue
lsb_release -a
查看内核版本号
uname -sr
uname -a
升级内核方法
到 Ubuntu 网站 http://kernel.ubuntu.com/~kernel-ppa/mainline/ 选择所需要的 Ubuntu 内核版本目录 比如最新的内核版本 v4.12.9 目录(发布日期 2018 年 3 月 21 日) 在介绍页面中,根据硬件的架构选择内核版本, X86 硬件架构 64 位操作系统应选择 AMD64
下载 3 个内核 deb 安装文件
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.12/linux-headers-4.15.12-041512_4.15.12-041512.201803211230_all.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.12/linux-headers-4.15.12-041512-generic_4.15.12-041512.201803211230_amd64.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.12/linux-image-4.15.12-041512-generic_4.15.12-041512.201803211230_amd64.deb
安装下载的内核文件
sudo dpkg -i *.deb
安装完成以后,reboot
重新启动,验证内核的版本
uname -sr
查看内核列表
sudo dpkg --get-selections |grep linux-image
删除旧内核(可选)
sudo apt-get remove linux-image-4.4.0-105-generic linux-image-4.4.0-62-generic linux-image-extra-4.4.0-105-generic linux-image-extra-4.4.0-62-generic linux-image-generic
笔者旧内核为 linux-image-4.4.0-105-generic linux-image-4.4.0-62-generic linux-image-extra-4.4.0-105-generic linux-image-extra-4.4.0-62-generic linux-image-generic
删除下载的内核 deb 安装文件
rm linux-headers-4.15.12-041512_4.15.12-041512.201803211230_all.deb linux-headers-4.15.12-041512-generic_4.15.12-041512.201803211230_amd64.deb linux-image-4.15.12-041512-generic_4.15.12-041512.201803211230_amd64.deb
2.进行 ubuntu 系统与软件更新
sudo apt-get update
更新源,源保存的文件为:/etc/apt/sources.list
sudo apt-get upgrade
3.安装常用软件
①.SSH
sudo apt-get install openssh-server
查看状态:
service ssh status/start/stop/restart
或:/etc/init.d/ssh status/start/stop/retsrt
实际上,service 命令就是执行/etc/init.d 脚本,二者功能是一样的
②.Vim
sudo apt-get install vim
③.lrzsz
sudo apt-get install lrzsz
使用方法详见 https://blog.csdn.net/qq_33912199/article/details/79596492
④.RAR/ZIP
sudo apt-get install p7zip p7zip-full p7zip-rar
二、安装 LAMP
1. 安装 Apache
sudo apt-get install apache2
- 测试: 浏览器访问 Ubuntu 的 IP,出现”It Works!”网页即表明安装 apache 成功
- 查看状态:
service apache2 status/start/stop/restart
- 重启 apache:
sudo /etc/init.d/apache2 restart
- 查看 apache 版本:
apache2 -v
( 安装至此本人 apache 的版本为 2.4.18 )如果需要升级到最新版本的 Apache
使 add-apt-repository 可用
sudo apt-get install python-software-properties -y
sudo apt-get install software-properties-common -y
添加源 并下载最新 Apache
sudo add-apt-repository ppa:ondrej/apache2
sudo apt-get update
sudo apt-get dist-upgrade
( 更新后本人 apache 的版本为 2.4.29 )
网站目录权限设置:
网站目录文件权限的设置对网站的安全至关重要,下面简单介绍网站目录文件权限的基本设定。
单一站点用户权限设置
我们假设 http 服务器运行的用户和用户组是 www-data,网站用户为 www-data,网站根目录是/var/www/html
- 我们首先设定网站目录和文件的所有者和所有组为 www-data,www-data,如下命令:
sudo chown -R www-data:www-data /var/www/html
- 设置网站目录权限为 750,750 是 www-data 用户对目录拥有读写执行的权限,这样 www-data 用户可以在任何目录下创建文件,用户组有有读执行权限,这样才能进入目录,其它用户没有任何权限。
sudo find -type d -exec chmod 750 {} \;
- 设置网站文件权限为 640,640 指只有 www-data 用户对网站文件有更改的权限,http 服务器只有读取文件的权限,无法更改文件,其它用户无任何权限。
sudo find -not -type d -exec chmod 640 {} \;
- 针对个别目录设置可写权限。比如网站的一些缓存目录就需要给 http 服务有写入权限。例如 discuz x2 的/data/目录就必须要写入权限。
sudo find data -type d -exec chmod 770 {} \;
多站点分独立用户权限设置
将多站点使用独立权限更加安全,如其中一个站点有漏洞被上传木马,入侵者没有同服务器上其他的站点的操作权限
案例假设: /var/www 目录下 有 www.aaa.com 和 www.bbb.com 两个虚拟主机网站,要实现的目的就是比如 www.aaa.com 被入侵,入侵者看不到并且修改不了 www.bbb.com 站内的文件。www.aaa.om 使用 aaa 用户,www.bbb.com 使用 bbb 用户。apache 装完即有 www-data 用户 和 www-data 用户组,所以网站都是以这个用户用户组运行
先建两个用户
useradd -g www-data -d /var/null -s /usr/sbin/nologin aaa
useradd -g www-data -d /dev/null -s /usr/sbin/nologin bbb
添加虚拟主机时候添加指定用户权限
以添加 www.aaa.com 为例:
<VirtualHost *:80> DocumentRoot /var/www/www.abc.com ServerName www.aaa.com ServerAlias www.aaa.com <Directory "/var/www/www.abc.com"> Require user aaa #Require user:定义了允许哪些用户访问,各用户之间用空格分开。 </Directory> </VirtualHost>
重启下 apache,这样每个网站运行用户就分离出来了
追加自动压缩网页代码功能,在主配置文件继续加入
启动 Gzip mod_deflate
<IfModule mod_deflate.c> <IfModule mod_filter.c> #压缩率, 6 是建议值. DeflateCompressionLevel 6 #压缩率, 6 是建议值. AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript application/x-javascript AddOutputFilterByType DEFLATE application/xml application/rss+xml application/atom_xml application/atom_xml AddOutputFilterByType DEFLATE application/xml application/xhtml AddOutputFilterByType DEFLATE application/x-httpd-php AddOutputFilterByType DEFLATE image/svg+xml </IfModule> </IfModule>
设置目录以及文件权限
chown root.root /var/www
chmod 711 /var/www
(这样就可以禁止其它组查看该目录的权限,入侵者就看不到/var/www 下有那些网站目录,当然你可以来个 751)
cd /var/www
chown aaa.www-data www.aaa.com
chmod 500 www.aaa.com
cd www.aaa.com
chmod -R 700 upload
因为这个目录要上传,所以要给写入的权限
chmod -R 500 images
图片目录给 500 就可以,不需要写入,400 也应该可以
chmod -R 500 *.php
防止 php 或者 html 被挂马,给个 500 或者 400 就行
(权限 设置根据自身情况而定)
防止信息泄露
vi /etc/apache2/conf-enabled/security.conf
ServerTokens Prod ServerSignature Off 设置后不显示系统版本以及 apache 版本号,让入侵者不知道我们使用的是什么环境从而降低漏洞利用风险 禁用自动索引模块
rm /etc/apache2/mods-enabled/autoindex.load
rm /etc/apache2/mods-enabled/autoindex.conf
将 apache 的工作模式 prefork 改成 worker 或者 event
apache2.4.10 版本之后拥有三种工作模式 prefork worker event,最新的为 event , 三种工作模式自行百度,推荐 event
检测 apache 正在使用哪个 mpm
apachectl -V | grep -i mpm
列出可用的 mpm 模块(确保 mpm_worker 在列表中)
ls /etc/apache2/mods-available/mpm*
列出开启的 mpm 模块(如果 mpm_event 没有开启,我们应该开启 mpm_event,禁用 mpm_prefork 模块)
ls -l /etc/apache2/mods-enabled/mpm*
禁用 mpm_prefork 模块
sudo a2dismod mpm_prefork
开启 mpm_event 模块
sudo a2enmod mpm_event
忽略网址 url 大小写区分
a2enmod speling
配置文件 apache2.conf 加入以下代码
<IfModule speling_module> CheckSpelling on </IfModule>
IIS 下 默认是不区分大小写的比如 a.com/ABC.htm 会自动转换为 a.com/abc.htm apache 则不同,需要加载模块 speling_module
2.安装 PHP
方式一:较简单
① PHP5.6
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php5.6 php5.6-fpm
② PHP7.0
sudo apt-get install php7.0 php7.0-fpm
③ PHP7.1
sudo apt-get install php7.1 php7.1-fpm
④ PHP7.2
sudo apt-get install php7.2 php7.2-fpm
开启重写转向
sudo a2enmod rewrite
sudo a2enmod headers
如果安装多个版本 PHP,逐个或选择性安装以上 PHP 版本即可 安装完成后,reboot 重启,默认是运行 5.6 版本的 php(命令行下 php-v 显示的最高版本 7.1) 编辑 bashrc 加入 PHP 版本切换自定义命令,为方便在不同 PHP 版本间切换
sudo vi .bashrc
编辑 bashrc 加入自定义命令,为方便在不同 php 版本间切换(bashrc 文件尾加入以下代码)alias php56=’sudo a2dismod php7.0 && sudo a2dismod php7.1 && sudo a2dismod php7.2 && sudo a2enmod php5.6 && sudo /etc/init.d/apache2 restart’ alias php70=’sudo a2dismod php5.6 && sudo a2dismod php7.1 && sudo a2dismod php7.2 && sudo a2enmod php7.0 && sudo /etc/init.d/apache2 restart’ alias php71=’sudo a2dismod php5.6 && sudo a2dismod php7.0 && sudo a2dismod php7.2 && sudo a2enmod php7.1 && sudo /etc/init.d/apache2 restart’ alias php72=’sudo a2dismod php5.6 && sudo a2dismod php7.0 && sudo a2dismod php7.1 && sudo a2enmod php7.2 && sudo /etc/init.d/apache2 restart’ alias apache-r=’sudo /etc/init.d/apache2 restart’ # (重启 apache 自定义命令,方便重启 apache 自行选择是否需要) alias php56-r=’sudo /etc/init.d/php5.6-fpm restart’ # (重启 php5.6-fpm 自行选择是否需要) alias php71-r=’sudo /etc/init.d/php7.1-fpm restart’ # (重启 php7.2-fpm 自行选择是否需要) alias php72-r=’sudo /etc/init.d/php7.2-fpm restart’ # (重启 php7.2-fpm 自行选择是否需要) alias mysql-r=’sudo /etc/init.d/mysql restart’ # (重启 mysql 自定义命令,方便重启 mysql 自行选择是否需要) 复制过去检查是否为单引号,本博客有时候会把单引号转义不想研究
命令行下 php72 可切换到 php7.2 版本,其他类同 注:在/etc/php 目录下有对应版本号的文件夹,编辑相应的 php.ini 文件可配置相应的 php 版本
方式二:FPM 模式,多 PHP 版本共存(不同虚拟主机可以同时使用不同 PHP 版本)
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
安装 PHP5.6 和 PHP7.2 或更多其他版本
sudo apt-get install php5.6 php5.6-fpm php5.6-mbstring php5.6-mysql php5.6-xml php5.6-gd php5.6-curl php5.6-json php5.6-zip php5.6-mcrypt
sudo apt-get install php7.1 php7.1-fpm php7.1-mbstring php7.1-mysql php7.1-xml php7.1-gd php7.1-curl php7.1-json php7.1-zip
sudo apt-get install php7.2 php7.2-fpm php7.2-mbstring php7.2-mysql php7.2-xml php7.2-gd php7.2-curl php7.2-json php7.2-zip
启用以下两个模块 sudo a2enmod proxy proxy_fcgi
开启重写转向 sudo a2enmod rewrite headers
默认选择 PHP7.2 版本,在 apache 配置文件/etc/apache2/apache2.conf 中 添加以下代码
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
</FilesMatch>
由于某些 PHP 程序较老与最新的 PHP7.2 存在不兼容,在需要使用 PHP5.6 版本的虚拟主机<VirtualHost *:80>
中添加以下代码:
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost"
</FilesMatch>
使用 FPM 方式运行 PHP 更高效,但也潜在漏洞危害 修复方案:修改 php.ini 文件,将 cgi.fix_pathinfo 的值设置为 0
防止 php 木马执行 webshell ,在 php.ini 中添加设置 disable_functions=passthru,exec,shell_exec,system
关闭开启 PHP 详细错误信息 /etc/php/7.0/fpm/php.ini 设置 display_errors = On /etc/php/7.0/fpm/php-fpm.conf 设置 php_flag[display_errors] = on
防止跨站、跨目录的安全设置
- 步骤一:全局设置
vi /etc/php/7.2/fpm/pool.d/www.conf
末尾添加:
env[TMP] = /tmp/ env[TMPDIR] = /tmp/ env[TEMP] = /tmp/ php_admin_value[session.save_path] = /tmp/ php_admin_value[upload_tmp_dir] = /tmp/ php_admin_value[open_basedir] = /var/www/:/tmp/:/var/tmp:/proc/ ;开启慢执行日志 slowlog = /etc/php/7.2/fpm/pool.d/$pool.slow.log request_slowlog_timeout = 2s
> (其他版本如 php5.6 类同,以上设置完成既不会再出现使用 open_basedir 导致 upload 无法上传文件等问题)
-
步骤二:安装 apache2-mod-php 模块
sudo apt-get install apache2-mod-php5.6
sudo apt-get install apache2-mod-php7.1
sudo apt-get install apache2-mod-php7.2
虚拟主机中添加限制目录设置
假设 abc.com 网站的网站目录为/var/www/abc_com,限制代码如下:
php_admin_value open_basedir “/var/www/abc_com/”
使用 open_basedir 验证理论上会相对降低 PHP 的高频率 I/O 性能,在安全和性能上权衡自行斟酌是否使用
3.安装 MySQL
下载安装包
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
- 安装过程中会提示设置 root 密码
测试:mysql -u root -p
( exit; 可以退出 )
查看版本:mysql -V
查看状态:service mysql status/start/stop/retart
查看监听端口的情况:netstat -tunpl
或 netstat -tap