2022年XX百万职工技能大赛 XX区网络安全与信息管理员比赛 经验之谈

本次有幸参加了一次,《百万职工技能大赛XX区网络安全与信息管理员比赛》分享下个人经验:

 

大赛标准:

个人赛以国家职业技能标准中级工及以上职业资格等级的要求为基础,适当增加新知识、新技术、新技能等相关内容,以理论考试和实际操作的形式分别进行,理论考试占30%,实际操作占70%

参赛条件:

各企(事)业单位专兼职从事网络与信息安全相关工作的职工,社会个体从业者均可报名参赛,性别不限,参赛年龄为18-60周岁

报名方式:

一般自己单位会受到XX地区的工会邀请,并且告知相关报名方式

所需技能:(官方披露版)

技术描述
1.1.1 技术描述

  • 网络与信息安全管理员是指从事网络及信息安全管理、防护、监控工作的人员。本次比赛项目考察的是网络与信息安全管理员的管理和技术能力。

1.1.2基本技术要求

  • 操作系统(含虚拟)操作技术的准确程度、熟练程度;
  • 网络设备(含虚拟)操作技术的准确程度、熟练程度;
  • 桌面运维工作的操作准确度、熟练程度;
  • 基线检查及安全加固技术;
  • 对各类网络攻击的现象、危害、攻击手法、后门驻留等进行:准确快速的识别、分类、处置等应急响应能力。

1.1.3其它技术描述

  • 隐藏攻击流量的识别
  • 隐蔽攻击载荷的识别

1.2 能力要求
参赛选手应具备以下技术能力:

  •  网络安全防护能力
  • 系统安全防护能力
  • 应用安全防护能力
  • 网络安全管理能力
  • 系统安全管理能力
  • 应用安全管理能力
  • 网络安全事件监控和处置能力
  • 系统安全事件监控和处置能力
  • 应用安全事件监控和处置能力

1.3 基本知识要求

  • 参赛选手应掌握以下基本知识

1.3.1相关知识:

  • 主流操作系统知识
  • TCP/IP知识
  • 信息系统架构知识
  • 正则表达式
  • 密码学知识
  • 信息搜集知识
  • 网络攻击知识
  • 应急响应知识

1.3.2延伸知识:

  • 主机、网络虚拟化知识
  • 日志管理知识
  • 漏洞管理知识

所需技能:(个人总结版)

1. 首先你要对Windows&Linux 客户端,服务端操作系统及对应常用命令,组件,网络配置都比较熟悉

2. 常用和不常用的网络设备又一定的配置经验(至少接触过华为,思科,ROS等相关网络设备,常用网络协议RIP,OSPF...)

3. 对服务器及相关常用组件(Apache,Redis,)的加固有一定经验

4. 现场禁用手机和现场外网,仅可以提供沙盒里面的一些设备官方文档可以参阅(需要少量英文阅读能力)

5. 现场结果都是以截图&文字描述的形式进行提交,可以覆盖提交,最多可以提交5个版本的截图&文字描述

6. 结果评判是分为2部分,理论是机器判断直接出结果,操作是人工判断进行给分

 

# 偏冷问题踩坑部分记录

0. 网络设备调试

根据提供的白皮书&拓扑图,进行某网络设备网络调试

  • 提供详细的网络拓扑参考
  • 提供相关设备的调试白皮书
  • 进行网络互通问题解决
  • 调整网络设备进行一个NAT设置
  • 调整网络设备进行一个端口映射

1. history 增加时间戳

在~/.bash_profile添加下面的环境变量

export HISTTIMEFORMAT="%F %T "

source ~/.bash_profile

PS:/etc/profile;全局  

  ~/.bash_profile;个人

  %F是日期长格式,%T是时分秒

 

2. Windows 安全加固

# 关闭常见风险端口

# 修改组策略一些安全设置

 

3. Linux 安全加固

# 用户密码与登录安全策略设置

主要是通过 /etc/login.defs 与 pam_cracklib.so 实现的

/etc/login.defs:只控制了账号密码的有效期和最小长度。修改完/etc/login.defs文件后,会立即生效,但是它只对修改后创建的用户生效。

