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

信安之路

第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

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

ssh

test

2.htop:sudo apt install htop

htop

test2

3.git:sudo apt install git

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

sogou

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

修复

3.设置系统默认输入法

默认输入法

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

重启

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

卸载


2.开发环境

2.2.MySQL

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

安装MySQL

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

apt

成功验证:localhost

ok

PS:Nginx书籍

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

2.4.PHP-FPM

1.安装php-fpm

fpm

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

编辑配置文件

3.nginx的php配置

nginx配置

4.编辑一个php页面

新建文件

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

配置php-fpm

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

php-mysql

3.2.连接MySQL

连接mysql

连接mysql

3.3.创建表

创建表

创建表

创建表-验证

2.创建表-验证

3.4.插入数据

插入数据

3.插入数据.png

插入数据-验证

插入数据-验证

3.5.更新数据

更新数据

4.更新数据.png

更新数据-验证

4.更新数据-验证.png

3.6.查询数据

查询

5.查询.png

3.7.删除数据

删除表数据

6.删除表数据.png

删除表数据-验证

6.删除表数据-验证.png


4.加固初尝

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

4.1.Linux

4.1.1.思路

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

2.SSH相关加固思路:

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

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

4.1.2.用户

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

删除用不到的用户

4.1.3.SSH

SSH的配置:/etc/ssh/sshd_config

配置

重启下sshsudo 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

简单演示:

demo

开放MySQL和Nginx的权限:

开发

测试:

test


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

port

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

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

conn

PHP程序测试:

demo

4.2.4.binlog开启

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

binlog

在binlog中记录SQL:binlog_rows_query_log_events=on

sql

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

测试一下:

刷新

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

sql

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

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


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

innodb


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代码:

git

2.移动到nginx的waf目录下

2.移动到nginx的waf目录下

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

配置nginx

文字: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