——引言
01
日志
1.Linux系统日志:
2.syslog()
应用程序使用syslog()与守护进程rsyslogd通信。
该函数采用可变参数(第二个参数message和第三个参数。。。)来结构化输出。
priority:设施值 (按位异或) 日志级别。设施值默认:LOG_USER,下面针对默认设施值,讨论日志级别。
2.1下面这个函数可以改变syslog的默认输出方式,进一步结构化日志内容
(1)ident:指定字符串将被添加到日志消息的日期和时间之后,通常设为程序的名字。
(2)logopt:对后续syslog调用的行为进行配置,它可取下列值的按位异或
(3)facility: 用来修改ysyslog默认设施值
此外,日志过滤也很重要,程序再开发阶段可能需要输出很多调试信息,而发布之后,我们又要将这些调试信息关闭,解决这个问题的方法并不是再程序发布之后,删除调试代码(日后可能还会用到),而是缉拿但地设置日志掩码,使日志级别大于日志掩码的日志被系统忽略。
2.2下面这个函数用于设置syslog的日志掩码。
maskpri:指定日志掩码值,该函数始终回成功,它返回调用进程先前的日志掩码值。
2.3关闭日志功能:
02
用户信息
1.UID, EUID, GID, EGID
用户信息对于服务器安全很重要,大多说服务器以root启动, 非root运行
基础知识:
一个进程拥有两个用户ID, UID, EUID, EUID存在的目的是为了方便资源的访问, 它使得运行程序的用户拥有该程序的有效用户权限,比如,su用来更改账户信息,但修改账户时su程序的所有者是root,在普通用户运行su程序时,其有效用户就是该程序的所有者root, 有效用户为root的进程称为特权进程,EGID与EUID类似,下面演示uid, euid区别:
将生成的可执行文件,所有者设置为root,并设置该文件set-user-id标志,然后运行。
从测试输出结果看,进程的uid是启动程序的用户id, 而euid是root。
2.切换用户
03
进程间关系
1.进程组:
Linux下每一个进程都属于一个进程组,因此他们除了pid之外,还有进程组ID(PGID)。我们用如下函数获取指定进程组PGID.
成功返回pid, 失败-1,设置errno。
如果pid与pgid相同,则由pid指定的进程别设置为进程组首领:如果pid为0, 表示当前进程的PGID为pgid;如果pgid为0, 则使用pid作为目标pgid。setpid函数成功时返回0, 失败-1, 设置errno。
一个进程只能设置自己或者其子进程的PGID。并且, 当子进程调用exec系列函数后,我们也不能再在父进程中对他设置PGID。
2.会话
(1)一些有关联的进程将组成一个会话, 下面的函数用于创建一个会话:
该函数不能由进程组的首领进程调用,否则将产生一个错误。对于非首领的进程, 调用该函数不仅创建新会话, 而且有如下额外效果。
调用进程成为会话的首领,此时该进程时新会话的唯一成员。
新建一个进程组,其PGID就是调用进程的PID, 调用进程成为该组的首领。
调用进程将甩开终端(如果有)
该函数成功时返回新的进程组PGID, 失败-1, errno。
Linux进程并未提供所谓会话ID的概念, 但Linux系统认为它等于会话首领所在的进程组的PGID,
(2)并提供了如下函数读取SID
3.用ps命令查看进程关系
执行ps命令可查看进程,进程组和会话之间的关系。
在bash_shell 下执行ps和less命令,所以ps和less命令的父进程时bash命令,这个可以从PPID(父进程PID)一列看出。
这三条命令创建了一个会话(SID是2962)和两个进程组(PGID:2962, 3102)bash命令的PID,PGID和SID都相同,显然它时会话的首领, 也就是组2962的首领。ps时3102的首领,
04
系统资源限制
Linux上运行的程序都会受到资源限制的影响,比如物理设备限制(cpu数量,内存数量等),系统策略限制(cup时间等),以及具体实现的限制(文件名最大长度)Linux系统资源限制可以通过如下一对函数来读取和设置:
getrlimit , setrlimit
rlimit 结构体定义如下:
成功返回0, 失败-1, 置errno
rlim_t 是一个整数类型,它描述资源级别
rlim_cur 成员指定资源的软限制,建议性的,最好不要超越的限制,如果超越,系统可能向进程发送信号,并终止运行,如果当前进程CPU时间超过软限制,系统将向进程发送SIGXCPU信号;当文件尺寸超过其软限制时,系统将向进程发送SIZEXFSZ信号。
rlim_max 成员指定资源的硬限制。硬限制一般是软限制的上限,普通程序可以减小应限制,而只有以root身份运行的程序才能增加硬限制,此外我们可以使用ulimit命令修改当前shell环境下的资源限制(软/硬)这种修改对该shell启动的所有后续程序都有效,我们也可以通过修改配置文件来改变系统软限制和应限制,而这种修改时永久的。
resource参数指定资源限制类型。如下表
05
改变工作目录和根目录
有些服务器程序好需要改变工作目录和根目录(web /var/www)
获取当前进程工作目录和改变进程的工作目录的函数:
buf参数指向的内存用于存储当前工作目录的绝对路径,size指定其大小
如果当前目录的绝对路径超度(+1 (‘\0’))超过了size,则getcwd返回NULL,errno:ERANG。
chdir中path指向要切换到的目录。成功0, 失败-1 置errno。
改变进程根目录:chroot
chroot并不改变进程的当前工作目录,调用chroot之后,仍需要调用chdir(“/”)来将工作转至新的工作目录,之后原来的文件描述符依然生效。所以可以利用早先打开的文件描述符来访问调用chroot之后不能直接访问的文件(目录).
06
服务器程序后台化
最后,如何在代码中让一个进程以守护进程的防止运行,守护进程的编写遵循一定的步骤,下面一个实例。
实际上,linux提供了完成同样功能的库函数:
nochdir:传0则工作目录将被设置为”/”,否则继续使用当前工作目录。
noclose:传0标准输入输出,标准错误输出都被重定向到,dev/null,否则继续使用原来的设备,成功0, 失败-1 置error。
1、NMap工具
主要功能:探测主机是否在线、扫描主机开放端口和嗅探网络服务,用于网络探测和安全扫描。
NMap支持很多扫描技术,例如:UDP、TCPconnect()、TCPSYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、SYN扫描和null扫描。
命令格式:Nmap [ 扫描类型 ] [ 通用选项 ] { 扫描目标说明 }
扫描类型:
-sT | TCP connect()扫描,这是最基本的TCP扫描方式,用来建立一个TCP连接,如果成功则认为目标端口正在监听,否则认为目标端口没有监听程序。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。 |
-sS | TCP同步扫描(TCP SYN),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口没有监听程序。所以这项技术通常称为半开扫描(half-open)。这项技术最大的好处是,很少有系统能够把这记入系统日志。不过,你需要root权限来定制SYN数据包。 |
-sF,-sX,-sN | 秘密FIN数据包扫描、圣诞树(Xmas Tree)、空(Null)扫描模式。这些扫描方式的理论依据是:关闭的端口需要对你的探测包回应RST包,而打开的端口必需忽略有问题的包,通过这种扫描,可间接用于检测防火墙的健壮性。 |
-sP | ping扫描,用ping方式检查网络上哪些主机正在运行。当主机阻塞ICMP echo请求包是ping扫描是无效的。nmap在任何情况下都会进行ping扫描,只有目标主机处于运行状态,才会进行后续的扫描。 |
-sU | UDP扫描,如果你想知道在某台主机上提供哪些UDP服务,可以使用此选项。 |
-sA | ACK扫描,这项高级的扫描方法通常可以用来穿过防火墙。 |
-sW | 滑动窗口扫描,非常类似于ACK的扫描。 |
-sR | RPC扫描,和其它不同的端口扫描方法结合使用。 |
-b | FTP反弹攻击(bounce attack),连接到防火墙后面的一台FTP服务器做代理,接着进行端口扫描。 |
通用选项:
-n | 不做反向DNS解析,以加快扫描速度 |
-P0 | 在扫描之前,不ping主机;有些网络防火墙可能禁止ICMP请求包,使用这种扫描类型可以跳过ping测试 |
-PT | 扫描之前,使用TCP ping确定哪些主机正在运行。 |
-PS | 对于root用户,这个选项让nmap使用SYN包而不是ACK包来对目标主机进行扫描。 |
-PI | 设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。 |
-PB | 这是默认的ping扫描选项。它使用ACK(-PT)和ICMP(-PI)两种扫描类型并行扫描。如果防火墙能够过滤其中一种包,使用这种方法,你就能够穿过防火墙。 |
-O | 这个选项激活对TCP/IP指纹特征(fingerprinting)的扫描,获得远程主机的标志,也就是操作系统类型。 |
-I | 打开nmap的反向标志扫描功能。 |
-f | 使用碎片IP数据包发送SYN、FIN、XMAS、NULL。包增加包过滤、入侵检测系统的难度,使其无法知道你的企图。 |
-v | 强烈推荐使用这个选项,它会给出扫描过程中的详细信息。 |
-S | 在一些情况下,nmap可能无法确定你的源地址(nmap会告诉你)。在这种情况使用这个选项给出你的IP地址。 |
-g port | 设置扫描的源端口。一些天真的防火墙和包过滤器的规则集允许源端口为DNS(53)或者FTP-DATA(20)的包通过和实现连接。显然,如果攻击者把源端口修改为20或者53,就可以摧毁防火墙的防护。 |
-oN | 把扫描结果重定向到一个可读的文件logfilename中。 |
-oS | 扫描结果输出到标准输出。 |
-A | 打开操作系统探测和版本探测。 |
扫描目标:
目标地址 | 可以为IP地址,CIRD地址等。如192.168.1.2,222.247.54.5/24 |
-iL filename | 从filename文件中读取扫描的目标。 |
-iR | 让nmap自己随机挑选主机进行扫描。 |
-p | 端口,这个选项让你选择要进行扫描的端口号的范围。可使用逗号分隔多个端口,减号连接一个端口范围,在列表前指定T:表示TCP端口,U:表示UDP端口 |
-exclude | 排除指定主机。 |
-excludefile | 排除指定文件中的主机。 |
端口的三种状态:
举例说明:
1、探测指定网段是否有FTP服务的主机,不做DNS反向解析
nmap -sS n p 21192.168.0.0/24
2、探测指定服务器是否启有特定端口的服务
nmap n p T:21-25,80,110,3389sS 192.168.0.1
3、使用TCP连接扫描探测指定服务器,即使无法ping通也仍然继续探测
4、nmap -sT PO 192.168.0.1
5、探测指定服务器的操作系统类型
nmap O n 192.168.0.1
6、探测局域网段中各主机开启了哪些服务
nmap sS 192.168.0.0/24
7、探测192.168.0.0和172.16.0.0/16网段中有哪些主机在运行
nmap sP n 192.168.0.0/24 172.16.0.0/16
8、快速扫描主机开放端口
nmap -F 192.168.0.1
| 留言与评论(共有 0 条评论) “” |