pam_cracklib.so:该模块实现了账户密码的复杂度控制。早期用的是pam_cracklib.so模块,后来改成用pam_pwquality.so了,该模块完全兼容旧的pam_cracklib.so模块。该模块对应的配置文件路径在/etc/pam.d/目录下。

设置密码的有效期和最小长度

/etc/login.defs参数说明:

#       PASS_MAX_DAYS  99999 Maximum number of days a password may be used.(密码过期时间,设置90表示90天后过期,默认为99999,表示永不过期)
#       PASS_MIN_DAYS  0     Minimum number of days allowed between password changes.(两次修改密码的最小间隔时间)
#       PASS_MIN_LEN   5     Minimum acceptable password length.(密码最小长度,对于root无效)
#       PASS_WARN_AGE  7     Number of days warning given before a password expires.(密码过期前发出警告的天数)

设置用户密码的复杂度

修改/etc/pam.d/system-auth-ac文件

    

minlen=8     # 新密码最小长度为8个字符
difok=3       # 允许的新、旧密码存在相同字符的个数,默认为5。
dcredit=-3    # 新密码中至少包含3个数字
lcredit=-3    # 新密码中至少包含3个小写字母
ucredit=-1    # 新密码中至少包含1个大写字母
ocredit=-1    # 新密码中至少包含1个其他符合

通常会在下面4个文件中配置策略:

