99

环境搭建

0x00 准备工作

虚拟机:Vmware15
系统:Ubuntu16
虚拟机装ubuntu过程个人觉得就不用详说了。。反正就是一顿操作猛如虎。。然后就安装好了,因为登录是个人用户,所以做了一些设置,让其可以使用root方式登录。

1、安装vim(个人喜欢用vim,自带的vi不太喜欢用)
sudo apt-get install vim

2、设置root密码
sudo passwd ******

3、配置文件,设置root可登录
sudo vim /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
在文件最后添加:greeter-show-manual-login=true

更换源

sudo vim /etc/apt/sources.list

清华大学源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

安装截图

更新ubuntu

更新
sudo apt update
sudo apt upgrade
sudo apt clean

更新报错,提示资源管理器被占用,使用ps -e | grep apt 查看占用进程
使用sudo kill PID号 杀死进程,重新运行以上命令即可

成功截图

0x01 搭建web环境

安装mysql

apt-get -y install mysql-server mysql-client

中途会让你设置数据库密码,或者使用以下命令设置密码

mysql_secure_installation

可以正常连接,此时账户是root

安装nginx

apt-get install nginx -y

启动nginx守护程序
systemctl start nginx.service
systemctl enable nginx.service

安装php-fpm

apt-get -y install php7.0-fpm php7.0-mysql

配置php.ini文件

vim /etc/php/7.0/fpm/php.ini

在配置文件中查看以下参数

; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
; cgi.fix_pathinfo=1

使用 / ; to use SCRIPT_ 找到此行,修改最后一行为以下

; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0

保存后重新启动php

systemctl restart php7.0-fpm.service
systemctl enable php7.0-fpm.service

配置Nginx使用php处理器
打开配置文件

sudo vim /etc/nginx/sites-available/default

设置以下对应参数

server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;

server_name 127.0.0.1;

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

location ~ /\.ht {
deny all;
}
}

创建index.php

<?php
phpinfo();
?>

访问成功

参考连接:
https://www.globo.tech/learning-center/setup-nginx-php-fpm-mysql-ubuntu-16/
https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04

0x02 php连接mysql

让php连接mysql,感觉网上找个源码搭建有点不太好,不是自己的东西,所以准备自己写一个可以插入数据的页面,先本机测试,然后放到ubuntu虚拟机中

创建数据库

create database mag;//创建test数据库
use mag;//选择数据库
//创建表
create table mag(
id int not null primary key,
name char(10) not null,
content varchar(100) not null
)charset utf8;

创建成功

插入数据

有点丑,不过可以用就行。。。

php代码

<?php
//连接数据库
$conn = mysql_connect('localhost' , 'root' , 'root');
mysql_query('use mag' , $conn);//选择数据库
mysql_query('set names utf8' , $conn);//设置字符集

//获取post过来的数据
$id = $_POST['id'];
$name = $_POST['name'];
$content = $_POST['content'];
$sql = "INSERT INTO mag(id , name , content) VALUE ('$id' , '$name' , '$content')";

if (mysql_query($sql , $conn)) {
echo "OK";
}else{
echo "no";
}

?>

html代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>留言板</title>
</head>
<body>
<form action="mag.php" method="post">
<p>ID :<input type="text" name="id"><br/></p>
<p>昵称:<input type="text" name="name"><br/></p>
<p>内容:<textarea name="content" id="" cols="30" rows="10"></textarea><br/></p>
<p style="height: 200px"><input type="submit" value="SUBMIT"></p>
</form>
</body>
</html>

插入成功


开始测试虚拟机是否可用。

ubuntu下php连接mysql

创建数据库

create database mag;//创建test数据库
use mag;//选择数据库
//创建表
create table mag(
id int not null primary key,
name char(10) not null,
content varchar(100) not null
)charset utf8;

将代码放入ubuntu下的html目录中,发现提交数据报错,报500错误,
搜索后发现nginx禁止静态页面使用post方式,需要修改nginx.conf.
在nginx.conf下添加以下代码

error_page  405 =200 @405;
location @405 {
proxy_method GET;
proxy_pass http://localhost;
}

还是报错,测试各种方法都失败了。猜测可能不是nginx的问题,如果mysql配置错误也会爆出500错误,查看mysql错误日志

vim /var/log/nginx/error.log

报mysql_connetc错误。

最后发现环境不一样,本机使用的phpstudy集成环境,使用的是php5
ubuntu下载的php7,两种不一样。
php7使用的是mysqli,所以连接需要使用mysqli_connect

代码修改这样的

//连接数据库
$conn = mysqli_connect('127.0.0.1' , 'root' , '888888');
mysqli_query('use mag' , $conn);//选择数据库
mysqli_query('set names utf8' , $conn);//设置字符集

//获取get过来的数据
$id = $_GET['id'];
$name = $_GET['name'];
$content = $_GET['content'];
$sql = "INSERT INTO mag(id , name , content) VALUES ('$id' , '$name' , '$content')";

