信安周报-第01周:环境配置

信安之路

第01周

Code:https://github.com/lotapp/BaseCode/tree/master/safe

前言

信安之路最近有一个成长计划,每周发布任务,不讲解,全部自学完成

其实这种模式很好,拓展性也很高,每个人学到什么程度看个人而不局限于“做题”

这边简单记录下第一周的任务:(欢迎指正)

信安周报-第01周:环境配置_第1张图片

下面是我仓促间的自学过程:(下次补发一篇扩展篇)

1.虚拟环境

1.1.Hyper-v配置

Hyper-V为例搭建环境

Ubuntu镜像下载:https://mirrors.huaweicloud.com/ubuntu-releases/bionic/ubuntu-18.04.2-desktop-amd64.iso

1.开启Hyper

信安周报-第01周:环境配置_第2张图片

2.安装一下

信安周报-第01周:环境配置_第3张图片

3.重启进行配置

重启

4.固定到开始屏幕上

信安周报-第01周:环境配置_第4张图片

5.创建外部访问的虚拟网卡

信安周报-第01周:环境配置_第5张图片

6.设置名称并创建

信安周报-第01周:环境配置_第6张图片


7.新建虚拟机

信安周报-第01周:环境配置_第7张图片

8.指定名称和存放位置

信安周报-第01周:环境配置_第8张图片

9.分配动态内存

信安周报-第01周:环境配置_第9张图片

10.设置网络

信安周报-第01周:环境配置_第10张图片

11.设置虚拟文件存放位置和名称

信安周报-第01周:环境配置_第11张图片

12.指定安装镜像

信安周报-第01周:环境配置_第12张图片

13.创建成功

信安周报-第01周:环境配置_第13张图片

1.2.安装系统

1.启动系统

信安周报-第01周:环境配置_第14张图片

2.安装Ubuntu

信安周报-第01周:环境配置_第15张图片

3.最小安装

信安周报-第01周:环境配置_第16张图片

4.格式化硬盘

信安周报-第01周:环境配置_第17张图片

5.设置用户名和密码

信安周报-第01周:环境配置_第18张图片

6.等待安装

信安周报-第01周:环境配置_第19张图片

7.安装完成后重启一下

信安周报-第01周:环境配置_第20张图片

1.3.配置网络

4.启动后连接,打开网络设置

信安周报-第01周:环境配置_第21张图片

5.配置网络

信安周报-第01周:环境配置_第22张图片

6.reboot重启之后就生效了

信安周报-第01周:环境配置_第23张图片

1.4.镜像源

1.编辑源:sudo gedit /etc/apt/sources.list

信安周报-第01周:环境配置_第24张图片

2.复制一下清华提供的镜像源:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

信安周报-第01周:环境配置_第25张图片

3.更新系统:sudo apt update && sudo apt upgrade && sudo apt dist-upgrade

信安周报-第01周:环境配置_第26张图片

1.5.SSH and Git and htop

1.安装SSH:sudo apt install openssh-server

信安周报-第01周:环境配置_第27张图片

信安周报-第01周:环境配置_第28张图片

2.htop:sudo apt install htop

信安周报-第01周:环境配置_第29张图片

信安周报-第01周:环境配置_第30张图片

3.git:sudo apt install git

信安周报-第01周:环境配置_第31张图片

PS:用户名和邮箱设置命令:

# github账号名
git config --global user.name "Your Name"
# 使用Github提供的隐私邮箱
git config --global user.email xxx+名称@users.noreply.github.com
1.6.谷歌浏览器

谷歌浏览器deb文件下载:(不用FQ)

https://www.google.cn/chrome/

安装谷歌浏览器:sudo dpkg -i google-chrome*.deb

卸载火狐浏览器:sudo apt autoremove firefox*

信安周报-第01周:环境配置_第32张图片

1.7.搜狗输入法

官方地址:https://pinyin.sogou.com/linux/

1.安装sogou:sudo dpkg -i sogopinyin*.deb

信安周报-第01周:环境配置_第33张图片

2.修复依赖:sudo apt install -f

信安周报-第01周:环境配置_第34张图片

3.设置系统默认输入法

信安周报-第01周:环境配置_第35张图片

4.reboot重启后输入法就生效了

信安周报-第01周:环境配置_第36张图片