/etc/pam.d/system-auth:全局限制,会对所有登录方式做限制
/etc/pam.d/login:只对本地终端用户登录做限制
/etc/pam.d/remote:只对远程telnet做限制
/etc/pam.d/sshd:只对ssh登录做限制
/etc/pam.d/system-auth-ac:全局限制,会对所有登录方式做限制 (实验是在这个里面测试生效

 

登录安全策略

登录安全相关的控制策略,主要是通过 pam_tally2.so 模块实现的,比如尝试登录失败多少次就锁定用户多少分钟。同样,该模块对应的配置文件路径也是在/etc/pam.d/目录下。

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

示例:登录失败达到3次,就锁定用户,普通用户锁定1分钟,root用户锁定1分钟(实际生产环境按需修改)

修改/etc/pam.d/sshd,增加下面的锁定语句:

auth required pam_tally2.so deny=3 unlock_time=60 even_deny_root root_unlock_time=60

 

 查看被锁和解锁用户:

$ pam_tally2 -u <username> #查看用户登录失败次数记录
$ pam_tally2 -u <username> --reset #清空失败次数记录,即解锁用户

 

 扩展学习:

使用如下命令判断程序是否使用了PAM

 

关于PAM

Linux-PAM (Pluggable Authentication Modules for Linux)可插拔认证模块。Linux-PAM是一套适用于Linux的身份验证共享库系统,它为系统中的应用程序或服务提供动态身份验证模块支持。在Linux中,PAM是可动态配置的,本地系统管理员可以自由选择应用程序如何对用户进行身份验证。PAM应用在许多程序与服务上,比如登录程序(loginsu)的PAM身份验证(口令认证、限制登录),passwd强制密码,用户进程实时管理,向用户分配系统资源等。

PAM的主要特征是认证的性质是可动态配置的。PAM的核心部分是库(libpam)和PAM模块的集合,它们是位于文件夹/lib/security/中的动态链接库(.so)文件,以及位于/etc/pam.d/目录中(或者是/etc/pam.conf配置文件)的各个PAM模块配置文件。/etc/pam.d/目录中定义了各种程序和服务的PAM配置文件,其中system-auth文件是PAM模块的重要配置文件,它主要负责用户登录系统的身份认证工作,不仅如此,其他的应用程序或服务可以通过include接口来调用它(该文件是system-auth-ac的软链接)。此外password-auth配置文件也是与身份验证相关的重要配置文件,比如用户的远程登录验证(SSH登录)就通过它调用。而在Ubuntu、SuSE Linux等发行版中,PAM主要配置文件是common-auth、common-account、common-password、common-session这四个文件,所有的应用程序和服务的主要PAM配置都可以通过它们来调用。
View Code

PAM身份验证配置文件

/etc/pam.d/目录包含应用程序的PAM配置文件。例如,login程序将其程序/服务名称定义为login,与之对应的PAM配置文件为/etc/pam.d/login。

PAM配置文件语法格式

每个PAM配置文件都包含一组指令,用于定义模块以及控制标志和参数。每条指令都有一个简单的语法,用于标识模块的目的(接口)和模块的配置设置,语法格式如下:

module_interface      control_flag      module_name  module_arguments

如在/etc/pam.d/password-auth-ac配置文件中(CentOS),其中一行PAM模块接口定义如下

PAM模块接口(模块管理组)

PAM为认证任务提供四种类型可用的模块接口,它们分别提供不同的认证服务:

  • auth 认证模块接口,如验证用户身份、检查密码是否可以通过,并设置用户凭据
  • account 账户模块接口,检查指定账户是否满足当前验证条件,如用户是否有权访问所请求的服务,检查账户是否到期
  • password 密码模块接口,用于更改用户密码,以及强制使用强密码配置
  • session 会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效

单个PAM库模块可以提供给任何或所有模块接口使用。例如,pam_unix.so提供给四个模块接口使用。

PAM控制标志

所有的PAM模块被调用时都会返回成功或者失败的结果,每个PAM模块中由多个对应的控制标志决定结果是否通过或失败。每一个控制标志对应一个处理结果,PAM库将这些通过/失败的结果整合为一个整体的通过/失败结果,然后将结果返回给应用程序。模块可以按特定的顺序堆叠。控制标志是实现用户在对某一个特定的应用程序或服务身份验证的具体实现细节。该控制标志是PAM配置文件中的第二个字段,PAM控制标志如下:

  • required 模块结果必须成功才能继续认证,如果在此处测试失败,则继续测试引用在该模块接口的下一个模块,直到所有的模块测试完成,才将结果通知给用户。
  • requisite 模块结果必须成功才能继续认证,如果在此处测试失败,则会立即将失败结果通知给用户。
  • sufficient 模块结果如果测试失败,将被忽略。如果sufficient模块测试成功,并且之前的required模块没有发生故障,PAM会向应用程序返回通过的结果,不会再调用堆栈中其他模块。
  • optional 该模块返回的通过/失败结果被忽略。当没有其他模块被引用时,标记为optional模块并且成功验证时该模块才是必须的。该模块被调用来执行一些操作,并不影响模块堆栈的结果。
  • include 与其他控制标志不同,include与模块结果的处理方式无关。该标志用于直接引用其他PAM模块的配置参数

PAM配置方法

所有的PAM配置方法都在man手册中有说明,比如要查找某个程序支持PAM模块的配置,可以使用man 加模块名(去掉.so)查找说明,如# man pam_unix。(模块名可以在目录/lib/security/或/lib64/security/中找到。)

 

禁止直接使用root用户通过SSH登录

在/etc/pam.d/password-auth-ac或者/etc/pam.d/sshd配置文件中添加以下配置(该配置禁止SSH的口令认证,但仍然可以使用SSH密钥登录)

auth        required      pam_securetty.so

此外还可以配置/etc/securetty 文件禁止root用户通过所有tty终端登录系统

cp /etc/securetty /etc/securetty.saved
echo "" >/etc/securetty

 

# apache 相关加固

严格控制Apache主目录的访问权限,非超级用户不能修改该目录中的内容 

sudo chmod 600 /etc/httpd/conf/httpd.conf 

日志设置,LogLevel 用于调整记录在错误日志中的信息的详细程度,建议设置为notice。 日志的级别,默认是warn,notice级别比较详细,在实际中由于日志会占用大量硬盘空间

   

  • %h 是远程主机
  • %l 是由identd确定的用户的身份
  • %u 是HTTP身份验证确定的用户名
  • %t 是服务器处理完请求的时间。
  • %r 是来自客户端的请求行(“GET/HTTP/1.0”)。
  • %> s 是从服务器发送到客户端的状态代码(500,404等)
  • %b 是客户端响应的大小(以字节为单位)Referer是链接到此URL的页面。

禁止访问外部文件

 Order deny,allow   先拒绝所有,在允许指定   Allow from  XXXX(可以是域名,可以是IP,可以是网段)

Order allow,deny  先允许所有,在拒绝部分   Deny from  XXXX(可以是域名,可以是IP,可以是网段)

 

设置禁止访问某些文件或目录

 禁止访问后缀名为TXT的文件

 

 禁止目录列出,如果目录列出,极可能会导致信息泄露和下载,禁止apache列出目录配置

# 删掉Indexes

 

   设置错误页面重定向

自己设置报错文件,放置到根目录,出现问题后如图所示:

  

 

拒绝服务防范

 

Timeout # 客户端与服务器端建立连接前的时间间隔

KeepAliveTimeout # 限制每个session 的保持时间是15秒

 默认:Timeout 120 KeepAlive Off,KeepAliveTimeout 15,该项设置涉及服务器性能调整。

 !!: 用途有待测试

 隐藏服务器的版本信息

ServerSignature Off   # 有三个值,分别是Off,On和Email。该信息会被显示在错误页面中,如果设置为Off,则不显示,On和Email区别不大,Email会自动给ServerAdmin加一个mailto的链接地址。

ServerTokens Prod   # 有六个值,分别是ProductOnly,Major,Minor,Minimal,OS和Full。该信息会显示Apache和其模块信息在HTTP Header和错误页面中。

修改前:

  修改后:

  

关闭服务器不常见的http请求方法

禁用PUT、DELETE等危险的http请求方法,编辑httpd.conf文件,设置白名单:

<Location "/">
AllowMethods GET POST HEAD
</Location>

 

服务器关闭TRACE Method请求方式的方法

 TraceEnable off (:2.0.55以上版本的Apache服务器)

  • 虚拟主机用户可以在.htaccess文件中添加如下代码过滤TRACE请求:
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]