if (mysqli_query($conn , $sql)) {
echo $sql;
echo 'ok';
}else{
echo $sql;
echo 'no';

发现还是报错,提示mysqli_query($conn , $sql)这行出问题,使用f12查看网络,发现报错500。。经过表哥们的提醒,mysql配置连接不应该按照php5的来写。
修改成以下

$host = 'localhost:3306';
$username = 'root';
$password = '888888';
$dbname = 'mag';
$link = mysqli_connect($host , $username , $password , $dbname);
mysqli_set_charset($link , 'utf-8');
//获取get过来的数据
$id = $_GET['id'];
$name = $_GET['name'];
$content = $_GET['content'];
$sql = "INSERT INTO mag(id , name , content) VALUES ($id , '$name' , '$content')";
$res = mysqli_query($link , $sql);

if (!$res) {
echo $sql;
echo "<br/>no";
}else{
echo $sql;
echo "<br/>yes";
}

数据插入成功

困扰我大半天的问题,终于解决了,感谢大表哥们的回答啊。。

0x03 Ubuntu安全加固

参考连接:https://www.freebuf.com/column/202728.html

根据群主说的下载了linux安全加固PDF,但是由于第一次做加固,所以不太懂,在freebuf上面找了一篇文章,根据此文章进行加固

身份鉴别

口令复杂度策略
口令长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少2类。

Minlen //密码最小长度要求;
Lcredit //小写字符数量
Ocredit //特殊字符数量

因为安装的ubuntu,所以有些文件可能不太一样

修改/etc/security/pwquality.conf配置文件
vim /etc/security/pwquality.conf

Minlen //密码最小长度要求;
Lcredit //小写字符数量
Ocredit //特殊字符数量

口令最长生存期策略

修改/etc/login.defs

vim /etc/login.defs

找到以下参数修改
PASS_MAX_DAYS 180 #密码最长过期天数
PASS_MIN_DAYS 90 #密码最小过期天数
PASS_WARN_AGE 10 #密码过期警告天数

多次登录失败锁定策略

修改/etc/pam.d/login配置文件
各参数解释:

even_deny_root 也限制root用户;
deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
unlock_time 设定普通用户锁定后,多少时间后解锁,单位是秒;
root_unlock_time 设定root用户锁定后,多少时间后解锁,单位是秒;

设置为密码连续错误6次锁定,锁定时间30秒 root密码连续错误6次锁定,时间为 100秒

添加
#%PAM-1.0
auth required pam_tally2.so onerr=fail deny=6 unlock_time=30 even_deny_root root_unlock_time=100

访问控制

多余账户锁定策略
应锁定与设备运行、维护等工作无关的账号。
/etc/password以root账户登录Linux系统
锁定用户方法一:
修改/etc/password文件,将需要锁定的用户的shell域后添加nologin;
test:x:1000:100:-LINUX:/home/test:/bin/bash/nologin

锁定用户方法二:
在超级权限的账户下使用”passwd”命令
#passwd –lusername //锁定账户;
#passwd –dusername//解锁用户;
解锁用户后需重新设置密码,且/etc/passwd文件内容不会发生变化。该操作比较麻烦,不推荐使用。

对以下账户进行锁定,使用第一种方法

锁定uucp账户
uucp:x:10:10:uucp:-LINUX:/var/spool/uucp:/usr/sbin/nologin

锁定lp账户
lp:x:7:7:lp:-LINUX:/var/spool/lpd:/usr/sbin/nologin

锁定sync账户
sync:x:4:65534:sync:-LINUX:/bin:/bin/sync

关键目录权限控制
重点设置password、shadow、group、service、login.defs、xinetd.conf、security、ssh_config文件权限。

其实很多版本都默认设置了一些。

ls –l /etc/passwd//查看passwd文件是否为644权限
ls –l /etc/shadow//查看shadow文件是否为600权限
ls –l /etc/group//查看group文件是否为644权限
ls –l /etc/services//查看services文件是否为644权限
ls –l /etc/login.defs //查看login.defs是否为644权限
ls -l /ssh/ssh_config //查看ssh_config文件是否为600权限

计算权限

r=4,w=2,x=1 
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=5。

查看关键目录权限
符合

passwd文件为 6+4+4=644
-rw-r--r-- 1 root root 2371 Jul 30 21:59 /etc/passwd

group文件为 6+4+4=644
-rw-r--r-- 1 root root 1008 Jul 30 04:01 /etc/group

services文件为 6+4+4=644
-rw-r--r-- 1 root root 19605 Oct 25 2014 /etc/services

login.defs文件为 6+4+4=644
-rw-r--r-- 1 root root 10551 Jul 30 21:27 /etc/login.defs

不符合

shadow文件为 6+4+0=640 不符合
-rw-r----- 1 root shadow 1332 Jul 30 04:01 /etc/shadow

修改
chmod 600 /etc/shadow
shadow文件为 6+0+0=600 符合
-rw------- 1 root shadow 1332 Jul 30 04:01 /etc/shadow
ssh_config文件为 6+4+4=644 不符合
-rw-r--r-- 1 root root 1756 Apr 28 2016 /etc/ssh/ssh_config

修改
chmod 600 /etc/ssh/ssh_config
ssh_config文件为 6+0+0=600 符合
-rw------- 1 root root 1756 Apr 28 2016 /etc/ssh/ssh_config
用户缺省权限控制

umask值应为027或更小的权限
修改/etc/profile

umask 027

0x04 总结

1、重新温习了环境搭建这一块的知识,搭建这块倒也没有遇到什么坑。
2、了解php5和php7语法这块的区别,大体上面的没有变,就是语法格式上面可能有些改变。。。之前学的是php5,加上好久没有搞php了,这坑踩了几个小时才解决。。
3、linux安全加固这块是完全没有碰过的,以前只听过加固,知道加固的一些关键点,但是从来没有实践过,这次动手感觉涨了不少见识。

总体来说,根据这次作业还是学到了很多东西,特别是加固这块,加固命令,检查那些地方,可能没有完全按照文章里面写的加固,有些文件没有,有些是看不太懂,所以不敢操作。。怕把虚拟机搞崩溃了,总结就到这里结束了。。。