5.删除自带输入法:sudo apt autoremove ibus

信安周报-第01周:环境配置_第37张图片


2.开发环境

2.2.MySQL

1.安装MySQL:sudo apt install mysql-server

信安周报-第01周:环境配置_第38张图片

2.2.1.MySQL安全初始化

1.安全初始化:sudo mysql_secure_installation

2.设置密码复杂度

信安周报-第01周:环境配置_第39张图片

3.删除匿名用户和测试库,不允许root远程登录

信安周报-第01周:环境配置_第40张图片

4.登录测试

信安周报-第01周:环境配置_第41张图片


2.3.Nginx

官方网站:https://nginx.org/

Github:https://github.com/nginx/nginx

在线安装:sudo apt install nginx

信安周报-第01周:环境配置_第42张图片

成功验证:localhost

信安周报-第01周:环境配置_第43张图片

PS:Nginx书籍

  1. Nginx Cookbook 中文版
  2. Nginx官方中文文档
  3. Nginx入门教程

2.4.PHP-FPM

1.安装php-fpm

信安周报-第01周:环境配置_第44张图片

2.配置Nginx:sudo gedit /etc/nginx/sites-available/default

信安周报-第01周:环境配置_第45张图片

3.nginx的php配置

信安周报-第01周:环境配置_第46张图片

4.编辑一个php页面

信安周报-第01周:环境配置_第47张图片

5.配置php-fpm文件:listen = /var/run/php/php7.0-fpm.sock

信安周报-第01周:环境配置_第48张图片

6.重启Nginx和php-fpm使配置生效

信安周报-第01周:环境配置_第49张图片

7.验证

信安周报-第01周:环境配置_第50张图片

PS:CentOS下的Nginx配置只需要把注释去除,然后改下这个地方就可以了

shell:vi /etc/nginx/conf.d/default.conf$document_root

信安周报-第01周:环境配置_第51张图片


3.CURD(PHP)

这个之前我写了篇编辑远程服务器文件的文章,可以看看:https://www.cnblogs.com/dotnetcrazy/p/11254225.html

3.1.安装驱动

安装php的mysql驱动:sudo apt install php7.2-mysql

信安周报-第01周:环境配置_第52张图片

3.2.连接MySQL

连接mysql

信安周报-第01周:环境配置_第53张图片

3.3.创建表

创建表

信安周报-第01周:环境配置_第54张图片

创建表-验证

信安周报-第01周:环境配置_第55张图片

3.4.插入数据

插入数据

信安周报-第01周:环境配置_第56张图片

插入数据-验证

信安周报-第01周:环境配置_第57张图片

3.5.更新数据

更新数据

信安周报-第01周:环境配置_第58张图片

更新数据-验证

信安周报-第01周:环境配置_第59张图片

3.6.查询数据

查询

信安周报-第01周:环境配置_第60张图片

3.7.删除数据

删除表数据

信安周报-第01周:环境配置_第61张图片

删除表数据-验证

信安周报-第01周:环境配置_第62张图片


4.加固初尝

第一次接触加固,若有不妥还望指教^_^,探索如下:

4.1.Linux
4.1.1.思路

1.删除用不到的那些普通用户

2.SSH相关加固思路:

  1. SSH修改端口:不让端口扫描器轻易发现
  2. 不允许Root远程登录:root权限太大,只允许一般账户远程登录

3.防火墙加固思路:主要就是限制端口的对外访问,暴露越少相对越安全

4.1.2.用户

删除/etc/passwd中用不到的用户:

信安周报-第01周:环境配置_第63张图片

4.1.3.SSH

SSH的配置:/etc/ssh/sshd_config

信安周报-第01周:环境配置_第64张图片

重启下sshsudo systemctl restart ssh

验证:下次登录的时候就必须是33端口了

信安周报-第01周:环境配置_第65张图片

4.1.4.防火墙

常用命令:

# 开启/关闭/查看防火墙状态
sudo ufw enable|disable|status
# 开通3306端口
sudo ufw allow 3306/tcp
# 禁用本机的3306端口
sudo ufw delete allow 3306/tcp

# 设置本机80端口访问的白名单:只允许192.168.0.0网段的ip访问本机80端口
sudo ufw allow 80/tcp from 192.168.0.0/24

