信安之路
第01周
Code:https://github.com/lotapp/BaseCode/tree/master/safe
前言
信安之路最近有一个成长计划,每周发布任务,不讲解,全部自学完成
其实这种模式很好,拓展性也很高,每个人学到什么程度看个人而不局限于“做题”
这边简单记录下第一周的任务:(欢迎指正)

下面是我仓促间的自学过程:(下次补发一篇扩展篇)
1.虚拟环境
1.1.Hyper-v配置
以Hyper-V为例搭建环境
Ubuntu镜像下载:https://mirrors.huaweicloud.com/ubuntu-releases/bionic/ubuntu-18.04.2-desktop-amd64.iso
1.开启Hyper

2.安装一下

3.重启进行配置

4.固定到开始屏幕上

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

6.设置名称并创建

7.新建虚拟机

8.指定名称和存放位置

9.分配动态内存

10.设置网络

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

12.指定安装镜像

13.创建成功

1.2.安装系统
1.启动系统

2.安装Ubuntu

3.最小安装

4.格式化硬盘

5.设置用户名和密码

6.等待安装

7.安装完成后重启一下

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

5.配置网络

6.reboot重启之后就生效了

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

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

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

1.5.SSH and Git and htop
1.安装SSH:sudo apt install openssh-server


2.htop:sudo apt install htop


3.git:sudo apt install git

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*

1.7.搜狗输入法
官方地址:https://pinyin.sogou.com/linux/
1.安装sogou:sudo dpkg -i sogopinyin*.deb

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

3.设置系统默认输入法

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

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

2.开发环境
2.2.MySQL
1.安装MySQL:sudo apt install mysql-server

2.2.1.MySQL安全初始化
1.安全初始化:sudo mysql_secure_installation
2.设置密码复杂度

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

4.登录测试

2.3.Nginx
官方网站:https://nginx.org/
Github:https://github.com/nginx/nginx
在线安装:sudo apt install nginx

成功验证:localhost

PS:Nginx书籍:
- Nginx Cookbook 中文版
- Nginx官方中文文档
- Nginx入门教程
2.4.PHP-FPM
1.安装php-fpm

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

3.nginx的php配置

4.编辑一个php页面

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

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

7.验证

PS:CentOS下的Nginx配置只需要把注释去除,然后改下这个地方就可以了
shell:
vi /etc/nginx/conf.d/default.conf、$document_root

3.CURD(PHP)
这个之前我写了篇编辑远程服务器文件的文章,可以看看:https://www.cnblogs.com/dotnetcrazy/p/11254225.html
3.1.安装驱动
安装php的mysql驱动:sudo apt install php7.2-mysql

3.2.连接MySQL
连接mysql

3.3.创建表
创建表

创建表-验证

3.4.插入数据
插入数据

插入数据-验证

3.5.更新数据
更新数据

更新数据-验证

3.6.查询数据
查询

3.7.删除数据
删除表数据

删除表数据-验证

4.加固初尝
第一次接触加固,若有不妥还望指教^_^,探索如下:
4.1.Linux
4.1.1.思路
1.删除用不到的那些普通用户
2.SSH相关加固思路:
- SSH修改端口:不让端口扫描器轻易发现
- 不允许Root远程登录:root权限太大,只允许一般账户远程登录
3.防火墙加固思路:主要就是限制端口的对外访问,暴露越少相对越安全
4.1.2.用户
删除/etc/passwd中用不到的用户:

4.1.3.SSH
SSH的配置:/etc/ssh/sshd_config

重启下ssh:sudo systemctl restart ssh
验证:下次登录的时候就必须是33端口了

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 简单演示:

开放MySQL和Nginx的权限:

测试:

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.创建远程专用用户
创建远程登录用户并赋予某数据库的权限

命令附录:
# 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; 登录测试

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

重启使其生效

远程测试

4.2.3.修改默认端口
在配置文件sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf中修改port

小测试:使用3333端口则执行成功,使用默认的3306则失败
ps:记得先开发防火墙的端口权限

PHP程序测试:

4.2.4.binlog开启
开启binlog日志:去除server-id和log_bin的注释

在binlog中记录SQL:binlog_rows_query_log_events=on

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

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

PS:记录每次修改数据的SQL,便于查找和恢复
sudo mysqlbinlog -vv /var/log/mysql/mysql-bin.xxx
PS:几个优化选项(每个表独立存放可以有效保护数据,而且性能高)

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代码进行执行
解决:
- 升级Nginx版本
- 制定目录下的格式限制(可以是白名单也可以黑名单)
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
- 拦截Cookie类型工具
- 拦截异常post请求
- 拦截CC洪水攻击
- 拦截URL
- 拦截arg(提交的参数)
市面上比较常用一块开源项目:ngx_lua_waf
https://github.com/loveshell/ngx_lua_waf
1.clone代码:

2.移动到nginx的waf目录下

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

文字附录:
- 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_conn和limit_req
可以使用
ab -n 20 -c 20 http://192.168.0.9来简单测试
4.4.PHP
PHP不是很熟悉,简单归纳下网上说的加固(修改php.ini)
- 防止变量覆盖:
register_globals=off - 防止越权访问目录:
open_basedir = /var/www/html(指定目录) - 防止远程文件包含:
allow_url_include=offandallow_url_fopen=off - 防止显示详细的错误信息:
display_errors=off - 记录错误在日志文件中:
log_errors=on - 关闭不安全的字符串转义处理函数(防SQLi和XSS):
magic_quotes_gpc=off - 如果PHP以CGI方式安装则需要关闭:
cgi.fix_pathinfo=0 - 防御XSS(开启HttpOnly)
session.cookie_httponly=1 - 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