40、网络安全与脚本编程基础

网络安全与脚本编程基础

1. 事件响应

事件响应是一套策略,它规定了当系统出现异常情况时应采取的措施,比如有人入侵系统时的应对方法。对事件的响应取决于系统的使用方式以及系统对个人或业务的重要性。进行全面的事件响应时,需牢记以下要点:
- 明确计算机和网络的关键程度与重要性,确定可用于保护系统的资源和人员。
- 采取措施预防并尽量减少潜在的损害和中断。
- 制定并记录全面的应急计划。
- 定期测试应急计划,并适时修订相关程序。

2. 网络安全审查

网络安全审查主要聚焦于评估以下几个方面的安全机制:
- 预防 :设置防火墙、启用数据包过滤、禁用不必要的inetd或xinetd服务、关闭不需要的互联网服务、使用TCP包装器进行访问控制以及使用SSH进行安全的远程登录。
- 检测 :使用网络入侵检测工具并捕获系统日志。
- 响应 :制定事件响应程序。

2.1 inetd或xinetd启动的服务

根据不同的系统发行版,inetd或xinetd服务器可能被配置为启动一些传统的互联网服务,如Telnet和FTP。一般不建议使用这些服务,但是否开启某些服务取决于系统连接互联网的方式以及系统的使用情况。通常,可以通过在相关行前添加井号(#)来注释掉该行,从而关闭inetd和xinetd服务。
若使用xinetd,可以通过检查 /etc/xinetd.d 目录下的配置文件,查看其中包含 disable = yes 行的文件来确定哪些服务已关闭(若该行被注释掉则不算,注释以行首的#字符表示)。对于想要关闭的任何服务,可以在其配置文件中添加 disable = yes 行。
此外,还需检查以下文件以查看inetd或xinetd服务使用的访问控制:
- /etc/hosts.allow :列出允许访问特定服务的主机。
- /etc/hosts.deny :列出被拒绝访问服务的主机。

2.2 独立服务

许多服务,如apache、httpd(Web服务器)和sendmail(邮件服务器),如果配置为开机自启,会在系统启动时自动运行。
在某些发行版中,可以使用 systemctl chkconfig 命令检查这些独立服务器在不同运行级别下的启动设置。大多数系统通常在运行级别3(文本登录)或5(图形登录)下启动,因此关键在于这两个级别的服务器设置。
- 查看服务器列表:输入 chkconfig --list | more
- 关闭特定运行级别(3和5)的服务:输入 chkconfig --level 35 servicename off ,其中 servicename 是要关闭的服务名称。
对于使用Systemd启动方法的发行版,输入 systemctl --type=service 列出正在运行的服务。在一些发行版中,还可以使用图形用户界面(GUI)工具查看在任何运行级别下启用和运行的服务,例如在YaST中,点击窗口左侧的“System”,然后点击右侧的“Runlevel Editor”。
进行网络安全审计时,记录所有开启的服务器,并根据对系统的了解判断它们是否真的需要开启。开启特定服务的决策取决于系统的使用方式(如作为Web服务器或桌面系统)以及连接互联网的方式(如通过防火墙或直接连接)。

3. 渗透测试

渗透测试是确定Linux系统上实际运行哪些服务的最佳方法。它从攻击者的角度尝试访问系统,通常从互联网上的某个系统发起,试图入侵或至少访问Linux系统上运行的服务。
渗透测试的一个方面是查看Linux系统上哪些端口是开放的。端口号用于标识与系统的TCP/IP网络连接,只有当服务器在某个端口上“监听”时,尝试连接该端口才会成功。如果服务器对端口的连接请求做出响应,则认为该端口是开放的。
渗透测试的第一步是进行端口扫描,即自动尝试连接每个端口号以查看是否有有效响应返回。有许多可用的自动化工具可以进行端口扫描,例如流行的端口扫描工具nmap。
进行端口扫描后,可以知道哪些端口是开放的且可能被利用。并非所有服务器都存在安全问题,但许多服务器有已知的漏洞。开放端口为攻击者通过服务器攻击系统提供了途径。实际上,可以使用称为漏洞扫描器的自动化工具来识别系统中存在的漏洞。无论Linux系统是直接连接到互联网(通过DSL或电缆调制解调器)还是通过防火墙连接,都可以使用端口扫描和漏洞扫描工具来检查防御是否存在漏洞。

4. 漏洞测试类型

渗透测试的首要目的是识别漏洞。从这个角度来看,有三种不同的测试方法:黑盒测试、白盒测试和灰盒测试。这三种方法的区别在于测试开始时所假设拥有的信息量。
- 黑盒测试 :假设对网络一无所知,寻找外部人员可能偶然发现的漏洞,如开放端口和弱密码。例如,一个无聊的恶意分子随机发现了你的网络并试图破坏它。
- 白盒测试 :假设攻击者是了解系统内部情况的人员,试图破坏系统。比如,刚被解雇的系统管理员为了报复而试图破坏网络。
- 灰盒测试 :介于前两者之间,假设问题是由内部人员引起的。例如,发货部门的某人因未获得期望的加薪而愤怒,想让公司付出代价。攻击者虽不如管理员了解系统,但比完全的外部人员知道得多。

5. 安全测试工具

有许多自动化工具可用于进行安全测试。这些工具的功能各异,有些用于查找一定IP地址范围内每个系统上的开放端口,有些用于查找与开放端口相关的漏洞,还有些用于捕获并帮助分析系统的弱点,以获取有关网络状况的有用信息。
可以在 https://sectools.org 浏览基于nmap用户非正式投票选出的前100个安全工具列表。以下是一些常见的计算机安全测试工具分类:
| 类型 | 工具名称 |
| ---- | ---- |
| 端口扫描器 | nmap, Strobe |
| 漏洞扫描器 | Nessus Security Scanner, SAINT, SARA, Whisker (CGI scanner), ISS Internet Scanner, CyberCop Scanner, Vetescan, Retina Network Security Scanner |
| 网络实用工具 | Netcat, hping2, Firewalk, Cheops, ntop, ping, ngrep, AirSnort (802.11 WEP encryption - cracking tool) |
| 主机安全工具 | Tripwire, lsof |
| 数据包嗅探器 | tcpdump, Ethereal, dsniff, sniffit |
| 入侵检测 | aide (Advanced Intrusion Detection Environment), Snort, Abacus portsentry, scanlogd, NFR, LIDSSystems (IDSs) |
| 日志分析和监控工具 | logcolorise, tcpdstats, nlog, logcheck, LogWatch, Swatch |
| 密码检查工具 | John the Ripper |

其中,John the Ripper是管理员用于测试用户密码强度的优秀命令行工具。在大多数发行版中,需要使用 apt install john 进行安装,使用 unshadow 命令创建包含 etc/passwd etc/shadow 条目的文件,然后查找密码弱点。
nmap(网络映射器的缩写)是一个端口扫描工具,它可以快速扫描大型网络,确定网络上可用的主机、它们提供的服务、运行的操作系统(及其版本)、使用的数据包过滤器或防火墙类型等数十种特征。可以在 https://nmap.org 了解更多关于nmap的信息。
如果nmap尚未安装,可以使用以下命令进行安装:
- 使用 apt - get install nmap
- 使用YaST的软件搜索功能查找nmap。
- 使用特定发行版的接口进行安装。
如果获得网络管理员的许可,可以使用类似以下命令对局域网进行扫描(将IP地址范围替换为适合自己网络的地址):

nmap -O -sS 10.0.2.10 - 20

典型的输出示例如下:

Starting Nmap 7.80 ( https://nmap.org ) at 2022 - 03 - 16 19:35 EDT
Nmap scan report for ubuntu22 (10.0.2.15)
Host is up (0.000059s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6.32
OS details: Linux 2.6.32
Network Distance: 0 hops
OS detection performed. Please report any incorrect results at https://nmap.org/submit/.
Nmap done: 11 IP addresses (1 host up) scanned in 1.93 seconds

若要快速扫描自己的机器,可以使用IP地址127.0.0.1:

sudo nmap -O -sS 127.0.0.1

输出示例如下:

Starting Nmap 7.80 ( https://nmap.org ) at 2022 - 03 - 16 19:37 EDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000060s latency).
Not shown: 998 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
631/tcp open  ipp
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6.32
OS details: Linux 2.6.32
Network Distance: 0 hops
OS detection performed. Please report any incorrect results at https://nmap.org/submit/.
Nmap done: 1 IP address (1 host up) scanned in 1.46 seconds

在这个示例中,Ubuntu系统的端口22开放用于远程SSH访问,端口631开放用于访问CUPS打印服务。

6. 入门级shell脚本编程

在Linux系统中,bash(Bourne Again Shell)是大多数系统的默认shell,它提供了I/O重定向和管道功能,允许将一个命令的输出作为另一个命令的输入。bash还包含条件语句(如if语句)和循环语句(如for语句),可以根据特定条件执行命令或重复执行一组命令。可以利用这些特性编写称为shell脚本的程序,即存储在文件中的面向任务的shell命令集合。

6.1 尝试简单的shell脚本

对于非程序员来说,编程可能会让人感到担忧,但shell脚本编程可以简单到只需将几个命令存储在一个文件中并执行。实际上,一个有用的shell程序甚至可以只包含一个命令。
shell脚本在系统管理员中很受欢迎,因为它们可以帮助自动化频繁执行的任务。例如,当硬盘似乎快满时,可能希望找到所有超过一定大小(如5MB)且在过去30天内未被访问的文件,然后向与这些大文件相关的用户发送电子邮件,要求他们归档和清理这些文件。可以使用以下find命令来识别大文件:

find / -type f -atime +30 -size +5000k -exec ls -l {} \; > /tmp/largefiles

此命令创建一个名为 /tmp/largefiles 的文件,其中包含占用过多空间的旧文件的详细信息。获取文件列表后,可以使用其他一些Linux命令(如sort、cut和sed)来准备并向拥有大文件的用户发送邮件。将这些命令放在一个文件中创建shell脚本,避免每次都手动输入命令。
bash脚本和大多数Linux命令一样,接受命令行选项。在脚本内部,可以使用 $1 $2 等引用这些选项, $0 表示脚本的名称。以下是一个接受参数的典型bash脚本示例:

#!/bin/sh
echo "This script's name is: $0"
echo Argument 1: $1
echo Argument 2: $2

将这个简单的脚本保存为名为 simple 的文件,并使用以下命令使其可执行:

chmod +x simple

运行脚本:

./simple

输出如下:

This script's name is: ./simple
Argument 1:
Argument 2:

若带参数运行脚本:

./simple "This is one argument" second - argument third

输出如下:

This script's name is: ./simple
Argument 1: This is one argument
Argument 2: second - argument

这个示例脚本只打印前两个参数,忽略第三个及后续参数。

6.2 探索shell脚本编程的基础

和任何编程语言一样,bash shell支持以下特性:
- 变量 :用于存储值,包括用于访问传递给shell脚本的命令行参数和其他特殊值的特殊内置变量。
- 表达式求值 :具备计算表达式的能力。
- 控制结构 :可以循环执行多个shell命令或根据条件执行某些命令。
- 函数定义 :能够定义可在脚本中多次调用的函数,bash还包含许多可在任何脚本中使用的内置命令。

在bash中定义变量的方式与定义环境变量相同,例如:

count=12

需要注意的是,语句中不能有空格。使用变量的值时,在变量名前加美元符号($),如 $PATH 表示变量 PATH 的值。要显示变量 count 的值,可以使用以下命令:

echo $count

bash有一些特殊变量用于访问命令行参数,在shell脚本中, $0 表示脚本的名称, $1 $2 等表示命令行参数, $* 将所有命令行参数存储为一个变量, $? 包含shell执行的最后一个命令的退出状态。
在bash脚本中,可以提示用户输入并使用 read 命令将输入读取到变量中,示例如下:

echo -n "Enter a value: "
read value
echo "You entered: $value"

网络安全与脚本编程基础

7. 高级shell脚本编程

在掌握了入门级的shell脚本编程后,我们可以进一步探索高级shell脚本编程,其中 sed awk 是两个非常强大的工具。

7.1 尝试sed

sed (Stream Editor)是一种流编辑器,它可以对输入的文本进行逐行处理,并根据指定的规则进行修改、替换、删除等操作。以下是一个简单的 sed 示例,用于替换文本中的字符串:

echo "Hello, World!" | sed 's/World/Linux/'

在这个示例中, s 表示替换操作, /World/Linux/ 表示将 World 替换为 Linux 。执行上述命令后,输出将是 Hello, Linux!

sed 还可以用于删除行、插入行等操作。例如,要删除包含特定字符串的行,可以使用以下命令:

echo -e "Line 1\nLine 2\nLine 3" | sed '/Line 2/d'

这里的 d 表示删除操作, /Line 2/ 表示匹配包含 Line 2 的行。执行后,输出将是:

Line 1
Line 3
7.2 使用awk和sed

awk 是一种强大的文本处理工具,它可以对文本进行格式化、统计、提取等操作。结合 sed awk 可以实现更复杂的文本处理任务。

以下是一个使用 awk 统计文件中每行单词数量的示例:

echo -e "This is a test\nAnother line here" | awk '{print NF}'

在这个示例中, NF awk 的内置变量,表示当前行的字段数量(即单词数量)。执行后,输出将是:

4
3

我们可以将 sed awk 结合使用,例如先使用 sed 对文本进行预处理,再使用 awk 进行统计。假设我们有一个文件 data.txt ,内容如下:

Name: John, Age: 25
Name: Jane, Age: 30

我们可以使用以下命令提取每个人的年龄并求和:

cat data.txt | sed 's/.*Age: //' | awk '{sum+=$1} END {print sum}'

首先, sed 命令将每行中的 Name: ..., Age: 部分替换为空,只保留年龄数字。然后, awk 命令将这些数字累加起来,并在处理完所有行后输出总和。

8. Linux编程概述

在Linux环境下进行编程,我们可以使用多种编程语言和开发工具。

8.1 编程概述

Linux提供了丰富的编程环境,支持C、C++、Python、Java等多种编程语言。不同的编程语言适用于不同的场景,例如C和C++适合系统编程和高性能应用开发,Python适合脚本编写和数据分析,Java适合企业级应用开发。

在选择编程语言时,需要考虑项目的需求、性能要求、开发效率等因素。例如,如果要开发一个简单的脚本程序,Python可能是一个不错的选择;如果要开发一个操作系统内核或高性能游戏,C或C++可能更合适。

8.2 探索Linux中的软件开发工具

Linux中有许多软件开发工具可以帮助我们进行编程开发,以下是一些常见的工具:
| 工具类型 | 工具名称 | 描述 |
| ---- | ---- | ---- |
| 编译器 | gcc、g++ | 用于编译C和C++程序 |
| 解释器 | python、java | 用于解释执行Python和Java程序 |
| 调试器 | gdb | 用于调试程序,查找和修复程序中的错误 |
| 版本控制系统 | git | 用于管理项目的代码版本,方便团队协作开发 |
| 集成开发环境(IDE) | Eclipse、NetBeans | 提供代码编辑、编译、调试等一站式开发环境 |

例如,使用 gcc 编译一个简单的C程序:

#include <stdio.h>

int main() {
    printf("Hello, Linux!\n");
    return 0;
}

将上述代码保存为 hello.c ,然后使用以下命令进行编译:

gcc -o hello hello.c

这将生成一个可执行文件 hello ,运行该文件:

./hello

输出将是 Hello, Linux!

9. GNU许可证的影响

在Linux编程中,GNU许可证是一个重要的概念。GNU(GNU’s Not Unix)是一个自由软件项目,旨在创建一个完全自由的操作系统。GNU许可证主要有GPL(General Public License)、LGPL(Lesser General Public License)和AGPL(Affero General Public License)等。

  • GPL :要求使用GPL许可证的软件及其衍生作品必须以GPL许可证发布,保证软件的自由传播和修改。
  • LGPL :允许将LGPL许可证的库与其他非自由软件结合使用,但修改后的库必须以LGPL许可证发布。
  • AGPL :适用于网络服务软件,要求在网络上提供服务时,必须向用户提供源代码。

理解GNU许可证的影响对于开发者非常重要,在使用开源软件或发布自己的软件时,需要遵守相应的许可证规定。例如,如果使用了GPL许可证的库来开发一个软件,那么这个软件也必须以GPL许可证发布。

10. 总结

本文涵盖了网络安全和脚本编程的多个方面,从网络安全的事件响应、审查、渗透测试和漏洞测试,到脚本编程的入门级和高级知识,以及Linux编程概述和GNU许可证的影响。

在网络安全方面,我们了解到事件响应的重要性以及如何制定应急计划,通过网络安全审查评估系统的安全机制,利用渗透测试和漏洞扫描工具发现系统的漏洞。在脚本编程方面,我们学习了如何编写简单和复杂的shell脚本,使用 sed awk 进行文本处理,以及在Linux环境下进行编程开发的工具和许可证相关知识。

希望这些知识能够帮助你更好地保护系统安全,提高脚本编程能力,在Linux环境下进行高效的开发工作。

下面是一个简单的mermaid流程图,展示了网络安全审查的主要步骤:

graph LR
    A[网络安全审查] --> B[预防]
    A --> C[检测]
    A --> D[响应]
    B --> B1[设置防火墙]
    B --> B2[启用数据包过滤]
    B --> B3[禁用不必要服务]
    C --> C1[使用入侵检测工具]
    C --> C2[捕获系统日志]
    D --> D1[制定事件响应程序]

通过这个流程图,我们可以更清晰地看到网络安全审查的主要环节和具体措施。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值