信安之路
第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=off
andallow_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