# 允许此ip访问本机的所有端口(定向访问)
sudo ufw allow from 192.168.0.7
# 禁止这个ip访问本机(黑名单)
sudo ufw delete allow from 192.168.0.2

简单演示:

信安周报-第01周:环境配置_第66张图片

开放MySQL和Nginx的权限:

信安周报-第01周:环境配置_第67张图片

测试:

信安周报-第01周:环境配置_第68张图片


PS:CentOS 7 现在默认使用firewall-cmd当防火墙

# 显示服务状态
systemctl status firewalld
# 添加 --permanent永久生效(没有此参数重启后失效)
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重新载入
firewall-cmd --reload
# 查看
firewall-cmd --zone=public --query-port=3306/tcp
# 删除
firewall-cmd --zone=public --remove-port=3306/tcp --permanent
4.2.MySQL
4.2.1.思考

1.如果是root账号开放远程登录,那么权限太过高了,项目里也是对指定数据库开放对应的用户权限

2.端口号默认是3306,很多扫描器都会盯着,那么修改下默认端口会缓解不少~

3.开启binlog可以预防黑客修改数据后没法恢复的尴尬

4.设置innodb一个表对应一个文件可以黑客串改的数据进行针对性恢复(主要是性能提高)

PS:被修改的表应急情况下可以使用10分钟前的备份文件来保证安全性,如果不设置,那么所有表数据都是在一个文件里的(容易丢失太多数据)

4.2.2.创建远程专用用户

创建远程登录用户并赋予某数据库的权限

信安周报-第01周:环境配置_第69张图片

命令附录:

# 1.创建用户
create user bryan@'%' identified by '含大小写字母+数字的密码';

# 2.创建工作数据库
# PS:以后创建数据库后给bryan分配下权限即可访问
create database safe_db charset=utf8;

# 3.给用户分配某数据库的所有权限
grant all on safe_db.* to bryan;

# 4.刷新权限
flush privileges;

# 5.显示用户有哪些权限
show grants for bryan;

登录测试

信安周报-第01周:环境配置_第70张图片

允许远程访问:sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

信安周报-第01周:环境配置_第71张图片

重启使其生效

信安周报-第01周:环境配置_第72张图片

远程测试

信安周报-第01周:环境配置_第73张图片

4.2.3.修改默认端口

在配置文件sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf中修改port

port

小测试:使用3333端口则执行成功,使用默认的3306则失败

ps:记得先开发防火墙的端口权限

信安周报-第01周:环境配置_第74张图片

PHP程序测试:

信安周报-第01周:环境配置_第75张图片

4.2.4.binlog开启

开启binlog日志:去除server-idlog_bin的注释

信安周报-第01周:环境配置_第76张图片

在binlog中记录SQL:binlog_rows_query_log_events=on

信安周报-第01周:环境配置_第77张图片

然后重启一下mysql:sudo systemctl restart mysql

测试一下:

信安周报-第01周:环境配置_第78张图片

我们以之前php的案例进行一次数据库交互:

信安周报-第01周:环境配置_第79张图片

PS:记录每次修改数据的SQL,便于查找和恢复

sudo mysqlbinlog -vv /var/log/mysql/mysql-bin.xxx


PS:几个优化选项(每个表独立存放可以有效保护数据,而且性能高)

信安周报-第01周:环境配置_第80张图片


4.3.Nginx

通过常见的攻击手段来防护:

4.3.1.防止路径扫描

防止恶意抓取和资源盗用:

secure_link_module:对数据安全性提供加密验证时效性

eg:资源文件设置加密和时效/download?md5=xxxx&expires=xxxx

# vi /etc/nginx/conf.d/access_module.conf
server {
    root /var/www/html;
    location / {
        # 提取参数
        secure_link $arg_md5,$arg_expires;
        secure_link_md5 "$secure_link_expiress$uri key字符串";
        # 不满足就跳转
        if ($secure_link = ""){
            return 403;
        }
        if ($secure_link = "0"){
            return 410;
        }
    }
}

access_module:基于ip白名单的访问控制

eg:特定ip才能访问后台

# vi /etc/nginx/conf.d/access_module.conf
server {
    location ~ ^/admin.html {
        # 代码路径
        root /var/www/html;
        # 不允许其他ip访问
        deny all;
        # 允许ip(段)访问
        allow 192.168.0.0/24;
        index index.html index.php;
    }
}
4.3.2.密码爆破