注:判断是否为虚拟主机,可以在httpd.conf里搜索VirtualHost确定虚拟主机的配置文件

  

# Redis 相关加固

限制redis 配置文件访问权限 | 文件权限

sudo chmod 600 /etc/redis.conf

修改默认6379端口 | 服务配置

/etc/redis.conf

禁用或者重命名危险命令 | 入侵防范

rename-command <COMMAND> "" 重命名为""代表禁用命令,如果想保留命令可以修改为上面例子的一串不容易猜测的字符串

rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""

禁止监听在公网 | 访问控制

 

 bind <地址>   # 127 或者内网IP

禁止使用root用户启动 | 访问控制

 

 检查是否是由redis用户启动的服务,如果不是或者没有创建此用户就需要手动创建(yum版本的已经自动创建)

打开保护模式 | 访问控制

 

确认保护模式是否启动(默认打开)

redis默认开启保护模式。要是配置里没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问

 

# MySQL相关安全加固

查看用户列表,不存在同名用户,用户身份标识唯一

 SELECT user, host FROM mysql.user;

## 删除空用户名

delete from mysql.user where user=’’;

## 防止注入:按照mysql路径在配置my.ini文件末尾加上local_infile=0表示不允许文件注入,保存。
local_infile=0

## 日志格式类型

log:查询日志;
log-error:错误日志,
log-bin:二进制日志;
log-slow-queries:慢查询日志

## 仅允许root本地登录

update user set host='localhost' where user='root';   

update user set host = "127.0.0.1" where user = "root" and host = "%";

flush privileges;

## 是否采用加密等安全方式对系统进行远程管理

show variables like %have_ssl%"

## 设置高强度密码

update user set password=password('这里输入密码') where user='root';

##  禁止网络连接,防止猜解密码攻击、溢出攻击、和嗅探攻击

PS:如果数据库不需要远程访问,可以禁止远程 TCP/IP 连接,通过在 MySQL 服务器的启动参数中添加--skip-networking参数使 MySQL 服务不监听任何 TCP/IP 连接,增加安全性。

## 设置可信 IP 访问控制

GRANT ALL PRIVILEGES ON db.*  TO 用户名@'IP子网/掩码';

## 连接数设置(根据您的机器性能和业务需求,设置最大、最小连接数)

在 MySQL 配置文件(my.conf 或 my.ini)的 [mysqld] 配置段中添加max_connections = 1000,保存配置文件,重启 MySQL 服务后即可生效。

## 禁用数据库用户的语句