后台密码爆破还是挺常见的

PS:可以看看3年前我讲MVC演示的暴力破解登录页面的案例:https://www.cnblogs.com/dunitian/p/5724872.html

程序里面主要就是通过验证码ip访问频率来限制

PS:后台密码设置更复杂些(提高爆破耗时),加密方式选sha256来增加明文密码解猜的难度(已泄露情况下)

Nginx里面可以通过:access_module来设置ip限制的

PS:某些页面只能特定ip访问,提高渗透难度

还可以设置预警机制,太过频繁会提示管理人员处理

4.3.3.文件上传漏洞

Nginx早期版本有解析漏洞,eg:www.baidu.com/upload/1.jpg/1.php ==> 1.jpg作为php代码进行执行

解决:

  1. 升级Nginx版本
  2. 制定目录下的格式限制(可以是白名单也可以黑名单)

eg:不允许upload文件夹下访问php格式的文件

location ^~ /upload{
    root /var/www/html;
    if($request_filename ~* (.*)\.php){
        return 403;
    }
}
4.3.4.Nginx+Lua

可以使用Nginx + Lua防火墙进行防护:

PS:详细内容可以看我写的拓展:https://www.cnblogs.com/dotnetcrazy/p/11306202.html

  1. 拦截Cookie类型工具
  2. 拦截异常post请求
  3. 拦截CC洪水攻击
  4. 拦截URL
  5. 拦截arg(提交的参数)

市面上比较常用一块开源项目:ngx_lua_waf

https://github.com/loveshell/ngx_lua_waf

1.clone代码:

信安周报-第01周:环境配置_第81张图片

2.移动到nginx的waf目录下

信安周报-第01周:环境配置_第82张图片

3.参数简单说明下:红色字体部分需要修改

pms

文字附录:

  • attacklog:记录攻击日志
  • logdir:日志目录设置
  • urldeny:url规则匹配
  • redirect;拦截后重定向
  • cookiematch:cookie匹配
  • postmatch:post请求的匹配
  • whitemodule:是否开启白名单
    • ipwhitelist:白名单列表
  • black_fileExt:禁止上传的文件后缀
  • ccdeny:防CC
    • ccrate:频率设置(默认1分钟同一个IP只能请求同一个地址100次)
  • html:拦截后的返回内容

4.配置nginx:sudo vi /etc/nginx/nginx.conf

文字:http下添加

lua_package_path "/etc/nginx/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /etc/nginx/waf/init.lua;
access_by_lua_file /etc/nginx/waf/waf.lua;

PS:自带的CC防护可以使用limit_connlimit_req

可以使用ab -n 20 -c 20 http://192.168.0.9来简单测试


4.4.PHP

PHP不是很熟悉,简单归纳下网上说的加固(修改php.ini)

  1. 防止变量覆盖:register_globals=off
  2. 防止越权访问目录:open_basedir = /var/www/html(指定目录)
  3. 防止远程文件包含:allow_url_include=off and allow_url_fopen=off
  4. 防止显示详细的错误信息:display_errors=off
  5. 记录错误在日志文件中:log_errors=on
  6. 关闭不安全的字符串转义处理函数(防SQLi和XSS):magic_quotes_gpc=off
  7. 如果PHP以CGI方式安装则需要关闭:cgi.fix_pathinfo=0
  8. 防御XSS(开启HttpOnly)session.cookie_httponly=1
  9. HTTPS下提高安全性:session.cookie_secure=1

参考文章

Ubuntu16下配置自己的web服务器

https://www.jianshu.com/p/998eeb56aa6c

PHP 5 MySQLi 函数

https://www.runoob.com/php/php-ref-mysqli.html

ubuntu系统下防火墙简单使用

https://www.cnblogs.com/kevingrace/p/6212463.html

Nginx模块Lua-Nginx-Module学习笔记

https://blog.csdn.net/qq_21860077/article/details/83622957

Nginx编译安装Lua模块

http://www.imooc.com/article/19597

转载于:https://www.cnblogs.com/dotnetcrazy/p/11299835.html

你可能感兴趣的:(php,数据库,lua)