ALTER USER 'user'@'host' ACCOUNT LOCK;

## 登录失败和连接超时设置

show variables like "%connection_control%";

connection_control_failed_connections_threshold  #  失败尝试的次数,默认为3,表示当连接失败3次后启用连接控制0表示不开启
connection_control_max_connection_delay  # 响应延迟的最大时间
connection_control_min_connection_delay  # 响应延迟的最小时间,默认1000微秒,1秒

## 超时时间查询和设置

show global variables like 'interactive_timeout';
show global variables like 'wait_timeout';

set global interactive_timeout=1800;
set global wait_timeout=1800;

## 禁止.mysql_history文件记录信息

.mysql_history文件会记录MySQL操作历史(即数据库查询语句),包含敏感信息。为了避免敏感信息泄露,需要禁止使用。
检查所有.mysql_history文件是否链接到dev/null,若没连接到,则以root用户执行如下命令:

find / -name ".mysql_history" | xargs
rm <your_path>/.mysql_history
ln -s /dev/null <your_path>/.mysql_history

## 禁止mysql对系统文件进行读写操作

local_infile变量表示能否使用load data local infile命令。该变量默认为ON。该变量为OFF时,禁用客户端使用load data local infile命令。避免通过数据库查询语句造成的任意文件读写漏洞。

执行如下SQL语句:

show variables like 'local_infile';
若返回结果不为OFF,则在/etc/my.cnf配置文件中修改

[mysqld]
local_infile = 0

 

 

如查询结果为空,不存在空口令用户

SELECT * FROM mysql.user WHERE length(password)= 0 OR password is null;

查询密码复杂度

show variables like "validate_password%";

validate_password_length=8,  # 密码长度最小值为 8
password_mixed_case_count=1,  # 至少应包含一个字母大小写

validate_password_number_count=1,  # 一个数字
validate_password_special_char_count=1,  # 一个特殊字符
validate_password policy=MEDIUM  # 密码验证策略为 MEDIUM

查询密码生命周期,上次修改时间,密码过期时间

SELECT user, host,password_lifetime,password_last_changed,password_expired FROM mysql.user";

开启安全审计(二进制日志),查看到 bin_log=ON

show global variables like "%general%

 

Tips:

知识补充-drop和delete的区别

drop
drop user XXX;

删除已存在的用户,默认删除的是'XXX'@'%'这个用户,如果还有其他的用户(其它主机名),如'XXX'@'localhost'等,不会一起被删除。如果要删除'XXX'@'localhost',使用drop删除时需要加上host即drop user 'XXX'@'localhost'。

delete
delete from user where user='XXX' and host='localhost';

其中XXX为用户名,localhost为主机名(即需指定主机名)。

drop不仅会将user表中的数据删除,还会删除其他权限表的内容。而delete只删除user表中的内容,所以使用delete删除用户后需要执行FLUSH PRIVILEGES;刷新权限,否则下次使用create语句创建用户时会报错。

 

关于更改数据库用户密码

update user set password=password('123') where user='root' and host='localhost';
# mysql 5.7以下

update mysql.user set authentication_string=PASSWORD('newpassword') where user='username' and host='localhost';
# mysql 5.7以上

alter user 'root'@'localhost' identified by 'newpassword';
# mysql 8.0以上

 

 

4.情景模拟

勒索病毒“排雷”,提前在环境里面模拟已经中了勒索病毒,自行进行排查查找相关问题和后门

发现后门账号r00t,发现高仿进程-mysql

 

 

... 后面再想想,有时间在补充

 

 

参考资料:

https://blog.csdn.net/qq_19676401/article/details/121701097?share_token=28ee3c2a-8b99-42a2-9aee-9a9d83d3907f

https://blog.csdn.net/qq_55213436/article/details/125668967?share_token=9ac8293b-7ade-4598-875b-a28d0417be6e

https://blog.csdn.net/am540/article/details/117111580

https://blog.csdn.net/chaishen10000/article/details/106104868?share_token=356d4191-117d-4460-b3bc-7715cfebfc0b

posted @ 2022-10-24 08:37  Cong0ks  阅读(481)  评论(0编辑  收藏  举报