├── Iptables ├── Iptables-CMD.txt ├── Linux-iptables-netfilter.word └── README.txt ├── Kali-Linux ├── Kali 渗透测试 - 服务器攻击实战(20个实验).txt ├── readme.txt └── 安装.txt ├── LinEnum.sh ├── Linux-Safe-configuration ├── LInux_Safety_Application_Doc.word ├── Linux-Safe-Configuration.word ├── Linux_File_Permission_List.txt ├── readme.txt └── sudo_Security_Configuration │ ├── Sudo-Security-Configuration.word │ └── readme.txt ├── Linux信息获取.txt ├── ManagementTechnology ├── ManagementSecurity.txt ├── NetworkLayerSecurity.txt ├── SystemLayerSecurity.txt ├── SystemLayerSecurityTest.txt ├── SystemServiceSecurity.txt └── readme.txt ├── README.txt ├── Rootkit ├── chkrootkit │ └── readme.txt ├── readme.txt └── rkhunter │ └── readme.txt ├── Snort └── readme.txt ├── tcmdump └── readme.txt └── zabbix └── readme.txt /Iptables/Iptables-CMD.txt: -------------------------------------------------------------------------------- 1 | 一般的命令格式如下: 2 | iptables [-t 表] -命令 匹配 操作 3 | 4 | 说明 5 | (1) -t 表 6 | 表选项用于指定命令应用于哪个iptables内置表。 7 | (2)命令 8 | 命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,如下表所示 9 | -P --policy <链名> 定义默认策略 10 | -L --list <链名> 查看iptables规则列表 11 | -A --append <链名> 在规则列表的最后增加1条规则 12 | -I --insert <链名> 在指定的位置插入1条规则 13 | -D --delete <链名> 从规则列表中删除1条规则 14 | -R --replace <链名> 替换规则列表中的某条规则 15 | -F --flush <链名> 删除表中所有规则 16 | -Z --zero <链名> 将表中数据包计数器和流量计数器归零 17 | -X --delete-chain <链名> 删除自定义链 18 | -v --verbose <链名> 与-L他命令一起使用显示更多更详细的信息 19 | (3) 匹配规则 20 | 匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下表所示 21 | -i --in-interface 网络接口名> 指定数据包从哪个网络接口进入, 22 | -o --out-interface 网络接口名> 指定数据包从哪个网络接口输出 23 | -p ---proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等 24 | -s --source 源地址或子网> 指定数据包匹配的源地址 25 | --sport 源端口号> 指定数据包匹配的源端口号 26 | --dport 目的端口号> 指定数据包匹配的目的端口号 27 | -m --match 匹配的模块 指定数据包规则所使用的过滤模块 28 | (4) 操作 29 | 前面我们说过iptables处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 以外,还多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK等。我们只说明其中最常用的动作: 30 | REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下: 31 | iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply 32 | DROP 丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 33 | REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护web 服务器。例如: 34 | iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081 35 | MASQUERADE 改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。范例如下: 36 | iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000 37 | LOG 将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。例如: 38 | iptables -A INPUT -p tcp -j LOG --log-prefix "input packet" 39 | SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下: 40 | iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200 41 | DNAT 改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。范例如下: 42 | iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100 43 | MIRROR 镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。 44 | QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。 45 | RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。 46 | MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下: 47 | iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22 48 | 看了本文是不是对iptables参数有所了解了,下文我会使用实例来更详细的说明iptables的参数的用法。 49 | 50 | ####################################################################################################### 51 | 保存规则 52 | 使用iptables程序建立的规则只会保存在内存中,通常我们在修改了iptables的规则重启 iptables 后,之前修改的规则又消失了。那么如何保存新建立的规则呢? 53 | 54 | 方法1、对于RHEL和ceontos系统可以使用service iptables save将当前内存中的规则保存到/etc/sysconfig/iptables文件中 55 | 方法2、修改/etc/sysconfig/iptables-config 将里面的IPTABLES_SAVE_ON_STOP="no", 这一句的"no"改为"yes"这样每次服务在停止之前会自动将现有的规则保存在 /etc/sysconfig/iptables 这个文件中去。 56 | ####################################################################################################### 57 | 58 | (一)、常用命令示例: 59 | 60 | 1、命令 -A, --append 61 | 范例:iptables -A INPUT -p tcp --dport 80 -j ACCEPT 62 | 说明 :新增规则到INPUT规则链中,规则时接到所有目的端口为80的数据包的流入连接,该规则将会成为规则链中的最后一条规则。 63 | 2、命令 -D, --delete 64 | 范例:iptables -D INPUT -p tcp --dport 80 -j ACCEPT 65 | 或 : iptables -D INPUT 1 66 | 说明: 从INPUT规则链中删除上面建立的规则,可输入完整规则,或直接指定规则编号加以删除。 67 | 3、命令 -R, --replace 68 | 范例: iptables -R INPUT 1 -s 192.168.0.1 -j DROP 69 | 说明 取代现行第一条规则,规则被取代后并不会改变顺序。 70 | 4、命令 -I, --insert 71 | 范例:iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT 72 | 说明: 在第一条规则前插入一条规则,原本该位置上的规则将会往后移动一个顺位。 73 | 5、命令 -L, --list 74 | 范例: iptables -L INPUT 75 | 说明:列出INPUT规则链中的所有规则。 76 | 6、命令 -F, --flush 77 | 范例: iptables -F INPUT 78 | 说明: 删除INPUT规则链中的所有规则。 79 | 7、命令 -Z, --zeroLINUX教程 centos教程 80 | 范例:iptables -Z INPUT 81 | 说明 将INPUT链中的数据包计数器归零。它是计算同一数据包出现次数,过滤阻断式攻击不可少的工具。 82 | 8、命令 -N, --new-chain 83 | 范例: iptables -N denied 84 | 说明: 定义新的规则链。 85 | 9、命令 -X, --delete-chain 86 | 范例: iptables -X denied 87 | 说明: 删除某个规则链。 88 | 10、命令 -P, --policy 89 | 范例 :iptables -P INPUT DROP 90 | 说明 :定义默认的过滤策略。 数据包没有找到符合的策略,则根据此预设方式处理。 91 | 11、命令 -E, --rename-chain 92 | 范例: iptables -E denied disallowed 93 | 说明: 修改某自订规则链的名称。 94 | 95 | (二)常用封包比对参数: 96 | 97 | 1、参数 -p, --protocol 98 | 范例:iptables -A INPUT -p tcpLINUX教程 centos教程 99 | 说明:比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。 100 | 2、参数 -s, --src, --source 101 | 范例: iptables -A INPUT -s 192.168.1.100 102 | 说明:用来比对数据包的来源IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时可以使用!运算子进行反向比对,例如:-s ! 192.168.0.0/24。 103 | 3、参数 -d, --dst, --destination 104 | 范例: iptables -A INPUT -d 192.168.1.100 105 | 说明:用来比对封包的目的地 IP,设定方式同上。 106 | 4、参数 -i, --in-interface 107 | 范例 iptables -A INPUT -i lo 108 | 说明:用来比对数据包是从哪个网卡进入,可以使用通配字符 + 来做大范围比对,如:-i eth+ 表示所有的 ethernet 网卡,也可以使用 ! 运算子进行反向比对,如:-i ! eth0。这里lo指本地换回接口。 109 | 5、参数 -o, --out-interface 110 | 范例:iptables -A FORWARD -o eth0 111 | 说明:用来比对数据包要从哪个网卡流出,设定方式同上。 112 | 6、参数 --sport, --source-port 113 | 范例:iptables -A INPUT -p tcp --sport 22 114 | 说明:用来比对数据的包的来源端口号,可以比对单一端口,或是一个范围,例如:--sport 22:80,表示从 22 到 80 端口之间都算是符合件,如果要比对不连续的多个端口,则必须使用 --multiport 参数,详见后文。比对端口号时,可以使用 ! 运算子进行反向比对。 115 | 7、参数 --dport, --destination-port 116 | 范例 iptables -A INPUT -p tcp --dport 22 117 | 说明 用来比对封包的目的地端口号,设定方式同上。 118 | 8、参数 --tcp-flags 119 | 范例:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 120 | 说明:比对 TCP 封包的状态标志号,参数分为两个部分,第一个部分列举出想比对的标志号,第二部分则列举前述标志号中哪些有被设,未被列举的标志号必须是空的。TCP 状态标志号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对标志号时,可以使用 ! 运算子行反向比对。 121 | 9、参数 --syn 122 | 范例:iptables -p tcp --syn 123 | 说明:用来比对是否为要求联机之TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。 124 | 10、参数 -m multiport --source-port 125 | 范例: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 -j ACCEPT 126 | 说明 用来比对不连续的多个来源端口号,一次最多可以比对 15 个端口,可以使用 ! 运算子进行反向比对。 127 | 11、参数 -m multiport --destination-port 128 | 范例 :iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110 -j ACCEPT 129 | 说明:用来比对不连续的多个目的地端口号,设定方式同上。 130 | 12、参数 -m multiport --port 131 | 范例:iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 -j ACCEPT 132 | 说明:这个参数比较特殊,用来比对来源端口号和目的端口号相同的数据包,设定方式同上。注意:在本范例中,如果来源端口号为 80,目的地端口号为 110,这种数据包并不算符合条件。 133 | 13、参数 --icmp-type 134 | 范例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP 135 | 说明:用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp --help 来查看有哪些代码可用。这里是指禁止ping如,但是可以从该主机ping出。 136 | 14、参数 -m limit --limit 137 | 范例:iptables -A INPUT -m limit --limit 3/hour 138 | 说明:用来比对某段时间内数据包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次3个数据包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行数据包数量的比对外,设定这个参数也会在条件达成时,暂停数据包的比对动作,以避免因洪水攻击法,导致服务被阻断。 139 | 15、参数 --limit-burst 140 | 范例:iptables -A INPUT -m limit --limit-burst 5 141 | 说明:用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。 142 | 16、参数 -m mac --mac-source 143 | 范例:iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 -j ACCEPT 144 | 说明:用来比对数据包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则链上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。linux基础 145 | 17、参数 --mark 146 | 范例:iptables -t mangle -A INPUT -m mark --mark 1 147 | 说明:用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。linux基础 148 | 18、参数 -m owner --uid-owner 149 | 范例:iptables -A OUTPUT -m owner --uid-owner 500 150 | 说明:用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。 151 | 19、参数 -m owner --gid-owner 152 | 范例:iptables -A OUTPUT -m owner --gid-owner 0 153 | 说明:用来比对来自本机的数据包,是否为某特定使用者群组所产生的,使用时机同上。 154 | 20、参数 -m owner --pid-owner 155 | 范例:iptables -A OUTPUT -m owner --pid-owner 78 156 | 说明:用来比对来自本机的数据包,是否为某特定行程所产生的,使用时机同上。 157 | 21、参数 -m owner --sid-owner 158 | 范例: iptables -A OUTPUT -m owner --sid-owner 100 159 | 说明: 用来比对来自本机的数据包,是否为某特定联机(Session ID)的响应封包,使用时机同上。 160 | 22、参数 -m state --state 161 | 范例: iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 162 | 说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。 163 | 23、iptables -L -n -v 可以查看计数器 164 | INVALID 表示该数据包的联机编号(Session ID)无法辨识或编号不正确。ESTABLISHED 表示该数据包属于某个已经建立的联机。NEW 表示该数据包想要起始一个联机(重设联机或将联机重导向)。RELATED 表示该数据包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。 165 | 166 | (三)、常用的处理动作: 167 | 168 | -j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK。 169 | 170 | 分别说明如下: 171 | 172 | ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。 173 | 174 | REJECT 拦阻该数据包,并传送数据包通知对方,可以传送的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下: 175 | 176 | iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset 177 | 178 | DROP 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 179 | 180 | REDIRECT 将包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。例如: 181 | 182 | iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 183 | 184 | MASQUERADE 改写数据包来源 IP为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨号连接时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:linux基础 185 | 186 | iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000 187 | 188 | LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其规则。例如: 189 | 190 | iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets" 191 | 192 | SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。范例如下: 193 | 194 | iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000 195 | 196 | DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。范例如下: 197 | 198 | iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 199 | 192.168.1.1-192.168.1.10:80-100 200 | 201 | MIRROR 镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包送回,进行完此处理动作后,将会中断过滤程序。 202 | 203 | QUEUE 中断过滤程序,将数据包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费.......等。 204 | 205 | RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则链看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。 206 | 207 | MARK 将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下: 208 | 209 | iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2 210 | 211 | 以上用来大量的实例来说明iptables的参数和命令的用法,如果有朋友有配置iptables的需求可以QQ联系我:1600490666,或者将需求发给我,为您配置相应的策略。 212 | -------------------------------------------------------------------------------- /Iptables/Linux-iptables-netfilter.word: -------------------------------------------------------------------------------- 1 | 1 Iptables简介 2 | 1.1 为什么要配置主机防火墙 3 | 防火墙作为一种网络或系统之间强制实行访问控制的机制,是确保网络安全的重要手段。针对不同的需求和应用环境,可以量身定制出不同的防火墙系统。防火墙大到可由若干路由器和堡垒主机构成,也可小到仅仅是网络操作系统上一个防火墙软件包所提供的包过滤功能。 4 | 防火墙系统可分为包过滤型、应用级网关(也叫代理服务器型防火墙)和电路级网关三种基本类型。Linux提供的防火墙软件包内置于Linux内核中,是一种基于包过滤型的防火墙实现技术。其中心思想是根据网络层IP包头中的源地址、目的地址及包类型等信息来控制包的流向。更彻底的过滤则是检查包中的源端口、目的端口以及连接状态等信息。 5 | 对于连接到网络上的 Linux 系统来说,防火墙是必不可少的防御机制,它只允许合法的网络流量进出系统,而禁止其它任何网络流量,例如只限定允许的IP地址访问其SSH服务。因而,可以定制防火墙配置来满足任何特定需求和任何安全性级别需求 6 | Linux内核从1.1版本开始,就已经具备包过滤功能。在2.0内核中,开始采用Ipfwadm来操作内核的包过滤规则。到2.2版本时,Linux内核采用了Ipchains来控制内核的包过滤规则。发展到2.4.x时,Ipchains被一个全新的包过滤管理工具Iptables所替代。新发布的2.6版内核也在安全方面进行了改进。因此,无论拥有哪个版本的Linux内核,无论选择哪个版本的Linux来构建自己的企业网,都可以利用现有的系统构建出一个理想实用的防火墙。 7 | 1.2 netfilter/iptables系统是如何工作的? 8 | 1.2.1 Netfilter 9 | Linux 内核2.4 版本中集成了NetFilter框架,该框架是Linux平台新的网络安全功能框架,实现了多种网络安全功能:数据包过滤、状态保持、NAT,以及抗攻击等等。我们常用的Iptables,仅仅是NetFilter框架在用户空间的配置工具,负责从用户命令行界面接收命令,然后转化成内核认识的结构体,调用相应的内核操作函数,将规则插入到内核中去。 10 | NetFilter和Iptables,不是两个独立的东西,它们一个是内核空间的实现模块,称作NetFilter,一个是用户空间的控制命令解析器,称作Iptables。两者结合才能完成整体的工作。 11 | 要使用Iptables,必须在编译Linux内核的时候(内核的版本必须大于2.4)选择与NetFilter相关的内核模块,否则即使安装了Iptables,也不能使用。一般发行版中都在内核中已经把相关模块编译进去了,iptables也安装好了,所以可以直接调用iptables进行配置。 12 | 1.2.2 Iptables 13 | Linux根据数据包在内核中的不同处理,将整个IP包在内核中的生存周期划分为三个:PREROUTING、FORWARD、POSTROUTING。其他还有两个LOCAL_INPUT和LOCAL_OUTPUT(一般简写成INPUT和OUTPUT),分别对应送入本机上层协议栈的数据包和本机发送出的数据包。如果想要保护本机的安全性,那么只需关注INPUT和OUTPUT方向的数据包就可以了。其他几个不需要关心。 14 | 这五个方向对应着内核中五条不同的规则链和三个不同的规则表。 15 | Linux中规则链被组织在三个不同的规则表中:Filter 、NAT、Mangle。其中Filter针对过滤系统,NAT针对地址转换系统,Mangle针对策略路由和特殊应用。规则链分配如下: 16 |  Filter:INPUT、FORWARD、OUTPUT 17 |  NAT:PREROUTING、POSTROUTING 18 |  Mangle:PREROUTING、POSTROUTING 19 | 在内核编译了NetFilter系统以后,系统会自动建立这五个规则链和三个规则表。 20 | 我们在使用的时候主要要使用到的规则表是Filter表,规则链是INPUT和OUTPUT链。添加的主要规则都集中在这两个链上。用图示表示如下: 21 | 22 | 图1 信息包过滤过程 23 | 系统缺省的表为filter,该表包含了INPUT链(输入链)、FORWARD链(转发链)和OUTPUT链(输出链)。每一条链中可以定义一条或数条规则,每一条规则都以如下格式定义: 24 | 条件/处理方式。 25 | 当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件。如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足,则继续检查下一条规则。如果该数据包不符合该链中任一条规则,系统则会根据该链预先定义的策略(policy)来处理该数据包。 26 | 针对主机的安全性主要集中在Filter表中的INPUT和OUTPUT规则链,这两个关键字在添加规则的时候会使用到。 27 | 28 | 2 Iptables配置 29 | 针对Linux绝大多数发行版,如SUSE 9.0/10.0由于已经在内核中编译好了NetFilter,并安装好Iptables配置工具,所以我们重点介绍如何配置iptables来保护我们的系统。如需要进行手工安装,请参考3.1 附录1。 30 | 2.1 Iptables基本指令 31 | Iptables基本语法如下,可以在命令行下直接执行 32 | iptables [-t table] command [match] [-j target/jump] 33 | 详细命令请参考3.2节 附录2。 34 | 2.2 配置实例 35 | 在防火墙配置中,最明智的办法是阻挡所有东西,然后对需要的开启。这通常称为“凡是没有明确允许的都是禁止的”。如果非常关心系统安全,并明确知道需要的服务,建议这样做。 36 | 强调一点是不要运行任何不需要的服务,即使你认为你已经阻挡了对它们的访问。 37 | 下面所有例子均采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存到相应文件,参考2.3.4章节进行保存。 38 | 2.2.1 清除原有规则 39 | 首先参考配置注意事项把系统自带的防火墙关闭。然后清除现在filter的所有规则,配置一个全新的防火墙规则。 40 | [root@tp ~]# iptables -F 41 | 清除预设表filter中的所有规则链的规则 42 | [root@tp ~]# iptables -X 43 | 清除预设表filter中使用者自定链中的规则 44 | 看一下现在的规则: 45 | [root@tp ~]# iptables -L -n 46 | Chain INPUT (policy ACCEPT) 47 | target prot opt source destination 48 | Chain FORWARD (policy ACCEPT) 49 | target prot opt source destination 50 | Chain OUTPUT (policy ACCEPT) 51 | target prot opt source destination 52 | 现在IPTABLES配置表里什么配置都没有了,可以开始自己的配置了。 53 | 2.2.2 设定预设规则 54 | 注意:如果你是远程SSH登陆的话,最好先看完下面的设置,考虑周全后再进行设置,否则,当你输入下面第一个命令回车的时候就应该掉线了,因为你没有设置任何规则。 55 | [root@tp ~]# iptables -p INPUT DROP 56 | [root@tp ~]# iptables -p OUTPUT ACCEPT 57 | [root@tp ~]# iptables -p FORWARD DROP 58 | 预设规则也就是默认规则,上面的意思是,当超出了IPTABLES里filter表里的两个链INPUT,FORWARD)时,数据包将被被(放弃)DROP掉。相当于默认情况下进入系统的包和经过系统转发的包是不允许的。 59 | 而对于OUTPUT链,也就是从系统向外发的包我们不做太多限制,而是采取ACCEPT,也就是说,不在这个规则链里的包默认通过。 60 | 而后面的事情,就是增加特殊情况,即在INPUT,FORWARD两个链中添加允许什么包通过,而OUTPUT链采用的是不允许什么包通过。这里我们主要考虑INPUT链和OUTPUT链的规则。 61 | 2.2.3 添加规则 62 |  INPUT链规则 63 | 首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链。 64 | (1)开放服务 65 | 如我们需要开放SSH服务,能够采用远程SSH登陆,我们要开启22端口. 66 | [root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT 67 | 如果做了FTP服务器,开启21端口,另外还需要开放数据端口20。 68 | [root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT 69 | [root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT 70 | 如果你还做了其他的服务器,需要开启哪个端口,照写就行了. 71 | (2)开放协议 72 | 如需要其他机器ping通本机,即允许icmp包通过,也就是允许ping: 73 | [root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT 74 | (3)限制某些IP访问 75 | 如我们只允许192.168.1.3的机器进行SSH连接到本机: 76 | [root@tp ~]# iptables -A INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT 77 | 如果要允许或限制一段IP地址可用 192.168.1.0/24 表示,24表示子网掩码数,指192.168.1.1-255一段的所有IP。!192.168.1.3 表示除了192.168.0.3的ip地址。 78 | 上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP 79 |  OUTPUT链规则 80 | 下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链。 81 | 如减少不安全的端口连接: 82 | [root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP 83 | [root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP 84 | 当然出入更安全的考虑你也可以包OUTPUT链设置成DROP,那么添加的规则就多一些,就像上边INPUT链一样,需要开放什么,就要设置什么样的规则: 85 | [root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT 86 | 允许远程用户连接SSH服务。 87 | [root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT 88 | 允许访问80端口。 89 | [root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT 90 | 允许远程用户ping本机。 91 | 2.2.4 删除规则 92 | 如果发现配置错误,需要删除某条规则,用下面命令: 93 | [root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT 94 | 再次强调,凡是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存到文件。 95 | 2.2.5 保存规则 96 | 查看现有的规则: 97 | [root@tp ~]# iptables -L –n 98 | 上面说明了如何建立基本的规则和链接以及如何从数据包过滤表中添加或删除它们。但是:用上述方法所建立的规则会被保存到内核中,但当重新引导系统时,会丢失这些规则。所以,如果您将没有错误的且有效的规则集添加到信息包过滤表,同时希望在重新引导之后再次使用这些规则,那么必须将该规则集保存在文件中。可以使用 iptables-save命令来做到这一点,检查规则没有问题后,进行保存。 99 | [root@tp ~]#iptables-save > /PATH/iptables-script 100 | PATH为具体路径。 101 | 2.2.6 恢复规则 102 | 现在,数据包过滤表中的所有规则都被保存在文件 iptables-script 中。无论何时再次引导系统,都可以使用 iptables-restore命令将规则集从该脚本文件恢复到信息包过滤表,如下所示: 103 | [root@tp ~]#iptables-restore iptables-script 104 | 另外如果要在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化shell 脚本中。在/etc/rc.d/rc3.d中新建一个S*开头的脚本,*为一个数字,内容如下: 105 | #!/bin/bash 106 | iptables-restore /PATH/iptables-script 107 | PATH为具体的路径名。 108 | 2.2.7 配置注意事项 109 | 上面只是举了一些简单的实例,其他的规则链接也同样设置。具体设置需要根据每个系统进行不同定制。下面是一些在配置过程中注意的事项。 110 | 1、 如果使用自己定义的iptables规则文件,确保关闭Suse Linux自带的防火墙 111 | 由于Suse Linux自带yast管理工具,可以利用yast配置管理防火墙,但其提供的外置接口比较简单,很多功能无法实现,如果同时使用两种配置会造成冲突。建议如果不想使用默认的防火墙,把防火墙进行关闭。 112 |  方法1:直接/etc/rc.d/rc3.d和/etc/rc.d/rc5.d下的S*SuSEfirewall2_init,S*SuSEfirewall2_setup,S*SuSEfirewall2_final三个文件。 113 |  方法2:运行yast,选择Security and UsersFirewall,然后选择Stop Firewall and Remove from Boot Proces,然后Next,关闭防火墙。 114 | 2、 配置iptables规则时注意大小写 115 | 由于Linux是区分大小写的,所以要注意规则中大小写的区别。 116 | 3 附录 117 | 3.1 附录1 iptables安装 118 | Linux 2.4 以后的版本默认已经配置了netfilter,这里就不介绍如何进行编译内核了,只介绍一下如何安装用户空间程序iptables。 119 | 首先到官方网站下载源代码:http://www.netfilter.org/,然后进行安装。 120 | [root@tp ~]#bzip2 -d iptables-x.x.x.tar.bz2 121 | [root@tp ~]#tar -xvf iptables-x.x.x.tar 122 | [root@tp ~]#cd iptables-x.x.x 123 | [root@tp ~]#make KERNEL_DIR=/usr/src/linux/ 124 | [root@tp ~]#make install KERNEL_DIR=/usr/src/linux/ 125 | 126 | 3.2 附录2 iptables命令详细使用说明 127 | Iptables基本语法如下: 128 | iptables [-t table] command [match] [-j target/jump] 129 | -t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter。filter 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则链,这个规则表顾名思义是用来进行数据包过滤的处理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。 130 | 下面是使用到的基本命令,主要是filter表中用到的,nat和mangle表在这里不做详细说明。可以使用man iptables查找更详细的信息。 131 | 命令(command) 范例 说明 132 | -A, --append iptables -A INPUT ... 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。 133 | -D, --delete iptables -D INPUT --dport 80 -j DROP 134 | iptables -D INPUT 1 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。 135 | -R, --replace iptables -R INPUT 1 -s 192.168.0.1 -j DROP 取代现行规则,规则被取代后并不会改变顺序。 136 | -I, --insert iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本该位置上的规则将会往后移动一个顺位。 137 | -L, --list iptables -L INPUT 列出某规则链中的所有规则。 138 | -F, --flush iptables -F INPUT 删除某规则链中的所有规则。 139 | -Z, --zero iptables -Z INPUT 将数据包计数器归零。数据包计数器是用来计算同一数据包出现次数,是过滤阻断式攻击不可或缺的工具。 140 | -N, --new-chain iptables -N allowed 定义新的规则链 141 | -X, --delete-chain iptables -X allowed 删除某个规则链。 142 | -P, --policy iptables -P INPUT DROP 定义过滤政策。 也就是未符合过滤条件的数据包,默认的处理方式。 143 | -E, --rename-chain iptables -E allowed disallowed 修改某自定义规则链的名称。 144 | 145 | 匹配(match) 范例 说明 146 | -p, --protocol iptables -A INPUT -p tcp 比对通讯协议类型是否相符,可以使用 ! 运算进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。 147 | -s, --src, --source iptables -A INPUT -s 192.168.1.1 用来比对数据包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示掩码,例如:-s 192.168.0.0/24,比对 IP 时可以使用 ! 运算进行反向比对,例如:-s ! 192.168.0.0/24。 148 | -d, --dst, --destination iptables -A INPUT -d 192.168.1.1 用来比对数据包的目的地 IP,设定方式同上。 149 | -i, --in-interface iptables -A INPUT -i eth0 用来比对数据包是从哪块网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也可以使用 ! 运算符进行反向比对,例如:-i ! eth0。 150 | -o, --out-interface iptables -A FORWARD -o eth0 用来比对数据包要从哪块网卡送出,设定方式同上。 151 | --sport, --source-port iptables -A INPUT -p tcp --sport 22 用来比对数据包的源端口,可以比对单一端口,或是一个范围,例如:--sport 22:80,表示从 22 到 80 端口之间都算是符合条件,如果要比对不连续的多个端口,则必须使用 --multiport 参数,详见后文。比对端口号时,可以使用 ! 运算符进行反向比对。 152 | --dport, --destination-port iptables -A INPUT -p tcp --dport 22 用来比对数据包的目的端口号,设定方式同上。 153 | --tcp-flags iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 比对 TCP 数据包的状态标志,参数分为两个部分,第一个部分列举出想比对的状态标志,第二部分则列举前述状态标志中哪些有被设,未被列举的标志必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送) 等,均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对标志时,可以使用 ! 运算符进行行反向比对。 154 | --syn iptables -p tcp --syn 用来比对是否为要求连接之 TCP 数据包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !运算符,可用来比对非要求连接数据包。 155 | -m multiport --source-port iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 用来比对不连续的多个源端口号,一次最多可以比对 15 个端口,可以使用 ! 运算符进行反向比对。 156 | -m multiport --destination-port iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110 用来比对不连续的多个目的端口号,设定方式同上。 157 | -m multiport --port iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 这个参数比较特殊,用来比对来源端口号和目的端口号相同的数据包,设定方式同上。注意:在本范例中,如果来源端口号为 80 158 | 目的地端口号为 110,这种数据包并不算符合条件。 159 | --icmp-type iptables -A INPUT -p icmp --icmp-type 8 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。可用 iptables -p icmp --help 来查看有哪些代码可用。 160 | -m limit --limit iptables -A INPUT -m limit --limit 3/hour 用来比对某段时间内数据包的平均流量,例子是用来比对每小时平均流量是否超过一次 3 个数据包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行数据包数量的比对外,设定这个参数也会在条件达成时,暂停数据包的比对动作,以避免因黑客使用洪水攻击法,导致服务被阻断。 161 | -m limit --limit-burst iptables -A INPUT -m limit --limit-burst 5 用来比对瞬间大量数据包的数量,例子是用来比对一次同时涌入的数据包是否超过 5 个(这是默认值),超过此上限的数据包将被直接丢弃。使用效果同上。 162 | -m mac --mac-source iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 用来比对数据包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则链上,这是因为数据包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行数据包比对时,并不知道数据包会送到哪个网络接口去。 163 | -m mark --mark iptables -t mangle -A INPUT -m mark --mark 1 用来比对数据包是否被表示某个号码,当数据包被比对成功时,我们可以透过 MARK 处理动作,将该数据包标示一个号码,号码最大不可以超过 4294967296。 164 | -m owner --uid-owner iptables -A OUTPUT -m owner --uid-owner 500 用来比对来自本机的数据包是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出去,可以降低系统被攻击的损失。可惜这个功能无法比对出来自其它主机的数据包。 165 | -m owner --gid-owner iptables -A OUTPUT -m owner --gid-owner 0 用来比对来自本机的数据包,是否为某特定使用者群组所产生的,使用时机同上。 166 | -m owner --pid-owner iptables -A OUTPUT -m owner --pid-owner 78 用来比对来自本机的数据包,是否为某特定行程所产生的,使用时机同上。 167 | -m owner --sid-owner iptables -A OUTPUT -m owner --sid-owner 100 用来比对来自本机的数据包,是否为某特定连接(Session ID)的响应数据包,使用时机同上。 168 | -m state --state iptables -A INPUT -m state --state RELATED,ESTABLISHED 用来比对连接状态,连接状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。INVALID 表示该数据包的连接编号(Session ID)无法辨识或编号不正确。ESTABLISHED 表示该数据包属于某个已经建立的连接。NEW 表示该数据包想要起始一个连接(重设连接或将连接重定向)。RELATED 表示该数据包是属于某个已经建立的连接,所建立的新连接。例如:FTP-DATA 连接必定是源自某个 FTP 连接。 169 | 170 | 常用的处理动作:-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK. 171 | 参数 说明 172 | ACCEPT 将数据包放行,进行完此处理动作后,该数据包将不再比对其它规则,直接跳往下一个规则链。 173 | REJECT 拦截该数据包,并传送数据包通知对方,可以传送的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个数据包会要求对方关闭连接),进行完此处理动作后,该数据包将不再比对其它规则。 范例如下: 174 | iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset 175 | DROP 丢弃数据包不予处理,进行完此处理动作后,该数据包将不再比对其它规则。 176 | REDIRECT 将数据包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 这个功能可以用来实现透明代理或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 177 | MASQUERADE 改写数据包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用IP 是由 ISP 公司的 DHCP 服务器指派的时候,MASQUERADE 特别有用。范例如下: 178 | iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000 179 | LOG 将数据包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。例如: 180 | iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets" 181 | SNAT 改写数据包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。范例如下:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000 182 | DNAT 改写数据包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。范例如下: 183 | iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100 184 | MIRROR 镜射数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包送回。 185 | QUEUE 将数据包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:连接计费.......等。 186 | RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。 187 | MARK 将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下: 188 | iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2 189 | -------------------------------------------------------------------------------- /Iptables/README.txt: -------------------------------------------------------------------------------- 1 | Iptabels是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含Iptables的功能。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则Iptables有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。 2 | netfilter/iptables过滤防火墙系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。 3 | 虽然netfilter/iptables包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。 4 | netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 5 | iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。 6 | 7 | 优点 8 | netfilter/iptables的最大优点是它可以配置有状态的防火墙。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信 息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED 。 9 | 状态 ESTABLISHED指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。 INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。最后, RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。 10 | 11 | netfilter/iptables的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。 12 | 另外,netfilter/iptables是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。 13 | 14 | 原理 15 | iptables的原理主要是对数据包的控制,看下图: 16 | (1) 一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。 17 | (2) 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。 18 | (3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD链,然后到达POSTROUTING链输出。 19 | 20 | 规则、表和链 21 | 1.规则(rules) 22 | 规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。 23 | 2.链(chains) 24 | 链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。 25 | 3.表(tables) 26 | 表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。 27 | (1)RAW表 28 | 只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了. 29 | (2)filter表 30 | 主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改 31 | (3)nat表 32 | 主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包) 33 | (4)mangle表 34 | 主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包) 35 | 36 | 3、规则表之间的优先顺序: 37 | 38 | Raw——mangle——nat——filter 39 | 规则链之间的优先顺序(分三种情况): 40 | 第一种情况:入站数据流向 41 | 从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。 42 | 第二冲情况:转发数据流向 43 | 来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。 44 | 第三种情况:出站数据流向 45 | 防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。 46 | iptables是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting,然后检查目的IP判断是否需要转送出去,接着就会跳到INPUT 或 Forward 进行过滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及Postrouting。 47 | 过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则链的过滤,并依照前述流程继续进行下一个规则链的过滤(注意:这一点与ipchains不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(nat:postrouting)。 48 | 49 | 那么如何使用iptables在以上流程中控制对数据包的处理行为呢?当然是使用iptables与其相关的参数了。 50 | -------------------------------------------------------------------------------- /Kali-Linux/Kali 渗透测试 - 服务器攻击实战(20个实验).txt: -------------------------------------------------------------------------------- 1 | 2 | 3.使用多种安全工具获取目标主机信息 3 | nmap 4 | zmap 5 | amap 6 | p0f 7 | smtp-user-enum 8 | 等 9 | 10 | 4.Metasploit 基础知识和使用 11 | 12 | 5。Nmap 配合 Metasploit 进行端口扫描 13 | 14 | 6。扫描目标主机网络服务安全漏洞 15 | 16 | 7.Kali 常用漏洞扫描工具实战 17 | 18 | 8.开发新的 Metasploit 扫描器 19 | 20 | 9.攻击 Ingreslock 后门漏洞 21 | 22 | 10.Samba 漏洞攻击 Linux 服务器 23 | 24 | 11.攻击 Unreal Ircd 服务 25 | 26 | 12.暴力破解 SSH 及 VNC 远程连接 27 | 28 | 13.攻击 Distcc 获取权限 29 | 30 | 14.目标Linux服务器提取 31 | 通过查找可以用的 SUID 文件 32 | 命令:find / -perm -u=s -type f 2>/dev/null 33 | 34 | 15.攻击Tomcat漏洞 35 | 36 | 16。利用 NFS 错误配置进行攻击 37 | 利用了nfspy工具 38 | 39 | 17.利用 FTP 服务漏洞进行攻击 40 | 通过靶机FTP漏洞获得 ROOT身份的shell ,先使用 msf 模拟攻击得到靶机的 FTP版本号,然后使用 msf 选择相应的 FTP版本攻击模块,设置好靶机 IP 执行 exploit 进行攻击,成功获得 靶机ROOT身份的 shell 41 | 42 | 18.利用 Telnet 服务漏洞进行攻击 43 | 44 | 19.创建包含 Windows 后门的 PDF 文件 45 | 46 | 20.攻击后清除痕迹并创建访问后门 47 | 基本流程; 48 | 引入 metasploitable2 49 | 搭建Kali虚拟环境,保持两个环境属于同一网段,同一网络配置 50 | 启动 postgresql : service postgresql start 51 | sudo msfconsole 52 | db_rebuild_cache 53 | msf > nmap -sV -Pn -oX shiyanlou.xml 192.168.. 54 | db_import shiyanlou.xml 55 | services 192.168.. 56 | seach 模块 57 | use 模块路径 58 | show options 59 | set options/属性 60 | exploit 61 | whoami/info检测 62 | -------------------------------------------------------------------------------- /Kali-Linux/readme.txt: -------------------------------------------------------------------------------- 1 | Kali Linux 的安装使用 2 | 参考书籍《Kali Linux高级渗透》 3 | -------------------------------------------------------------------------------- /Kali-Linux/安装.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 安装完成后需要进行的配置: 5 | 1、基本的网络命令 6 | ifconfig命令用于显示当前主机中状态为“激活”的网络接口信息。 7 | ifconfig -a命令用于显示当前主机中所有网络接口信息(包括未激活的网络接口) 8 | 9 | route命令: 10 | route命令用于显示当前Linux系统中的路由信息,从route命令的显示结果可以看到当前主机所在的子网和默认网关的地址 11 | 12 | netstat命令 13 | netstat -r 命令可以实现与“route"命令相同的功能,即显示Linux系统中的路由信息(路由表)。 14 | ”netstat -au"显示udp传输协议的连接情况 15 | "netstat -at"显示tcp传输协议的连接状况 16 | 17 | 网卡的启用和停用: 18 | #ifconfig up 19 | #ifconfig down 20 | 21 | 配置动态获取IP地址: 22 | 在大型网络中,客户端主机通常设置为从DHCP服务器自动获取IP地址、子网掩码等网络信息,因此可以大大简化网络设置,下面是如何配置DHCP客户端 23 | "/etc/network/"目录下的”interfaces"文件是kali linux中最重要的网络配置文件之一,该文件用于描述主机中所有的网络接口的信息,不论Linux主机中作为DHCP客户端还是配置使用静态IP地址,都需要对该文件进行修改。 24 | 以下是作为DHCP客户端的“interfaces”文件的配置内容,其中“iface eth0 inet dhcp"设置网络接口eth0 通过DHCP获取网络地址。 25 | iface eth0 inet dhcp //用于设置网络接口eth0 通过dhcp协议获取网络配置 26 | 27 | 重启网络服务: 28 | 对”interfaces“文件进行更改后,需要重新启动Linux中的networking 服务 29 | # /etc/init.d/networking restart 30 | 31 | 配置使用静态IP地址 32 | 配置Kali Linux使用静态IP地址同样需要在”/etc/networking"目录下的“interfaces”文件中进行配置。静态IP地址的配置将使用“interfaces"文件中更多的配置项。 33 | 如下所示是eth0配置为使用静态IP地址的”interfaces"文件的内容,配置文件中各配置项的功能如下所示: 34 | 35 | 36 | “interfaces”文件中还有很多其他的设置项,如需要了解更多的信息,可以使用man命令查询“interfaces”文件的手册页。 37 | #man interfaces 38 | 39 | 其中eth0指本机以太网卡一,类似的,eth1指本机的以太网卡2。一般一台电脑只有一个eth0。网卡的设备名/dev/eth0 和硬件的MAC 地址52:54:AB:DD:6F:61对应,MAC 地址是生产厂家定的,每个网卡拥有的唯一地址。 40 | 41 | linux下,用ifconfig后,能看到eth0,可能还会看到eth0:1。其中eth0:1是指eth0的分ip存储文件,分ip存储文件格式为ifcfg-eth0:X, X为任意正整数(包括0) 42 | 具体作用是实现单网卡多ip,类似与windows的多ip。 43 | 44 | 二、配置DNS 45 | Kali Linux的DNS服务器地址使用文件“/etc/resovl.conf”进行配置,用户可以通过“nameserver”配置项设置DNS服务器的 IP地址;“resolv.conf”文件中最多可以使用 46 | “nameserver”指定3个DNS服务器,按照先后的顺序,一旦前面的DNS服务器失效,系统将自动使用后面的DNS服务器。 47 | 对于“resolv.conf”文件设置“nameserver”的修改是即时生效的,即只要对“resolv.conf”文件的修改进行了保存,在系统下一次需要进行域名的解析时就会按照该文件中指定 48 | 的DNS服务器IP地址进行域名的解析。 49 | 在resolv.conf中的格式如下: 50 | domain 51 | nameserver 10.10.10.10 52 | nameserver 102.54.16.2 53 | 三、重启网络 54 | 在之前的步骤完成后保存,然后在终端里边重启网络,命令如下:/etc/init.d/networking restart 55 | 完了之后打开浏览器就可以在校内网下载登录客户端上网了! 56 | -------------------------------------------------------------------------------- /LinEnum.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #A script to enumerate local information from a Linux host 3 | version="version 0.91" 4 | #@rebootuser 5 | 6 | #help function 7 | usage () 8 | { 9 | echo -e "\n\e[00;31m#########################################################\e[00m" 10 | echo -e "\e[00;31m#\e[00m" "\e[00;33mLocal Linux Enumeration & Privilege Escalation Script\e[00m" "\e[00;31m#\e[00m" 11 | echo -e "\e[00;31m#########################################################\e[00m" 12 | echo -e "\e[00;33m# www.rebootuser.com | @rebootuser \e[00m" 13 | echo -e "\e[00;33m# $version\e[00m\n" 14 | echo -e "\e[00;33m# Example: ./LinEnum.sh -k keyword -r report -e /tmp/ -t \e[00m\n" 15 | 16 | echo "OPTIONS:" 17 | echo "-k Enter keyword" 18 | echo "-e Enter export location" 19 | echo "-s Supply user password for sudo checks (INSECURE)" 20 | echo "-t Include thorough (lengthy) tests" 21 | echo "-r Enter report name" 22 | echo "-h Displays this help text" 23 | echo -e "\n" 24 | echo "Running with no options = limited scans/no output file" 25 | 26 | echo -e "\e[00;31m#########################################################\e[00m" 27 | } 28 | header() 29 | { 30 | echo -e "\n\e[00;31m#########################################################\e[00m" 31 | echo -e "\e[00;31m#\e[00m" "\e[00;33mLocal Linux Enumeration & Privilege Escalation Script\e[00m" "\e[00;31m#\e[00m" 32 | echo -e "\e[00;31m#########################################################\e[00m" 33 | echo -e "\e[00;33m# www.rebootuser.com\e[00m" 34 | echo -e "\e[00;33m# $version\e[00m\n" 35 | 36 | } 37 | 38 | debug_info() 39 | { 40 | echo "[-] Debug Info" 41 | 42 | if [ "$keyword" ]; then 43 | echo "[+] Searching for the keyword $keyword in conf, php, ini and log files" 44 | else 45 | : 46 | fi 47 | 48 | if [ "$report" ]; then 49 | echo "[+] Report name = $report" 50 | else 51 | : 52 | fi 53 | 54 | if [ "$export" ]; then 55 | echo "[+] Export location = $export" 56 | else 57 | : 58 | fi 59 | 60 | if [ "$thorough" ]; then 61 | echo "[+] Thorough tests = Enabled" 62 | else 63 | echo -e "\e[00;33m[+] Thorough tests = Disabled (SUID/GUID checks will not be perfomed!)\e[00m" 64 | fi 65 | 66 | sleep 2 67 | 68 | if [ "$export" ]; then 69 | mkdir $export 2>/dev/null 70 | format=$export/LinEnum-export-`date +"%d-%m-%y"` 71 | mkdir $format 2>/dev/null 72 | else 73 | : 74 | fi 75 | 76 | if [ "$sudopass" ]; then 77 | echo -e "\e[00;35m[+] Please enter password - INSECURE - really only for CTF use!\e[00m" 78 | read -s userpassword 79 | echo 80 | else 81 | : 82 | fi 83 | 84 | who=`whoami` 2>/dev/null 85 | echo -e "\n" 86 | 87 | echo -e "\e[00;33mScan started at:"; date 88 | echo -e "\e[00m\n" 89 | } 90 | 91 | # useful binaries (thanks to https://gtfobins.github.io/) 92 | binarylist='nmap\|perl\|awk\|find\|bash\|sh\|man\|more\|less\|vi\|emacs\|vim\|nc\|netcat\|python\|ruby\|lua\|irb\|tar\|zip\|gdb\|pico\|scp\|git\|rvim\|script\|ash\|csh\|curl\|dash\|ed\|env\|expect\|ftp\|sftp\|node\|php\|rpm\|rpmquery\|socat\|strace\|taskset\|tclsh\|telnet\|tftp\|wget\|wish\|zsh\|ssh' 93 | 94 | system_info() 95 | { 96 | echo -e "\e[00;33m### SYSTEM ##############################################\e[00m" 97 | 98 | #basic kernel info 99 | unameinfo=`uname -a 2>/dev/null` 100 | if [ "$unameinfo" ]; then 101 | echo -e "\e[00;31m[-] Kernel information:\e[00m\n$unameinfo" 102 | echo -e "\n" 103 | else 104 | : 105 | fi 106 | 107 | procver=`cat /proc/version 2>/dev/null` 108 | if [ "$procver" ]; then 109 | echo -e "\e[00;31m[-] Kernel information (continued):\e[00m\n$procver" 110 | echo -e "\n" 111 | else 112 | : 113 | fi 114 | 115 | #search all *-release files for version info 116 | release=`cat /etc/*-release 2>/dev/null` 117 | if [ "$release" ]; then 118 | echo -e "\e[00;31m[-] Specific release information:\e[00m\n$release" 119 | echo -e "\n" 120 | else 121 | : 122 | fi 123 | 124 | #target hostname info 125 | hostnamed=`hostname 2>/dev/null` 126 | if [ "$hostnamed" ]; then 127 | echo -e "\e[00;31m[-] Hostname:\e[00m\n$hostnamed" 128 | echo -e "\n" 129 | else 130 | : 131 | fi 132 | } 133 | 134 | user_info() 135 | { 136 | echo -e "\e[00;33m### USER/GROUP ##########################################\e[00m" 137 | 138 | #current user details 139 | currusr=`id 2>/dev/null` 140 | if [ "$currusr" ]; then 141 | echo -e "\e[00;31m[-] Current user/group info:\e[00m\n$currusr" 142 | echo -e "\n" 143 | else 144 | : 145 | fi 146 | 147 | #last logged on user information 148 | lastlogedonusrs=`lastlog 2>/dev/null |grep -v "Never" 2>/dev/null` 149 | if [ "$lastlogedonusrs" ]; then 150 | echo -e "\e[00;31m[-] Users that have previously logged onto the system:\e[00m\n$lastlogedonusrs" 151 | echo -e "\n" 152 | else 153 | : 154 | fi 155 | 156 | 157 | #who else is logged on 158 | loggedonusrs=`w 2>/dev/null` 159 | if [ "$loggedonusrs" ]; then 160 | echo -e "\e[00;31m[-] Who else is logged on:\e[00m\n$loggedonusrs" 161 | echo -e "\n" 162 | else 163 | : 164 | fi 165 | 166 | #lists all id's and respective group(s) 167 | grpinfo=`for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null` 168 | if [ "$grpinfo" ]; then 169 | echo -e "\e[00;31m[-] Group memberships:\e[00m\n$grpinfo" 170 | echo -e "\n" 171 | else 172 | : 173 | fi 174 | 175 | #added by phackt - look for adm group (thanks patrick) 176 | adm_users=$(echo -e "$grpinfo" | grep "(adm)") 177 | if [[ ! -z $adm_users ]]; 178 | then 179 | echo -e "\e[00;31m[-] It looks like we have some admin users:\e[00m\n$adm_users" 180 | echo -e "\n" 181 | else 182 | : 183 | fi 184 | 185 | #checks to see if any hashes are stored in /etc/passwd (depreciated *nix storage method) 186 | hashesinpasswd=`grep -v '^[^:]*:[x]' /etc/passwd 2>/dev/null` 187 | if [ "$hashesinpasswd" ]; then 188 | echo -e "\e[00;33m[+] It looks like we have password hashes in /etc/passwd!\e[00m\n$hashesinpasswd" 189 | echo -e "\n" 190 | else 191 | : 192 | fi 193 | 194 | #contents of /etc/passwd 195 | readpasswd=`cat /etc/passwd 2>/dev/null` 196 | if [ "$readpasswd" ]; then 197 | echo -e "\e[00;31m[-] Contents of /etc/passwd:\e[00m\n$readpasswd" 198 | echo -e "\n" 199 | else 200 | : 201 | fi 202 | 203 | if [ "$export" ] && [ "$readpasswd" ]; then 204 | mkdir $format/etc-export/ 2>/dev/null 205 | cp /etc/passwd $format/etc-export/passwd 2>/dev/null 206 | else 207 | : 208 | fi 209 | 210 | #checks to see if the shadow file can be read 211 | readshadow=`cat /etc/shadow 2>/dev/null` 212 | if [ "$readshadow" ]; then 213 | echo -e "\e[00;33m[+] We can read the shadow file!\e[00m\n$readshadow" 214 | echo -e "\n" 215 | else 216 | : 217 | fi 218 | 219 | if [ "$export" ] && [ "$readshadow" ]; then 220 | mkdir $format/etc-export/ 2>/dev/null 221 | cp /etc/shadow $format/etc-export/shadow 2>/dev/null 222 | else 223 | : 224 | fi 225 | 226 | #checks to see if /etc/master.passwd can be read - BSD 'shadow' variant 227 | readmasterpasswd=`cat /etc/master.passwd 2>/dev/null` 228 | if [ "$readmasterpasswd" ]; then 229 | echo -e "\e[00;33m[+] We can read the master.passwd file!\e[00m\n$readmasterpasswd" 230 | echo -e "\n" 231 | else 232 | : 233 | fi 234 | 235 | if [ "$export" ] && [ "$readmasterpasswd" ]; then 236 | mkdir $format/etc-export/ 2>/dev/null 237 | cp /etc/master.passwd $format/etc-export/master.passwd 2>/dev/null 238 | else 239 | : 240 | fi 241 | 242 | #all root accounts (uid 0) 243 | superman=`grep -v -E "^#" /etc/passwd 2>/dev/null| awk -F: '$3 == 0 { print $1}' 2>/dev/null` 244 | if [ "$superman" ]; then 245 | echo -e "\e[00;31m[-] Super user account(s):\e[00m\n$superman" 246 | echo -e "\n" 247 | else 248 | : 249 | fi 250 | 251 | #pull out vital sudoers info 252 | sudoers=`grep -v -e '^$' /etc/sudoers 2>/dev/null |grep -v "#" 2>/dev/null` 253 | if [ "$sudoers" ]; then 254 | echo -e "\e[00;31m[-] Sudoers configuration (condensed):\e[00m$sudoers" 255 | echo -e "\n" 256 | else 257 | : 258 | fi 259 | 260 | if [ "$export" ] && [ "$sudoers" ]; then 261 | mkdir $format/etc-export/ 2>/dev/null 262 | cp /etc/sudoers $format/etc-export/sudoers 2>/dev/null 263 | else 264 | : 265 | fi 266 | 267 | #can we sudo without supplying a password 268 | sudoperms=`echo '' | sudo -S -l -k 2>/dev/null` 269 | if [ "$sudoperms" ]; then 270 | echo -e "\e[00;33m[+] We can sudo without supplying a password!\e[00m\n$sudoperms" 271 | echo -e "\n" 272 | else 273 | : 274 | fi 275 | 276 | #check sudo perms - authenticated 277 | if [ "$sudopass" ]; then 278 | if [ "$sudoperms" ]; then 279 | : 280 | else 281 | sudoauth=`echo $userpassword | sudo -S -l -k 2>/dev/null` 282 | if [ "$sudoauth" ]; then 283 | echo -e "\e[00;33m[+] We can sudo when supplying a password!\e[00m\n$sudoauth" 284 | echo -e "\n" 285 | else 286 | : 287 | fi 288 | fi 289 | else 290 | : 291 | fi 292 | 293 | ##known 'good' breakout binaries (cleaned to parse /etc/sudoers for comma separated values) - authenticated 294 | if [ "$sudopass" ]; then 295 | if [ "$sudoperms" ]; then 296 | : 297 | else 298 | sudopermscheck=`echo $userpassword | sudo -S -l -k 2>/dev/null | xargs -n 1 2>/dev/null|sed 's/,*$//g' 2>/dev/null | grep -w $binarylist 2>/dev/null` 299 | if [ "$sudopermscheck" ]; then 300 | echo -e "\e[00;33m[-] Possible sudo pwnage!\e[00m\n$sudopermscheck" 301 | echo -e "\n" 302 | else 303 | : 304 | fi 305 | fi 306 | else 307 | : 308 | fi 309 | 310 | #known 'good' breakout binaries (cleaned to parse /etc/sudoers for comma separated values) 311 | sudopwnage=`echo '' | sudo -S -l -k 2>/dev/null | xargs -n 1 2>/dev/null | sed 's/,*$//g' 2>/dev/null | grep -w $binarylist 2>/dev/null` 312 | if [ "$sudopwnage" ]; then 313 | echo -e "\e[00;33m[+] Possible sudo pwnage!\e[00m\n$sudopwnage" 314 | echo -e "\n" 315 | else 316 | : 317 | fi 318 | 319 | #who has sudoed in the past 320 | whohasbeensudo=`find /home -name .sudo_as_admin_successful 2>/dev/null` 321 | if [ "$whohasbeensudo" ]; then 322 | echo -e "\e[00;31m[-] Accounts that have recently used sudo:\e[00m\n$whohasbeensudo" 323 | echo -e "\n" 324 | else 325 | : 326 | fi 327 | 328 | #checks to see if roots home directory is accessible 329 | rthmdir=`ls -ahl /root/ 2>/dev/null` 330 | if [ "$rthmdir" ]; then 331 | echo -e "\e[00;33m[+] We can read root's home directory!\e[00m\n$rthmdir" 332 | echo -e "\n" 333 | else 334 | : 335 | fi 336 | 337 | #displays /home directory permissions - check if any are lax 338 | homedirperms=`ls -ahl /home/ 2>/dev/null` 339 | if [ "$homedirperms" ]; then 340 | echo -e "\e[00;31m[-] Are permissions on /home directories lax:\e[00m\n$homedirperms" 341 | echo -e "\n" 342 | else 343 | : 344 | fi 345 | 346 | #looks for files we can write to that don't belong to us 347 | if [ "$thorough" = "1" ]; then 348 | grfilesall=`find / -writable ! -user \`whoami\` -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null` 349 | if [ "$grfilesall" ]; then 350 | echo -e "\e[00;31m[-] Files not owned by user but writable by group:\e[00m\n$grfilesall" 351 | echo -e "\n" 352 | else 353 | : 354 | fi 355 | fi 356 | 357 | #looks for files that belong to us 358 | if [ "$thorough" = "1" ]; then 359 | ourfilesall=`find / -user \`whoami\` -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null` 360 | if [ "$ourfilesall" ]; then 361 | echo -e "\e[00;31m[-] Files owned by our user:\e[00m\n$ourfilesall" 362 | echo -e "\n" 363 | else 364 | : 365 | fi 366 | fi 367 | 368 | #looks for hidden files 369 | if [ "$thorough" = "1" ]; then 370 | hiddenfiles=`find / -name ".*" -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null` 371 | if [ "$hiddenfiles" ]; then 372 | echo -e "\e[00;31m[-] Hidden files:\e[00m\n$hiddenfiles" 373 | echo -e "\n" 374 | else 375 | : 376 | fi 377 | fi 378 | 379 | #looks for world-reabable files within /home - depending on number of /home dirs & files, this can take some time so is only 'activated' with thorough scanning switch 380 | if [ "$thorough" = "1" ]; then 381 | wrfileshm=`find /home/ -perm -4 -type f -exec ls -al {} \; 2>/dev/null` 382 | if [ "$wrfileshm" ]; then 383 | echo -e "\e[00;31m[-] World-readable files within /home:\e[00m\n$wrfileshm" 384 | echo -e "\n" 385 | else 386 | : 387 | fi 388 | else 389 | : 390 | fi 391 | 392 | if [ "$thorough" = "1" ]; then 393 | if [ "$export" ] && [ "$wrfileshm" ]; then 394 | mkdir $format/wr-files/ 2>/dev/null 395 | for i in $wrfileshm; do cp --parents $i $format/wr-files/ ; done 2>/dev/null 396 | else 397 | : 398 | fi 399 | else 400 | : 401 | fi 402 | 403 | #lists current user's home directory contents 404 | if [ "$thorough" = "1" ]; then 405 | homedircontents=`ls -ahl ~ 2>/dev/null` 406 | if [ "$homedircontents" ] ; then 407 | echo -e "\e[00;31m[-] Home directory contents:\e[00m\n$homedircontents" 408 | echo -e "\n" 409 | else 410 | : 411 | fi 412 | else 413 | : 414 | fi 415 | 416 | #checks for if various ssh files are accessible - this can take some time so is only 'activated' with thorough scanning switch 417 | if [ "$thorough" = "1" ]; then 418 | sshfiles=`find / \( -name "id_dsa*" -o -name "id_rsa*" -o -name "known_hosts" -o -name "authorized_hosts" -o -name "authorized_keys" \) -exec ls -la {} 2>/dev/null \;` 419 | if [ "$sshfiles" ]; then 420 | echo -e "\e[00;31m[-] SSH keys/host information found in the following locations:\e[00m\n$sshfiles" 421 | echo -e "\n" 422 | else 423 | : 424 | fi 425 | else 426 | : 427 | fi 428 | 429 | if [ "$thorough" = "1" ]; then 430 | if [ "$export" ] && [ "$sshfiles" ]; then 431 | mkdir $format/ssh-files/ 2>/dev/null 432 | for i in $sshfiles; do cp --parents $i $format/ssh-files/; done 2>/dev/null 433 | else 434 | : 435 | fi 436 | else 437 | : 438 | fi 439 | 440 | #is root permitted to login via ssh 441 | sshrootlogin=`grep "PermitRootLogin " /etc/ssh/sshd_config 2>/dev/null | grep -v "#" | awk '{print $2}'` 442 | if [ "$sshrootlogin" = "yes" ]; then 443 | echo -e "\e[00;31m[-] Root is allowed to login via SSH:\e[00m" ; grep "PermitRootLogin " /etc/ssh/sshd_config 2>/dev/null | grep -v "#" 444 | echo -e "\n" 445 | else 446 | : 447 | fi 448 | } 449 | 450 | environmental_info() 451 | { 452 | echo -e "\e[00;33m### ENVIRONMENTAL #######################################\e[00m" 453 | 454 | #env information 455 | envinfo=`env 2>/dev/null | grep -v 'LS_COLORS' 2>/dev/null` 456 | if [ "$envinfo" ]; then 457 | echo -e "\e[00;31m[-] Environment information:\e[00m\n$envinfo" 458 | echo -e "\n" 459 | else 460 | : 461 | fi 462 | 463 | #check if selinux is enabled 464 | sestatus=`sestatus 2>/dev/null` 465 | if [ "$sestatus" ]; then 466 | echo -e "\e[00;31m[-] SELinux seems to be present:\e[00m\n$sestatus" 467 | echo -e "\n" 468 | fi 469 | 470 | #phackt 471 | 472 | #current path configuration 473 | pathinfo=`echo $PATH 2>/dev/null` 474 | if [ "$pathinfo" ]; then 475 | echo -e "\e[00;31m[-] Path information:\e[00m\n$pathinfo" 476 | echo -e "\n" 477 | else 478 | : 479 | fi 480 | 481 | #lists available shells 482 | shellinfo=`cat /etc/shells 2>/dev/null` 483 | if [ "$shellinfo" ]; then 484 | echo -e "\e[00;31m[-] Available shells:\e[00m\n$shellinfo" 485 | echo -e "\n" 486 | else 487 | : 488 | fi 489 | 490 | #current umask value with both octal and symbolic output 491 | umaskvalue=`umask -S 2>/dev/null & umask 2>/dev/null` 492 | if [ "$umaskvalue" ]; then 493 | echo -e "\e[00;31m[-] Current umask value:\e[00m\n$umaskvalue" 494 | echo -e "\n" 495 | else 496 | : 497 | fi 498 | 499 | #umask value as in /etc/login.defs 500 | umaskdef=`grep -i "^UMASK" /etc/login.defs 2>/dev/null` 501 | if [ "$umaskdef" ]; then 502 | echo -e "\e[00;31m[-] umask value as specified in /etc/login.defs:\e[00m\n$umaskdef" 503 | echo -e "\n" 504 | else 505 | : 506 | fi 507 | 508 | #password policy information as stored in /etc/login.defs 509 | logindefs=`grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs 2>/dev/null` 510 | if [ "$logindefs" ]; then 511 | echo -e "\e[00;31m[-] Password and storage information:\e[00m\n$logindefs" 512 | echo -e "\n" 513 | else 514 | : 515 | fi 516 | 517 | if [ "$export" ] && [ "$logindefs" ]; then 518 | mkdir $format/etc-export/ 2>/dev/null 519 | cp /etc/login.defs $format/etc-export/login.defs 2>/dev/null 520 | else 521 | : 522 | fi 523 | } 524 | 525 | job_info() 526 | { 527 | echo -e "\e[00;33m### JOBS/TASKS ##########################################\e[00m" 528 | 529 | #are there any cron jobs configured 530 | cronjobs=`ls -la /etc/cron* 2>/dev/null` 531 | if [ "$cronjobs" ]; then 532 | echo -e "\e[00;31m[-] Cron jobs:\e[00m\n$cronjobs" 533 | echo -e "\n" 534 | else 535 | : 536 | fi 537 | 538 | #can we manipulate these jobs in any way 539 | cronjobwwperms=`find /etc/cron* -perm -0002 -type f -exec ls -la {} \; -exec cat {} 2>/dev/null \;` 540 | if [ "$cronjobwwperms" ]; then 541 | echo -e "\e[00;33m[+] World-writable cron jobs and file contents:\e[00m\n$cronjobwwperms" 542 | echo -e "\n" 543 | else 544 | : 545 | fi 546 | 547 | #contab contents 548 | crontabvalue=`cat /etc/crontab 2>/dev/null` 549 | if [ "$crontabvalue" ]; then 550 | echo -e "\e[00;31m[-] Crontab contents:\e[00m\n$crontabvalue" 551 | echo -e "\n" 552 | else 553 | : 554 | fi 555 | 556 | crontabvar=`ls -la /var/spool/cron/crontabs 2>/dev/null` 557 | if [ "$crontabvar" ]; then 558 | echo -e "\e[00;31m[-] Anything interesting in /var/spool/cron/crontabs:\e[00m\n$crontabvar" 559 | echo -e "\n" 560 | else 561 | : 562 | fi 563 | 564 | anacronjobs=`ls -la /etc/anacrontab 2>/dev/null; cat /etc/anacrontab 2>/dev/null` 565 | if [ "$anacronjobs" ]; then 566 | echo -e "\e[00;31m[-] Anacron jobs and associated file permissions:\e[00m\n$anacronjobs" 567 | echo -e "\n" 568 | else 569 | : 570 | fi 571 | 572 | anacrontab=`ls -la /var/spool/anacron 2>/dev/null` 573 | if [ "$anacrontab" ]; then 574 | echo -e "\e[00;31m[-] When were jobs last executed (/var/spool/anacron contents):\e[00m\n$anacrontab" 575 | echo -e "\n" 576 | else 577 | : 578 | fi 579 | 580 | #pull out account names from /etc/passwd and see if any users have associated cronjobs (priv command) 581 | cronother=`cut -d ":" -f 1 /etc/passwd | xargs -n1 crontab -l -u 2>/dev/null` 582 | if [ "$cronother" ]; then 583 | echo -e "\e[00;31m[-] Jobs held by all users:\e[00m\n$cronother" 584 | echo -e "\n" 585 | else 586 | : 587 | fi 588 | 589 | } 590 | networking_info() 591 | { 592 | echo -e "\e[00;33m### NETWORKING ##########################################\e[00m" 593 | 594 | #nic information 595 | nicinfo=`/sbin/ifconfig -a 2>/dev/null` 596 | if [ "$nicinfo" ]; then 597 | echo -e "\e[00;31m[-] Network and IP info:\e[00m\n$nicinfo" 598 | echo -e "\n" 599 | else 600 | : 601 | fi 602 | 603 | #nic information (using ip) 604 | nicinfoip=`/sbin/ip a 2>/dev/null` 605 | if [ ! "$nicinfo" ] && [ "$nicinfoip" ]; then 606 | echo -e "\e[00;31m[-] Network and IP info:\e[00m\n$nicinfoip" 607 | echo -e "\n" 608 | else 609 | : 610 | fi 611 | 612 | arpinfo=`arp -a 2>/dev/null` 613 | if [ "$arpinfo" ]; then 614 | echo -e "\e[00;31m[-] ARP history:\e[00m\n$arpinfo" 615 | echo -e "\n" 616 | else 617 | : 618 | fi 619 | 620 | arpinfoip=`ip n 2>/dev/null` 621 | if [ ! "$arpinfo" ] && [ "$arpinfoip" ]; then 622 | echo -e "\e[00;31m[-] ARP history:\e[00m\n$arpinfoip" 623 | echo -e "\n" 624 | else 625 | : 626 | fi 627 | 628 | #dns settings 629 | nsinfo=`grep "nameserver" /etc/resolv.conf 2>/dev/null` 630 | if [ "$nsinfo" ]; then 631 | echo -e "\e[00;31m[-] Nameserver(s):\e[00m\n$nsinfo" 632 | echo -e "\n" 633 | else 634 | : 635 | fi 636 | 637 | nsinfosysd=`systemd-resolve --status 2>/dev/null` 638 | if [ "$nsinfosysd" ]; then 639 | echo -e "\e[00;31m[-] Nameserver(s):\e[00m\n$nsinfosysd" 640 | echo -e "\n" 641 | else 642 | : 643 | fi 644 | 645 | #default route configuration 646 | defroute=`route 2>/dev/null | grep default` 647 | if [ "$defroute" ]; then 648 | echo -e "\e[00;31m[-] Default route:\e[00m\n$defroute" 649 | echo -e "\n" 650 | else 651 | : 652 | fi 653 | 654 | #default route configuration 655 | defrouteip=`ip r 2>/dev/null | grep default` 656 | if [ ! "$defroute" ] && [ "$defrouteip" ]; then 657 | echo -e "\e[00;31m[-] Default route:\e[00m\n$defrouteip" 658 | echo -e "\n" 659 | else 660 | : 661 | fi 662 | 663 | #listening TCP 664 | tcpservs=`netstat -antp 2>/dev/null` 665 | if [ "$tcpservs" ]; then 666 | echo -e "\e[00;31m[-] Listening TCP:\e[00m\n$tcpservs" 667 | echo -e "\n" 668 | else 669 | : 670 | fi 671 | 672 | tcpservsip=`ss -t 2>/dev/null` 673 | if [ ! "$tcpservs" ] && [ "$tcpservsip" ]; then 674 | echo -e "\e[00;31m[-] Listening TCP:\e[00m\n$tcpservsip" 675 | echo -e "\n" 676 | else 677 | : 678 | fi 679 | #listening UDP 680 | udpservs=`netstat -anup 2>/dev/null` 681 | if [ "$udpservs" ]; then 682 | echo -e "\e[00;31m[-] Listening UDP:\e[00m\n$udpservs" 683 | echo -e "\n" 684 | else 685 | : 686 | fi 687 | 688 | udpservsip=`ip -u 2>/dev/null` 689 | if [ ! "$udpservs" ] && [ "$udpservsip" ]; then 690 | echo -e "\e[00;31m[-] Listening UDP:\e[00m\n$udpservsip" 691 | echo -e "\n" 692 | else 693 | : 694 | fi 695 | } 696 | 697 | services_info() 698 | { 699 | echo -e "\e[00;33m### SERVICES #############################################\e[00m" 700 | 701 | #running processes 702 | psaux=`ps aux 2>/dev/null` 703 | if [ "$psaux" ]; then 704 | echo -e "\e[00;31m[-] Running processes:\e[00m\n$psaux" 705 | echo -e "\n" 706 | else 707 | : 708 | fi 709 | 710 | #lookup process binary path and permissisons 711 | procperm=`ps aux 2>/dev/null | awk '{print $11}'|xargs -r ls -la 2>/dev/null |awk '!x[$0]++' 2>/dev/null` 712 | if [ "$procperm" ]; then 713 | echo -e "\e[00;31m[-] Process binaries and associated permissions (from above list):\e[00m\n$procperm" 714 | echo -e "\n" 715 | else 716 | : 717 | fi 718 | 719 | if [ "$export" ] && [ "$procperm" ]; then 720 | procpermbase=`ps aux 2>/dev/null | awk '{print $11}' | xargs -r ls 2>/dev/null | awk '!x[$0]++' 2>/dev/null` 721 | mkdir $format/ps-export/ 2>/dev/null 722 | for i in $procpermbase; do cp --parents $i $format/ps-export/; done 2>/dev/null 723 | else 724 | : 725 | fi 726 | 727 | #anything 'useful' in inetd.conf 728 | inetdread=`cat /etc/inetd.conf 2>/dev/null` 729 | if [ "$inetdread" ]; then 730 | echo -e "\e[00;31m[-] Contents of /etc/inetd.conf:\e[00m\n$inetdread" 731 | echo -e "\n" 732 | else 733 | : 734 | fi 735 | 736 | if [ "$export" ] && [ "$inetdread" ]; then 737 | mkdir $format/etc-export/ 2>/dev/null 738 | cp /etc/inetd.conf $format/etc-export/inetd.conf 2>/dev/null 739 | else 740 | : 741 | fi 742 | 743 | #very 'rough' command to extract associated binaries from inetd.conf & show permisisons of each 744 | inetdbinperms=`awk '{print $7}' /etc/inetd.conf 2>/dev/null |xargs -r ls -la 2>/dev/null` 745 | if [ "$inetdbinperms" ]; then 746 | echo -e "\e[00;31m[-] The related inetd binary permissions:\e[00m\n$inetdbinperms" 747 | echo -e "\n" 748 | else 749 | : 750 | fi 751 | 752 | xinetdread=`cat /etc/xinetd.conf 2>/dev/null` 753 | if [ "$xinetdread" ]; then 754 | echo -e "\e[00;31m[-] Contents of /etc/xinetd.conf:\e[00m\n$xinetdread" 755 | echo -e "\n" 756 | else 757 | : 758 | fi 759 | 760 | if [ "$export" ] && [ "$xinetdread" ]; then 761 | mkdir $format/etc-export/ 2>/dev/null 762 | cp /etc/xinetd.conf $format/etc-export/xinetd.conf 2>/dev/null 763 | else 764 | : 765 | fi 766 | 767 | xinetdincd=`grep "/etc/xinetd.d" /etc/xinetd.conf 2>/dev/null` 768 | if [ "$xinetdincd" ]; then 769 | echo -e "\e[00;31m[-] /etc/xinetd.d is included in /etc/xinetd.conf - associated binary permissions are listed below:\e[00m"; ls -la /etc/xinetd.d 2>/dev/null 770 | echo -e "\n" 771 | else 772 | : 773 | fi 774 | 775 | #very 'rough' command to extract associated binaries from xinetd.conf & show permisisons of each 776 | xinetdbinperms=`awk '{print $7}' /etc/xinetd.conf 2>/dev/null |xargs -r ls -la 2>/dev/null` 777 | if [ "$xinetdbinperms" ]; then 778 | echo -e "\e[00;31m[-] The related xinetd binary permissions:\e[00m\n$xinetdbinperms" 779 | echo -e "\n" 780 | else 781 | : 782 | fi 783 | 784 | initdread=`ls -la /etc/init.d 2>/dev/null` 785 | if [ "$initdread" ]; then 786 | echo -e "\e[00;31m[-] /etc/init.d/ binary permissions:\e[00m\n$initdread" 787 | echo -e "\n" 788 | else 789 | : 790 | fi 791 | 792 | #init.d files NOT belonging to root! 793 | initdperms=`find /etc/init.d/ \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null` 794 | if [ "$initdperms" ]; then 795 | echo -e "\e[00;31m[-] /etc/init.d/ files not belonging to root:\e[00m\n$initdperms" 796 | echo -e "\n" 797 | else 798 | : 799 | fi 800 | 801 | rcdread=`ls -la /etc/rc.d/init.d 2>/dev/null` 802 | if [ "$rcdread" ]; then 803 | echo -e "\e[00;31m[-] /etc/rc.d/init.d binary permissions:\e[00m\n$rcdread" 804 | echo -e "\n" 805 | else 806 | : 807 | fi 808 | 809 | #init.d files NOT belonging to root! 810 | rcdperms=`find /etc/rc.d/init.d \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null` 811 | if [ "$rcdperms" ]; then 812 | echo -e "\e[00;31m[-] /etc/rc.d/init.d files not belonging to root:\e[00m\n$rcdperms" 813 | echo -e "\n" 814 | else 815 | : 816 | fi 817 | 818 | usrrcdread=`ls -la /usr/local/etc/rc.d 2>/dev/null` 819 | if [ "$usrrcdread" ]; then 820 | echo -e "\e[00;31m[-] /usr/local/etc/rc.d binary permissions:\e[00m\n$usrrcdread" 821 | echo -e "\n" 822 | else 823 | : 824 | fi 825 | 826 | #rc.d files NOT belonging to root! 827 | usrrcdperms=`find /usr/local/etc/rc.d \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null` 828 | if [ "$usrrcdperms" ]; then 829 | echo -e "\e[00;31m[-] /usr/local/etc/rc.d files not belonging to root:\e[00m\n$usrrcdperms" 830 | echo -e "\n" 831 | else 832 | : 833 | fi 834 | 835 | initread=`ls -la /etc/init/ 2>/dev/null` 836 | if [ "$initread" ]; then 837 | echo -e "\e[00;31m[-] /etc/init/ config file permissions:\e[00m\n$initread" 838 | echo -e "\n" 839 | else 840 | : 841 | fi 842 | 843 | # upstart scripts not belonging to root 844 | initperms=`find /etc/init \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null` 845 | if [ "$initperms" ]; then 846 | echo -e "\e[00;31m[-] /etc/init/ config files not belonging to root:\e[00m\n$initperms" 847 | echo -e "\n" 848 | else 849 | : 850 | fi 851 | 852 | systemdread=`ls -lthR /lib/systemd/ 2>/dev/null` 853 | if [ "$systemdread" ]; then 854 | echo -e "\e[00;31m[-] /lib/systemd/* config file permissions:\e[00m\n$systemdread" 855 | echo -e "\n" 856 | else 857 | : 858 | fi 859 | 860 | # systemd files not belonging to root 861 | systemdperms=`find /lib/systemd/ \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null` 862 | if [ "$systemdperms" ]; then 863 | echo -e "\e[00;31m[-] /lib/systemd/* config files not belonging to root:\e[00m\n$systemdperms" 864 | echo -e "\n" 865 | else 866 | : 867 | fi 868 | } 869 | 870 | software_configs() 871 | { 872 | echo -e "\e[00;33m### SOFTWARE #############################################\e[00m" 873 | 874 | #sudo version - check to see if there are any known vulnerabilities with this 875 | sudover=`sudo -V 2>/dev/null| grep "Sudo version" 2>/dev/null` 876 | if [ "$sudover" ]; then 877 | echo -e "\e[00;31m[-] Sudo version:\e[00m\n$sudover" 878 | echo -e "\n" 879 | else 880 | : 881 | fi 882 | 883 | #mysql details - if installed 884 | mysqlver=`mysql --version 2>/dev/null` 885 | if [ "$mysqlver" ]; then 886 | echo -e "\e[00;31m[-] MYSQL version:\e[00m\n$mysqlver" 887 | echo -e "\n" 888 | else 889 | : 890 | fi 891 | 892 | #checks to see if root/root will get us a connection 893 | mysqlconnect=`mysqladmin -uroot -proot version 2>/dev/null` 894 | if [ "$mysqlconnect" ]; then 895 | echo -e "\e[00;33m[+] We can connect to the local MYSQL service with default root/root credentials!\e[00m\n$mysqlconnect" 896 | echo -e "\n" 897 | else 898 | : 899 | fi 900 | 901 | #mysql version details 902 | mysqlconnectnopass=`mysqladmin -uroot version 2>/dev/null` 903 | if [ "$mysqlconnectnopass" ]; then 904 | echo -e "\e[00;33m[+] We can connect to the local MYSQL service as 'root' and without a password!\e[00m\n$mysqlconnectnopass" 905 | echo -e "\n" 906 | else 907 | : 908 | fi 909 | 910 | #postgres details - if installed 911 | postgver=`psql -V 2>/dev/null` 912 | if [ "$postgver" ]; then 913 | echo -e "\e[00;31m[-] Postgres version:\e[00m\n$postgver" 914 | echo -e "\n" 915 | else 916 | : 917 | fi 918 | 919 | #checks to see if any postgres password exists and connects to DB 'template0' - following commands are a variant on this 920 | postcon1=`psql -U postgres template0 -c 'select version()' 2>/dev/null | grep version` 921 | if [ "$postcon1" ]; then 922 | echo -e "\e[00;33m[+] We can connect to Postgres DB 'template0' as user 'postgres' with no password!:\e[00m\n$postcon1" 923 | echo -e "\n" 924 | else 925 | : 926 | fi 927 | 928 | postcon11=`psql -U postgres template1 -c 'select version()' 2>/dev/null | grep version` 929 | if [ "$postcon11" ]; then 930 | echo -e "\e[00;33m[+] We can connect to Postgres DB 'template1' as user 'postgres' with no password!:\e[00m\n$postcon11" 931 | echo -e "\n" 932 | else 933 | : 934 | fi 935 | 936 | postcon2=`psql -U pgsql template0 -c 'select version()' 2>/dev/null | grep version` 937 | if [ "$postcon2" ]; then 938 | echo -e "\e[00;33m[+] We can connect to Postgres DB 'template0' as user 'psql' with no password!:\e[00m\n$postcon2" 939 | echo -e "\n" 940 | else 941 | : 942 | fi 943 | 944 | postcon22=`psql -U pgsql template1 -c 'select version()' 2>/dev/null | grep version` 945 | if [ "$postcon22" ]; then 946 | echo -e "\e[00;33m[+] We can connect to Postgres DB 'template1' as user 'psql' with no password!:\e[00m\n$postcon22" 947 | echo -e "\n" 948 | else 949 | : 950 | fi 951 | 952 | #apache details - if installed 953 | apachever=`apache2 -v 2>/dev/null; httpd -v 2>/dev/null` 954 | if [ "$apachever" ]; then 955 | echo -e "\e[00;31m[-] Apache version:\e[00m\n$apachever" 956 | echo -e "\n" 957 | else 958 | : 959 | fi 960 | 961 | #what account is apache running under 962 | apacheusr=`grep -i 'user\|group' /etc/apache2/envvars 2>/dev/null |awk '{sub(/.*\export /,"")}1' 2>/dev/null` 963 | if [ "$apacheusr" ]; then 964 | echo -e "\e[00;31m[-] Apache user configuration:\e[00m\n$apacheusr" 965 | echo -e "\n" 966 | else 967 | : 968 | fi 969 | 970 | if [ "$export" ] && [ "$apacheusr" ]; then 971 | mkdir --parents $format/etc-export/apache2/ 2>/dev/null 972 | cp /etc/apache2/envvars $format/etc-export/apache2/envvars 2>/dev/null 973 | else 974 | : 975 | fi 976 | 977 | #installed apache modules 978 | apachemodules=`apache2ctl -M 2>/dev/null; httpd -M 2>/dev/null` 979 | if [ "$apachemodules" ]; then 980 | echo -e "\e[00;31m[-] Installed Apache modules:\e[00m\n$apachemodules" 981 | echo -e "\n" 982 | else 983 | : 984 | fi 985 | 986 | #htpasswd check 987 | htpasswd=`find / -name .htpasswd -print -exec cat {} \; 2>/dev/null` 988 | if [ "$htpasswd" ]; then 989 | echo -e "\e[00;33m[-] htpasswd found - could contain passwords:\e[00m\n$htpasswd" 990 | echo -e "\n" 991 | else 992 | : 993 | fi 994 | 995 | #anything in the default http home dirs (changed to thorough as can be large) 996 | if [ "$thorough" = "1" ]; then 997 | apachehomedirs=`ls -alhR /var/www/ 2>/dev/null; ls -alhR /srv/www/htdocs/ 2>/dev/null; ls -alhR /usr/local/www/apache2/data/ 2>/dev/null; ls -alhR /opt/lampp/htdocs/ 2>/dev/null` 998 | if [ "$apachehomedirs" ]; then 999 | echo -e "\e[00;31m[-] www home dir contents:\e[00m\n$apachehomedirs" 1000 | echo -e "\n" 1001 | else 1002 | : 1003 | fi 1004 | fi 1005 | 1006 | } 1007 | 1008 | interesting_files() 1009 | { 1010 | echo -e "\e[00;33m### INTERESTING FILES ####################################\e[00m" 1011 | 1012 | #checks to see if various files are installed 1013 | echo -e "\e[00;31m[-] Useful file locations:\e[00m" ; which nc 2>/dev/null ; which netcat 2>/dev/null ; which wget 2>/dev/null ; which nmap 2>/dev/null ; which gcc 2>/dev/null; which curl 2>/dev/null 1014 | echo -e "\n" 1015 | 1016 | #limited search for installed compilers 1017 | compiler=`dpkg --list 2>/dev/null| grep compiler |grep -v decompiler 2>/dev/null && yum list installed 'gcc*' 2>/dev/null| grep gcc 2>/dev/null` 1018 | if [ "$compiler" ]; then 1019 | echo -e "\e[00;31m[-] Installed compilers:\e[00m\n$compiler" 1020 | echo -e "\n" 1021 | else 1022 | : 1023 | fi 1024 | 1025 | #manual check - lists out sensitive files, can we read/modify etc. 1026 | echo -e "\e[00;31m[-] Can we read/write sensitive files:\e[00m" ; ls -la /etc/passwd 2>/dev/null ; ls -la /etc/group 2>/dev/null ; ls -la /etc/profile 2>/dev/null; ls -la /etc/shadow 2>/dev/null ; ls -la /etc/master.passwd 2>/dev/null 1027 | echo -e "\n" 1028 | 1029 | #search for suid files - this can take some time so is only 'activated' with thorough scanning switch (as are all suid scans below) 1030 | if [ "$thorough" = "1" ]; then 1031 | findsuid=`find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;` 1032 | if [ "$findsuid" ]; then 1033 | echo -e "\e[00;31m[-] SUID files:\e[00m\n$findsuid" 1034 | echo -e "\n" 1035 | else 1036 | : 1037 | fi 1038 | else 1039 | : 1040 | fi 1041 | 1042 | if [ "$thorough" = "1" ]; then 1043 | if [ "$export" ] && [ "$findsuid" ]; then 1044 | mkdir $format/suid-files/ 2>/dev/null 1045 | for i in $findsuid; do cp $i $format/suid-files/; done 2>/dev/null 1046 | else 1047 | : 1048 | fi 1049 | else 1050 | : 1051 | fi 1052 | 1053 | #list of 'interesting' suid files - feel free to make additions 1054 | if [ "$thorough" = "1" ]; then 1055 | intsuid=`find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null | grep -w $binarylist 2>/dev/null` 1056 | if [ "$intsuid" ]; then 1057 | echo -e "\e[00;33m[+] Possibly interesting SUID files:\e[00m\n$intsuid" 1058 | echo -e "\n" 1059 | else 1060 | : 1061 | fi 1062 | else 1063 | : 1064 | fi 1065 | 1066 | #lists word-writable suid files 1067 | if [ "$thorough" = "1" ]; then 1068 | wwsuid=`find / -perm -4007 -type f -exec ls -la {} 2>/dev/null \;` 1069 | if [ "$wwsuid" ]; then 1070 | echo -e "\e[00;33m[+] World-writable SUID files:\e[00m\n$wwsuid" 1071 | echo -e "\n" 1072 | else 1073 | : 1074 | fi 1075 | else 1076 | : 1077 | fi 1078 | 1079 | #lists world-writable suid files owned by root 1080 | if [ "$thorough" = "1" ]; then 1081 | wwsuidrt=`find / -uid 0 -perm -4007 -type f -exec ls -la {} 2>/dev/null \;` 1082 | if [ "$wwsuidrt" ]; then 1083 | echo -e "\e[00;33m[+] World-writable SUID files owned by root:\e[00m\n$wwsuidrt" 1084 | echo -e "\n" 1085 | else 1086 | : 1087 | fi 1088 | else 1089 | : 1090 | fi 1091 | 1092 | #search for guid files - this can take some time so is only 'activated' with thorough scanning switch (as are all guid scans below) 1093 | if [ "$thorough" = "1" ]; then 1094 | findguid=`find / -perm -2000 -type f -exec ls -la {} 2>/dev/null \;` 1095 | if [ "$findguid" ]; then 1096 | echo -e "\e[00;31m[-] GUID files:\e[00m\n$findguid" 1097 | echo -e "\n" 1098 | else 1099 | : 1100 | fi 1101 | else 1102 | : 1103 | fi 1104 | 1105 | if [ "$thorough" = "1" ]; then 1106 | if [ "$export" ] && [ "$findguid" ]; then 1107 | mkdir $format/guid-files/ 2>/dev/null 1108 | for i in $findguid; do cp $i $format/guid-files/; done 2>/dev/null 1109 | else 1110 | : 1111 | fi 1112 | else 1113 | : 1114 | fi 1115 | 1116 | #list of 'interesting' guid files - feel free to make additions 1117 | if [ "$thorough" = "1" ]; then 1118 | intguid=`find / -perm -2000 -type f -exec ls -la {} \; 2>/dev/null | grep -w $binarylist 2>/dev/null` 1119 | if [ "$intguid" ]; then 1120 | echo -e "\e[00;33m[+] Possibly interesting GUID files:\e[00m\n$intguid" 1121 | echo -e "\n" 1122 | else 1123 | : 1124 | fi 1125 | else 1126 | : 1127 | fi 1128 | 1129 | #lists world-writable guid files 1130 | if [ "$thorough" = "1" ]; then 1131 | wwguid=`find / -perm -2007 -type f -exec ls -la {} 2>/dev/null \;` 1132 | if [ "$wwguid" ]; then 1133 | echo -e "\e[00;33m[+] World-writable GUID files:\e[00m\n$wwguid" 1134 | echo -e "\n" 1135 | else 1136 | : 1137 | fi 1138 | else 1139 | : 1140 | fi 1141 | 1142 | #lists world-writable guid files owned by root 1143 | if [ "$thorough" = "1" ]; then 1144 | wwguidrt=`find / -uid 0 -perm -2007 -type f -exec ls -la {} 2>/dev/null \;` 1145 | if [ "$wwguidrt" ]; then 1146 | echo -e "\e[00;33m[+] World-writable GUID files owned by root:\e[00m\n$wwguidrt" 1147 | echo -e "\n" 1148 | else 1149 | : 1150 | fi 1151 | else 1152 | : 1153 | fi 1154 | 1155 | #list all world-writable files excluding /proc and /sys 1156 | if [ "$thorough" = "1" ]; then 1157 | wwfiles=`find / ! -path "*/proc/*" ! -path "/sys/*" -perm -2 -type f -exec ls -la {} 2>/dev/null \;` 1158 | if [ "$wwfiles" ]; then 1159 | echo -e "\e[00;31m[-] World-writable files (excluding /proc and /sys):\e[00m\n$wwfiles" 1160 | echo -e "\n" 1161 | else 1162 | : 1163 | fi 1164 | else 1165 | : 1166 | fi 1167 | 1168 | if [ "$thorough" = "1" ]; then 1169 | if [ "$export" ] && [ "$wwfiles" ]; then 1170 | mkdir $format/ww-files/ 2>/dev/null 1171 | for i in $wwfiles; do cp --parents $i $format/ww-files/; done 2>/dev/null 1172 | else 1173 | : 1174 | fi 1175 | else 1176 | : 1177 | fi 1178 | 1179 | #are any .plan files accessible in /home (could contain useful information) 1180 | usrplan=`find /home -iname *.plan -exec ls -la {} \; -exec cat {} 2>/dev/null \;` 1181 | if [ "$usrplan" ]; then 1182 | echo -e "\e[00;31m[-] Plan file permissions and contents:\e[00m\n$usrplan" 1183 | echo -e "\n" 1184 | else 1185 | : 1186 | fi 1187 | 1188 | if [ "$export" ] && [ "$usrplan" ]; then 1189 | mkdir $format/plan_files/ 2>/dev/null 1190 | for i in $usrplan; do cp --parents $i $format/plan_files/; done 2>/dev/null 1191 | else 1192 | : 1193 | fi 1194 | 1195 | bsdusrplan=`find /usr/home -iname *.plan -exec ls -la {} \; -exec cat {} 2>/dev/null \;` 1196 | if [ "$bsdusrplan" ]; then 1197 | echo -e "\e[00;31m[-] Plan file permissions and contents:\e[00m\n$bsdusrplan" 1198 | echo -e "\n" 1199 | else 1200 | : 1201 | fi 1202 | 1203 | if [ "$export" ] && [ "$bsdusrplan" ]; then 1204 | mkdir $format/plan_files/ 2>/dev/null 1205 | for i in $bsdusrplan; do cp --parents $i $format/plan_files/; done 2>/dev/null 1206 | else 1207 | : 1208 | fi 1209 | 1210 | #are there any .rhosts files accessible - these may allow us to login as another user etc. 1211 | rhostsusr=`find /home -iname *.rhosts -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \;` 1212 | if [ "$rhostsusr" ]; then 1213 | echo -e "\e[00;33m[+] rhost config file(s) and file contents:\e[00m\n$rhostsusr" 1214 | echo -e "\n" 1215 | else 1216 | : 1217 | fi 1218 | 1219 | if [ "$export" ] && [ "$rhostsusr" ]; then 1220 | mkdir $format/rhosts/ 2>/dev/null 1221 | for i in $rhostsusr; do cp --parents $i $format/rhosts/; done 2>/dev/null 1222 | else 1223 | : 1224 | fi 1225 | 1226 | bsdrhostsusr=`find /usr/home -iname *.rhosts -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \;` 1227 | if [ "$bsdrhostsusr" ]; then 1228 | echo -e "\e[00;33m[+] rhost config file(s) and file contents:\e[00m\n$bsdrhostsusr" 1229 | echo -e "\n" 1230 | else 1231 | : 1232 | fi 1233 | 1234 | if [ "$export" ] && [ "$bsdrhostsusr" ]; then 1235 | mkdir $format/rhosts 2>/dev/null 1236 | for i in $bsdrhostsusr; do cp --parents $i $format/rhosts/; done 2>/dev/null 1237 | else 1238 | : 1239 | fi 1240 | 1241 | rhostssys=`find /etc -iname hosts.equiv -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \;` 1242 | if [ "$rhostssys" ]; then 1243 | echo -e "\e[00;33m[+] Hosts.equiv file and contents: \e[00m\n$rhostssys" 1244 | echo -e "\n" 1245 | else 1246 | : 1247 | fi 1248 | 1249 | if [ "$export" ] && [ "$rhostssys" ]; then 1250 | mkdir $format/rhosts/ 2>/dev/null 1251 | for i in $rhostssys; do cp --parents $i $format/rhosts/; done 2>/dev/null 1252 | else 1253 | : 1254 | fi 1255 | 1256 | #list nfs shares/permisisons etc. 1257 | nfsexports=`ls -la /etc/exports 2>/dev/null; cat /etc/exports 2>/dev/null` 1258 | if [ "$nfsexports" ]; then 1259 | echo -e "\e[00;31m[-] NFS config details: \e[00m\n$nfsexports" 1260 | echo -e "\n" 1261 | else 1262 | : 1263 | fi 1264 | 1265 | if [ "$export" ] && [ "$nfsexports" ]; then 1266 | mkdir $format/etc-export/ 2>/dev/null 1267 | cp /etc/exports $format/etc-export/exports 2>/dev/null 1268 | else 1269 | : 1270 | fi 1271 | 1272 | if [ "$thorough" = "1" ]; then 1273 | #phackt 1274 | #displaying /etc/fstab 1275 | fstab=`cat /etc/fstab 2>/dev/null` 1276 | if [ "$fstab" ]; then 1277 | echo -e "\e[00;31m[-] NFS displaying partitions and filesystems - you need to check if exotic filesystems\e[00m" 1278 | echo -e "$fstab" 1279 | echo -e "\n" 1280 | fi 1281 | fi 1282 | 1283 | #looking for credentials in /etc/fstab 1284 | fstab=`grep username /etc/fstab 2>/dev/null |awk '{sub(/.*\username=/,"");sub(/\,.*/,"")}1' 2>/dev/null| xargs -r echo username: 2>/dev/null; grep password /etc/fstab 2>/dev/null |awk '{sub(/.*\password=/,"");sub(/\,.*/,"")}1' 2>/dev/null| xargs -r echo password: 2>/dev/null; grep domain /etc/fstab 2>/dev/null |awk '{sub(/.*\domain=/,"");sub(/\,.*/,"")}1' 2>/dev/null| xargs -r echo domain: 2>/dev/null` 1285 | if [ "$fstab" ]; then 1286 | echo -e "\e[00;33m[+] Looks like there are credentials in /etc/fstab!\e[00m\n$fstab" 1287 | echo -e "\n" 1288 | else 1289 | : 1290 | fi 1291 | 1292 | if [ "$export" ] && [ "$fstab" ]; then 1293 | mkdir $format/etc-exports/ 2>/dev/null 1294 | cp /etc/fstab $format/etc-exports/fstab done 2>/dev/null 1295 | else 1296 | : 1297 | fi 1298 | 1299 | fstabcred=`grep cred /etc/fstab 2>/dev/null |awk '{sub(/.*\credentials=/,"");sub(/\,.*/,"")}1' 2>/dev/null | xargs -I{} sh -c 'ls -la {}; cat {}' 2>/dev/null` 1300 | if [ "$fstabcred" ]; then 1301 | echo -e "\e[00;33m[+] /etc/fstab contains a credentials file!\e[00m\n$fstabcred" 1302 | echo -e "\n" 1303 | else 1304 | : 1305 | fi 1306 | 1307 | if [ "$export" ] && [ "$fstabcred" ]; then 1308 | mkdir $format/etc-exports/ 2>/dev/null 1309 | cp /etc/fstab $format/etc-exports/fstab done 2>/dev/null 1310 | else 1311 | : 1312 | fi 1313 | 1314 | #use supplied keyword and cat *.conf files for potential matches - output will show line number within relevant file path where a match has been located 1315 | if [ "$keyword" = "" ]; then 1316 | echo -e "[-] Can't search *.conf files as no keyword was entered\n" 1317 | else 1318 | confkey=`find / -maxdepth 4 -name *.conf -type f -exec grep -Hn $keyword {} \; 2>/dev/null` 1319 | if [ "$confkey" ]; then 1320 | echo -e "\e[00;31m[-] Find keyword ($keyword) in .conf files (recursive 4 levels - output format filepath:identified line number where keyword appears):\e[00m\n$confkey" 1321 | echo -e "\n" 1322 | else 1323 | echo -e "\e[00;31m[-] Find keyword ($keyword) in .conf files (recursive 4 levels):\e[00m" 1324 | echo -e "'$keyword' not found in any .conf files" 1325 | echo -e "\n" 1326 | fi 1327 | fi 1328 | 1329 | if [ "$keyword" = "" ]; then 1330 | : 1331 | else 1332 | if [ "$export" ] && [ "$confkey" ]; then 1333 | confkeyfile=`find / -maxdepth 4 -name *.conf -type f -exec grep -lHn $keyword {} \; 2>/dev/null` 1334 | mkdir --parents $format/keyword_file_matches/config_files/ 2>/dev/null 1335 | for i in $confkeyfile; do cp --parents $i $format/keyword_file_matches/config_files/ ; done 2>/dev/null 1336 | else 1337 | : 1338 | fi 1339 | fi 1340 | 1341 | #use supplied keyword and cat *.php files for potential matches - output will show line number within relevant file path where a match has been located 1342 | if [ "$keyword" = "" ]; then 1343 | echo -e "[-] Can't search *.php files as no keyword was entered\n" 1344 | else 1345 | phpkey=`find / -maxdepth 10 -name *.php -type f -exec grep -Hn $keyword {} \; 2>/dev/null` 1346 | if [ "$phpkey" ]; then 1347 | echo -e "\e[00;31m[-] Find keyword ($keyword) in .php files (recursive 10 levels - output format filepath:identified line number where keyword appears):\e[00m\n$phpkey" 1348 | echo -e "\n" 1349 | else 1350 | echo -e "\e[00;31m[-] Find keyword ($keyword) in .php files (recursive 10 levels):\e[00m" 1351 | echo -e "'$keyword' not found in any .php files" 1352 | echo -e "\n" 1353 | fi 1354 | fi 1355 | 1356 | if [ "$keyword" = "" ]; then 1357 | : 1358 | else 1359 | if [ "$export" ] && [ "$phpkey" ]; then 1360 | phpkeyfile=`find / -maxdepth 10 -name *.php -type f -exec grep -lHn $keyword {} \; 2>/dev/null` 1361 | mkdir --parents $format/keyword_file_matches/php_files/ 2>/dev/null 1362 | for i in $phpkeyfile; do cp --parents $i $format/keyword_file_matches/php_files/ ; done 2>/dev/null 1363 | else 1364 | : 1365 | fi 1366 | fi 1367 | 1368 | #use supplied keyword and cat *.log files for potential matches - output will show line number within relevant file path where a match has been located 1369 | if [ "$keyword" = "" ];then 1370 | echo -e "[-] Can't search *.log files as no keyword was entered\n" 1371 | else 1372 | logkey=`find / -maxdepth 4 -name *.log -type f -exec grep -Hn $keyword {} \; 2>/dev/null` 1373 | if [ "$logkey" ]; then 1374 | echo -e "\e[00;31m[-] Find keyword ($keyword) in .log files (recursive 4 levels - output format filepath:identified line number where keyword appears):\e[00m\n$logkey" 1375 | echo -e "\n" 1376 | else 1377 | echo -e "\e[00;31m[-] Find keyword ($keyword) in .log files (recursive 4 levels):\e[00m" 1378 | echo -e "'$keyword' not found in any .log files" 1379 | echo -e "\n" 1380 | fi 1381 | fi 1382 | 1383 | if [ "$keyword" = "" ];then 1384 | : 1385 | else 1386 | if [ "$export" ] && [ "$logkey" ]; then 1387 | logkeyfile=`find / -maxdepth 4 -name *.log -type f -exec grep -lHn $keyword {} \; 2>/dev/null` 1388 | mkdir --parents $format/keyword_file_matches/log_files/ 2>/dev/null 1389 | for i in $logkeyfile; do cp --parents $i $format/keyword_file_matches/log_files/ ; done 2>/dev/null 1390 | else 1391 | : 1392 | fi 1393 | fi 1394 | 1395 | #use supplied keyword and cat *.ini files for potential matches - output will show line number within relevant file path where a match has been located 1396 | if [ "$keyword" = "" ];then 1397 | echo -e "[-] Can't search *.ini files as no keyword was entered\n" 1398 | else 1399 | inikey=`find / -maxdepth 4 -name *.ini -type f -exec grep -Hn $keyword {} \; 2>/dev/null` 1400 | if [ "$inikey" ]; then 1401 | echo -e "\e[00;31m[-] Find keyword ($keyword) in .ini files (recursive 4 levels - output format filepath:identified line number where keyword appears):\e[00m\n$inikey" 1402 | echo -e "\n" 1403 | else 1404 | echo -e "\e[00;31m[-] Find keyword ($keyword) in .ini files (recursive 4 levels):\e[00m" 1405 | echo -e "'$keyword' not found in any .ini files" 1406 | echo -e "\n" 1407 | fi 1408 | fi 1409 | 1410 | if [ "$keyword" = "" ];then 1411 | : 1412 | else 1413 | if [ "$export" ] && [ "$inikey" ]; then 1414 | inikey=`find / -maxdepth 4 -name *.ini -type f -exec grep -lHn $keyword {} \; 2>/dev/null` 1415 | mkdir --parents $format/keyword_file_matches/ini_files/ 2>/dev/null 1416 | for i in $inikey; do cp --parents $i $format/keyword_file_matches/ini_files/ ; done 2>/dev/null 1417 | else 1418 | : 1419 | fi 1420 | fi 1421 | 1422 | #quick extract of .conf files from /etc - only 1 level 1423 | allconf=`find /etc/ -maxdepth 1 -name *.conf -type f -exec ls -la {} \; 2>/dev/null` 1424 | if [ "$allconf" ]; then 1425 | echo -e "\e[00;31m[-] All *.conf files in /etc (recursive 1 level):\e[00m\n$allconf" 1426 | echo -e "\n" 1427 | else 1428 | : 1429 | fi 1430 | 1431 | if [ "$export" ] && [ "$allconf" ]; then 1432 | mkdir $format/conf-files/ 2>/dev/null 1433 | for i in $allconf; do cp --parents $i $format/conf-files/; done 2>/dev/null 1434 | else 1435 | : 1436 | fi 1437 | 1438 | #extract any user history files that are accessible 1439 | usrhist=`ls -la ~/.*_history 2>/dev/null` 1440 | if [ "$usrhist" ]; then 1441 | echo -e "\e[00;31m[-] Current user's history files:\e[00m\n$usrhist" 1442 | echo -e "\n" 1443 | else 1444 | : 1445 | fi 1446 | 1447 | if [ "$export" ] && [ "$usrhist" ]; then 1448 | mkdir $format/history_files/ 2>/dev/null 1449 | for i in $usrhist; do cp --parents $i $format/history_files/; done 2>/dev/null 1450 | else 1451 | : 1452 | fi 1453 | 1454 | #can we read roots *_history files - could be passwords stored etc. 1455 | roothist=`ls -la /root/.*_history 2>/dev/null` 1456 | if [ "$roothist" ]; then 1457 | echo -e "\e[00;33m[+] Root's history files are accessible!\e[00m\n$roothist" 1458 | echo -e "\n" 1459 | else 1460 | : 1461 | fi 1462 | 1463 | if [ "$export" ] && [ "$roothist" ]; then 1464 | mkdir $format/history_files/ 2>/dev/null 1465 | cp $roothist $format/history_files/ 2>/dev/null 1466 | else 1467 | : 1468 | fi 1469 | 1470 | #all accessible .bash_history files in /home 1471 | checkbashhist=`find /home -name .bash_history -print -exec cat {} 2>/dev/null \;` 1472 | if [ "$checkbashhist" ]; then 1473 | echo -e "\e[00;31m[-] Location and contents (if accessible) of .bash_history file(s):\e[00m\n$checkbashhist" 1474 | echo -e "\n" 1475 | else 1476 | : 1477 | fi 1478 | 1479 | #is there any mail accessible 1480 | readmail=`ls -la /var/mail 2>/dev/null` 1481 | if [ "$readmail" ]; then 1482 | echo -e "\e[00;31m[-] Any interesting mail in /var/mail:\e[00m\n$readmail" 1483 | echo -e "\n" 1484 | else 1485 | : 1486 | fi 1487 | 1488 | #can we read roots mail 1489 | readmailroot=`head /var/mail/root 2>/dev/null` 1490 | if [ "$readmailroot" ]; then 1491 | echo -e "\e[00;33m[+] We can read /var/mail/root! (snippet below)\e[00m\n$readmailroot" 1492 | echo -e "\n" 1493 | else 1494 | : 1495 | fi 1496 | 1497 | if [ "$export" ] && [ "$readmailroot" ]; then 1498 | mkdir $format/mail-from-root/ 2>/dev/null 1499 | cp $readmailroot $format/mail-from-root/ 2>/dev/null 1500 | else 1501 | : 1502 | fi 1503 | } 1504 | 1505 | docker_checks() 1506 | { 1507 | #specific checks - check to see if we're in a docker container 1508 | dockercontainer=` grep -i docker /proc/self/cgroup 2>/dev/null; find / -name "*dockerenv*" -exec ls -la {} \; 2>/dev/null` 1509 | if [ "$dockercontainer" ]; then 1510 | echo -e "\e[00;33m[+] Looks like we're in a Docker container:\e[00m\n$dockercontainer" 1511 | echo -e "\n" 1512 | else 1513 | : 1514 | fi 1515 | 1516 | #specific checks - check to see if we're a docker host 1517 | dockerhost=`docker --version 2>/dev/null; docker ps -a 2>/dev/null` 1518 | if [ "$dockerhost" ]; then 1519 | echo -e "\e[00;33m[+] Looks like we're hosting Docker:\e[00m\n$dockerhost" 1520 | echo -e "\n" 1521 | else 1522 | : 1523 | fi 1524 | 1525 | #specific checks - are we a member of the docker group 1526 | dockergrp=`id | grep -i docker 2>/dev/null` 1527 | if [ "$dockergrp" ]; then 1528 | echo -e "\e[00;33m[+] We're a member of the (docker) group - could possibly misuse these rights!\e[00m\n$dockergrp" 1529 | echo -e "\n" 1530 | else 1531 | : 1532 | fi 1533 | 1534 | #specific checks - are there any docker files present 1535 | dockerfiles=`find / -name Dockerfile -exec ls -l {} 2>/dev/null \;` 1536 | if [ "$dockerfiles" ]; then 1537 | echo -e "\e[00;31m[-] Anything juicy in the Dockerfile:\e[00m\n$dockerfiles" 1538 | echo -e "\n" 1539 | else 1540 | : 1541 | fi 1542 | 1543 | #specific checks - are there any docker files present 1544 | dockeryml=`find / -name docker-compose.yml -exec ls -l {} 2>/dev/null \;` 1545 | if [ "$dockeryml" ]; then 1546 | echo -e "\e[00;31m[-] Anything juicy in docker-compose.yml:\e[00m\n$dockeryml" 1547 | echo -e "\n" 1548 | else 1549 | : 1550 | fi 1551 | } 1552 | 1553 | lxc_container_checks() 1554 | { 1555 | #specific checks - are we in an lxd/lxc container 1556 | lxccontainer=`grep -qa container=lxc /proc/1/environ 2>/dev/null` 1557 | if [ "$lxccontainer" ]; then 1558 | echo -e "\e[00;33m[+] Looks like we're in a lxc container:\e[00m\n$lxccontainer" 1559 | echo -e "\n" 1560 | fi 1561 | 1562 | #specific checks - are we a member of the lxd group 1563 | lxdgroup=`id | grep -i lxd 2>/dev/null` 1564 | if [ "$lxdgroup" ]; then 1565 | echo -e "\e[00;33m[+] We're a member of the (lxd) group - could possibly misuse these rights!\e[00m\n$lxdgroup" 1566 | echo -e "\n" 1567 | fi 1568 | } 1569 | 1570 | footer() 1571 | { 1572 | echo -e "\e[00;33m### SCAN COMPLETE ####################################\e[00m" 1573 | } 1574 | 1575 | call_each() 1576 | { 1577 | header 1578 | debug_info 1579 | system_info 1580 | user_info 1581 | environmental_info 1582 | job_info 1583 | networking_info 1584 | services_info 1585 | software_configs 1586 | interesting_files 1587 | docker_checks 1588 | lxc_container_checks 1589 | footer 1590 | } 1591 | 1592 | while getopts "h:k:r:e:st" option; do 1593 | case "${option}" in 1594 | k) keyword=${OPTARG};; 1595 | r) report=${OPTARG}"-"`date +"%d-%m-%y"`;; 1596 | e) export=${OPTARG};; 1597 | s) sudopass=1;; 1598 | t) thorough=1;; 1599 | h) usage; exit;; 1600 | *) usage; exit;; 1601 | esac 1602 | done 1603 | 1604 | call_each | tee -a $report 2> /dev/null 1605 | #EndOfScript 1606 | -------------------------------------------------------------------------------- /Linux-Safe-configuration/LInux_Safety_Application_Doc.word: -------------------------------------------------------------------------------- 1 | 目录 2 | 简介 6 3 | 使用对象 6 4 | 适用范围 6 5 | 指导解释 6 6 | 用词约定 6 7 | 术语解释 7 8 | 1 权限管理 8 9 | 1.1 权限最小化 8 10 | 1.1.1 禁止直接使用root账号登录Linux系统 8 11 | 1.1.2 除有明确特权需求,应用程序应以非root账号运行 9 12 | 1.1.3 采用不同权限的帐号运行不同的应用并对帐号进行权限分离 9 13 | 1.1.4 在运行时有特权需求的程序,在特权操作完后如后续无特权需求,必须使用setuid放弃特权 10 14 | 1.1.5 使用sudo机制代替以root帐号登录运行特权程序的方式。 11 15 | 1.1.6 应对允许使用su到root帐号的用户进行明确授权,非授权用户不能切换到root 11 16 | 1.1.7 使用POSIX Capabilities功能避免直接使用root权限 12 17 | 1.2 文件和目录权限 14 18 | 1.2.1 系统中禁止有无主文件存在 14 19 | 1.2.2 除有明确需求,应删除文件不必要的setuid和setgid位 14 20 | 1.2.3 应为系统用户设置缺省的umask值 15 21 | 1.2.4 使用特殊属性位Sticky位对共享目录权限进行控制 16 22 | 1.2.5 利用特殊文件属性Append-only位保护系统命令行历史日志文件,防止内容被篡改 16 23 | 2 访问控制 18 24 | 2.1 自主访问控制 18 25 | 2.1.1 使用POSIX ACL进行更细粒度的访问控制 18 26 | 2.2 强制访问控制 20 27 | 2.2.1 Linux系统上应安装强制访问控制系统作为应急的安全访问控制手段 20 28 | 3 记录和审计 22 29 | 3.1 监测、记录和审计 22 30 | 3.1.1 启用inotify监控机制,以文件系统事件进行安全监控 22 31 | 3.1.2 使用Auditd组件对系统中的重要目录或文件进行审计 24 32 | 4 认证 26 33 | 4.1 口令和账号 26 34 | 4.1.1 使用shadow套件对系统账号口令进行分离保护 26 35 | 4.1.2 Linux系统必须使用shadow套件对当前暂时不使用的账号进行锁定或登录限制 27 36 | 4.1.3 使用shadow套件对系统口令的时效进行限制 29 37 | 4.2 可插拔认证模块(PAM) 29 38 | 4.2.1 使用PAM模块增强认证管理 29 39 | 5 文件系统保护 31 40 | 5.1 日志文件保护 31 41 | 5.1.1 应将操作系统日志发送至外部服务器单独存储,确保日志不被篡改 31 42 | 5.2 文件系统加密 31 43 | 5.2.1 对含有重要信息的文件目录或分区进行加密处理 31 44 | 5.3 分区和挂载 32 45 | 5.3.1 对于系统中的重要目录必须根据存储目的不同进行分区隔离 32 46 | 5.3.2 使用fstab对外接、日志存储分区进行访问控制。 32 47 | 5.3.3 禁用自动工具对移动存储设备进行挂载 33 48 | 6 网络防护 34 49 | 6.1 网络防护能力 34 50 | 6.1.1 使用sysctl工具增强系统网络防护能力 34 51 | 6.1.2 使用iptables对系统中不使用的端口进行限制 35 52 | 6.2 限制网络服务 35 53 | 6.2.1 远程访问需使用SSH取代telnet 35 54 | 6.2.2 系统中不应安装不安全的传统网络服务 35 55 | 7 漏洞攻击防护 37 56 | 7.1 地址随机化 37 57 | 7.1.1 使用Linux自带的ASLR功能(地址空间布局随机化)增强漏洞攻击防护能力 37 58 | 7.2 数据执行防护 37 59 | 7.2.1 系统必须使用DEP防护手段提升漏洞攻击防护能力 37 60 | 7.2.2 使用栈保护机制 38 61 | 7.3 增强性安全防护 39 62 | 7.3.1 使用Grsecurity增强Linux系统的安全防护能力 39 63 | 7.3.2 使用PaX提升系统攻击防护能力 40 64 | 8 完整性保护 43 65 | 8.1 文件完整性检查 43 66 | 8.1.1 使用IMA工具对系统文件的完整性进行检查 43 67 | 9 安全隔离和容器 44 68 | 9.1 安全隔离 44 69 | 9.1.1 对于开放给第三方的shell环境,应使用隔离技术对其可访问的系统资源进行隔离 44 70 | 9.1.2 对于系统中运行的第三方应用,需使用控制组或容器等技术手段将其于系统关键资源进行隔离。 46 71 | 10 其他 47 72 | 10.1 额外系统功能限制 47 73 | 10.1.1 对core dump功能的使用进行限制 47 74 | 10.1.2 关闭SysRq键的使用 47 75 | 10.1.3 应对bootloader开启引导装载密码 48 76 | 10.1.4 使用ulimit工具限制用户可以打开文件个数 48 77 | 11 设计样例 50 78 | 79 | 80 | 81 | 术语解释 82 | 名词 解释 83 | MAC 强制访问控制(Mandatory Access Control——MAC),用于将系统中的信息分密级和类进行管理,以保证每个用户只能访问到那些被标明可以由他访问的信息的一种访问约束机制。 84 | DAC 自主访问控制(Discretionary Access Control,DAC)是这样的一种控制方式,由客体的属主对自己的客体进行管理,由属主自己决定是否将自己的客体访问权或部分访问权授予其他主体,这种控制方式是自主的。 85 | 容器 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。 86 | PAM PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理 87 | 员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系 统中添加新的认证手段。 88 | ASLR ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。 89 | DEP DEP (Data Execution Prevention) 是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意代码。 90 | ACL 访问控制列表(Access Control List,ACL)。 91 | 92 | 1 权限管理 93 | 1.1 权限最小化 94 | 1.1.1 禁止直接使用root账号登录Linux系统 95 | 说明: 96 | root是Linux系统中的超级特权用户,具有所有Linux系统资源的访问权限。如果允许直接使用root账号登录Linux系统对系统进行操作,会带来很多潜在的安全风险,为了规避由此带来的风险,应禁止直接使用root帐号登录操作系统,仅在必要的情况通过其他技术手段(如:su)间接的使用root账号。禁止直接使用root账号登录可以规避很多潜在的安全风险,提高系统安全性。 97 | 此条目需满足以下要求: 98 |  禁止直接通过root账号远程登录系统(ssh远程登录) 99 |  禁止直接使用root账号本地标准终端登录(本地tty登录,如:tty1、tty2等) 100 | 此条目对以下情况不做强制要求: 101 |  对于设备维护用串口不做强制要求,如console。 102 |  系统初始化和调测阶段不在规则范围内。 103 | 实施指导: 104 |  禁止root账号本地直接登录 105 | 1) 编辑root登录设备控制文件securetty 106 | vi /etc/securetty 107 | 2) 注释掉或删除所有标准终端设备(形如ttyN,如:tty1、tty2等) 108 | #tty1 109 | #tty2 110 | … 111 | #ttyN 112 | 3) 保存文件后root用户本地标准终端登录即被禁止 113 | Login: root 114 | Password: 115 | Login incorrect 116 |  禁止root账号远程直接登录 117 | 例:修改openssh服务配置文件,禁止root账号远程直接登录 118 | 1) 编辑openssh服务配置文件sshd_config 119 | vi /etc/ssh/sshd_config 120 | 2) 查找PermitRootLogin配置项(若不存在需添加),将其设置为No 121 | PermitRootLogin No 122 | 3) 保存文件后,重新启动sshd服务 123 | /etc/init.d/sshd restart 124 | 125 | 1.1.2 除有明确特权需求,应用程序应以非root账号运行 126 | 说明: 127 | root权限是Linux系统中的超级特权用户,具有所有Linux资源的访问权限。若自研程序或者第三方程序存在堆栈溢出漏洞,那么攻击者就可以利用漏洞植入任意代码,获取程序执行者的权限,进而控制整个系统。因此,我们应该按照最小权限原则设计Linux系统权限,即使程序中存在堆栈溢出漏洞,由于被植入恶意代码的程序只有普通用户权限,无法对系统造成严重影响,攻击面大大降低。 128 | 实施指导: 129 | 比如一个程序在使用普通用户就可以正常运行的情况,就不应用 root帐号运行,按照安全设计的最小权限原则,分析应用程序进程所需要的最小权限,无特权需求的程序禁止使用root运行。实施方法如下: 130 | root# useradd huawei 131 | su - user -c program 132 | user代表用户名,program是程序名(这里要注意的是程序名要给决对路径) 133 | 134 | 1.1.3 采用不同权限的帐号运行不同的应用并对帐号进行权限分离 135 | 说明: 136 | 在设计实现应用系统时,应根据各个组成部分(子系统或程序)运行所需的操作系统权限的不同以及暴露给用户的访问权限的不同,对其进行划分和授权,采用不同权限的帐号运行不同的程序或组成部分。 137 | 此条目需满足以下要求: 138 |  运行web服务的系统帐号不能和运行数据库的系统帐号是同一个帐号,并且要做访问的权限分离。 139 | 实施指导: 140 | 例如典型的WEB应用系统,由WEB系统和数据库系统组成,WEB系统对外提供访问服务,外部用户通过WEB服务获取页面相关的数据,这此页面数据敏感度相对低一些,而数据库系统一般存放业务相关的重要数据,敏感度高,通常会为两个系统建立不同的帐号和权限,并分配不同的目录来存放敏感度不同的数据。对于WEB系统使用Apache服务器情况,会建立apache用户来运行httpd进程,限制httpd进程只能特定WEB文件、配置文件和日志数据,如var/www;同时,对数据库使用mysql的情况,也会为数据库建立专门的帐户mysql和相应的特权目录,让mysqld服务进程只能访问限定的目录,如var/lib/mysql。通过这样的划分和授权,达到用不同的权限帐号运行不同的程序并实现了运行权限的分离。 141 | 142 | 1.1.4 在运行时有特权需求的程序,在特权操作完后如后续无特权需求,必须使用setuid放弃特权 143 | 说明: 144 | 程序中有些任务必需使用root权限执行,当特权操作完成后并且后续无特权需求,应调用setuid()函数放弃root用户的权利,使用普通用户权限运行程序。需要注意的是一旦调用setuid()函数放弃root用户的权利,在后续执行中这个进程就只能以普通用户的身份运行。 145 | 此条目需满足以下要求: 146 |  在程序启动时需要特权需求,启动完成后不需要特权需求的程序,需放弃特权。 147 | 实施指导: 148 | #include 149 | #include 150 | #include 151 | int main() 152 | { 153 | if( !setuid( getuid() ) ) \\抛弃root权限,进入普通用户权限 154 | { 155 | printf("setuid successfully!\n"); 156 | }else{ 157 | printf("setuid error!"); 158 | perror("setuid"); 159 | } 160 | return 0; 161 | } 162 | 163 | 1.1.5 使用sudo机制代替以root帐号登录运行特权程序的方式。 164 | 说明: 165 | sudo可以使普通用户以特定的用户权限执行某些命令。大部分系统管理命令都需要使用root权限执行,对于系统管理员来说,适当的对其它用户授权可以减轻系统管理员负担,但直接授予其它用户root用户密码会带来安全方面的风险,而使用sudo可以解决这一问题。 166 | 此条目需满足以下要求: 167 |  系统中的需要以root帐号执行的自开发程序,可以使用sudo机制避免使用root帐号登录。 168 | 实施指导: 169 | 下面看一个完整的例子: 170 | $ cat /etc/sudoers 171 | 为方便对允许使用sudo命令的用户分类,我们可以用户分组: 172 | User_Alias NETWORK_ MAINTAINERS=www,com 173 | #定义NETWORK _COMMANDS可以运行网络接口配置命令 174 | Cmnd_Alias NETWORK _COMMANDS = /bin/ifconfig,/bin/ping 175 | # NETWORK_ MAINTAINERS用户组可以用 root身份运行NETWORK _COMMANDS中包含的命令 176 | NETWORK_ MAINTAINERS localhost = (root) NETWORK _COMMANDS 177 | 178 | 1.1.6 应对允许使用su到root帐号的用户进行明确授权,非授权用户不能切换到root 179 | 说明: 180 | su命令可以使一个一般用户拥有超级用户或其他用户的权限,它经常被用于从普通用户账号切换到系统root账号。su命令为用户变更身份提供了便捷的途径,但如果不加约束的使用su命令,会给系统带来潜在的风险。通过对用户su访问root账户的权力进行限制,仅对部分账号进行su使用授权,可以提高系统账号使用的安全性。 181 | 此条目需满足以下要求: 182 |  需建立su访问组,非组内帐号未无法使用su命令切换到root账号(包括在已知root口令的情况下) 183 | 实施指导: 184 |  使用pam_limits模块限制su root的访问组 185 | 例:通过组成员限制能够su为root的用户 186 | 1) 编辑pam的su配置文件 187 | vi /etc/pam.d/su 188 | 2) 查找auth required pam_wheel.so配置行(若不存在需添加),做如下设置: 189 | auth required pam_wheel.so group=wheel 190 | 3) 保存文件后,根据需要将su授权的账号加入wheel组即可。 191 | usermod -a -G wheel testuser 192 | 这样,只有wheel组的用户可以su到root(执行su的用户仍需要知道root口令,但未被授权的用户即使知道root口令也无法通过su切换为root用户。 193 | 194 | 195 | POSIX 能力(pcap)是一种分散root用户权利的方式,使用POSIX可以对具有特权需求的程序进行授权访问。在需要的时,通过POSIX可以把一项或几项特权赋予需要的程序。因此,POSIX以授予最小的完成工作所需的权限的方式提供一个更安全的选择,坚持了最小权限的安全原则。 196 | 197 | 1.1.7 使用POSIX Capabilities功能避免直接使用root权限 198 | 说明: 199 | 某个程序运行权限为root,但是可能并不需要 root 权限的全部能力,以ping命令为例,ping命令可能只需要cap_net_raw能力来发送ICMP ping报文,对于root其它能力并不是必需的。因此,只需要将cap_net_raw能力分配ping命令,这样普通用户就可以使用ping命令了。使用setcap分配运行命令所需要的能力替换直接使用root。此功能需要内核版本在2.6.13以上,并且xattr(扩展文件属性)功能在内核设置中被打开。 200 | 下表为setcap中提供的能力: 201 | 名称 值 解释 202 | CAP_CHOWN 0 允许改变文件的所有权 203 | CAP_DAC_OVERRIDE 1 忽略对文件的所有DAC访问限制 204 | CAP_DAC_READ_SEARCH 2 忽略所有对读、搜索操作的限制 205 | CAP_FOWNER 3 以最后操作的UID,覆盖文件的先前的UID 206 | CAP_FSETID 4 确保在文件被修改后不修改setuid/setgid位 207 | CAP_KILL 5 允许对不属于自己的进程发送信号 208 | CAP_SETGID 6 允许改变组ID 209 | CAP_SETUID 7 允许改变用户ID 210 | CAP_SETPCAP 8 允许向其它进程转移能力以及删除其它进程的任意能力(只限init进程) 211 | CAP_LINUX_IMMUTABLE 9 允许修改文件的不可修改(IMMUTABLE)和只添加(APPEND-ONLY)属性 212 | CAP_NET_BIND_SERVICE 10 允许绑定到小于1024的端口 213 | CAP_NET_BROADCAST 11 允许网络广播和多播访问 214 | CAP_NET_ADMIN 12 允许执行网络管理任务:接口、防火墙和路由等 215 | CAP_NET_RAW 13 允许使用原始(raw)套接字 216 | CAP_IPC_LOCK 14 允许锁定共享内存片段 217 | CAP_IPC_OWNER 15 忽略IPC所有权检查 218 | CAP_SYS_MODULE 16 插入和删除内核模块 219 | CAP_SYS_RAWIO 17 允许对ioperm/iopl的访问 220 | CAP_SYS_CHROOT 18 允许使用chroot()系统调用 221 | CAP_SYS_PTRACE 19 允许跟踪任何进程 222 | CAP_SYS_PACCT 20 允许配置进程记帐(process accounting) 223 | CAP_SYS_ADMIN 21 允许执行系统管理任务:加载/卸载文件系统、设置磁盘配额、开/关交换设备和文件等 224 | CAP_SYS_BOOT 22 允许重新启动系统 225 | CAP_SYS_NICE 23 允许提升优先级,设置其它进程的优先级 226 | CAP_SYS_RESOURCE 24 忽略资源限制 227 | CAP_SYS_TIME 25 允许改变系统时钟 228 | CAP_SYS_TTY_CONFIG 26 允许配置TTY设备 229 | CAP_MKNOD 27 允许使用mknod()系统调用 230 | CAP_LEASE 28 允许在文件上建立租借锁 231 | CAP_SETFCAP 31 允许在指定的程序上授权能力给其它程序 232 | 233 | 实施指导: 234 | 参考设计样例中的《使用setcap避免直接使用root》方案 235 | 236 | 1.2 文件和目录权限 237 | 1.2.1 系统中禁止有无主文件存在 238 | 说明: 239 | 无主文件(和目录)是指属于没有匹配到任何用户的用户ID的文件。通常管理员删除一个用户但是该用户在文件系统中尚有文件时会发生这种情况。同样的情况也会发生在用户组上。这些文件叫做未分组文件。如果新用户分配到某个已删除用户的用户ID,新用户将能够访问某些原本无意访问的文件。因此,应根据实际情况对其进行合理处理如删除、添加新的用户或用户组等。 240 | 实施指导: 241 | 可使用如下命令检查无主文件和未分组文件 242 | root # find / \( -nouser -o -nogroup \) –print 243 | 244 | 1.2.2 除有明确需求,应删除文件不必要的setuid和setgid位 245 | 说明: 246 | 非法带有setuid和setgid的可执行文件可能对系统造成威胁。因此,建议对除必须要带SUID位的可执行文件进行检查,删除不必要可执行文件的setuid和setgid位。必须要带SUID位的的可执行文件根据系统版本和配置不同会不同。 247 | 此条目需满足以下要求: 248 |  公司自主开发的软件/程序需遵守本条目(操作系统自带程序不做严格限制)。 249 | 实施指导: 250 | 可使用如下命令来显示setuid 和setgid 可执行文件: 251 | root # find / -type f \( -perm -4000 -o -perm -2000 \) –print 252 | 显然,命令结果中会列出很多设置了setuid/setgid 位的文件(例如/usr/bin/passwd 文件):仔细确认文件列表并确认是否有必要设置该权限。 253 | 如果确定某可执行文件没有必要设置setuid位,使用以下命令将其删除: 254 | root # chmod -s FILE 255 | 256 | 1.2.3 应为系统用户设置缺省的umask值 257 | 说明: 258 | umask设置了用户创建文件的默认权限。一般在/etc/profile、$ [HOME]/.bash_profile或$[HOME]/.profile中设置umask值。因此系统必须设置Umask值,普通用户推荐值为022,超级用户推荐值为027。如果用户希望创建的文件或目录的权限不是umask指定的缺省权限,可以修改缺省的umask值,然后再创建文件或目录。 259 | 实施指导: 260 | $umask 261 | 查询默认的umask值 262 | 020 263 | 系统默认为020,更改为所希望的022 264 | $umask 022 265 | $touch testfile 266 | 创建文件 267 | $ls -l testfile 268 | 查看创建后的权限 269 | rxwr-xr-x admin admin 786 Nov 17 10:45 /home/ testfile 270 | 271 | 1.2.4 使用特殊属性位Sticky位对共享目录权限进行控制 272 | 说明: 273 | Sticky位是Linux系统下的一种特殊文件属性位,可用于加强对文件的权限管理,合理的使用Sticky位属性,能够帮助提高文件和目录的安全性。使用Sticky位对共享目录权限进行控制,可以防止共享目录中不属于自己的文件被恶意或无意删除。在Linux系统下,最典型的共享目录为用于临时文件存取的/tmp和/var/tmp目录。 274 | 此条目需满足以下要求: 275 |  对/tmp和/var/tmp目录应设置Sticky位,确保用户(root除外)只能对自己建立的文件或目录进行删除/更名/移动等动作。 276 | 实施指导: 277 | 在Linux系统下,有一些特殊文件属性位用于加强对文件的权限管理,合理的使用这些特殊属性,能够帮助提高文件和目录的安全性。使用Sticky位对共享目录权限进行控制,可以防止共享目录中不属于自己的文件被恶意或无意删除。对不希望被修改的文件设置非可变位(Immutable bit),系统不允许对这个文件进行任何的修改。如果对目录设置这个属性,那么任何的进程只能修改目录中已存在的文件,不能建立和删除文件。对不允许修改历史内容的文件设置只追加位(Append-only bit),系统只允许在这个文件之后追加数据,不允许任何进程覆盖或者截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。 278 |  设置sticky位 279 | chmod +t /tmp 280 | $ ls -ld /tmp 281 | drwxrwxrwt 1 root root 786 Nov 17 10:45 /tmp 282 | 注意:rwt权限中t代表sticky和execute位。如果显示的是T,那么只有sticky位置位了。 283 | 284 | 285 | 1.2.5 利用特殊文件属性Append-only位保护系统命令行历史日志文件,防止内容被篡改 286 | 说明: 287 | 在Linux系统下,有一些特殊文件属性位用于加强对文件的权限管理,合理的使用这些特殊属性,能够帮助提高文件和目录的安全性。对不允许修改历史内容的文件设置只追加位(Append-only bit),系统将只允许在这个文件之后追加数据,不允许任何进程覆盖或者截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。 288 | 此条目需满足以下要求: 289 |  对系统中的用户命令行历史日志文件(典型名称如:.bash_history)设置只追加位(Append-only bit),防止日志被篡改。 290 | 此条目对以下情况不做强制要求: 291 |  对命令行日志文件有定期截断或回滚需求的系统不做追加位(Append-only bit)设置的强制要求。 292 | 实施指导: 293 |  设置非可变位和只追加位 294 | $ sudo chattr +ai test.txt 295 | $ lsattr test.txt 296 | ----ia---------- test.txt 297 |   298 | 2 访问控制 299 | 2.1 自主访问控制 300 | 2.1.1 使用POSIX ACL进行更细粒度的访问控制 301 | 说明: 302 | 虽然Linux系统提供了文件控制机制,但是也具有一些局限性。例如,一个目录只允许一个组访问。POSIX ACL提供了一种更加细粒度的访问控制机制,通过运用这种机制,文件系统对象可以为具体用户和组分配访问权限。每一个文件系统对象都有一条对应的访问ACL,用于控制对该对象的访问。此外,目录还可以包括一条缺省的ACL,该缺省ACL决定了本目录中创建的对象的首次访问ACL。此功能需要内核版本2.6以上,并且内核开启POSIX ACL、xattr功能 。此建议适用于提供对文件或目录的细粒度访问控制的情形,比如:同一个用户组中的两个用户,对特定的文件或目录,需要设定一个用户拥有写的权限,而另一个用户只拥有只读权限。 303 | 此条目需满足以下要求: 304 |  对于特定的目录或文件仅允许特定的几个用户组或用户设置使用权限的情形,建议使用ACL进行细粒度的访问控制。 305 | POSIX ACL条目名称 解释 用法 306 | ACL_USER_OBJ 所有者的访问权限 user:: 307 | ACL_USER access rights of some specific user, other than the owner 308 | 除所有者外,一些特定用户的访问权限 user:USERNAME: 309 | ACL_GROUP_OBJ access rights of the group that owns the file 310 | 文件所属组的访问权限 group:: 311 | ACL_GROUP access rights of some group that doesn’t own the file 312 | 非文件所属组的访问权限 group:GROUPNAME: 313 | ACL_OTHER access rights of anyone not otherwise covered 314 | 所有没有覆盖用户的访问根限 other:: 315 | ACL_MASK maximum possible access rights for everyone, except for the owner and OTHER 316 | 定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限。 mask:GROUPNAME: 317 | 318 | 实施指导: 319 | 下面用几个例子来解释这些概念: 320 | 通过设置umask为027,设置新创建的文件组没有写权限和其他用户的没有任何权限 321 | $ umask 027 322 | $ mkdir directory 323 | $ ls -ld directory/ 324 | drwxr-x--- 1 bob users 0 dec 1 15:10 directory/ 325 | 使用getfacl命令查看文件权限 326 | $ getfacl directory 327 | # file: directory 328 | # owner: bob 329 | # group: users 330 | user::rwx 331 | group::r-x 332 | other::--- 333 | 使用setfacl 添加用户alice的rwx权限 334 | $ setfacl --modify user:alice:rwx directory 335 | $ getfacl --omit-header directory 336 | user::rwx 337 | user:alice:rwx 338 | group::r-x 339 | mask::rwx 340 | other::--- 341 | $ ls -ld directory 342 | drwxrwx---+ 1 bob users 0 joulu 1 15:10 directory 343 | 344 | 2.2 强制访问控制 345 | 强制访问控制(MAC)是一个安全系统,在这个安全系统中,主体的访问或者对某个对象的操作根据策略规则严格被操作系统进行了限制。主体通常是进程,而对象可以是文件、目录、共享内存、端口、设备等。主体和对象都分配了安全属性。当一个主体访问一个对象时,内核会对这些属性进行检查,并根据认证规则(策略)决定是否允许访问。 346 | MAC系统的策略由安全策略管理员控制。与自主访问控制不同,普通用户不能对其进行设置,不能对所拥有对象的访问规则进行自行设置。MAC系统为整个系统提供了一个全局加强的安全策略。 347 | 348 | 2.2.1 Linux系统上应安装强制访问控制系统作为应急的安全访问控制手段 349 | 说明: 350 | Linux系统上应该安装强制控制系统,当应用系统所依赖的组件存在漏洞时,MAC作为应急的安全访问控制手段被打开,以便应用系统的服务在特定情况下可以不被中断,同时保证系统安全。当前强制访问控制系统使用比较广泛的是AppArmor和SELinux两种,Apparmor比SELinux使用更简单,配置较容易,但安全性和灵活度上没有SELinux高,然而SELinux配置较复杂。SELinux与Apparmor最大的区别在于Apparmor使用文件名(路径名)作为安全标签,而SELinux使用文件的inode作为安全标签。下表是Apparmor与SELinux更详细的对比。 351 | Apparmor SELinux 352 | 安全类型  路径名基于系统不需要标记或重新标记文件系统 353 |  当增量开发配置文件,不用修改其它配置文件,只要引用配置文件路径名。 354 |  路径名很容易理解和审核  为所有文件、进程打标签 355 |  标签标识沟通的渠道,因此增加新的配置文件可能需要修改现有的配置文件划分沟通渠道,增加策略制定难度 356 |  并非所有应用程序保留的标签 357 | 影响  可自动化 358 |  易整合  难维护 359 | 易用性  策略语言易使用、易修改、易审计 360 |  集成GUI/Console工具集 361 |  可用性是首要目标  复杂的策略语言 362 |  难管理的规则 363 |  缺少集成工具 364 | 鉴于上述对比,如果对系统安全性要求不严格的情况,推荐优先选用Apparmor。 365 | 366 | 此条目需满足以下要求: 367 |  系统中需安装Apparmor或SELinux一种强制访问控制系统,可以不启用。 368 | 此条目对以下情况不做强制要求: 369 |  对系统不内统版本较低不支持安装或安装后对系统应用有影响的可以不强制安装。 370 | 实施指导: 371 | 参考设计样例中的《SELinux应用指南》、《SELinux进程隔离方案指导书》 372 |   373 | 3 记录和审计 374 | 3.1 监测、记录和审计 375 | 3.1.1 启用inotify监控机制,以文件系统事件进行安全监控 376 | 说明: 377 | Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,可用于对文件系统进行安全监控,提高系统安全性。 378 |  Inotify 不需要对被监视的目标打开文件描述符,而且如果被监视目标在可移动介质上,那么在 umount 该介质上的文件系统后,被监视目标对应的 watch 将被自动删除,并且会产生一个 umount 事件。 379 |  Inotify 既可以监视文件,也可以监视目录。 380 |  Inotify 使用系统调用而非 SIGIO 来通知文件系统事件。 381 |  Inotify 使用文件描述符作为接口,因而可以使用通常的文件 I/O 操作select 和 poll 来监视文件系统的变化。 382 | 此条目需满足以下要求: 383 |  开启inotify功能,对文件系统事件进行监控。/bin /etc 384 | 此条目对以下情况不做强制要求: 385 |  对系统性能有严格要求,启用相关功能影响产品交付的,不做强制要求。 386 | 实施指导: 387 |  确定内核是否支持inotify 388 | 查看/proc/sys/fs/inotify/目录是否存在,从kernel 2.6.13开始,Inotify正式并入内核。 389 | # ls /proc/sys/fs/inotify/ 390 | max_queued_events max_user_instances max_user_watches 391 | 392 | 其中inotify目录下的三个文件对应inotify 的默认内核参数 393 | /proc/sys/fs/inotify/max_queued_events 默认值: 16384 该文件中的值为调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。 394 | /proc/sys/fs/inotify/max_user_instances 默认值: 128 指定了每一个real user ID可创建的inotify instatnces的数量上限。 395 | /proc/sys/fs/inotify/max_user_watches 默认值: 8192 指定了每个inotify instance相关联的watches的上限。 396 | 注意: max_queued_events 是 Inotify 管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。 397 | 如果在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用. 398 | 399 |  安装inotify工具 400 | 在Linux下使用inotify需要安装inotify-tools工具包,其中有两个主要的工具程序inotifywait和inotifywatch。其中,inotifywait执行阻塞,等待 inotify 事件,可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。Inotifywatch程序用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。 401 | 402 |  使用 inotify工具 403 | 示例脚本: 404 | #!/bin/bash 405 | inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' --event modify,delete,create,attrib /home/admin | while read date time file event 406 | do 407 | case $event in 408 | MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR) 409 | echo $event'-'$file 410 | ;; 411 | MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR) 412 | echo $event'-'$file 413 | ;; 414 | esac 415 | done 416 | 417 | 在示例脚本中,仅对部分文件系统事件进行了监控,以下为inotify可以监控的文件系统事件: 418 | IN_ACCESS : 即文件被访问 419 | IN_MODIFY : 文件被 write 420 | IN_ATTRIB : 文件属性被修改,如 chmod、chown、touch 等 421 | IN_CLOSE_WRITE : 可写文件被 close 422 | IN_CLOSE_NOWRITE : 不可写文件被 close 423 | IN_OPEN : 文件被open 424 | IN_MOVED_FROM : 文件被移走,如 mv 425 | IN_MOVED_TO : 文件被移来,如 mv、cp 426 | IN_CREATE : 创建新文件 427 | IN_DELETE : 文件被删除,如 rm 428 | IN_DELETE_SELF : 自删除,即一个可执行文件在执行时删除自己 429 | IN_MOVE_SELF : 自移动,即一个可执行文件在执行时移动自己 430 | IN_UNMOUNT : 宿主文件系统被 umount 431 | IN_CLOSE : 文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) 432 | IN_MOVE : 文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO) 433 | 434 | 3.1.2 使用Auditd组件对系统中的重要目录或文件进行审计 435 | 说明: 436 | Auditd程序是Linux审计框架的用户空间组件, Auditd组件提供了auditctl、ausearch、aureport三个程序完成审计和查看日志功能。配置审计规则是通过auditctl程序完成的,该程序启动时从/etc/audit/audit.rules读取这些规则。后台程序本身可以通过设置/etc/audit/auditd.conf 文件来进行定制。其他两个组件分别是audispd和 autrace。Audispd用于给其他应用发送事件通知,而autrace则通过与strace类似的方式对系统调用进行追踪。系统中一些文件是非常重要的,是不可以轻意修改的,对于这类文件使用Auditd程序对其进行审计是非常有必要的。 437 | 此条目需满足以下要求: 438 |  /etc/passwd、 /etc/shadow系统文件应进行审计。 439 |  密钥文件应进行审计。 440 | 实施指导 : 441 | 如何审计对特定文件的访问: 442 | root # auditctl -D 443 | No rules 444 | root # auditctl -w /etc/shadow -k fk_shadow2 445 | root # su bob 446 | $ exit 447 | exit 448 | root # ausearch -k fk_shadow2 449 | --- 450 | time->Tue Dec 9 13:13:03 2014 451 | type=CONFIG_CHANGE msg=audit(1418123583.368:1756): auid=1000 ses=1 op="add rule" key="fk_shadow2" list=4 res=1 452 | --- 453 | time->Tue Dec 9 13:13:13 2014 454 | type=PATH msg=audit(1418123593.100:1758): item=0 name="/etc/shadow" inode=382852 dev=08:02 mode=0100640 ouid=0 ogid=15 rdev=00:00 455 | type=CWD msg=audit(1418123593.100:1758): cwd="/home/bob/Desktop" 456 | type=SYSCALL msg=audit(1418123593.100:1758): arch=c000003e syscall=2 success=yes exit=3 a0=7f526ad5d076 a1=80000 a2=1b6 a3=7f526ad5cfe9 items=1 ppid=4561 pid=4730 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=1 comm="su" exe="/bin/su" key="fk_shadow2" 457 | 以上实现的基础就是使用auditctl -D命令来检测所有的审计规则,然后使用auditctl –w添加一条规则。需要监控的文件是/etc/shadow,而且为了方便搜索,审计日志应为该事件添加一个fk_shadow2标签。然后root用户使用su bob命令切换到用户bob并使用exit迅速退出bob的shell。为获取密码信息,执行Su命令使系统访问/etc/shadow 文件。然后我们便可以使用ausearch命令来搜索带fk_shadow2.标签的事件。列表显示了两条表项,其中一条用于设置规则,另一条用于/bin/su 命令。 458 | 459 | 460 | 461 | 462 | 463 | 4 认证 464 | 4.1 口令和账号 465 | 4.1.1 使用shadow套件对系统账号口令进行分离保护 466 | 说明: 467 | Shadow 套件是密码和用户账号管理的程序和库模块的集合。目前主流的Linux用户认证依赖两个文件:/etc/passwd 和 /etc/shadow文件。而在一些旧的LINUX系统或某些被过度裁剪的发行版本中,在/etc/passwd 中同时保存了系统中所有的用户,帐号和密码哈希值。但是,密码哈希值被普通用户读取是不安全的,需将密码哈希值与帐号信息保存在不同的文件里,使用shadow套件可以达到此目标,shadow套件可以将用户帐号与密码哈希值进行有效隔离。shadow文件中除了保存有密码哈希值,还保存了密码有效期以及何时可以修改密码等信息。为保护系统安全,需要确保shadow文件只允许root账号有读写权限。 468 | 实施指导: 469 | 1) 备份系统原始命令 470 | Shadow Suite会替换系统内部分命令,在安装前需对这部分命令进行备份: 471 | /bin/su 472 | /bin/login 473 | /usr/bin/passwd 474 | /usr/bin/newgrp 475 | /usr/bin/chfn 476 | /usr/bin/chsh 477 | /usr/bin/id 478 | 2) 下载安装Shadow Suite 479 | # tar -xzvf shadow-current.tar.gz 480 | # cd /usr/src/shadow-YYMMDD 481 | # cp Makefile.linux Makefile 482 | # cp config.h.linux config.h 483 | # make all 484 | # make install 485 | 3) 使用pwconv分离出passwd和shadow文件 486 | # cd /etc 487 | # /usr/sbin/pwconv 488 | 4) Pwconv输出的分离文件名称为npasswd和nshadow,需重命名复制到/etc目录中使用,在复制前应对原passwd文件进行备份。 489 | # cd /etc 490 | # cp passwd ~passwd 491 | # chmod 600 ~passwd 492 | # mv npasswd passwd 493 | # mv nshadow shadow 494 | 5) 确保passwd和shadow文件的权限正确,如: 495 | chown root.root passwd 496 | chown root.shadow shadow 497 | chmod 0644 passwd 498 | chmod 0640 shadow 499 | 6) 现在登录系统账号即已开始使用新的shadow passwd机制 500 | 501 | 4.1.2 Linux系统必须使用shadow套件对当前暂时不使用的账号进行锁定或登录限制 502 | 说明: 503 | 对于Linux系统中当前暂时不使用的账号,如系统中某些默认账号、用户账号,应进行锁定或登录限制。 504 | 此规则要求做到以下几点: 505 |  对于现在未使用的账号,进行账号锁定 506 |  对无登录需求的账号,设置为不可登录 507 | 实施指导: 508 | 可通过以下方法对帐号进行锁定 509 | 1.将shadow文件中修改某个帐号的第二个字段,限制该帐号登陆,该方法无法限制root用户使用su的方式切换到该帐号。修改方式有以下两种: 510 | 1)将shadow文件中修改某个帐号的第二个字段改为*,限制该帐号登陆,该方法的缺点是要想让锁定的帐号重新拥有登陆权限需要重置密码。 511 | 以下是shadow文件的部分示例: 512 | /etc/shadow: 513 | postfix:*:16400:0:99999:7::: 514 | 2)在shadow文件中修改某个帐号的第二个字段开头加入’!’,可以使用usermod –L USERNAME进行修改或直接修改。 515 | 以下是shadow文件的部分示例: 516 | /etc/shadow: 517 | test:!$2y$10$ROmaUOTtnnlUFx/0e0oaPOE27vJv7m0Iv6Z2h9govhF.FDFtSVy8W:16737:0:99999:7::: 518 | 2.也可以通过修改passwd文件把用户的登录shell设置为/sbin/nologin或/bin/false来限制用户登陆。该方法的好处在于修改后root用户也无法用su方式切换到该帐号。修改方式有以下两种: 519 | 1)可使用命令来修改passwd文件限制用户的登录: 520 | usermod -s /sbin/nologin USERNAME 521 | 2)直接修改passwd文件将最后一个字段改为/sbin/nologin或/bin/false 522 | 以下是passwd文件的部分示例: 523 | /etc/passwd: 524 | postfix:x:51:51:Postfix daemon:/var/spool/postfix:/bin/false 525 | root:x:0:0:root:/root:/bin/bash 526 | suse-ncc:x:104:106:Novell Customer..:/var/lib/YaST2/suse-ncc-fakehome:/sbin/nologin 527 | uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/false 528 | 529 | 530 | 531 | 4.1.3 使用shadow套件对系统口令的时效进行限制 532 | 说明: 533 | 长期使用同一个口令将会增加口令被破解的可能(如暴力破解),因此,口令必须要求在一段时期内有效。 534 | 此条目需满足以下要求: 535 |  需限制密码的最大有效天数,推荐值为90天,如果系统存在长期无需登录的情况不做强制要求。 536 |  需限制密码的最小有效天数,该值可设为0。 537 |  需设置密码即将到期天数提醒,推荐值为30天。 538 |  需设置密码最小长度,该值不能小于6,如系统中使用pam_cracklib模块,该参数将不再有效。 539 | 实施指导: 540 | Shadow套件对口令的时效的配置文件是 /etc/login.defs,可通过以下配置项对密码时间限制进行设置: 541 | root# cat /etc/login.defs 542 | PASS_MAX_DAYS 90 543 | PASS_MIN_DAYS 0 544 | PASS_WARN_AGE 30 545 | PASS_MIN_LEN 6 546 | 4.2 可插拔认证模块(PAM) 547 | PAM (Pluggable Authentication Modules )是一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。 548 | 4.2.1 使用PAM模块增强认证管理 549 | 说明: 550 | PAM认证是Linux服务器系统主流的安全认证模式,PAM模块提供了许多在原有Linux系统之上加强的手段,如:对口令复杂度检查、登录尝试次数限制、禁用历史密码等功能。 551 | 此条目需满足以下要求: 552 |  密码最小可接受长度不能小于6。 553 |  密码字符要求至少包含数字和字母。 554 |  修改密码至少不能和当前密码相同。 555 | 实施指导: 556 |  使用pam_tally2模块对登录尝试次数进行限制 557 | pam_tally2:该模块记录登录失败事件并在一定次数登录失败之后就不再允许登录。账号也因此被锁定一段时间,知道系统管理员解锁该账号。deny=N 选项将最大登录次数设置为N。选项unlock_time=N 设置达到最大登录次数之后账号被锁定的时长(秒)。比如我们希望认证4次失败后锁定2分钟,可在/etc/pam.d/login文件中做以下配置: 558 | auth required pam_tally2.so deny=4 unlock_time=120 559 |  使用pam_cracklib模块对口令复杂度进行检查 560 | pam_cracklib:该模块给password栈提供了质量检查。提示用户输入新密码之后又进行了多种测试,最重要的是检验了新密码是否是字典的一部分。同样也提供了多个配置项,可用于将密码要求与配置的策略对齐。比如我们希望密码长度不小于8,至少包含一个数字,一个字母,可在/etc/pam.d/passwd文件中做以下配置: 561 | password required pam_cracklib.so dcredit=-1 ucredit=-1 minlen=8 562 |  使用pam_pwhistory模块禁用历史密码 563 | pam_pwhistory:该模块使password栈能执行历史密码禁用功能。意味着用户不能再次使用指定个数旧密码。remember=N 选项设置记住的旧密码个数为N。比如我们希望设置的密码不是相当使用的密码,可在/etc/pam.d/passwd文件中做以下配置: 564 | password required pam_pwhistory.so remember=1 565 | 566 |   567 | 5 文件系统保护 568 | 5.1 日志文件保护 569 | 5.1.1 应将操作系统日志发送至外部服务器单独存储,确保日志不被篡改 570 | 说明: 571 | 为确保操作系统日志文件不被系统用户恶意修改,可将日志发送到外部服务器单独存储,确保日志文件不被篡改。 572 | 此条目需满足以下要求: 573 |  需将系统日志(/var/log/message)发送到外部服务器单独存储。 574 | 此条目对以下情况不做强制要求: 575 |  对于用户不允许将日志转存的情况,不做强制要求。 576 | 实施指导: 577 | 因为不同的Linux版本对日志转发的方法各不相同,我们以suse为例,suse下使用syslog-ng日志服务,现在我们要将日志发送到日志服务器192.168.2.152上去。 配置方法如下: 578 | 修改 /etc/syslog-ng/syslog-ng.conf文件增加以下内容: 579 | destination d_loghost { udp("192.168.2.152" port (514)); }; 580 | log {source(src); filter(f_messages); destination(d_loghost);}; 581 | 本例仅将messages日志同步到日志服务器 582 | 583 | 5.2 文件系统加密 584 | 5.2.1 对含有重要信息的文件目录或分区进行加密处理 585 | 说明: 586 | 一个很典型的案例就是防止离线攻击时对敏感数据的非法访问。这就意味着攻击者可以获取系统的物理访问权限并通过启动自己的操作系统或移除某个物理媒介并在其他系统上安装该物理媒介的方式来分析该文件系统。预防这种攻击类型的唯一保护方式就是加密文件系统。加密方法有两种:一种是使用cryptsetup创建加密分区,别一种是使用ecryptFS 对文件目录进行加密。ecryptFS加密相对cryptsetup加密既有优点也有不足。cryptsetup加密工作在块(block)级别,要求另外的文件系统加载到自己的分区上,ecryptFS加密能在已存在的分区中工作,不需要划开特定块区域(block area)供其使用。同时也可以选择性的加密单个文件或文件夹。 587 | 588 | 5.3 分区和挂载 589 | 5.3.1 对于系统中的重要目录必须根据存储目的不同进行分区隔离 590 | 说明: 591 | 隔离的原因有多个:第一个原因就是控制资源,确切的说是控制存储空间。比如说,有时候/tmp被进程填满了大量多余的超大文件。 如果该目录与其余的文件系统位于同一个分区,那么该分区的可用存储空间将急剧减少。如果目录是全局可写的,也就是说允许所有人写入,攻击者使用单个进程就可以占用整个分区。第二个原因是不同的分区可以有不同的选项和不同的权限,从而遵循最小权限原则。 592 | 此条目需满足以下要求: 593 |  /tmp 是一个全局可写的目录,有时候进程会过度使用该目录,应该放到一个独立的分区。 594 |  /var 可能包含全局可写的文件或目录,应该放到一个独立的分区。 595 |  /var/log 用于记录日志。有时候日志过于详尽,很快就耗尽了可用空间,应该放到一个独立的分区。 596 |  /home 存储用户数据,应该放到一个独立的分区。 597 | 598 | 5.3.2 使用fstab对外接、日志存储分区进行访问控制。 599 | 说明: 600 | 对于外接、日志、临时存储分区中不应有可执行文件、特殊设备等文件出现,为了防止上述文件或设备给系统带来风险,可使用fstab在挂载时进行限制。 601 | 此条目需满足以下要求: 602 |  需对外接、日志、临时存储分区设置nodev,nosuid,noexec选项。 603 | 实施指导: 604 | root# cat /etc/fstab 605 | # 606 | /dev/sda1 / ext4 acl,user_xattr 0 1 607 | /dev/sda2 /tmp ext4 nodev,nosuid,noexec 0 0 608 |  nosuid:表示分区的二进制文件未使用setuid权限运行。这对安全来说很重要,应配置在不要求suid的所有分区。 609 |  noexec:表示该分区不能包含可执行的二进制文件。 610 |  nodev:表示该分区不能包含特殊设备。除root以外的所有分区都可配置该选项。注意chroot jails 通常需要分区包含特殊设备。在这种情况下,jail所在的分区不能配置nodev选项*。 611 | 5.3.3 禁用自动工具对移动存储设备进行挂载 612 | 说明: 613 | 移动存储设备对于系统来说一直都是潜在的风险。通常,恶意软件就是通过移动存储设备在系统之间传播的。因此,尽可能避免使用移动存储设备。如果必须要使用移动存储设备,应手动安装。 614 | 示例: 615 | 如:Autofs 自动安装工具,可自动安装移动存储介质,因此应禁用该工具。可使用以下命令检查Autofs 的状态: 616 | chkconfig --list autofs 617 | 如果Autofs 处于禁用状态,命令输出信息应如下所示: 618 | Autofs 0:off 1:off 2:off 3:off 4:off 5:off 6:off 619 | 在必要情况下,可执行如下命令禁用Autofs : 620 | chkconfig autofs off 621 | 需要安装移动存储设备时,应使用nodev, noexec 和nosuid 选项。 622 | 举例说明如何将/dev/sdb1 设备安装到/media/usb_stick路径: 623 | mount -o ro, nosuid,nodev,noexec /dev/cdrom /mnt/cdrom 624 | 625 |   626 | 6 网络防护 627 | 6.1 网络防护能力 628 | 6.1.1 使用sysctl工具增强系统网络防护能力 629 | 说明: 630 | Linux系统自身提供了许多安全机制用于应对一些常见的网络攻击,我们可以通过使用sysctl 工具对这些安全机制进行配置,增强系统网络防护能力。 631 | 此条目需满足以下要求: 632 |  需对ICMP攻击进行防护。 633 |  需对DOS攻击进行防护。 634 | 实施指导: 635 | 在/etc/sysctl.conf文件中进行以下配置: 636 | net.ipv4.conf.all.send_redirects、net.ipv4.conf.default.send_redirects:ICMP重定向消息可将路由信息发送到网络中的其他主机。只有当设备是一台路由器的时候才需要开启。其他情况下,应将该参数设置为0. 637 | net.ipv4.conf.all.accept_redirects、net.ipv4.conf.default.accept_redirects:ICMP重定向消息可能会被用来恶意修改系统的路由表,可能会导致报文发送到错误的目的地。将这些参数设置为0可以防止系统接收ICMP重定向消息。 638 | net.ipv4.conf.all.secure_redirects:安全ICMP重定向消息是从缺省网关列表中的地址发出的重定向消息,但是网关可能被攻击。因此,推荐将该参数设置为0。 639 | net.ipv4.icmp_echo_ignore_broadcasts:该参数决定设备是否要回应ICMP echo消息和时间戳请求,对这些消息和请求来说,目的地址就是广播地址。无论是哪台设备发送的报文,报文都会发送到网络上的每一台设备上去。如果源地址是伪造的,就可能会导致网络上所有的设备发送恶意的echo报文给受害者(被伪造地址的设备)。推荐将该参数值设置为1。 640 | icmp_ignore_bogus_error_responses:如果将该参数设置为1,那么内核将不会对再次构造的仿冒应答记录日志。可以通过这种方式来防止系统被不相关的消息占用。推荐将该参数值设置为1。 641 | net.ipv4.conf.all.rp_filter、net.ipv4.conf.default.rp_filter:如果回应报文不是从请求报文出去接口进来的,该报文就是无效的并被丢弃。这样可以防止由攻击者发送无状态回应的伪造报文而产生DoS攻击。推荐将参数值设置为1。 642 | net.ipv4.tcp_syncookies:SYN cookie用于防止由于攻击者快速建立大量半连接而产生的DoS攻击。开启参数之后内核在回应报文中包含一个特殊构造的TCP序列号用来识别合法报文。推荐将该参数设置为1 643 | 644 | 6.1.2 使用iptables对系统中不使用的端口进行限制 645 | 说明: 646 | linux系统共提供65535个端口用于提供网络服务,但在实际应用中我们的系统对外开放服务的端口是有限制的,其余端口应使用安全机制对其管理和限制,防止攻击者利用这些未使用的端口。 647 | 此条目需满足以下要求: 648 |  对于不使用的端口,应限制tcp和udp协议端口。 649 | 实施指导: 650 | 对系统中没有对外开放服务的端口,应做以下限制 651 | root # iptables -A INPUT -p tcp --dport XXX -j DROP 652 | root # iptables -A INPUT -p udp --dport XXX -j DROP 653 | 654 | 6.2 限制网络服务 655 | 6.2.1 远程访问需使用SSH取代telnet 656 | 说明: 657 | 通过Telnet传输的数据都是明文,因此这种登录方式存在很大的安全隐患。如果网络遭到了“中间人”攻击就可以获取所有信息。SSH服务主要用于远程使用某个系统 ,设计的目的是用SSH来取代Telnet,通过使用SSH,可以把所有传输的数据进行加密,这样类似上面的“中间人”攻击方式就不可能实现了,而且它也能够防止DNS和IP欺骗。 658 | 659 | 6.2.2 系统中不应安装不安全的传统网络服务 660 | 说明: 661 | 许多曾经流行的服务,因为其安全问题渐渐被更好更安全的服务取代,如果系统中带有不安全的传统网络服务将会为带来未知的安全隐患。 662 | 此条目需满足以下要求: 663 |  禁止使用RSH远程访问服务。 664 |  禁止使用Talk通信服务 665 |  禁止使用TFTP文件传输服务 666 | 实施指导: 667 | RSH服务的状态可以通过以下命令来查看: 668 | root # chkconfig --list rsh 669 | 可执行以下命令来禁用RSH服务并卸载RSH客户端: 670 | root # chkconfig rsh off 671 | root # zypper remove rsh 672 | 执行以下命令来查看talk的状态: 673 | root # chkconfig --list talk 674 | 如果不需要,可使用以下命令禁用该服务并卸载talk客户端: 675 | root # chkconfig talk off 676 | root # zypper remove talk 677 | 可使用以下命令来查看tftp 和 atftp的状态: 678 | root # chkconfig --list tftp 679 | root # chkconfig --list atftpd 680 | 如果不需要,使用以下命令禁用tftp 和 atftp: 681 | root # chkconfig tftp off 682 | root # chkconfig atftpd off 683 | 684 | 685 | 686 | 687 | 688 | 689 | 7 漏洞攻击防护 690 | 7.1 地址随机化 691 | 7.1.1 使用Linux自带的ASLR功能(地址空间布局随机化)增强漏洞攻击防护能力 692 | 说明: 693 | ASLR通过每次将栈的起始位置、函数库和程序本身移至略微不同的位置,使得缓冲溢出攻击无法猜测正确的位置,导致攻击无法成功实施。在Linux内核2.6.12版之后ASLR是默认启用。 694 | 此条目需满足以下要求: 695 |  开启内核ASLR功能 696 | 此条目对以下情况不做强制要求: 697 |  如果有开启ASLR后出现软件不兼容或性能下降的情况,可以关闭相关项。 698 | 实施指导: 699 | ASLR开启/关闭方法: 700 | 在/proc/sys/kernel/randomize_va_space文件中写入1或2表示开启,建议写入2。 701 | 在/proc/sys/kernel/randomize_va_space文件中写入0表示关闭。 702 | 下表为每个值代表的含义: 703 | 值 含义 704 | 0 不存在随机化,表示一切都将位于静态地址中。 705 | 1 只有共享函数库、栈、mmap’ed 内存、VDSO以及堆是随机的。 706 | 2 完全随机化(默认)。使用brk()进行的旧式内存配置也将是随机的。 707 | 708 | 709 | 7.2 数据执行防护 710 | 7.2.1 系统必须使用DEP防护手段提升漏洞攻击防护能力 711 | 说明: 712 | Linux内核版本2.6.8以后支持数据执行保护(DEP)。DEP是除ASLR之外防止利用缓冲溢出执行恶意代码的另一种方法。因为ASLR是增加了查找要执行的库函数的难度,DEP是将栈和数据段中可能会被攻击者修改的权限进行了移除。在编译应用程序时需增加-z noexecstack gcc编译选项实现DEP功能。 713 | 此条目需满足以下要求: 714 |  自开发的软件系统需使用DEP防护手段。 715 | 此条目对以下情况不做强制要求: 716 |  对于系统开发中使用的开源软件本条目不做强制要求。 717 | 实施指导: 718 | Linux DEP防护在内核中是默认开启的,但是软件要在编译时添加-z noexecstack选项来支持DEP功能。 719 | root# gcc -z noexecstack -o exectest exectest.c 720 | 721 | 7.2.2 使用栈保护机制 722 | 说明: 723 | gcc编译器为位于栈的缓冲区执行了一个额外的保护机制。这种方式在函数开头将随机选择的整数值置于栈中。虽然导致了一小部分开销,但这会避免程序出现额外的缓冲溢出。同时也会使缓冲溢出攻击变得更难实施。需要注意的是该特性在gcc4.2或以上版本中支持。 724 | 此条目需满足以下要求: 725 |  需开启-fstack-protector、-stack-protector-all、-stack-protector-strong选项中的一种选项。 726 | 此条目对以下情况不做强制要求: 727 |  对性能要求比较敏感的产品,可根椐情况关闭该功能。 728 | 实施指导: 729 | 在gcc中与该特性相关的若干编译器标识: 730 |  -fno-stack-protector禁用栈保护(不建议使用)。 731 |  -fstack-protector 为栈中所有显示了8个或更长字节的函数增添了保护机制。 732 |  --param=ssp-buffer-size=N可被用于更改 -fstack-protector使用的8字节限制。 733 |  -stack-protector-all会对所有的函数进行堆栈保护,而-fstack-protector只会保护符合条件的函数(函数堆栈中包含字符、数组且符合ssp-buffer-size指定大小的函数才会得到保护)。-fstack-protector-all安全性更高,但是对程序性能影响更大。 734 |  -stack-protector-strong 介于 -fstack-protector 和 -stack-protector-all之间,采用更智能的规则来决定哪些函数该受益于栈保护机制。 735 |  -Wstack-protector编译器告警选项是可选的,作用是当启用-fstack-protector选项而又有函数未能被保护到(比如不符合ssp-buffer-size参数要求)时,会提示编译告警。 736 | 建议使用-fstack-protector选项同时指定ssp-buffer-size参数大小(例如—param ssp-buffer-size=4),并和-Wstack-protector一起使用。 737 | 738 | 7.3 增强性安全防护 739 | 7.3.1 使用Grsecurity增强Linux系统的安全防护能力 740 | 说明: 741 | Grsecurity是用于Linux内核安全增强的项目,针对Linux内核的某些安全漏洞进行修补以及安全性的增强。当攻击者能够对系统的某部分进行攻击并控制目标系统的执行流程时,Grsecurity作为最后一道防线会发挥最大作用。它甚至能够避免零日攻击,因为对攻击者而言其加大了攻击难度。Grsecurity的主要功能为:内存加固、对ASLR的改善、可信路径执行(TPE)、基于角色的访问控制(RBAC)、Chroot增强、暴力利用保护、限制普通用户量可获得的详细系统信息量、加强系统审查等。 742 | 743 | 此条目需满足以下要求: 744 |  开启Grsecurity的暴力利用保护功能 745 |  开启Grsecurity的chroot增强功能 746 |  开启到/dev/kmem,/dev/mem,/dev/port的限制 747 | 此条目对以下情况不做强制要求: 748 |  Grescurity的license是GPL2的,如果产品存在不允许使用GPL2 license的情况可以不使用Grescurity。 749 |  对Grsecurity不提供明确支持的内核版本不做强制要求 750 |  对于/dev/kmem,/dev/mem,/dev/port有明确使用需求的产品不做强制要求 751 | 实施指导: 752 | Grsecurity是针对主线的Linux内核应用的安全补丁文件。安装Grsecurity需要打补丁到内核,所以需要重新编译内核。 753 | 1. 下载Grsecurity 754 | Grsecurity项目的官方主页为grsecurity.net,下载Grsecurity只需要根据所要patch的系统内核版本号到网站的download页面选择下载即可。 755 | 如: wget http://grsecurity.net/stable/grsecurity-3.1-3.14.48-201507111210.patch 756 | 2. 将Grsecurity patch到内核 757 | 将下载的补丁文件使用patch命令刷新到内核源码中即可,如: 758 | # mv grsecurity-3.1-3.14.48-201507111210.patch /usr/src/linux 759 | # cd /usr/src/linux 760 | # patch -p1 < grsecurity-3.1-3.14.48-201507111210.patch 761 | 3. 开启需要的grsecurity内核功能选项 762 | 例如:开启chroot增强功能和暴力利用防护功能选项 763 | # make menuconfig 764 | 然后进入grsecurity功能配置界面, 765 | 选择:security option -> Grsecurity -> Customize Configuration -> Filesystem Protecton -> Chroot jail restrictions 766 | 选择:security option -> Grsecurity -> Customize Configuration -> Memory Protecton ->Deter exploit bruteforcing 767 | 选择:security option -> Grsecurity -> Customize Configuration -> Memory Protecton -> Deny reading/writing to /dev/kmem, /dev/mem, and /dev/port 768 | 4. 编译安装内核,重新启动系统即可。 769 | 770 | 7.3.2 使用PaX提升系统攻击防护能力 771 | 说明: 772 | PaX是Grsecurity的一部分,为linux设计的防止缓冲区溢出的一个内核补丁,可以脱离Grsecurity独立使用。Pax注重在Linux内核的层面增强系统防漏洞攻击的能力,能提供最优秀的与缓冲区溢出相关的攻击防护能力,强于Linux自身提供的DEP和ASLR的攻击防护能力。因此,建议在Linux系统中使用PaX安全补丁。使用时注意PaX版本应与Linux内核版本对应。 773 | 774 | PaX Address space layout randomization 775 |  Randomized ET_EXEC base 776 |  Randomized stack base 777 |  Randomized mmap() base 778 |  randomizes the executable base of programs 779 |  Binary markings to defeat ret2libc attacks and all other attacks relying on known structure of a program's virtual memory. 780 | executable space protection  Enforced non-executable pages 781 |  PAGEEXEC 782 |  SEGMEXEC 783 |  Restricted mprotect() 784 |  Trampoline emulation using (or emulating in operating system software) the functionality of an NX bit (i.e., built-in CPU/MMU support for memory contents execution privilege tagging 785 | 此条目需满足以下要求: 786 |  开启Pax中以下强化地址随机化功能: 787 |  用户空间堆栈栈顶随机化 788 |  Mmap基地址随机化(将包括所有库) 789 |  执行程序基地址随机化 790 | 此条目对以下情况不做强制要求: 791 |  产品license同GPL2存在冲突的情况下,不要求使用PaX。 792 |  对PaX不提供明确支持的内核版本不做强制要求 793 |  对系统性能有严格要求,启用相关功能影响产品交付的,不做强制要求。 794 | 实施指导: 795 |  安装Pax内核安全补丁 796 | 1. 下载安装 797 | PaX可以独立安装,也可以随Grsecurity安装,此处以Grsecurity为例: 798 | # wget http://grsecurity.net/stable/grsecurity-3.1-3.14.48-201507111210.patch 799 | # mv grsecurity-3.1-3.14.48-201507111210.patch /usr/src/linux 800 | # cd /usr/src/linux 801 | # patch -p1 < grsecurity-3.1-3.14.48-201507111210.patch 802 | 2. 开启地址空间随机化 803 | # make menuconfig 804 | 进入grsecurity功能配置界面, 805 | - 选择:security option -> Grsecurity -> Customize Configuration -> PaX -> Address Space 806 | 3. 开启用户空间堆栈栈顶随机化和Mmap基地址随机化 807 | - 选择:security option -> Grsecurity -> Customize Configuration -> PaX -> Address Space Layout Randomizat -> Randomize User stack and mmap() bases 808 | 4. 编译安装内核,重新启动系统即可。 809 | 810 |   811 | 8 完整性保护 812 | 8.1 文件完整性检查 813 | 8.1.1 使用IMA工具对系统文件的完整性进行检查 814 | 说明: 815 | Linux完整性度量架构(IMA)在文件中的代码被执行之前测量文件的完整性。度量通过计算出文件内容的哈希摘要来进行,安装IMA需要内核版本在2.6.30以上,并且内核开启IMA功能。文件完整性检测可以即时发现文件、程序或配置未经授权的更改,其基本原理是存储参考信息,如计算出的文件源数据(文件的源数据包括:所有者用户和组id、安全标签、权限)的哈希值,并确保除了合理的安装过程不对这些文件进行更改,发现恶意软件修改现有的程序。 816 | 此条目需满足以下要求: 817 |  Linux系统中以下目录的文件必须做完整性进行检查:/bin、 /etc、 /sbin、 /var、 /usr/bin、 /usr/sbin、 /lib、/usr/lib、 /sys、 /boot 、/dev。 818 | 实施指导: 819 | 参考设计样例中的《IMA实施指导书》 820 | 821 |   822 | 9 安全隔离和容器 823 | 9.1 安全隔离 824 | 9.1.1 对于开放给第三方的shell环境,应使用隔离技术对其可访问的系统资源进行隔离 825 | 说明: 826 | 当系统中存在开放给第三方使用的shell环境时,要充分的考虑将系统本身的软件和第三方软件隔离,当第三方软件崩溃时,使其无法影响到系统自身软件程序的运行,并保护系统软件不被第三方shell用户调试、跟踪、分析。为了达到此目的,应使用安全隔离技术对此shell环境及其对应的用户账号所能访问的系统资源进行限制,将其行为和结果影响限定到可控范围,保障基础系统的安全性。 827 | 此条目需满足以下要求: 828 |  Shell环境应与系统的文件系统资源隔离,Shell的文件访问范围仅限于其对应账号的HOME路径内。 829 | 实施指导: 830 |  选择chroot技术隔离shell环境 831 | chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。在经过 chroot 之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个: 832 | 1) 增加了系统的安全性,限制了用户的权力; 833 | 在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。 834 | 2) 建立一个与原系统隔离的系统目录结构,方便用户的开发; 835 | 使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。 836 | 3) 切换系统的根目录位置,引导 Linux 系统启动以及急救系统等。 837 | chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。 838 |  建立chroot环境 839 | 1) 在将要chroot到的新的根路径下建立chroot需具备的目录,如: 840 | $NEWROOT/etc 841 | $ NEWROOT/lib 842 | $ NEWROOT/bin 843 | $ NEWROOT/sbin 844 | $ NEWROOT/usr/lib 845 | $ NEWROOT/usr/bin 846 | $ NEWROOT/usr/local 847 | $ NEWROOT/home 848 | 2) 根据需要,将系统真实目录中的内容复制到NEWROOT下新建的目录内,在此过程中需要根据需要最小化的复制,剔除掉不希望开放给chroot目标的程序和配置文件,仅保留必要的文件。 849 | 3) 删除掉存在风险的程序,如su,sudo、和设置了setuid位的程序。 850 |  为指定用户启用chroot login 851 | 1) 构造用于chroot bash的jail bash程序,如下示例: 852 | /* jail_bash.c */ 853 | int main(void) { 854 | system(“/usr/bin/chroot –userspec=jailuser /home/jail /bin/bash”); 855 | return 0; 856 | } 857 | 2) 将jail_bash.c编译为jail_bash程序,并将jail_bash复制到系统/usr/bin/目录。 858 | 3) 设置jail_bash程序的权限和SETUID位 859 | chown root /usr/bin/jail_bash 860 | chgrp root /usr/bin/jail_bash 861 | chmod 755 /usr/bin/jail_bash 862 | chmod +s /usr/bin/jail_bash 863 | 4) 编辑/etc/passwd文件,修改jailuser账号配置行中的shell设置。 864 | 如: 865 | jailuser:x:1001:100::/home/jail:/bin/bash 866 | 替换为 867 | jailuser:x:1001:100::/home/jail:/usr/bin/jail_bash 868 | 上述设置完成后,以jailuser账号登录的shell,将自动被chroot到/home/jail目录。 869 | 870 | 871 | 9.1.2 对于系统中运行的第三方应用,或存在隔离和安全控制需求的自研软件,需使用控制组或容器等技术手段将其于系统关键资源进行隔离。 872 | 说明: 873 | 有些第三方应用可能会因为设计问题存在一些漏洞,这些漏洞可能导致系统资源被全部占用,如果第三方应用不能即时修复漏洞,将会影响系统的正常运行。因此,对第三方应用采用一些隔离手段可以有效降低系统的安全风险。 874 | 容器为安全控制应用程序及其依赖的组件提供了便利。为保障自研或第三方软件的安全,并满足以下的安全性需求:与主机的操作环境进行隔离,同时避免在虚拟机上部署完整操作系统的开销;控制应用和依赖组件对系统关键资源的使用;将软件和它的依赖部署在一起,并易于部署。设计中应当使用容器技术,并部署到应用的生产环境中。 875 | 此条目需满足以下要求: 876 |  需使用控制组、容器等一种技术手段对非开源的第三方应用进行内存、cpu资源的隔离。 877 |  需使用容器技术对存在隔离及安全控制需求的自研或第三方应用程序进行隔离。 878 | 实施指导: 879 | 参考设计样例中的《cgroup进程隔离方案指导书》 880 |   881 | 10 其他 882 | 10.1 额外系统功能限制 883 | 10.1.1 对core dump功能的使用进行限制 884 | 说明: 885 | 缺省情况下应禁用core dump功能,因为core dump功能可能会包含进程内存里的敏感信息。但是有时产品需要开启core dump功能记录当时产生问题的原因,对于需要开启core dump功能的产品需对日志输入的路径进行限制,同时需限制路径只允许特定用户访问。 886 | 此条目需满足以下要求: 887 |  在不使用core dump功能时应将其禁用。 888 |  在需要使用core dump功能时应限制core dump日志路径及且访问权限。 889 | 实施指导: 890 | 例一:禁止ulimits的core dump功能可通过以下方式设置: 891 | 1.执行命令root # sysctl -w ‘fs.suid_dumpable=0’对其永久禁用 892 | 2.在/etc/sysctl.conf中添加fs.suid_dumpable = 0对其永久禁用 893 | 3.在/etc/security/limits.conf中添加 * hard core 0对其永久禁用 894 | 4.使用ulimits –c 0 对当前会话禁用 895 | 896 | 例二:限制core dump日志输出路径 897 | 通过修改/proc/sys/kernel/core_pattern可以控制core dump日志文件保存位置和文件格式。下例为将所有的core dump日志文件生成到/home/admin/corefile目录下,文件名的格式为core-命令名-pid-时间戳 898 | echo "/corefile/core-%e-%p-%t" >/home/admin/corefile 899 | 同时限定目录只允许admin访问 900 | chown admin /home/admin/corefile 901 | chmod 700 /home/admin/corefile 902 | 903 | 10.1.2 关闭SysRq键的使用 904 | 说明: 905 | SysRq使得具有物理访问的用户能够访问计算机中危险的系统级命令。因此,建议对SysRq的功能使用进行限制。 906 | 实施指导: 907 | 可通过/proc/sys/kernel/sysrq文件查看SysRq的状态如果大于1表示开启: 908 | #cat /proc/sys/kernel/sysrq 909 | 在不需要的情况下,可通过下以方法禁用SysRq: 910 | # echo 0 > /proc/sys/kernel/sysrq 911 | 如果需要永久禁用可在sysctl.conf中加入以下内容: 912 | kernel.sysrq = 0 913 | 914 | 10.1.3 应对bootloader开启引导装载密码 915 | 说明: 916 | 应开启bootloader引导装载密码,至少要在设置启动参数前要求密码输入。可通过在配置文件中使用关键字password来实现该功能。 917 | 实施指导: 918 | Grub启动的时候,你可以设定启动密码方法如下: 919 | 打开终端,输入: 920 | grub-md5-crypt 921 | 会提示输入一个密码。这个密码就是启动菜单解锁密码,所以请小心输入并牢记。需要输入两次,以确认输入正确。密码可以包含数字、字符和空格。 922 | 密码输入完成以后,会输出一个密码的加密字符串,现在记录下这个字符串。现在,可以把这个字符串启动选项里面。 923 | 打开/boot/grub/menu.lst文件,在文件的顶端,加入一行: 924 | password --md5 c4b89e08456ce27d017e2efd322fd157 925 | 其中“c4b89e08456ce27d017e2efd322fd157”就是你刚才得到的字符串。 926 | 927 | 10.1.4 使用ulimit工具限制用户可以打开文件个数 928 | 说明: 929 | 在Linux系统中可以打开的文件个数是有限制的,如果全部资源被某个用户全部占用,其他用户将无法正常打开文件。 930 | 此条目需满足以下要求: 931 |  需对用户打开的文件个数做限制。 932 | 实施指导: 933 | 我们限制每个用户最多可以打开65536个文件,只需在/etc/security/limits.conf文件中添加或修改以下配置: 934 | * soft nofile 32768 935 | * hard nofile 65536 936 | 配置的硬限制是实际的限制,而软限制是warnning限制,只会做出warning。 937 |   938 | 11 设计样例 939 | -------------------------------------------------------------------------------- /Linux-Safe-configuration/Linux_File_Permission_List.txt: -------------------------------------------------------------------------------- 1 | 文件或目录 属主 属组 权限 2 | /bin/ root root 0755 3 | /bin/bash root root 0755 4 | /bin/login root root 4555 5 | /bin/mount root root 0550 6 | /bin/netstat root root 0550 7 | /bin/su root root 4755 8 | /boot/ root root 0750 9 | /boot/* root root 0640 10 | /boot/grub/grub.conf root root 0600 11 | /boot/grub/menu.lst root root 0600 12 | /dev/ root root 0755 13 | /dev/console root root 0633 14 | /dev/full root root 0666 15 | /dev/kmem root kmem 0640 16 | /dev/MAKEDEV root root 0700 17 | /dev/mem root kmem 0640 18 | /dev/null root root 0666 19 | /dev/random root root 0666 20 | /dev/tty root tty 0666 21 | /dev/urandom root root 0666 22 | /dev/zero root root 0666 23 | /etc/ root root 0755 24 | /etc/aliases root root 0600 25 | /etc/aliases.db root root 0600 26 | /etc/anacrontab root root 0600 27 | /etc/at.allow root root 0400 28 | /etc/at.deny root root 0600 29 | /etc/bash.bashrc root root 0444 30 | /etc/cron.allow root root 0400 31 | /etc/cron.daily root root 0600 32 | /etc/cron.deny root root 0600 33 | /etc/cron.d/ root root 0700 34 | /etc/cron.hourly root root 0600 35 | /etc/cron.monthly root root 0600 36 | /etc/cron.weekly root root 0600 37 | /etc/crontab root root 0400 38 | /etc/csh.login root root 0444 39 | /etc/csh.cshrc root root 0444 40 | /etc/default/ root root 0750 41 | /etc/exports root root 0600 42 | /etc/fstab root root 0600 43 | /etc/ftpaccess root root 0400 44 | /etc/ftpconversions root root 0400 45 | /etc/ftpgroups root root 0400 46 | /etc/ftphosts root root 0400 47 | /etc/ftpusers root root 0400 48 | /etc/group root root 0644 49 | /etc/group.old root root 0600 50 | /etc/group- root root 0600 51 | /etc/gshadow root shadow 0640 52 | /etc/gshadow- root root 0600 53 | /etc/hosts root root 0644 54 | /etc/hosts.allow root root 0640 55 | /etc/hosts.deny root root 0640 56 | /etc/hosts.equiv root root 0000 57 | /etc/inetd.conf root root 0644 58 | /etc/init.d/ root root 0750 59 | /etc/init.d/* root root 0750 60 | /etc/inittab root root 0644 61 | /etc/issue* root root 0644 62 | /etc/lilo.conf root root 0600 63 | /etc/login.defs root root 0600 64 | /etc/mail/ root root 0755 65 | /etc/mail/* root root 0644 66 | /etc/motd root root 0644 67 | /etc/mtab root root 0644 68 | /etc/passwd root root 0644 69 | /etc/passwd.old root root 0600 70 | /etc/passwd- root root 0600 71 | /etc/printcap root root 0644 72 | /etc/profile root root 0644 73 | /etc/rc.d/ root root 0750 74 | /etc/rc.d/rc?.d/ root root 0750 75 | /etc/rc.d/rc?.d/* root root 0750 76 | /etc/resolv.conf root root 0644 77 | /etc/rpc root root 0644 78 | /etc/securetty root root 0400 79 | /etc/security/opasswd root root 0600 80 | /etc/sendmail.cf root root 0644 81 | /etc/services root root 0644 82 | /etc/shadow root shadow 0400 83 | /etc/shadow.old root root 0600 84 | /etc/shadow- root root 0600 85 | /etc/skel/ root root 0755 86 | /etc/skel/* root root 0644 87 | /etc/ssh/ root root 0755 88 | /etc/ssh/*key root root 0400 89 | /etc/ssh/*key.pub root root 0644 90 | /etc/ssh/sshd_config root root 0600 91 | /etc/ssh/* (other than above) root root 0644 92 | /etc/sudoers root root 0440 93 | /etc/sysctl.conf root root 0600 94 | /etc/syslog.conf root root 0644 95 | /etc/xinetd.conf root root 0640 96 | /etc/xinetd.d/ root root 0750 97 | /etc/xinetd.d/* root root 0640 98 | /home/ root root 0755 99 | /home/XXX/ XXX XXX 0750 100 | /home/XXX/.profile XXX XXX 0644 101 | /home/XXX/.cshrc XXX XXX 0644 102 | /home/XXX/.login XXX XXX 0644 103 | /home/XXX/.emacs XXX XXX 0644 104 | /home/XXX/.exrc XXX XXX 0644 105 | /home/XXX/.mailrc XXX XXX 0644 106 | /lib/ root root 0755 107 | /lib/modules/ root root 0750 108 | /lib/modules/* root root 0750 109 | /opt/ root root 0755 110 | /proc/ root root 0755 111 | /root/ root root 0700 112 | /root/.bash_profile root root 0600 113 | /root/.bashrc root root 0600 114 | /root/.cshrc root root 0600 115 | /root/.tcshrc root root 0600 116 | /root/* root root 0700 117 | /root/.rhosts root root 0000 118 | /sbin/ root root 0755 119 | /sbin/arp root root 0755 120 | /sbin/route root root 0550 121 | /tmp/ root root 1777 122 | /users/ root root 0555 123 | /usr/ root root 0755 124 | /usr/bin/ root root 0755 125 | /usr/bin/at root root 4555 126 | /usr/bin/batch root root 0755 127 | /usr/bin/crontab root root 0755 128 | /usr/bin/finger root root 0550 129 | /usr/bin/passwd root root 4555 130 | /usr/bin/wall root tty 2555 131 | /usr/bin/write root tty 2555 132 | /usr/games/ root root 0755 133 | /usr/lib/ root root 0755 134 | /usr/bin/chroot root root 0550 135 | /usr/sbin/cron root root 0755 136 | /usr/sbin/rpcinfo root root 0550 137 | /usr/src/ root root 0755 138 | /var/ root root 0755 139 | /var/adm/ root root 0750 140 | /var/adm/messages root root 0640 141 | /var/audit/ root root 0644 142 | /var/log/ root root 0750 143 | /var/log/boot.log* root root 0600 144 | /var/log/messages* root root 0600 145 | /var/log/news/* news news 0640 146 | /var/log/pgsql postgres postgres 0600 147 | /var/log/samba/* root root 0600 148 | /var/log/sa/* root root 0600 149 | /var/log/squid/* squid squid 0640 150 | /var/log/* root root 0640 151 | /var/log/secure.log root root 0600 152 | /var/log/wtmp root utmp 0600 153 | /var/run/syslogd.pid root root 0640 154 | /var/run/utmp root utmp 0640 155 | /var/spool/ root root 0755 156 | /var/spool/cron/ root root 0700 157 | /var/spool/cron/* root root 0400 158 | /var/tmp/ root root 1777 159 | -------------------------------------------------------------------------------- /Linux-Safe-configuration/readme.txt: -------------------------------------------------------------------------------- 1 | 2 | Linux安全配置规范-目录 3 | 简介 11 4 | 使用对象 12 5 | 适用范围 12 6 | 规范解释 12 7 | 用词约定 12 8 | 术语解释 12 9 | 1 LINUX基础安全 13 10 | 1.1 系统规划 13 11 | 1.1.1 规则:必须使用正版的操作系统安装程序 13 12 | 1.1.2 规则:合理地对硬盘分区,保护和优化操作系统的安装 -CIS 13 13 | 1.1.3 建议:为应用数据划分独立的分区 13 14 | 1.1.4 规则:禁止使用供应商、制造商或开发商不再支持的软件、硬件、固件、及它们的部件 13 15 | 1.2 最小化安装 14 16 | 1.2.1 规则:不使用的软件包不允许存在系统中 14 17 | 1.2.2 规则:用于生产环境的系统中不允许保留开发和编译工具 14 18 | 1.2.3 规则:操作系统中不允许安装显示安全策略的工具 14 19 | 1.2.4 规则:操作系统中不允许存在网络嗅探类的工具 14 20 | 1.2.5 建议:在不需要Modems系统中不应默认安装Modems 14 21 | 1.3 补丁安装 15 22 | 1.3.1 规则:选择最新或最稳定的操作系统,并及时给操作系统安装补丁 -CIS0 15 23 | 1.3.2 规则:所有的第三方软件必须使用最新或最稳定的版本,并及时安装补丁 15 24 | 2 LINUX系统安全 16 25 | 2.1 服务安全 16 26 | 2.1.1 规则:应默认删除NIS服务,并移除NIS客户端 -CIS 16 27 | 2.1.2 规则:应默认删除telnet服务,并移除telnet客户端 -CIS 16 28 | 2.1.3 规则:如果FTP服务不是必须的,应默认关闭 -CIS 17 29 | 2.1.4 规则:如果TFTP服务不是必须的,应默认关闭 -CIS 17 30 | 2.1.5 建议:如果squid服务不是必须的,应默认关闭 -CIS 17 31 | 2.1.6 规则:禁止安装finger服务 18 32 | 2.1.7 建议:如果uucp服务不是必须的,应默认关闭 18 33 | 2.1.8 规则:需关闭rsh服务,并移除rsh客户端 -CIS 18 34 | 2.1.9 建议:如果打印服务不是必须的,应默认关闭 -CIS 18 35 | 2.1.10 规则:如果DHCP服务不是必须的,应默认关闭 -CIS 19 36 | 2.1.11 规则:如果daytime服务不是必须的,应默认关闭 -CIS 19 37 | 2.1.12 规则:需关闭echo和echo-udp服务 -CIS 19 38 | 2.1.13 规则:需关闭talk服务并移除talk客户端 -CIS 19 39 | 2.1.14 规则:如果xinted服务不是必须的,应默认关闭 -CIS 20 40 | 2.1.15 建议:如果NFS服务不是必须的,应默认关闭 -CIS 20 41 | 2.1.16 建议:如果SNMP服务不是必须的,应默认关闭 -CIS 20 42 | 2.1.17 规则:需关闭autofs服务 -CIS 20 43 | 2.1.18 规则:如果邮件传输代理服务不是必须的,应默认关闭 -CIS 21 44 | 2.1.19 规则:如果X Windows服务不是必须的,应移除 21 45 | 2.1.20 规则:在不使用X Window时应关闭X Font服务 21 46 | 2.1.21 规则:应对SSH服务进行加固 -CIS 21 47 | 2.1.22 规则:应对系统中使用的包含有不安全配置项的服务进行加固 22 48 | 2.1.23 规则:如果系统对外提供远程访问服务,则不同主机上用于服务账号验证的私钥必须不同 23 49 | 2.1.24 规则:启用和配置系统的TCP Wrapper,对基于libwrap库的服务建立外部访问的黑白名单机制 -CIS 23 50 | 2.1.25 规则:没有用到的服务和协议必须禁用 24 51 | 2.1.26 规则:必须限制服务的可达性 25 52 | 2.1.27 规则:如果服务不能通过自我配置的方式绑定到它所提供服务的最少必需接口,则必须使用一个本地数据包过滤器规范服务的可访问性 25 53 | 2.1.28 规则:管理服务必须仅绑定到一个接口 25 54 | 2.1.29 规则:基于网络对系统和服务进行管理的通道必须是安全的 26 55 | 2.2 文件及目录安全 26 56 | 2.2.1 规则:系统目录必须是安全可靠的,所有系统加固相关的目录和文件的权限参考《Linux文件权限列表》进行配置 -CIS 26 57 | 2.2.2 规则:禁止使用setuid或setgid的shell脚本 26 58 | 2.2.3 规则:系统中不允许存在无属主的文件 -CIS 27 59 | 2.2.4 规则:系统中不允许存在空链接 27 60 | 2.2.5 规则:设置系统UMASK -CIS 27 61 | 2.2.6 规则:对于数据文件分区、CD/DVD和USB等分区应以noexec方式挂载分区 -CIS 27 62 | 2.2.7 规则:对于文件不能修改的分区必须以ro方式挂载 28 63 | 2.2.8 规则:对于不需要SUID/SGID的分区必须以nosuid方式挂载 -CIS 28 64 | 2.2.9 规则:/var、/tmp目录必须以nodev方式挂载 -CIS 28 65 | 2.2.10 规则:系统中不允许存在全局可写文件 -CIS 28 66 | 2.2.11 规则:为全局可写目录设置Sticky粘贴位 -CIS 28 67 | 2.2.12 规则:只允许root或授权的用户配置at和cron -CIS 29 68 | 2.2.13 规则:LD_LIBRARY_PATH变量必须被严格定义 29 69 | 2.2.14 规则:用户PATH变量必须被严格定义 -CIS 29 70 | 2.2.15 规则:系统中不允许存在以“.”开头的执行文件 29 71 | 2.2.16 建议:所有用户的HOME目录不能在系统根目录下 29 72 | 2.2.17 规则:所有帐户不应该具有非特定的shell 30 73 | 2.2.18 规则:root用户的HOME目录必须是/root 30 74 | 2.2.19 规则:所有属主为root用户的目录需设置严格的访问权限 30 75 | 2.2.20 建议:移除对不需要的文件系统类型的挂载支持 -CIS 30 76 | 2.3 认证及授权安全 31 77 | 2.3.1 规则:FTP\TELNET\SSH\GUI等提供交互界面的服务,登录之前的欢迎屏幕必须包含最少量的信息 -CIS0 31 78 | 2.3.2 规则:FTP\TELNET\GUI \SSH等提供交互界面的服务,登录失败提供最小的帮助信息 31 79 | 2.3.3 规则:FTP\TELNET\GUI\SSH等提供交互界面的服务,成功登录后,显示用户之前登录信息 31 80 | 2.3.4 规则:设置会话超时时间 31 81 | 2.3.5 规则:创建Warning Banners, Banner中必须删除操作系统版本信息 -CIS0 32 82 | 2.3.6 规则:登录失败一定次数后锁定账号 -CIS0 32 83 | 2.3.7 规则:设置用户账号口令的复杂度 -CIS 32 84 | 2.3.8 规则:用户在口令重置后首次登录须强制更改口令 33 85 | 2.3.9 规则:厂商提供的缺省口令或密码必须及时更改 33 86 | 2.3.10 建议:设置口令有效期 -CIS 33 87 | 2.3.11 建议:设置帐户有效期 -CIS 34 88 | 2.3.12 建议:用户的口令必须用强哈希算法进行加密 -CIS0 34 89 | 2.3.13 建议:限制su权限的使用 -CIS 34 90 | 2.3.14 规则:对账号最小化授权,所有进程必须以所需的最小权限启动 35 91 | 2.3.15 规则:去除系统中不需要的帐户 35 92 | 2.3.16 规则:禁止使用root帐户进行远程接入系统 -CIS 35 93 | 2.3.17 规则:确保只有root才是系统的超级用户,确保系统中各系统账号的UID必须不同 -CIS 35 94 | 2.3.18 规则:默认情况下,为每个用户账号分配一个唯一的主要组 35 95 | 2.3.19 规则:确保系统组的成员资格仅限于系统帐户和系统管理员 36 96 | 2.4 内核安全 36 97 | 2.4.1 规则:执行堆栈必须受到保护,以防止遭受缓冲区溢出这类的攻击 36 98 | 2.4.2 规则: ASLR功能(地址空间布局随机化)增强漏洞攻击防护能力 -CIS 36 99 | 2.4.3 规则:对core dump功能的使用进行限制 -CIS 36 100 | 2.4.4 规则:禁用IP转发功能 -CIS 37 101 | 2.4.5 规则:禁止IP源路由 -CIS 37 102 | 2.4.6 规则:IP欺骗防护 -CIS 37 103 | 2.4.7 规则:禁止系统响应广播请求 -CIS 37 104 | 2.4.8 规则:禁止ICMP重定向接收 -CIS 38 105 | 2.4.9 规则:防止ICMP重定向发给别的系统 -CIS 38 106 | 2.4.10 规则:防止ICMP重定向从默认网关接受 -CIS 38 107 | 2.4.11 规则:确保伪造的ICMP包被丢弃 -CIS 39 108 | 2.4.12 建议:记录所有欺骗的包、源路由包和发给系统的重定向包 -CIS 39 109 | 2.4.13 建议:关闭tcp_timestamps 39 110 | 2.4.14 建议:除非需要,关闭ARP代理 39 111 | 2.4.15 规则:加大从客户端连接请求等候确认的连接数,以防止受到SYN flooding攻击 -CIS 40 112 | 2.4.16 规则:设置TIME_WAIT TCP协议等待时间 40 113 | 2.4.17 规则:必须停用对系统操作所不需要的功能,必须停用所操作的软件和硬件的未用功能 40 114 | 3 LINUX审计及防护安全 42 115 | 3.1 审计安全 42 116 | 3.1.1 规则:必须记录所有与认证相关的事件 -CIS 42 117 | 3.1.2 规则:记录守护进程产生的DEBUG日志 42 118 | 3.1.3 规则:记录cron守护进程产生的日志 42 119 | 3.1.4 建议:应将操作系统日志发送至外部服务器单独存储,确保日志不被篡改 -CIS 43 120 | 3.1.5 规则:“emergency”优先级的事件必须要重定向到本地日志文件,并在控制台上显示 43 121 | 3.1.6 规则:就所有的后台应用程序而言(除了e-mail和认证),具有“info”优先级的事件必须重定向到本地日志文件中 44 122 | 3.1.7 规则:设备内核事件必须要重定向到本地日志文件并在控制台上显示 44 123 | 3.1.8 规则:邮件和认证设备事件必须被重定向到本地受限访问的日志文件上 44 124 | 3.1.9 规则:需保证syslog-ng或rsyslog服务已启用 -CIS 45 125 | 3.1.10 建议:重要事件的任何变化,都需要记录到日志中 45 126 | 3.1.11 建议:时钟必须同一个可信的和精确时间源同步的 -CIS 45 127 | 3.1.12 建议:日志文件必须要集中放置在特定的目录下 45 128 | 3.2 防护安全 46 129 | 3.2.1 规则:禁止通过键盘(CTRL+ALT+DEL)进行重启 46 130 | 3.2.2 建议:关闭SysRq键的使用 46 131 | 3.2.3 规则:确保在单用户模式下需要输入root密码 -CIS0 46 132 | 3.2.4 建议:设置EEPROM/BIOS密码,及时更新BOIS版本 46 133 | 3.2.5 建议:设置Grub密码 -CIS 46 134 | 3.2.6 建议:使用Iptables过滤网络包 -CIS 47 135 | 3.2.7 建议:linux系统需部署完整性校验工具 -CIS 47 136 | 3.2.8 建议:系统必须提供安全措施来处理过载情况 47 137 | 3.2.9 建议:静态地配置服务器的所有接口的IPv4和IPv6地址 49 138 | 3.2.10 规则:动态增长的内容必须不影响系统的功能 49 139 | 4 引用CIS规范 50 140 | 5 参考规范 57 141 | 5.1 CIS_DISTRIBUTION_INDEPENDENT_LINUX_BENCHMARK_V1.0.1.PDF 01-31-2017 57 142 | 5.2 CIS_RED_HAT_ENTERPRISE_LINUX_6_BENCHMARK_V2.0.2.PDF 01-31-2017 57 143 | 5.3 CIS_RED_HAT_ENTERPRISE_LINUX_7_BENCHMARK_V2.1.1.PDF 01-31-2017 57 144 | 5.4 CIS_SUSE_LINUX_ENTERPRISE_11_BENCHMARK_V2.0.0.PDF 12-07-2016 57 145 | 5.5 CIS_SUSE_LINUX_ENTERPRISE_12_BENCHMARK_V2.0.0.PDF 12-07-2016 57 146 | 5.6 UNIX TECHNICAL SECURITY STANDARD ISSUE 8.5. BRITISH TELECOMMUNICATIONS PLC 57 147 | 5.7 UNIX TECHNICAL SECURITY STANDARD. ISSUE10, BRITISH TELECOMMUNICATIONS PLC 57 148 | 5.8 SECURITY REQUIREMENT OPERATING SYSTEMS. VERSION 2.0. DEUTSCHE TELEKOM GROUP 57 149 | 5.9 SECURITY REQUIREMENT UNIX SERVERS. VERSION 2.0. DEUTSCHE TELEKOM GROUP 57 150 | 6 附录 58 151 | 6.1 方案及指导书 58 152 | 6.1.1 SuSe Linux安全解决方案——iptables防火墙配置指导书 58 153 | 6.1.2 SuSe Linux安全解决方案——文件完整性校验检查方案 58 154 | 6.1.3 使用sudo为用户最小化授权解决方案 58 155 | 6.1.4 Linux安全应用指导书 58 156 | 6.1.5 Linux文件权限列表 59 157 | 6.1.6 Linux不安全服务加固指导 59 158 | 6.1.7 syslog-ng及syslog配置指导 59 159 | 6.2 LINUX系统帐户说明 59 160 | 161 | 162 | Linux安全应用指导规范-目录 163 | 简介 6 164 | 使用对象 6 165 | 适用范围 6 166 | 指导解释 6 167 | 用词约定 6 168 | 术语解释 7 169 | 1 权限管理 8 170 | 1.1 权限最小化 8 171 | 1.1.1 禁止直接使用root账号登录Linux系统 8 172 | 1.1.2 除有明确特权需求,应用程序应以非root账号运行 9 173 | 1.1.3 采用不同权限的帐号运行不同的应用并对帐号进行权限分离 9 174 | 1.1.4 在运行时有特权需求的程序,在特权操作完后如后续无特权需求,必须使用setuid放弃特权 10 175 | 1.1.5 使用sudo机制代替以root帐号登录运行特权程序的方式。 11 176 | 1.1.6 应对允许使用su到root帐号的用户进行明确授权,非授权用户不能切换到root 11 177 | 1.1.7 使用POSIX Capabilities功能避免直接使用root权限 12 178 | 1.2 文件和目录权限 14 179 | 1.2.1 系统中禁止有无主文件存在 14 180 | 1.2.2 除有明确需求,应删除文件不必要的setuid和setgid位 14 181 | 1.2.3 应为系统用户设置缺省的umask值 15 182 | 1.2.4 使用特殊属性位Sticky位对共享目录权限进行控制 16 183 | 1.2.5 利用特殊文件属性Append-only位保护系统命令行历史日志文件,防止内容被篡改 16 184 | 2 访问控制 18 185 | 2.1 自主访问控制 18 186 | 2.1.1 使用POSIX ACL进行更细粒度的访问控制 18 187 | 2.2 强制访问控制 20 188 | 2.2.1 Linux系统上应安装强制访问控制系统作为应急的安全访问控制手段 20 189 | 3 记录和审计 22 190 | 3.1 监测、记录和审计 22 191 | 3.1.1 启用inotify监控机制,以文件系统事件进行安全监控 22 192 | 3.1.2 使用Auditd组件对系统中的重要目录或文件进行审计 24 193 | 4 认证 26 194 | 4.1 口令和账号 26 195 | 4.1.1 使用shadow套件对系统账号口令进行分离保护 26 196 | 4.1.2 Linux系统必须使用shadow套件对当前暂时不使用的账号进行锁定或登录限制 27 197 | 4.1.3 使用shadow套件对系统口令的时效进行限制 29 198 | 4.2 可插拔认证模块(PAM) 29 199 | 4.2.1 使用PAM模块增强认证管理 29 200 | 5 文件系统保护 31 201 | 5.1 日志文件保护 31 202 | 5.1.1 应将操作系统日志发送至外部服务器单独存储,确保日志不被篡改 31 203 | 5.2 文件系统加密 31 204 | 5.2.1 对含有重要信息的文件目录或分区进行加密处理 31 205 | 5.3 分区和挂载 32 206 | 5.3.1 对于系统中的重要目录必须根据存储目的不同进行分区隔离 32 207 | 5.3.2 使用fstab对外接、日志存储分区进行访问控制。 32 208 | 5.3.3 禁用自动工具对移动存储设备进行挂载 33 209 | 6 网络防护 34 210 | 6.1 网络防护能力 34 211 | 6.1.1 使用sysctl工具增强系统网络防护能力 34 212 | 6.1.2 使用iptables对系统中不使用的端口进行限制 35 213 | 6.2 限制网络服务 35 214 | 6.2.1 远程访问需使用SSH取代telnet 35 215 | 6.2.2 系统中不应安装不安全的传统网络服务 35 216 | 7 漏洞攻击防护 37 217 | 7.1 地址随机化 37 218 | 7.1.1 使用Linux自带的ASLR功能(地址空间布局随机化)增强漏洞攻击防护能力 37 219 | 7.2 数据执行防护 37 220 | 7.2.1 系统必须使用DEP防护手段提升漏洞攻击防护能力 37 221 | 7.2.2 使用栈保护机制 38 222 | 7.3 增强性安全防护 39 223 | 7.3.1 使用Grsecurity增强Linux系统的安全防护能力 39 224 | 7.3.2 使用PaX提升系统攻击防护能力 40 225 | 8 完整性保护 43 226 | 8.1 文件完整性检查 43 227 | 8.1.1 使用IMA工具对系统文件的完整性进行检查 43 228 | 9 安全隔离和容器 44 229 | 9.1 安全隔离 44 230 | 9.1.1 对于开放给第三方的shell环境,应使用隔离技术对其可访问的系统资源进行隔离 44 231 | 9.1.2 对于系统中运行的第三方应用,需使用控制组或容器等技术手段将其于系统关键资源进行隔离。 46 232 | 10 其他 47 233 | 10.1 额外系统功能限制 47 234 | 10.1.1 对core dump功能的使用进行限制 47 235 | 10.1.2 关闭SysRq键的使用 47 236 | 10.1.3 应对bootloader开启引导装载密码 48 237 | 10.1.4 使用ulimit工具限制用户可以打开文件个数 48 238 | 11 设计样例 50 239 | -------------------------------------------------------------------------------- /Linux-Safe-configuration/sudo_Security_Configuration/Sudo-Security-Configuration.word: -------------------------------------------------------------------------------- 1 | 1 Sudo介绍 2 | 1.1 Sudo简介 3 | sudo是Linux系统管理命令,是允许系统管理员让普通用户执行某些特权命令的工具。在sudo出现之前,普通用户通过su命令切换到特权用户来管理系统,但是在使用su命令时,普通用户必须输入特权用户的口令才能切换到特权用户,因此,必须预先告知普通用户该特权用户的口令,因为普通用户切换到特权用户后的权限是无限制的,所以系统的安全性会受到威胁。sudo的出现解决了这个问题,sudo让普通用户不需要知道特权用户的口令即可获得特权,在此之前,超级用户可将普通用户的用户名、可执行的特定命令、运行身份等信息,配置在文件中(通常是/etc/sudoers),即完成对普通用户的授权(此时该用户称为“sudoer”)。之后普通用户就可以在命令前加上“sudo”,以特权权限执行该命令。 4 | 1.2 应用场景 5 | 本文档为SuSe(10/11) Linux操作系统上sudo环境安全配置指导文档,旨在指导产品在配置sudo时如何配置安全的sudo用户和sudo命令,以达到系统的安全。本配置指导书适用场景: 6 | 1、 业务用户在未知特权用户口令情况下,基于业务需要,必须执行该特权用户权限范围内的一些操作。 7 | 2、 基于业务场景需要,实现自动化脚本时业务用户需要自动化执行一些特权操作。 8 | 1.3 Sudo命令使用方法 9 | 语法: 10 | sudo [-bhHpV][-s ][-u username|#uid][Command] 或 sudo [-klv] 11 | 12 | 表1:sudo命令参数介绍 13 | -V 显示版本编号 14 | -h 显示版本编号及指令的使用方式说明 15 | -l 显示出自己(执行 sudo 的使用者)的权限 16 | -v 延长密码有效期,如果当前密码有效期没到则不需要输入密码,否则需要再次输入密码 17 | -k 结束密码的有效期限,也就是下次再执行sudo时便需要输入密码 18 | -b 在后台执行命令 19 | -p 设置询问密码的提示语,可使用%u显示使用者的帐号名称,%h显示主机名称,如sudo –p “please %u input passwd for %h:” 20 | -u 指定username或#uid,表示想要切换到的用户。如果不加此参数,默认切换到 root 21 | -s 执行指定的shell 22 | -H 将HOME环境变量设为新身份的HOME环境变量 23 | Command 要执行的指令 24 | 2 主要问题 25 | 2.1 sudoer配置文件直接配置了高风险系统命令 26 | 某产品的在/etc/sudoers配置了普通用户gandalf可执行/usr/bin/scp。gandalf为普通用户,但是该用户可以创建文件passwd,然后使用sudo scp将文件考至/etc目录下替换掉原passwd文件,这样就相当于重置了root帐号密码,这样就可以直接su到root,从而获取了root权限,执行任意命令,达到了提升权限的目的。 27 | 2.2 属于低权限用户的脚本或程序不能以高权限帐号运行 28 | 某产品采用普通帐号omu来运行程序,但是程序需要执行一个脚本****.sh,脚本中包含了只有root帐号才能执行的命令,于是在/etc/sudoers里面的****.sh,但是脚本的属主是运行程序的普通用户omu,omu用户可以对该文件进行修改操作,所以omu用户登陆后可以通过修改该脚本文件,在其中插入任意root帐号才能执行的命令,通过命令sudo ****.sh就可以实现任提升权限的目的。 29 | 3 Sudo安全配置 30 | 3.1 配置示例 31 | 1) 以root用户身份登录服务器,执行如下命令打开sudo配置文件/etc/sudoers: 32 | #visudo 33 | 2) 找到“#User privilege specification”这个注释,在其下面就可以添加自定义配置。示例如下: 34 | 35 | 上图中三条配置释义如下: 36 | a) root ALL=(ALL) ALL 37 | 这条配置表明用户root可以通过sudo切换到任何用户执行任意命令。 38 | b) wang ALL=(ALL) NOPASSWD:/usr/bin/find 39 | 这条配置表明用户wang在不用输入目标用户口令的情况下通过sudo切换到任何用户执行find命令。NOPASSWD指明不需要输入目标用户的口令,/usr/bin/find指明用户wang只能通过sudo执行find命令,不能通过sudo执行cat、ls等其他命令。 40 | c) LJ ALL=(root) NOPASSWD:/bin/ls,/bin/cat,/usr/bin/vi /fjl/aaa,/bin/cp * /fjl/,/bin/mount * /fjl/,PASSWD:/bin/chmod 41 | 这条配置表明用户LJ通过sudo只能切换到root账号去执行后面的命令。在执行NOPASSWD后面的命令时不需要输入root账号口令,而执行在PASSWD后面的chmod命令时需要输入root账号的密码。其中,/usr/bin/vi /fjl/aaa这条命令表明用户LJ通过sudo执行vi命令时只能编辑/fjl/aaa这个文件;/bin/cp * /fjl/表明用户LJ通过sudo执行cp命令时只能往/fjl/目录下复制文件;/bin/mount * /fjl/表明用户LJ通过sudo执行mount命令时只能将设备挂载到/fjl/这个目录下。 42 | 43 | 3.2 命令分类 44 | 配置sudo后的风险 命令 说明 能否配置sudo权限 45 | 低 ls、dir、pwd、id、ps、du、df、who、w、whoami、file、finger、cal、dmidecode、find、wc、stat、ipcs 这些显示查看信息类的命令不会对系统或特殊文件造成影响,这类命令相对较安全 可以配置 46 | zip 压缩类命令不会对系统或特殊文件造成影响 可以配置 47 | mkdir、rmdir、touch 不会对系统或特殊文件造成影响 可以配置 48 | …… 49 | 中 cat、view、more、less、head、tail、awk 配置后普通用户能够查看系统内所有文件(包括特殊文件,如/etc/shadow)的内容,可能造成敏感信息泄露 限制访问范围 50 | grep、egrep、fgrep 配置后普通用户能够查看系统内所有文件(包括特殊文件,如/etc/shadow)的内容,可能造成敏感信息泄露 禁止 51 | stty stty命令用于显示和修改终端行设置,配置后恶意用户任意修改系统终端行配置,影响系统正常使用 限制访问范围 52 | /etc/init.d/* 53 | /usr/sbin/rc* 服务管理类命令,配置后可导致系统安全服务被恶意关闭,如syslog、auditd等,可将命令参数配全,如/etc/init.d/syslog restart 限制访问范围 54 | …… 55 | 高 rm、vi、sed、dos2unix 配置后可能造成系统特殊文件被恶意删除或修改 限制访问范围 56 | cp、mv、gzip、unzip、gunzip、tar 配置后可能造成系统特殊文件被恶意替换 限制访问范围 57 | killall、pkill、chkconfig 配置后可能影响系统或服务的正常运行 限制访问范围 58 | mount、rpm 配置后可能引入恶意程序 限制访问范围 59 | unmount、fdisk 配置后可能影响系统的正常使用 限制访问范围 60 | su、sudo 配置后普通用户可以通过su命令切换到root执行任何命令 禁止 61 | chmod、chown、chgrp 配置后普通用户可以修改任何文件的权限 禁止 62 | useradd、userdel、groupadd、groupdel 配置后可能引入特权用户 禁止 63 | kill、shutdown、init、reboot、halt、poweroff 配置后可能影响系统或服务的正常运行 禁止 64 | passwd 配置后可能造成root口令被恶意修改 禁止 65 | mkfs 配置后可能造成系统磁盘被恶意格式化 禁止 66 | ifconfig、ethtool、route 网络接口/路由配置类的命令,配置后系统网络可能被恶意修改,影响正常流量(如网络不通) 禁止 67 | sh、bash、ksh、csh Shell类程序配置后,普通用户可以用以目标用户权限执行系统任意命令 禁止 68 | crontab 配置后可为任意用户创建定时任务,可能导致root执行恶意程序 禁止 69 | sysctl 配置后可任意修改系统内核参数,系统安全功能可能被恶意关闭 禁止 70 | …… 71 | 72 | 3.3 限制访问范围 73 |  cat、view类命令 74 | 1) 若sudo配置中存在cat、view等查看类命令,则必须限制cat、view这些命令可查看的文件范围。要求该范围内查看文件不会产生安全威胁。例如,下面示例配置仅允许用户tom通过sudo切换到root查看/etc/xxx.conf文件: 75 | 编辑/etc/sudoers文件,自定义如下配置: 76 | tom ALL=(root) NOPASSWD:/bin/cat /etc/xxx.conf,/usr/bin/view /etc/xxx.conf 77 | 2) 不恰当的配置将会使普通用户能够查看系统内所有文件(包括特殊文件,如/etc/shadow)的内容,可能造成敏感信息泄露。例如,下面示例中用户tom可以通过sudo切换到root账户查看/etc/passwd和/etc/shadow等特殊文件。 78 | 编辑/etc/sudoers文件,自定义如下配置: 79 | tom ALL=(root) NOPASSWD:/bin/cat,/usr/bin/view 80 | 查看/etc/passwd文件内容命令: 81 | > sudo cat /etc/passwd 82 | 查看/etc/shadow文件内容命令: 83 | > sudo cat /etc/shadow 84 |  cp类命令 85 | 1) 若sudo配置中存在cp命令,则必须限制cp命令访问范围,约束目标目录。要求该范围内替换文件不会产生安全威胁。例如,下面示例配置仅允许用户tom往/dir1/和/dir2/dir3/目录下复制文件: 86 | 编辑/etc/sudoers文件,自定义如下配置: 87 | tom ALL=(root) NOPASSWD:/bin/cp * /dir1/,/bin/cp * /dir2/dir3/ 88 | 2) 不恰当的配置将会使系统特殊文件被更改,进而威胁整个系统。例如,下面示例中若用户tom通过sudo切换到root账号执行cp命令时没有限制,则用户tom可以复制系统内的任何文件,也可以向任何目录下复制文件。如果用户tom在/attack目录下伪造一个passwd文件,通过一条命令即可将系统的passwd文件替换为伪造的passwd文件,可能造成正常用户无法登陆系统或口令被恶意用户修改。其他文件如/etc/shadow、/etc/group等文件也是如此: 89 | 编辑/etc/sudoers文件,自定义如下配置: 90 | tom ALL=(root) NOPASSWD:/bin/cp 91 | 文件替换命令: 92 | > sudo cp /attack/passwd /etc/ 93 |  rm、vi 94 | 1) 若sudo配置中存在rm、vi命令,则必须限制rm、vi命令的访问范围,限制允许删除或修改的文件范围。要求该范围内删除、编辑文件不会产生安全威胁。例如,下面示例仅允许用户tom删除或编辑/etc/xxx.conf文件: 95 | 编辑/etc/sudoers文件,自定义如下配置: 96 | tom ALL=(root) NOPASSWD:/bin/rm /etc/xxx.conf,/bin/vi /etc/xxx.conf 97 | 2) 不恰当的配置将会使系统特殊文件被删除或修改,对系统造成威胁。例如,下面示例中用户tom通过sudo切换到root账号执行rm、vi命令时没有限制,则用户tom可以删除或修改系统内的任意文件。 98 | 编辑/etc/sudoers文件,自定义如下配置: 99 | tom ALL=(root) NOPASSWD:/bin/rm,/bin/vi 100 | 删除/etc/shadow文件命令: 101 | > sudo rm /etc/shadow 102 | 修改/etc/passwd文件命令: 103 | > sudo vi /etc/passwd 104 |  killall、pkill 105 | 1) 若sudo配置中存在killall、pkill命令,则必须限制killall、pkill命令的访问范围,限制允许终止进程的范围。要求该范围内终止进程不会产生安全威胁。例如,下面示例仅允许用户tom终止属于自己的进程和关闭httpd进程: 106 | 编辑/etc/sudoers文件,自定义如下配置: 107 | tom ALL=(root) NOPASSWD:/usr/bin/killall –u tom,/usr/bin/pkill httpd 108 | 2) 不恰当的配置将会影响系统的运行和服务的正常使用。例如,下面示例中用户tom通过sudo切换到root账号执行killall、pkill命令时没有限制,则用户tom可以杀掉系统内的任意进程。 109 | 编辑/etc/sudoers文件,自定义如下配置: 110 | tom ALL=(root) NOPASSWD:/usr/bin/killall,/usr/bin/pkill 111 | 终止用户root的所有进程命令: 112 | > sudo killall -u root 113 | 终止所有的bash进程命令: 114 | > sudo pkill bash 115 |  mount 116 | 1) 若sudo配置中存在mount命令,则必须限制mount命令挂载时挂载点的范围。要求该范围内挂载设备不会产生安全威胁。例如,下面示例仅允许用户tom往/aaa/bbb目录下挂载设备: 117 | 编辑/etc/sudoers文件,自定义如下配置: 118 | tom ALL=(root) NOPASSWD:/bin/mount * /aaa/bbb 119 | 2) 不恰当的配置将会影响系统或程序正常使用,也可能引入恶意程序。例如,下面示例中用户tom通过sudo切换到root账号执行mount命令时没有限制,则用户tom可以向任意目录下挂载设备。使用mount命令进行挂载时,挂载点通常是空目录,但当挂载点不是空目录时,则挂载后该目录下的原有内容不可见,在卸载之后才可见。例如恶意用户可以将设备挂载到/bin目录,而在该设备中含有恶意程序,可以将恶意程序命名为ls,这样就会替换原有的/bin/ls程序。 120 | 编辑/etc/sudoers文件,自定义如下配置: 121 | tom ALL=(root) NOPASSWD:/bin/mount 122 | 向/bin目录下挂载U盘设备(/dev/sdd1)命令: 123 | > sudo mount -t vfat /dev/sdd1 /bin 124 |  umount 125 | 1) 若sudo配置中存在unmount命令,则必须限制unmount命令卸载的范围。要求该范围内卸载设备不会产生安全威胁。例如,下面示例仅允许用户tom卸载挂载在/aaa/bbb目录下的设备: 126 | 编辑/etc/sudoers文件,自定义如下配置: 127 | tom ALL=(root) NOPASSWD:/bin/unmount /aaa/bbb 128 | 2) 不恰当的配置将会影响系统或程序正常使用,可能造成设备被恶意用户随意卸载。例如,下面示例中用户tom通过sudo切换到root账号执行unmount命令时没有限制,则用户tom可以卸载挂载在任意目录下的设备(包括挂载在根目录下的设备)。 129 | 编辑/etc/sudoers文件,自定义如下配置: 130 | tom ALL=(root) NOPASSWD:/bin/unmount 131 | 卸载挂载在根目录/下的设备命令: 132 | > sudo unmount / 133 |  其他需要限制的命令 134 | mv:限制源和目标 135 | tar:用-C选项指定目的目录 136 | fdisk:限制只能用-l选项查看磁盘分区信息 137 | rpm:限制其只具有查询功能或只能安装特定的安装包 138 | chkconfig:限制可控制服务的范围 139 | … 140 | 3.4 不能配置sudo权限的命令 141 |  su、sudo 142 | su、sudo命令可以使普通用户切换到其他用户(默认切换到root)去执行命令,一旦为su、sudo配置sudo权限,则普通用户sudo su和sudo sudo这样的连环命令切换到其他用户去执行该用户可执行的所有命令。因此要求禁止配置su、sudo命令的sudo权限。例如,下面示例用户tom可以通过sudo执行su和sudo命令切换到root账号执行passwd命令修改root的口令,用户tom除了可以执行passwd命令外还可以执行系统内的所有命令。 143 | 编辑/etc/sudoers文件,自定义如下配置: 144 | tom ALL=(root) NOPASSWD:/bin/su,/usr/bin/sudo 145 | 切换到root账号命令: 146 | > sudo su 147 | 修改root口令命令: 148 | # passwd 149 | 编辑/etc/shadow文件命令: 150 | # vi /etc.shadow 151 | 直接修改root口令命令: 152 | > sudo sudo passwd 153 | 备注:如果必须为su、sudo配置sudo权限则必须按照如下方式配置 154 | tom ALL=(Runas) NOPASSWD:/bin/su,/usr/bin/sudo 155 | 其中Runas必须满足: 1)不能为UID为0的用户(如root); 156 | 2)不能为GID为0的组(如%root)。 157 |  chmod、chown、chgrp 158 | chmod、chown和chgrp这三个命令分别可以修改文件的权限、所有者和所属群组,一旦配置sudo权限,则系统内的特殊文件(如/etc/passwd)将受到威胁。因此要求禁止配置这些命令的sudo权限。例如,下面示例用户tom通过sudo切换到root账号执行chmod命令修改/etc/passwd文件的权限,让所有用户对/etc/passwd文件都有可写权限。之后任意用户就可以使用vi等编辑命令修改/etc/passwd文件,这会造成其他用户甚至root账号的密码被修改: 159 | 编辑/etc/sudoers文件,自定义如下配置: 160 | tom ALL=(root) NOPASSWD:/bin/chmod 161 | 修改/etc/passwd文件的权限命令: 162 | > sudo chmod 777 /etc/passwd 163 | 修改/etc/passwd文件的内容命令: 164 | > vi /etc/passwd 165 |  passwd 166 | passwd这个命令可以修改用户口令,一旦配置sudo权限,则系统内所有用户的口令将受到威胁。因此要求禁止配置该命令的sudo权限。例如,下面示例用户tom通过sudo切换到root账号执行passwd命令修改root用户的口令,会导致root用户无法正常登录系统: 167 | 编辑/etc/sudoers文件,自定义如下配置: 168 | tom ALL=(root) NOPASSWD:/usr/bin/passwd 169 | 修改root用户的口令命令: 170 | > sudo passwd root 171 |  其他 172 | useradd、userdel、groupadd、groupdel等账号、组管理类命令可能引入特权用户。 173 | mkfs可能破坏系统文件 174 | kill、shutdown、init、reboot、halt、poweroff会影响系统的正常运行 175 | … 176 | 3.5 禁止命令规避措施 177 | 对于建议禁止配置sudo权限的命令,安全要求禁止配置在sudoers文件中。如果业务场景要求必须配置,则必须使用如下方法规避安全风险: 178 |  脚本封装 179 | 脚本封装就是将要执行的命令封装在脚本内,封装时要确保脚本的执行不会引发安全风险(如封装的命令可以任意执行),封装完成后再配置脚本的sudo权限即可。 180 | 例如,以下脚本封装su命令: 181 | #!/bin/bash 182 | if [ “$1” = “jack” ] || [ “$1” = “bob” ] 183 | then 184 | su $1 185 | else 186 | echo ‘Permision denied’ 187 | fi 188 | 以下示例通过上面的脚本封装su命令,并配置脚本的sudo权限,可以使用户tom通过该脚本执行su命令,且只能通过su切换到用户jack和用户bob下。 189 | 新建一个脚本/home/tom/su.sh,添加以上内容并保存: 190 | # vi /home/tom/su.sh 191 | 修改/home/tom/su.sh脚本的权限,使其可执行: 192 | # chmod 550 /home/tom/su.sh 193 | 修改/home/tom/su.sh脚本的用户/组所有者为下面的用户xxx和其所在的组xxxgrp: 194 | # chown xxx:xxxgrp /home/tom/su.sh 195 | 编辑/etc/sudoers文件,自定义如下配置: 196 | tom ALL=(xxx) NOPASSWD:/home/tom/su.sh 197 | 用户tom通过su.sh脚本切换到用户jack下命令: 198 | tom> sudo -u xxx /home/tom/su.sh jack 199 | (如果xxx为root则,执行完以上命令会直接切换到jack用户下;否则会提示输入jack的口令) 200 | 用户tom试图通过su.sh脚本切换到root时提示“Permision denied”: 201 | tom> sudo -u xxx /hom/tom/su.sh root 202 | Permision denied 203 | 3.6 合理配置sudo执行命令的文件权限 204 | 假设sudoers配置中存在以下配置: 205 | tom ALL=( xxx) NOPASSWD:/home/tom/bin/set.sh 206 | 则要求tom不能修改/home/tom/bin/set.sh的文件内容,否则tom可以通过修改set.sh来提权访问其他资源。 207 | 对于以上配置,可以采用以下方法: 208 | 方法1: 为set.sh文件设置不可修改属性 209 | root # chattr +i /home/tom/bin/set.sh 210 | 用root为set.sh文件设置不可修改属性后,即使是root也不能修改/删除set.sh文件,必须先用root移除该属性后才可。(chattr -i) 211 | 方法2:修改文件及上层目录的属主及权限 212 | root # chown xxx /home/tom/bin 213 | root # chown xxx /home/tom/bin/set.sh 214 | root # chmod go-w /home/tom/bin 215 | root # chmod go-w /home/tom/bin/set.sh 216 | 修改后确保tom不能任意修改sudo执行脚本的内容。 217 | 3.7 开启日志功能 218 | 以root用户身份登录服务器,执行如下命令查看sudo日志文件/var/log/sudo.log: 219 | # cat /var/log/sudo.log 220 | 执行后可看到类似下图的日志记录: 221 | 222 | 上图的一条记录释义如下: 223 | Jul 22 02:09:41:使用sudo的时间 224 | LJ:sudo使用者的用户名 225 | TTY=pts/3:sudo使用者的TTY值 226 | PWD=/:使用sudo时所在的目录 227 | USER=root:使用sudo切换到的用户 228 | COMMAND=/bin/cp /etc/shadow /fjl/:具体执行的命令 229 | 通过以下两步即可开启日志功能: 230 | 创建一个文件用于保存日志: 231 | #touch /var/log/sudo.log 232 | 编辑/etc/sudoers文件,设置logfile参数: 233 | 在#Defaults specification下面添加:Defaults logfile=/var/log/sudo.log 234 | 3.8 合理配置权限 235 | 配置sudo权限时根据用户的职责和权力来最小化配置Runas,谨慎使用root权限。 236 | 当用户只需要普通用户的权限,执行普通的命令时可进行如下配置: 237 | 编辑/etc/sudoers文件,自定义如下配置: 238 | tom ALL=(%users) NOPASSWD:Commands_List 239 | 当用户要进行数据库管理时,可进行如下配置: 240 | 编辑/etc/sudoers文件,自定义如下配置: 241 | tom ALL=(%dba) NOPASSWD:Commands_List 242 | … 243 | 3.9 设置sudo文件权限 244 | 通过设置文件权限,可以有效保护系统内的特殊文件。将特殊文件的权限设置为仅root用户可读,能够防止其他用户查看敏感信息。 245 | 设置sudo配置文件权限命令: 246 | #chmod 400 /etc/sudoers 247 | 设置sudo日志文件权限命令: 248 | #chmod 400 /var/log/sudo.log 249 | 3.10 排查可用sudo来执行的脚本的权限是否配置错误 250 | 3.10.1 攻击原理 251 | 不恰当的配置脚本的sudo执行权限可能会造成设备恶意用户的越权行为。例如,下面示例中用户tom可以通过sudo切换到root账号执行test.sh命令,且test.sh的属主是tom,这样就可以通过修改该脚本,添加恶意命令: 252 | 编辑/etc/sudoers文件,自定义如下配置: 253 | tom ALL=(root) NOPASSWD: /home/tom/bin/set.sh 254 | 编辑/home/tom/bin/set.sh,添加以下命令: 255 | shutdown -h now 256 | 在根目录/下的命令: 257 | > sudo /home/tom/bin/set.sh 258 | 3.10.2 正确的配置 259 | 对于以上配置,可以采用以下方法: 260 | 方法1:将脚本中需要执行的命令单独配置sudo权限,不使用sudo来执行该脚本。 261 | 方法2: 为test.sh文件设置不可修改属性 262 | root # chattr +i /home/tom/bin/ test.sh 263 | 用root为set.sh文件设置不可修改属性后,即使是root也不能修改/删除set.sh文件,必须先用root移除该属性后才可。(chattr -i) 264 | 方法3:修改文件及上层目录的属主及权限,使tom不能任意修改sudo执行脚本的内容 265 | root # chown xxx /home/tom/bin 266 | root # chown xxx /home/tom/bin/test.sh 267 | root # chmod go-w /home/tom/bin 268 | root # chmod go-w /home/tom/bin/ test.sh 269 | 3.11 排查sudo里面配置的脚本或目录实际不存在 270 | 如果/etc/sudoers文件中配置了不存在的脚本,那么普通用户可以创建该脚本,在该脚本中添加恶意命令,然后再用sudo去执行该脚本,从而达到越权的目的。 271 | 3.12 Sudo测试分类和测试方法分类 272 | 1、 检查sudoers中是否包含单纯的linux命令,如chown,如有按照方法一测试 273 | 2、 检查sudoers中是否包含带参数的linux命令,如rm /etc/passwd,mv * /opt/user 如有按照方法二测试 274 | 3、 检查sudoers中是否包含单纯的自定义脚本: 275 | a) 检查自定义脚本中是否包含外部传参,如有,在参数被使用的每一处按照方法二测试 276 | b) 检查自定义脚本中是否包含公共脚本的某个函数引入(如. ./xx.sh (两点之间有空格)),如有,检查公共脚本是否为相路径,如是则有问题,如不是按照方法三测试 277 | c) 检查自定义脚本中是否包含调用其它自定义脚本,如有,检查脚本是否为相路径,如是则有问题,如不是对打开脚本按照分类3循环排查 278 | d) 检查自定义脚本中是否包含写死的外部固定目录/文件、固定参数,如有,在参数被使用的每个语句处按照方法二测试(如提前声明变量:declare BACKUP_POLICY_LOG=/opt/UPORTAL2800/common/run_log/SHELL/uportal_backup_policy.log 279 | 或者 临时参数不用变量operate_Crontab "sed" "/auto_backup_uportal.sh/d" "/tmp/cron_temp") 280 | e) 检查自定义脚本中是否包含输出数据到日志或其它文件语句(如echo * >> log,cat 、cat << EOF > $EXP_FILE 等),如有按照方法四测试 281 | f) 按照方法五测试 282 | 4、 检查sudoers中是否包含带参数的自定义脚本(如./upload.sh uc_ims * *): 283 | a) 检查自定义脚本携带参数是否包含*,如果是,*处参数,按照3->a)测试,固定参数处按照3->c)测试 284 | b) 其它直接参考3->b),3-d),3->e)测试。 285 | 286 | 测试方法一: 287 | 1、 所有sudoers中包含的单纯的linux命令,直接查询《sudo安全配置指导书》,定义为中高风险的命令需要删除。 288 | 2、 若命令在《sudo安全配置指导书》无说明,建议查询命令功能范围后与安全SE一起做风险评估,风险评估参考 CVSS2中定义的完整、机密、可用性。 289 | 测试方法二: 290 | 1、 检查参数被引入的命令是否为《sudo安全配置指导书》定义的中高危命令,如不是,分析是否存在参数或参数指向的内容被写入文本、log等文件,如果有写动作,就查看文本和log文件是否当前用户不可写且不属主,查看文件和log所在目录是否当前用户不可写且不属主。并且观察参数或参数指向的内容是否当前用户可任意指定(参考案例五) 291 | 2、 如果参数被中高危命令引用,需要按照《sudo安全配置指导书》中的描述做限制(通读上下文代码,参考案例一到七)。 292 | a) 做为chmod、chown、mv、cp、rm、tar、gzip等命令的参数时,若作为目录文件入参,检查是否为脚本外部无限制入参,若是就有可能存在问题(参考案例一、二、四),可以尝试绕过目录限制(../); 293 | b) 做为chmod、chown、mv、cp、rm、tar、gzip等命令的参数时,若作为目录文件入参,检查是否为绝对路径文件入参,且文件所在目录属主root,当前用户不可写,文件属主root且当前用户不可写。(参考案例五、六) 294 | c) 若不是常见高危命令代码,需要通读上下文分析风险,及时总结案例补充此文档案例和测试方法。 295 | d) 检查防范低级的恶意命令写作,如mv /etc/shadow /tmp/user 或root:root|chpasswd,这类本来就存在问题确认被想当然写入sudo脚本的语句。 296 | 测试方法三: 297 | 1、 检查公共脚本的属主是否为root,检查是否当前user不可写,公共脚本的上层目录是否为root,当前用户不可写 298 | 2、 检查引入的公共脚本的功能函数,并按照测试方法二排查。 299 | 测试方法四: 300 | 1、 查看echo 、printf等是否涉及把用户输入直接打印到某文件中,如有,需要检查文件的属主root且当前用户不可写,文件上层目录属主root且当前用户不可写 301 | 2、 查看echo、printf 是否把passwd等变量打印到某文件中,如有,需要删除该语句 302 | 3、 查看cat exp是否把passwd变量保存在exp,如有需要保证exp只被root读写且使用后及时删除 303 | 4、 查看存有passwd变量的exp是否在被expect执行时输出到某log(>>log)文件,如有,需要检查是否有代码及时删除其中的passwd行,且如果有其它不可控变量输出到log文件,则需要检查log文件属主是否root,是否当前用户不可写,文件上层目录是否属主root且当前用户不可写。 304 | 5、 如有其它打印密码、变量的情况请分析后整理补充案例和测试方法。 305 | 测试方法五: 306 | 检查自定义脚本属主是否为root,权限至多为550,自定义脚本上层目录属主是否为root、当前user不可写 307 | 3.13 其他排查 308 |  在/etc/sudoers配置文件中,允许sudo执行的命令如果只用于用户交互登录手动执行时,禁止设置NOPASSWD。 309 |  如果通过sudo来赋予低权限用户执行特权命令的权限,必须限制其可以执行的命令范围,禁止允许执行所有命令的配置项,例如,配置文件/etc/sudoers中禁止存在如下配置项:ALL ALL=(ALL) ALL、XXX ALL=(root) ALL(除非前面配置了Defaults targetpw)。 310 |  禁止在/etc/sudoers允许sudo执行的命令列表中使用通配符‘*’,如禁止配置/sbin/*,/bin/*。 311 |  Sudoers——指的/etc/sudoers,以及在sudoers以#include 或#includedir 包含进来的文件,如 312 | 313 | 4 防御方法推荐 314 | 1、Sudo脚本、sudo产生日志建议单独规划在系统固有的root属主目录下,权限500 315 | 2、Sudo脚本中引用的脚本、文件建议单独规划在系统固有的root属主目录下,权限500 316 | 3、如果有需求必须引用非root目录或文件,引用时要做路径是否软连接判断、是否硬链接判断、是否存在跨目录判断,并对判断后再引用是否有风险结合指导、通读代码做充分评估 317 | 4、如果有需要必须在sudo脚本中执行一个相对路径的脚本、或引入一个相对路径文件入参,则执行时建议以低权限用户执行,并对执行结果返回值有校验,防止任意构造返回值后形成新的提权注入点。 318 | 5、如果有对文件、目录、入参等检查判断,那么这个判断语句与对其的判正后调用执行的语句时间差要尽量缩短,做到调用前1、2个语句内先判断,防止利用时间差攻击。 319 | 6、Sudoers里面配置的常见高危命令参考《sudo安全配置指导1.3》进行排查整改,对指导中未提到的命令需要提交安全工程部充分评估。(如/bin/python) 320 | 7、自定义脚本中使用的高危命令参考《sudo安全配置指导1.3》进行排查,理解命令功能用法的基础上形成对高危命令入参的判断。能用低权限用户执行的命令都用su user –c 执行 321 | 举例:1) rm 入参不能由用户指定 2)cp 入参不能由用户任意指定 3)chown 要加-h,且对被属主文件做硬链接判断和文件路径判断(软连接推荐readlink、硬链接推荐在链接数上做判断) 4)chmod 尽量使用xx0,避免other组有任何权限 5) tar 解压环境要判断 等等 322 | 8、自定义脚本中以exit为结尾 323 | 9、自定义脚本中如果存在文件写操作应注意 1)避免不可控字符写(如用户入参、某脚本执行返回值、某user可控的文件中取值) 2)被写的文件所在目录或为root属主绝对路径、或有软硬链接判断和属主判断。 324 | 5 SecureCAT工具排查说明 325 | 选取HW_Linux_Security_Test_Cases_for_Specific_OS_Functions策略进行扫描,详细检查内容见附件,部分检查项目需要产品结合业务进一步判定。 326 | 注:工具功能在试用阶段,如有问题请反馈联系安全工具部詹应根00255440 327 | 328 | 5.1 其他安全选项 329 | 如果要设置其他的安全参数,可通过visudo编辑/etc/sudoers文件,在“# Defaults specification”下面添加。 330 |  默认情况下,当用户使用sudo时是要求输入当前用户的密码,一旦/etc/sudoers文件里有不合理的配置如:ALL ALL=(ALL) ALL时,恶意用户就能通过sudo执行系统内的任何root命令。通过下面的方法设置targetpw后,用户使用sudo时就会要求输入目标用户的密码,即使有ALL ALL=(ALL) ALL这样的配置,恶意用户在没有root密码的情况下不会对系统造成威胁。 331 | 编辑/etc/sudoers文件,在“# Defaults specification”下添加: 332 | Defaults targetpw 333 |  设置always_set_home选项,使每次执行sudo时将当前用户的HOME环境变量设置为目标用户的HOME环境变量,相当于每次执行sudo时都指定-H选项。使用如下方式配置: 334 | 编辑/etc/sudoers文件,在“# Defaults specification”下添加: 335 | Defaults always_set_home 336 |  设置env_reset选项,使每次执行sudo时重置系统内的环境变量,使其只包括:HOME、LOGNAME、SHELL、PATH、TERM和USER。可以防止环境变量对程序造成影响。使用如下方式配置: 337 | 编辑/etc/sudoers文件,在“# Defaults specification”下添加: 338 | Defaults env_reset 339 |  其他选项 340 | 编辑/etc/sudoers文件,在“# Defaults specification”下添加: 341 | #设置允许输入验证密码的次数为3次 342 | Defaults passwd_tries=3 343 | #设置sudo令牌有效时间为1分钟 344 | Defaults timestamp_timeout=1 345 | #设置接收报警和错误邮件的地址为“xxx@abc.com” 346 | Defaults mailto=“xxx@abc.com” 347 | #设置当用户输入错误密码时向mailto用户发送邮件 348 | Defaults mail_badpass 349 | #设置当使用sudo的用户不在sudoers文件内有配置时向mailto用户发邮件 350 | Defaults mail_no_user 351 | 其他选项可根据实际情况参考附录中表2进行设置。 352 | 6 附录 353 | 6.1 Sudo配置文件详解 354 | 6.1.1 配置文件的组成 355 | 用visudo命令打开sudo的配置文件(通常为/etc/sudoers)后,可以看到该文件包含以下几个部分: 356 | # Host alias specification 357 | # User alias specification 358 | # Cmnd alias specification 359 | # Defaults specification 360 | # Runas alias specification 361 | # User privilege specification 362 | Alias 363 | Alias是别名的意思,在配置sudo时可以为多个Host、User、Cmnd和Runas起一个别名,方便统一配置。Alias的定义必须以大写字母开头,后跟大写字母、数字、下划线的组合。 364 | Host_Alias: 365 | Host为主机,表明用户可以在哪些主机上执行后面的命令,Host可以为主机名、主机IP地址、网络/子网掩码、网络组或者为ALL,为ALL时没有主机约束。可以通过以下方式定义Host_Alias: 366 | Host_Alias HOSTS1 = HostName1 ,HostName2 ,HostIP1,HostIP2#定义一个Alias 367 | Host_Alias HOSTS2 = HostName3 : HOSTS3 = HostName4 #定义多个Alias时用“:”隔开 368 | Host_Alias HOSTS4 = HostName5,HOSTS2 369 | User_Alias: 370 | User是要授权的用户名或者组名(如果是系统组,则要在组名前面加“%”;如果是网络组,则要在组名前面加“+”),也可以为ALL,为ALL时没有用户限制即任何用户都可以通过sudo使用后面的命令。User_Alias的定义方法同Host_Alias。 371 | Cmnd_Alias: 372 | Cmnd为要授权的命令,命令中可以带参数,参数中如果出现“,”,“:”,“=”和“\”这些特殊字符,则必须在前面用“\”转义,指明用户可以执行哪些命令;Cmnd也可以为目录(必须以“/”结束),指明用户可以执行哪些目录里的文件(不包括子目录里的文件),为ALL则没有限制即可以执行所有命令。命令要写绝对路径不能只写命令名(如ls命令必须写为/bin/ls),命令之间用逗号分隔。Cmnd_Alias的定义方法同Host_Alias。 373 | Runas_Alias: 374 | Runas为通过sudo要切换到的用户或组(用户可以是用户名或uid,uid之前要加“#”,组可以是系统组前面加“%”或者是网络组前面加“+”),为ALL时可以切换到任何用户。Runas_Alias的定义方法同Host_Alias。 375 | 说明:Host_Alias的定义最好写在“# Host alias specification”下面,其他Alias的定义也是如此。 376 | 6.1.2 配置规则 377 | User Host=(Runas) [Tag:]Commands [,[Tag:]Commands] 378 | User:要授权的对象,可以是一个特定的用户名(如tom),可以是一个组名(系统组:%Group,网络组:+NetGroup),还可以是一个定义好的User_Alias。 379 | Host:要授权的主机,可以是一个特定的主机或一个定义好的Host_Alias。 380 | Runas:通过sudo要切换到的对象,可以是一个特定的用户名(如root),可以是一个组名(系统组:%Group,网络组:+NetGroup),还可以是一个定义好的Runas_Alias。 381 | Tag:常用的Tag标签有NOPASSWD和PASSWD。设置为NOPASSWD时,当用户通过sudo执行后面的Commands时不需要进行身份验证,而设置为PASSWD时需要身份验证。 382 | Commands:要授权的命令,可以是一些特定的命令或一个定义好的Cmnd_Alias。 383 | 说明: 384 | 1) User、Host、Runas和Commands均可设置为ALL,为ALL时表明该项没有限制,也可以在它们的前面使用“!”进行取反操作(如!/bin/ls表示禁止通过sudo执行ls命令); 385 | 2) 每个配置项最好写在“# User privilege specification”下面; 386 | 3) sudo配置文件是从上到下解析的,如果前后设置不同,后面的设置将会覆盖前面的设置,例如: 387 | tom ALL=(root) NOPASSWD:/bin/cp 388 | tom ALL=(root) PASSWD:/bin/cp 389 | 上面两条配置,用户tom通过sudo执行cp命令还是会要求进行身份验证,因为后面一条配置会覆盖前面一条配置。 390 | 6.1.3 默认参数 391 | 通过默认参数的设置(使用Defaults关键字),可以改变使用sudo时的一些行为,例如: 392 | Defaults timestamp_timeout=0 393 | 上面这条设置将会使sudo的有效令牌时间为0,即用户每次使用sudo时都要进行身份验证。 394 | Defaults logfile=/var/log/sudo.log 395 | 这条配置将开启sudo的日志功能,即用户使用sudo的行为会被记录在/var/log/sudo.log文件中。 396 | 其他参数的设置可根据需要参考表2进行设置。 397 | 布尔类型的参数可在前面用“!”进行取反操作。 398 | 表2:默认参数 399 | 参数 类型 描 述 默认值 安全值 400 | authenticate 布尔 如果设置(为on)的话,用户在用sudo执行命令之前必须通过口令(或者通过其他的方式)来验证身分。这个默认选项可以通过设置PASSWD和NOPASSWD标签来覆盖。 on on 401 | root_sudo 布尔 如果设置(为on)的话,root也将被允许使用sudo。将此标志设置为off来阻值用户通过使用类似于“sudo sudo /bin/sh”这样的连锁sudo命令来获得一个root权限的shell。 on off 402 | rootpw 布尔 如果设置(为on)的话,sudo将提示输入root的口令而不是执行sudo命令的用户的口令。 off on 403 | targetpw 布尔 如果设置(为on)的话,sudo将提示输入由sudo的-u选项指定的用户(默认为root)的口令而不是执行sudo的用户的口令。 off on 404 | mail_always 布尔 每当有用户使用sudo时就给mailto user发送一封邮件。 off on 405 | mail_badpass 布尔 当用户使用sudo但是却输入了错误的口令时将给mailto user发送一封邮件。 off on 406 | mail_no_user 布尔 如果使用sudo的用户在sudoers中没有记录的话将给mailto user发送一封邮件。 off on 407 | mail_no_host 布尔 如果使用sudo的用户在sudoers中有记录,但是他不被永许在正在使用的主机上使用sudo,将给mailto user发送一封邮件。 off on 408 | mail_no_perms 布尔 如果用户有使用sudo的权限,但是他试图用sudo使用的命令在sudoers中没有列出来,那么给mailto user发送一封邮件。 off on 409 | insults 布尔 如果设置(为on)的话,可以通过badpass_message参数设置用户输入错误口令时的提示信息 。 off N/A 410 | passwd_tries 整数 sudo向日志中写入一个登录失败记录并退出之前允许用户输入口令的次数。 3 3 411 | timestamp_timeout 整数 sudo再次询问口令之前的时间(以分钟记)。如果想要总是询问口令的话请把此值设置为0。如果设置为负数的话,用户的时间戳永远不会过期,这可以用来允许用户分别使用sudo -v和sudo -k来建立或者删除他们自己的时间戳。 5 5 412 | passwd_timeout 整数 sudo询问口令的超时时间(分钟记)。设置为0可以取消口令超时。 413 | 5 1 414 | mailsub 字符串 发送给mailto user的邮件使用的主题。转义字符%h将被扩展为机器的主机名。 *** SECURITY information for %h *** N/A 415 | mailerpath 字符串 用来发送报警邮件的邮件程序的路径。 sendmail的路径。 416 | N/A 417 | mailto 字符串 发送报警邮件和错误邮件的目的地址。这个地址必须用双引号引起来,以免sudo解释"@"符号。 root N/A 418 | badpass_message 字符串 当用户输入了错误的口令时显示的信息。除非设置了insults的话,否则不可设置。 419 | Sorry,try again. N/A 420 | passprompt 字符串 询问口令时的提示。可以被sudo的-p选项或者SUDO_PROMPT环境变量所覆盖。这里提供了两个转义字符:%u将被扩展为用户的登录名,而%h将被扩展为本地主机名。 421 | Password: N/A 422 | runas_default 字符串 使用sudo但没有指定-u标志时使用的默认用户。 root root 423 | logfile 字符串 sudo日志的存放位置。设置一个路径来打开日志功能,取消设置将关闭日志功能。 无 /var/log/sudo.log 424 | exempt_group 字符串 在此组中的用户将不要求口令,此选项默认没有设置。 无 不设置 425 | 其他参数… 426 | 427 | 6.2 案例 428 | 429 | -------------------------------------------------------------------------------- /Linux-Safe-configuration/sudo_Security_Configuration/readme.txt: -------------------------------------------------------------------------------- 1 | sudo安全配置规范-对于sudo是否存在越权问题的排查可以使用自动化工具进行排查 2 | https://github.com/jidongdeatao/LinuxTest/blob/master/NewVerson/SecurityTest/TestCase/SudoersSafe/TestCase_SudoerSafe.py 3 | 4 | 5 | 目录 6 | 1 Sudo介绍 1 7 | 1.1 Sudo简介 1 8 | 1.2 应用场景 1 9 | 1.3 Sudo命令使用方法 1 10 | 2 主要问题 2 11 | 2.1 sudoer配置文件直接配置了高风险系统命令 2 12 | 2.2 属于低权限用户的脚本或程序不能以高权限帐号运行 2 13 | 3 Sudo安全配置 3 14 | 3.1 配置示例 3 15 | 3.2 命令分类 4 16 | 3.3 限制访问范围 6 17 | 3.4 不能配置sudo权限的命令 9 18 | 3.5 禁止命令规避措施 11 19 | 3.6 合理配置sudo执行命令的文件权限 12 20 | 3.7 开启日志功能 12 21 | 3.8 合理配置权限 13 22 | 3.9 设置sudo文件权限 13 23 | 3.10 排查可用sudo来执行的脚本的权限是否配置错误 13 24 | 3.10.1 攻击原理 13 25 | 3.10.2 正确的配置 14 26 | 3.11 排查sudo里面配置的脚本或目录实际不存在 14 27 | 3.12 Sudo测试分类和测试方法分类 14 28 | 3.13 其他排查 16 29 | 4 防御方法推荐 17 30 | 5 SecureCAT工具排查说明 18 31 | 5.1 其他安全选项 18 32 | 6 附录 19 33 | 6.1 Sudo配置文件详解 19 34 | 6.1.1 配置文件的组成 19 35 | 6.1.2 配置规则 20 36 | 6.1.3 默认参数 21 37 | 6.2 案例 24 38 | 6.2.1 场景1:脚本中直接调用执行低权限用户脚本 24 39 | 6.2.2 场景2:脚本中从低权限配置文件中读取内容作为参数 25 40 | 6.2.3 场景3:脚本将输入参数拼入路径,参数中传入相对路径 27 41 | 6.2.4 场景4:脚本中的操作涉及低权限用户目录 28 42 | 6.2.5 场景5:脚本中的校验和操作存在时间间隙 29 43 | 6.2.6 场景6:脚本输入参数直接作为命令执行 31 44 | 6.2.7 场景7:脚本直接引用外部输入作为路径,并对该路径下文件做属主、删除等操作 34 45 | 6.2.8 场景8:脚本直接引用外部输入作为文件名,并对该文件进行cp操作 37 46 | 6.2.9 场景9:脚本直接引用公共脚本中的某个函数,且公共脚本对当前用户拥有写权限。 39 47 | 6.2.10 场景10:脚本直接引用外部输入作为路径,作为chown/chmod/rm 的参数 40 48 | 6.2.11 场景11:脚本引入变量为内部目录/文件参数,且对该目录有属主/写操作 42 49 | 6.2.12 场景12:脚本引入变量为内部目录/文件参数,但当前用户对该目录可写 43 50 | 6.2.13 场景13:脚本执行过程中引入临时文件,并属主给当前user后执行mv操作 44 51 | 6.2.14 场景14:脚本执行过程中引入脚本,但脚本路径为相对路径 45 52 | 6.2.15 场景15:Sudo内定义可NOPassword的用户过多,利用其它用户身份间接提权 46 53 | 54 | -------------------------------------------------------------------------------- /Linux信息获取.txt: -------------------------------------------------------------------------------- 1 | Linux信息自动化收集 2 | 程序地址: https://github.com/l3m0n/linux_information 3 | 4 | 5 | 当前权限判断:是否为root 6 | whoami 7 | 1、系统区分 8 | debian系列:debian、ubuntu 9 | redhat系列:redhat、centos 10 | 是否为docker、或者为虚拟机 11 | 分为通用模块、单独模块的信息获取 12 | 2、系统信息收集 13 | 内核(是否为x64还是x86):uname -a 14 | 版本:cat /etc/issue 15 | cat /etc/*-release 16 | 网络地址\mac地址\ipv6地址:ifconfig 17 | 主机名:hostname 18 | hosts: 19 | cat /etc/hosts 20 | cat /etc/resolv.conf 21 | 3、用户信息 22 | who 23 | last 24 | 系统用户: 25 | 获取用户名、gid、uid、home路径:awk -F ':' '{print $1,$3,$4,$6;}' /etc/passwd 26 | 获取用户组:cat /etc/group 27 | **获取hash**:cat /etc/shadow 28 | 列出超级用户:grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' 29 | 查看用户操作:cat ~/.bash_history 30 | 获取在线用户:w 31 | 4、服务程序 32 | 需要实现:得到系统安装程序以及服务,版本信息和运行权限,用文档封装一下 33 | 端口:netstat 34 | 进程:ps -aux 35 | ps -A -o user,pid,tty,start,time,command | grep -E "[^]]$" 36 | 程序: 37 | dpkg -l 38 | rpm -qa 39 | 5、敏感文件 40 | /etc/目录下 41 | 计划任务 42 | 日志文件 43 | bash_history 44 | find / -type f -iname "*.bash_history" -o -iname "*config*" -o -iname "web.xml" -o -iname "*database*" -o -iname "*pass*" 2>/dev/null 45 | config 46 | web.xml 47 | 6、常见可使用程序 48 | nmap 49 | nc 50 | netcat 51 | wget 52 | tcpdump 53 | wireshark 54 | rpm 55 | yum 56 | apt-get 57 | ftp 58 | ssh 59 | telnet 60 | scp 61 | nslookup 62 | ruby 63 | 6、交互通信的ip 64 | hosts 65 | netstat -antpu 66 | arp -a 67 | tracert 68 | 7、提权帮助 69 | 根据内核去确认漏洞 70 | 8、信息展示 71 | 整体流程:信息获取 -> 信息处理 -> 信息输出 72 | 系统信息: 73 | 内核、x86|x64、主机类型、主机名 74 | ip地址、mac地址 75 | 是否存在exp获取root 76 | 用户信息: 77 | 存在的用户、在线用户 78 | 用户组 79 | last信息 80 | 用户操作信息 .bash_history 81 | 用户hash 82 | 服务信息: 83 | 端口,可能的服务名 84 | 进程,可能的进程名,进程权限,进程开启时间 85 | 文件信息: 86 | 敏感文件(password/config/database) 87 | 打包文件+运行文件(.zip/.tar.gz/.pl/.sh/.py) 88 | 服务配置文件(httpd.conf) 89 | log文件(做处理,只显示log所在目录) 90 | 常见的信息文件扫描 91 | //需要通过上面获取的信息整理出来 92 | 程序信息: 93 | 程序名、程序端口、运行的进程、版本、配置文件 94 | 命令信息: 95 | 可执行的一些程序 96 | 通信信息: 97 | hosts 98 | arp缓存 99 | 端口 100 | 结构信息: 101 | 内网主机存活 102 | 9、参考 103 | 基础内核信息: 104 | uname -a 2>/dev/null 105 | cat /proc/version 2>/dev/null 106 | cat /etc/*-release 2>/dev/null 107 | 主机名: 108 | hostname 2>/dev/null 109 | 最后用户登录的信息: 110 | lastlog |grep -v "Never" 2>/dev/null 111 | strips out username uid and gid values from /etc/passwd 112 | cat /etc/passwd | cut -d ":" -f 1,2,3,4 2>/dev/null 113 | 列出所有用户的组 114 | for i in $(cat /etc/passwd 2>/dev/null| cut -d":" -f1 2>/dev/null);do id $i;done 2>/dev/null 115 | 查询是否有hash存储在/etc/passwd(*nix中) 116 | grep -v '^[^:]*:[x]' /etc/passwd 2>/dev/null 117 | 118 | 根据uid列出本地用户: 119 | grep -v "^#" /etc/passwd | awk -F: '$3 == 0 || $3 == 500 || $3 == 501 || $3 == 502 || $3 == 1000 || $3 == 1001 || $3 == 1002 || $3 == 2000 || $3 == 2001 || $3 == 2002 { print }' 120 | 读取shadow文件 121 | cat /etc/shadow 2>/dev/null 122 | bsd的shadow文件 123 | cat /etc/master.passwd 2>/dev/null 124 | 能够sudo不需要提供密码 125 | echo '' | sudo -S -l 2>/dev/null 126 | 检查root目录是否存在 127 | ls -ahl /root/ 2>/dev/null 128 | 显示home目录情况 129 | ls -ahl /home/ 2>/dev/null 130 | 寻找文件我们能写但是不属于我们的文件 131 | find / -writable -not -user \`whoami\` -type f -not -path "/proc/*" -exec ls -al {} \; 2>/dev/null 132 | 寻找ssh公钥 133 | find / -name "id_dsa*" -o -name "id_rsa*" -o -name "known_hosts" -o -name "authorized_hosts" -o -name "authorized_keys" 2>/dev/null |xargs -r ls 134 | root是否能登录ssh 135 | grep "PermitRootLogin " /etc/ssh/sshd_config 2>/dev/null | grep -v "#" | awk '{print $2}' 136 | 如果返回yes则可以登录 137 | 环境变量 138 | echo $PATH 2>/dev/null 139 | 列出能用的shells 140 | cat /etc/shells 2>/dev/null 141 | hash的密码加密政策 142 | cat /etc/login.defs 2>/dev/null | grep "PASS_MAX_DAYS\|PASS_MIN_DAYS\|PASS_WARN_AGE\|ENCRYPT_METHOD" 2>/dev/null | grep -v "#" 2>/dev/null 143 | 所有的计划任务配置文件 144 | ls -la /etc/cron* 2>/dev/null 145 | 获取计划任务内容 146 | cat /etc/crontab 2>/dev/null 147 | ubuntu获取计划任务 148 | ls -la /var/spool/cron/crontabs 2>/dev/null 149 | ls -la /etc/anacrontab 2>/dev/null; cat /etc/anacrontab 2>/dev/null 150 | ls -la /var/spool/anacron 2>/dev/null 151 | 获取每个用户的计划任务 152 | cat /etc/passwd | cut -d ":" -f 1 | xargs -n1 crontab -l -u 2>/dev/null 153 | 获取ifconfig 154 | /sbin/ifconfig -a 2>/dev/null 155 | dns设置 156 | cat /etc/resolv.conf 2>/dev/null | grep "nameserver" 157 | 路由配置 158 | route 2>/dev/null | grep default 159 | 正在监听的tcp端口 160 | netstat -antp 2>/dev/null 161 | udp端口 162 | netstat -anup 2>/dev/null 163 | 正在运行的程序 164 | ps aux 2>/dev/null 165 | 查看进程路径和权限 166 | ps aux | awk '{print $11}'|xargs -r ls -la 2>/dev/null |awk '!x[$0]++' 167 | 获取inetd.conf文件(监视网络的守护进程) 168 | cat /etc/inetd.conf 2>/dev/null 169 | cat /etc/inetd.conf 2>/dev/null | awk '{print $7}' |xargs -r ls -la 2>/dev/null 170 | cat /etc/xinetd.conf 2>/dev/null 171 | cat /etc/xinetd.conf 2>/dev/null | awk '{print $7}' |xargs -r ls -la 2>/dev/null 172 | 列举各种服务的管理脚本 173 | ls -la /etc/init.d 2>/dev/null 174 | 寻找不是root的: 175 | find /etc/init.d/ \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null 176 | ls -la /etc/rc.d/init.d 2>/dev/null 177 | find /etc/rc.d/init.d \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null 178 | ls -la /usr/local/etc/rc.d 2>/dev/null 179 | find /usr/local/etc/rc.d \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null 180 | 获取mysql版本 181 | mysql --version 2>/dev/null 182 | mysqladmin -uroot version 2>/dev/null 183 | 获取sudo版本 184 | sudo -V 2>/dev/null| grep "Sudo version" 2>/dev/null 185 | 测试root/root能否登录 186 | mysqladmin -uroot -proot version 2>/dev/null 187 | postgres版本 188 | psql -V 2>/dev/null 189 | 登录成功 190 | psql -U postgres template0 -c 'select version()' 2>/dev/null | grep version 191 | apache详情 192 | apache2 -v 2>/dev/null; httpd -v 2>/dev/null 193 | apache的运行用户 194 | cat /etc/apache2/envvars 2>/dev/null |grep -i 'user\|group' |awk '{sub(/.*\export /,"")}1' 195 | plan(could contain useful information) 196 | find /home /usr/home -iname *.plan -exec ls -la {} \; -exec cat {} 2>/dev/null \; 197 | rhosts(these may allow us to login as another user etc.) 198 | find /home -iname *.rhosts -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \; 199 | .plan 200 | .rhosts 201 | hosts.equiv 202 | /etc/exports 203 | .conf 204 | .log 205 | .ini 206 | .*_history 207 | /root/.*_history 208 | ls -la /var/mail 2>/dev/null 209 | head /var/mail/root 2>/dev/null 210 | 软件安装判断流程 211 | dpkg -l 212 | rpm -qa 213 | etc目录配置文件 214 | know it then do it 215 | 216 | 超详细的Linux渗透常用命令 217 | http://www.91ri.org/17575.html 218 | -------------------------------------------------------------------------------- /ManagementTechnology/ManagementSecurity.txt: -------------------------------------------------------------------------------- 1 | 管理层安全 2 | 管理层主要描述如何通过管理制度确保人员正确并安全的使用产品,降低人为因素给产品带来的安全威胁。 3 | 4 | 1.组织和过程 5 | 确定组织的范围,明确组织中的成员,并确定成员使用产品的规范,规定产品的使用过程,对产品的使用信息进行记录,以便在产生安全威胁时进行定位和回溯。从流程和规范上确保用户的行为不存在安全风险,保障产品的安全性。 6 | 7 | 2.账户和权限管理 8 | 按照账户职责的不同对系统中的账户进行严格的区分,为每个账户分配适当的权限,确保能完成其职责范围内的工作,做到账户的权限不过大、不相互交叉,从而满足最小权限原则。 9 | 同时用户的职责要做到明确和互斥,用户只能获取到与其职责相匹配的账户,账户不能交叉使用。 10 | 11 | 3.日志检查和稽核 12 | 日志检查和稽核是一项非常重要的工作,通过该项工作可以检查到系统是否遭受攻击。对日志进行分类,主要关注系统登录登出、用户删除创建、关键目录存取、关键文件权限变革、特权操作等事件。 13 | 稽核的事件可分为两类:成功的事件与失败事件。成功的事件是指使用者已经成功进行操作,而失败的事件则是指使用者曾经试图操作但是失败了。 14 | 失败的事件对于追踪试图攻击环境的行为很有帮助,然而要分析成功的事件要困难很多。虽然绝大部分成功的稽核事件都只是系统中一般的正常活动,但处心积虑的攻击者在成功控制系统后也会产生成功的事件,因此事件的模式和事件本身一样重要。 15 | 例如,在连续不断失败之后获取的成功,就表示可能有人试图攻击而且最终得逞。 16 | 无论什么情况,都应该将稽核事件与其他相关的使用者的信息结合起来。例如,某用户对应的账户被锁定,这时就可以稽查该用户是否在锁定期间有非法登录的情况。 17 | 应该指派特定的用户进行日志检查和稽核工作,并设定只有该用户可以执行这项操作,确保日志的安全;同时还要保证管理员每天进行一次日志检查和稽核操作,并给出检查和稽核结果。 18 | 19 | 4.补丁管理 20 | 对补丁进行分类管理,记录补丁的使用过程,确保任何补丁的升级都有日志记录,以便于后期检查。 21 | 22 | 5.系统备份 23 | 系统备份是一项及其重要的工作,操作得当的话,它们是防范灾害的最后一道防线。即使主业务系统全部被摧毁,也可以在其他的计算机上通过正确生成和保护完好的备份进行恢复。 24 | 基本的备份方针有很多。但是,在设计和搭建备份环境时,需要注意以下几点: 25 | 镜像不能代替备份。镜像可以防范硬盘存储器的失效,但是它对于已删除的或损坏的文件无能为力。 26 | 如果文件在镜像中删除了,那么它就同时在镜像和原始位置消失了,因此它必须通过某些外部的方法才可以取回。最常用的(但不是唯一的)外部恢复方法是恢复存储在备份磁盘上的数据。 27 | 定期测试可恢复性。如果您无法恢复备份数据,那么就在创建备份上浪费了大量的时间。 28 | 定期测试恢复性并不要求测试所创建的每一个备份,但是必须定期检测每一个磁盘驱动器以便确保备份是可读的,并且必须进行随机抽样测试以便确保它们可以正确地读取和恢复。 29 | 保持磁头清洁。弄脏的磁头可能让备份看起来似乎成功地完成了,然而事实上磁带上只是写入了无用信息。 30 | 注意备份介质的平均故障时间(Mean Time Between Failure,MTBF)。如果制造商建议存储介质的有效使用寿命是1000次备份,那么就只使用它1000次,然后就不要它。 31 | 重要的数据要作双重备份。为了更好地确保数据的寿命和安全,明智的做法是存储一个异地备份。 32 | -------------------------------------------------------------------------------- /ManagementTechnology/NetworkLayerSecurity.txt: -------------------------------------------------------------------------------- 1 | 网络层安全 2 | 网络层安全就是通过采用一系列安全措施,使得网络系统得到应有的安全保护,为在该网络平台上运行的业务系统提供应用的支持, 3 | 包括一切访问网络资源或使用网络服务相关的安全保护。 4 | 网络层安全技术 5 | 包括网络拓朴安全设计、网络设备保护、网络隔离、网络边界保护(如防火墙)、网络安全检测(如IDS)、网络数据加密(如VPN)、网络安全扫描、网络安全管理和二层安全(如IP/MAC绑定和DHCP隔离)等多个方面。 6 | 在网络安全方面着重关注服务器内部网络安全问题,主要通过防火墙技术来保证服务器内部网络安全。iptables内容请参见主机防火墙。 7 | 8 | 网络层安全维护: 9 | 1.防火墙规则配置 10 | 防火墙需要配置一系列的规则,以决定什么样的数据包能够通过。防火墙基于iptables实现,系统管理员可以通过iptables配置防火墙规则。 11 | 查看当前防火墙配置:iptables -S 12 | 更改防火墙规则配置:防火墙规则配置请参考iptables相关帮助,此处不提供 13 | 14 | 2.远程接入控制主要是SSH远程接入,因此主要描述SSH远程接入的维护内容。 15 | 1)设置账户密钥 16 | SSH支持2种认证方式:基于口令的认证和基于密钥的认证。 17 | 基于口令的认证方式,只要知道账户和口令就可以登录远程主机,但是容易受到“中间人”攻击(仿冒目的服务器)。 18 | 基于密钥的认证需要生成公私密钥对,将公钥存放于服务器,登录服务器时使用密钥进行验证。与口令认证相比,密钥认证不需要在网络上传送口令,且可以防范“中间人”攻击。 19 | 设置账户密钥的步骤(客户端也为Linux系统)如下: 20 | 1.在服务器端,修改/etc/ssh/sshd_config配置文件如下字段的值: 21 | RSAAuthentication yes 22 | PubkeyAuthentication yes 23 | AuthorizedKeysFile .ssh/authorized_keys 24 | PasswordAuthentication no 25 | ChallengeResponseAuthentication yes 26 | StrictModes yes 27 | 2.在客户端使用ssh-keygen生成公私密钥对,生成文件存放于/root/.ssh/id_rsa,密钥口令为空 28 | 3.在客户端使用ssh-copy-id将公钥传递至远程服务器 29 | (如果缺少ssh-copy-id命令请先安装ssh-copy-id工具,或者使用scp等将公钥拷贝至远程服务器) 30 | 4.在客户端使用密钥认证,登录远程服务器 31 | 2)远程连接管理 32 | 查看当前SSH服务连接 33 | 可以通过以下命令查看当前系统所有的SSH服务连接。 34 | netstat -a | grep ".*ssh.*ESTABLISHED.*" 35 | 关闭异常SSH服务连接 36 | 使用以下命令关闭异常SSH服务连接。 37 | iptables -I INPUT -s 192.168.224.1 -m state --state ESTABLISHED -j DROP其中192.168.224.1为异常客户端的IP。 38 | 如果异常情况为误报或异常已经被清除,则使用如下命令删除上述限制。 39 | iptables -D INPUT -s 192.168.224.1 -m state --state ESTABLISHED -j DROP 40 | 3)远程接入日志审计 41 | 为保证系统安全,系统管理员需要每天检查远程接入日志,日志信息存放在/var/log/messages文件中。 42 | 查看SSH登录日志。命令示例如下: 43 | cat /var/log/messages | grep ".*sshd.*for.*from.*" 44 | 45 | -------------------------------------------------------------------------------- /ManagementTechnology/SystemLayerSecurity.txt: -------------------------------------------------------------------------------- 1 | 系统层安全 2 | 系统层安全是安全的核心,主要包括操作系统层面采用的各种安全技术。 3 | 4 | 1.系统层安全架构 5 | 操作系统作为信息系统的核心,为网络服务、数据库系统等上层应用的正常运行提供了基本保障。 6 | 7 | 2.身份标识与鉴别 8 | 操作系统通过PAM机制来实现用户的身份标识与鉴别。 9 | 10 | 3.安全协议 11 | 安全协议,通常也被称作口令协议,它是以口令学为基础的消息交换协议,其目的是在网络环境中提供各种安全服务。 12 | 口令学是网络安全的基础,但网络安全不能单纯依靠安全的口令算法。 13 | 安全协议是网络安全的一个重要组成部分,需要通过安全协议进行实体之间的认证、在实体之间安全地分配密钥或其他各种秘密、确认发送和接收的消息的非否认性等。 14 | 15 | 4.自主访问控制 16 | 访问控制,是指控制系统中主体对客体的访问权限。 17 | 其中主体是指引起信息在客体间交换或者改变系统状态的主动实体,通常是发出访问请求的对象,例如进程; 18 | 客体是指包含或接收数据的被动实体,是信息的载体,通常是被访问的对象,例如文件; 19 | 而权限是指对客体进行特定模式访问的操作许可。 20 | 21 | 5.强制访问控制 22 | 强制访问控制MAC(Mandatory Access Control)的基本思想是:每个主体、客体(文件、消息队列、共享区域、信号量)都赋予相应的安全属性(标记),该属性由管理员或系统按严格的规则设置,用户不能修改。 23 | 24 | 6.内存客体重用 25 | 客体重用机制保证在主体活动结束后,主体占用的存储客体中的信息将不能被另一个主体使用。 26 | 27 | 7.主机防火墙 28 | 操作系统默认安装iptables防火墙。 29 | ############################################################################################# 30 | 1.系统层安全架构 31 | 操作系统作为信息系统的核心,为网络服务、数据库系统等上层应用的正常运行提供了基本保障。 32 | 然而仅依赖应用空间的安全机制,无法从根本上解决信息系统的安全问题。没有操作系统安全机制的保障,应用空间的安全机制容易遭受破坏、旁路和欺骗攻击。 33 | 上层应用的安全机制,诸如访问控制和加密等必须依赖操作系统安全机制的支持,才能实现其安全功能。 34 | 操作系统提供身份标识与鉴别、安全协议、细粒度访问控制、强制访问控制、文件完整性检查、安全审计、内存客体重用、可信路径等安全机制,保障操作系统的安全性,为各类上层应用提供安全基础。 35 | 操作系统的安全架构如图1所示 36 | 安全加固工具 37 | | 38 | \ / 39 | IDENT完成用户的身份标识与鉴别 40 | | 41 | \ / 42 | ACL细粒度自主访问控制 43 | | 44 | \ / 45 | LSM内核安全框架(包含MAC强制访问控制)<->CAP权能策略 46 | | 47 | \ / 48 | AUDIT安全审计 49 | MOR SAK SP 50 | 内存客体存用 可信路径 安全协议 51 | 52 | 相关说明如下: 53 | 安全加固工具,提供方便的安全配置与管理,实现对系统服务、文件权限、内核参数、日志审计、账户口令等的安全加固。 54 | IDENT完成用户的身份标识与鉴别;可信路径提供安全注意键,启动可信的登录流程。 55 | ACL通过访问控制列表实现细粒度的自主访问控制。 56 | LSM(Linux Security Module)内核安全框架 57 | CAP基于LSM框架实现MAC强制访问控制。 58 | AUDIT负责进行安全审计。 59 | MOR禁止内存客体重用。 60 | SP为系统集成的安全协议。 61 | ############################################################################################# 62 | 2.身份标识与鉴别 63 | 操作系统通过PAM机制来实现用户的身份标识与鉴别。 64 | 可插入式验证模块PAM(Pluggable Authentication Module),是SUN公司最早提出和开发的一套为系统登录应用程序提供验证和相关的安全服务的套件。 65 | 主要功能包括认证管理、账户管理、会话管理和口令管理。 66 | 操作系统默认使用Linux-PAM。 67 | ############################################################################################# 68 | 3.安全协议 69 | 安全协议,通常也被称作口令协议,它是以口令学为基础的消息交换协议,其目的是在网络环境中提供各种安全服务。口令学是网络安全的基础,但网络安全不能单纯依靠安全的口令算法。 70 | 安全协议是网络安全的一个重要组成部分,需要通过安全协议进行实体之间的认证、在实体之间安全地分配密钥或其他各种秘密、确认发送和接收的消息的非否认性等。 71 | 安全目标是多种多样的。例如,认证协议的目标是认证参加协议的实体的身份。此外,许多认证协议还有一个附加的目标,即在主体之间安全地分配密钥或其他各种秘密。 72 | 操作系统支持的安全协议如下: 73 | SSH 74 | SSL 75 | IPSec 76 | SFTP 77 | ############################################################################################# 78 | 4.自主访问控制 79 | 操作系统通过UGO和ACL机制实现自主访问控制。 80 | ############################################################################################# 81 | 5.强制访问控制 82 | 强制访问控制MAC(Mandatory Access Control)的基本思想是:每个主体、客体(文件、消息队列、共享区域、信号量)都赋予相应的安全属性(标记), 83 | 该属性由管理员或系统按严格的规则设置,用户不能修改。 84 | 主体对客体的访问由强制安全控制机制按照某种安全策略,根据主、客体安全属性,确定是否允许访问。若系统判断不许访问,任何人(包括客体主)也不能访问。 85 | ############################################################################################# 86 | 6.内存客体重用 87 | 客体重用机制保证在主体活动结束后,主体占用的存储客体中的信息将不能被另一个主体使用。 88 | 在计算机信息系统可信计算机的空闲存储客体空间中,对客体初始指定、分配或再分配一个主体之前,撤消该客体所含信息的所有授权。 89 | 当主体获得对一个已被释放的客体的访问权时,当前主体不能获得原主体活动所产生的任何信息。 90 | 内存客体重用是用于防止新主体获得先前主体残留在内存中的信息。内存客体重用在分配内存时实施,它对内存进行覆写,以达到禁止重用目的。 91 | ############################################################################################# 92 | 7.主机防火墙 93 | 操作系统默认安装iptables防火墙。 94 | 防火墙是抵御网络攻击的第一道防线,它坐落于网络之间的枢纽点,保护某个网络以抵御来自其他网络的攻击。它放置的位置必须是受保护网络与其他网络的唯一进出口点。如果有其他入口节点可以进入受保护网络,防火墙将毫无作用。 95 | Linux内核内置了一套防火墙机制,称为Netfilter。而设置和控制Netfilter的工具是iptables。本系统就是使用iptables制定的防火墙规则。iptables的规则链组织结构如图1所示。 96 | ############################################################################################# 97 | 98 | 系统层安全维护: 99 | 一、系统层账户清单 100 | 二、账户口令维护 101 | 1.账户维护策略 102 | 进行严格的账户管理,实施严格的账户策略。 103 | 严格控制增加、修改、删除系统中的账户、群组。 104 | 删除所有系统上不使用的账户。 105 | 管理员创建账户时,需要明确权限和职责、操作建议。 106 | 管理员代行root权限时,需要先自行登录再通过su切换到root账户。 107 | 采用sha512对系统口令进行加密。 108 | 2.创建账户 109 | 在遵从最小账户原则的基础上,管理员可根据需要创建账户。使用系统命令useradd来创建新的账户。 110 | 说明: 111 | 仅root用户可以创建和删除账户。 112 | 操作说明 113 | useradd [-u UID] [-g GID] [-d HOME] [-mM] [-s shell] username [-p PASSSWORD]相关参数说明请参见表1。 114 | 创建账户参数说明 115 | -u 直接给予一个UID。 116 | -g 直接给予一个GID。 117 | -d 直接将该用户的根目录指向已经存在的目录(系统不会再建立)。 118 | -m 新建该用户的根目录,并将/etc/skel中的文件复制到用户根目录。 119 | -M 不建立用户的根目录。 120 | -s 定义其使用的shell。 121 | -p 设置用户的密码。 122 | 注意: 123 | 创建账户时,若使用-p参数设置密码,使用history命令可以查看到该账户设置的明文密码,导致账户口令泄露 124 | ,因此不建议使用-p参数。设置、修改口令请使用passwd命令,具体请参照修改口令。 125 | 操作举例 126 | 创建一个账户名称为test的普通用户。 127 | useradd test创建一个普通账户,其根目录为home/test。 useradd -d /home/test test 128 | 3.删除账户 129 | userdel [-r] account 130 | 参数 参数说明 131 | -r 删除该用户目录下的所有目录。 132 | 4.设置账户的有效期 133 | 操作说明 134 | chage [-m mindays] [-M maxdays] [-d lastday] [-I inactive] [-E expiredate] [-W warndays] user 135 | 参数 参数说明 136 | -m 口令可更改的最小天数。为零时代表任何时候都可以更改口令。 137 | -M 口令保持有效的最大天数。为-1时可删除这项口令的检测。 138 | -d 上一次更改的日期。 139 | -I 列出当前的设置。由非特权用户来确定他们的口令或账户何时过期。 140 | -E 账户到期的日期。过了这天,此账户将不可用。 141 | -W 用户口令到期前,提前收到警告信息的天数。 142 | 对于超过期限的用户,应该检查是否允许继续使用,如果不使用则应该将这些用户删除,防止用户被非授权使用, 143 | 删除账户请参考删除账户小节 144 | 5.变更账户权限 145 | 操作说明 146 | groupmems -g group [-a|-d] user相关参数说明请参见表1。 147 | -g 指定群组名称。 148 | -a 将指定账户加到指定群组。 149 | -d 将指定账户加从指定群组中移除。 150 | 操作举例:将用户test增加到特权组root。groupmems -g root -a test 151 | 6.锁定账户 152 | 管理员可锁定暂时不使用的账户,之后根据实际情况再进行解锁。通过系统命令passwd或usermod来锁定账户。 153 | 操作说明 154 | 锁定账户可使用如下命令: 155 | passwd -l user 或 156 | usermod -L user 157 | 操作举例:锁定test账户。passwd -l test 158 | 7.解锁账户 159 | 操作说明 160 | 解锁账户可使用如下命令: 161 | passwd -u user 或 162 | usermod -U user 163 | 8.修改口令 164 | 操作说明 165 | passwd [-g] [name] 166 | -g:表示修改指定群组的口令 167 | 9.监控账户操作 168 | 管理员需要定期检查各个账户的操作,包括账户是否操作异常或者非法操作。 169 | 操作说明 170 | 打开账户根目录下的“.bash_history([home]/.bash_history)”文件,查看账户的操作历史,确认是否存在非法或异常操作。 171 | 10.检查账户 172 | 打开文件/etc/passwd,比较文件中的账户与主机账户清单描述的账户是否一致。若不一致,建议查出多余账户存在的原因,若无故增加,则应删除。 173 | 检查系统账户是否可登录,即账户的shell是否为/sbin/nologin(/etc/passwd文件每行最后一个字段值);若不是,则应改为/sbin/nologin 174 | 11.系统口令加密算法维护 175 | 管理员可以对系统的口令加密算法进行定期检查,查看当前系统的加密算法是否与设定的算法一致。默认情况下的加密算法是sha512。 176 | 操作说明:要确认账户root的口令加密算法,打开/etc/pam.d/password-auth和/etc/pam.d/system-auth文件, 177 | 查看password sufficient pam_unix.so后的参数中的口令加密算法为sha512。 178 | 到口令加密算法中找到sha512对应的识别码是6。 179 | 打开/etc/shadow文件,发现root账户第二字段起始字符为“$6$”,说明与设定的算法一致。 180 | 三、系统安全维护: 181 | 1.服务维护策略 182 | 管理建议 183 | 最小服务和组件。 184 | 区分服务器的用途和角色,尽量避免安装不必要的服务和组件。 185 | 关闭未使用的服务。 186 | 服务内部组件也应采用上述原则进行裁减。 187 | 2.检查进程 188 | 管理员进行安全维护时,需要检查是否有多余的进程,及时发现不合理的进程并处理,避免风险。 189 | 操作说明 190 | 用系统命令“ps -aux”查看系统当前所有进程。 191 | 查看是否有多余进程(根据用户安装的组件不同,运行的进程有差异,具体由用户根据实际情况甄别)。 192 | 若发现有多余进程,则用系统命令“kill -9 PID”删除该进程。 193 | 3.检查服务/端口 194 | 管理员应检查是否有多余的服务,如果有多余服务及时停止,以避免安全风险。 195 | 操作说明 196 | 用户执行systemctl list-units --type=service命令查看系统所有服务。 197 | 查看是否有不需要使用的服务(根据用户安装的组件不同,开启服务有差异,具体由用户根据实际情况甄别)。 198 | 若存在不需要的服务,可用如下方式删除服务。 199 | 以rsyslog服务为例,如下操作: 200 | 执行systemctl stop rsyslog命令停止该服务运行。 201 | 执行systemctl disable rsyslog命令关闭该服务随机启动。 202 | 警告: 203 | 本操作前请务必先确认该服务为不需要的服务。 204 | 4.检查主机间通信 205 | 管理员应检查是否有多余的、非法的主机间通信,避免风险。 206 | 操作说明 207 | 用系统命令“netstat -an”查看当前系统中开放的所有端口。 208 | 参考通信矩阵中的端口列表,检查当前是否有多余开放的端口。 209 | 若存在多余端口,确认是否有必要开放,若无必要,则应关闭。 210 | 211 | 212 | -------------------------------------------------------------------------------- /ManagementTechnology/SystemLayerSecurityTest.txt: -------------------------------------------------------------------------------- 1 | 系统层安全维护: 2 | 一、系统层账户清单 3 | 二、账户口令维护 4 | 1.账户维护策略 5 | 进行严格的账户管理,实施严格的账户策略。 6 | 严格控制增加、修改、删除系统中的账户、群组。 7 | 删除所有系统上不使用的账户。 8 | 管理员创建账户时,需要明确权限和职责、操作建议。 9 | 管理员代行root权限时,需要先自行登录再通过su切换到root账户。 10 | 采用sha512对系统口令进行加密。 11 | 2.创建账户 12 | 在遵从最小账户原则的基础上,管理员可根据需要创建账户。使用系统命令useradd来创建新的账户。 13 | 说明: 14 | 仅root用户可以创建和删除账户。 15 | 操作说明 16 | useradd [-u UID] [-g GID] [-d HOME] [-mM] [-s shell] username [-p PASSSWORD]相关参数说明请参见表1。 17 | 创建账户参数说明 18 | -u 直接给予一个UID。 19 | -g 直接给予一个GID。 20 | -d 直接将该用户的根目录指向已经存在的目录(系统不会再建立)。 21 | -m 新建该用户的根目录,并将/etc/skel中的文件复制到用户根目录。 22 | -M 不建立用户的根目录。 23 | -s 定义其使用的shell。 24 | -p 设置用户的密码。 25 | 注意: 26 | 创建账户时,若使用-p参数设置密码,使用history命令可以查看到该账户设置的明文密码,导致账户口令泄露 27 | ,因此不建议使用-p参数。设置、修改口令请使用passwd命令,具体请参照修改口令。 28 | 操作举例 29 | 创建一个账户名称为test的普通用户。 30 | useradd test创建一个普通账户,其根目录为home/test。 useradd -d /home/test test 31 | 3.删除账户 32 | userdel [-r] account 33 | 参数 参数说明 34 | -r 删除该用户目录下的所有目录。 35 | 4.设置账户的有效期 36 | 操作说明 37 | chage [-m mindays] [-M maxdays] [-d lastday] [-I inactive] [-E expiredate] [-W warndays] user 38 | 参数 参数说明 39 | -m 口令可更改的最小天数。为零时代表任何时候都可以更改口令。 40 | -M 口令保持有效的最大天数。为-1时可删除这项口令的检测。 41 | -d 上一次更改的日期。 42 | -I 列出当前的设置。由非特权用户来确定他们的口令或账户何时过期。 43 | -E 账户到期的日期。过了这天,此账户将不可用。 44 | -W 用户口令到期前,提前收到警告信息的天数。 45 | 对于超过期限的用户,应该检查是否允许继续使用,如果不使用则应该将这些用户删除,防止用户被非授权使用, 46 | 删除账户请参考删除账户小节 47 | 5.变更账户权限 48 | 操作说明 49 | groupmems -g group [-a|-d] user相关参数说明请参见表1。 50 | -g 指定群组名称。 51 | -a 将指定账户加到指定群组。 52 | -d 将指定账户加从指定群组中移除。 53 | 操作举例:将用户test增加到特权组root。groupmems -g root -a test 54 | 6.锁定账户 55 | 管理员可锁定暂时不使用的账户,之后根据实际情况再进行解锁。通过系统命令passwd或usermod来锁定账户。 56 | 操作说明 57 | 锁定账户可使用如下命令: 58 | passwd -l user 或 59 | usermod -L user 60 | 操作举例:锁定test账户。passwd -l test 61 | 7.解锁账户 62 | 操作说明 63 | 解锁账户可使用如下命令: 64 | passwd -u user 或 65 | usermod -U user 66 | 8.修改口令 67 | 操作说明 68 | passwd [-g] [name] 69 | -g:表示修改指定群组的口令 70 | 9.监控账户操作 71 | 管理员需要定期检查各个账户的操作,包括账户是否操作异常或者非法操作。 72 | 操作说明 73 | 打开账户根目录下的“.bash_history([home]/.bash_history)”文件,查看账户的操作历史,确认是否存在非法或异常操作。 74 | 10.检查账户 75 | 打开文件/etc/passwd,比较文件中的账户与主机账户清单描述的账户是否一致。若不一致,建议查出多余账户存在的原因,若无故增加,则应删除。 76 | 检查系统账户是否可登录,即账户的shell是否为/sbin/nologin(/etc/passwd文件每行最后一个字段值);若不是,则应改为/sbin/nologin 77 | 11.系统口令加密算法维护 78 | 管理员可以对系统的口令加密算法进行定期检查,查看当前系统的加密算法是否与设定的算法一致。默认情况下的加密算法是sha512。 79 | 操作说明:要确认账户root的口令加密算法,打开/etc/pam.d/password-auth和/etc/pam.d/system-auth文件, 80 | 查看password sufficient pam_unix.so后的参数中的口令加密算法为sha512。 81 | 到口令加密算法中找到sha512对应的识别码是6。 82 | 打开/etc/shadow文件,发现root账户第二字段起始字符为“$6$”,说明与设定的算法一致。 83 | 三、系统安全维护: 84 | 1.服务维护策略 85 | 管理建议 86 | 最小服务和组件。 87 | 区分服务器的用途和角色,尽量避免安装不必要的服务和组件。 88 | 关闭未使用的服务。 89 | 服务内部组件也应采用上述原则进行裁减。 90 | 2.检查进程 91 | 管理员进行安全维护时,需要检查是否有多余的进程,及时发现不合理的进程并处理,避免风险。 92 | 操作说明 93 | 用系统命令“ps -aux”查看系统当前所有进程。 94 | 查看是否有多余进程(根据用户安装的组件不同,运行的进程有差异,具体由用户根据实际情况甄别)。 95 | 若发现有多余进程,则用系统命令“kill -9 PID”删除该进程。 96 | 3.检查服务/端口 97 | 管理员应检查是否有多余的服务,如果有多余服务及时停止,以避免安全风险。 98 | 操作说明 99 | 用户执行systemctl list-units --type=service命令查看系统所有服务。 100 | 查看是否有不需要使用的服务(根据用户安装的组件不同,开启服务有差异,具体由用户根据实际情况甄别)。 101 | 若存在不需要的服务,可用如下方式删除服务。 102 | 以rsyslog服务为例,如下操作: 103 | 执行systemctl stop rsyslog命令停止该服务运行。 104 | 执行systemctl disable rsyslog命令关闭该服务随机启动。 105 | 警告: 106 | 本操作前请务必先确认该服务为不需要的服务。 107 | 4.检查主机间通信 108 | 管理员应检查是否有多余的、非法的主机间通信,避免风险。 109 | 操作说明 110 | 用系统命令“netstat -an”查看当前系统中开放的所有端口。 111 | 参考通信矩阵中的端口列表,检查当前是否有多余开放的端口。 112 | 若存在多余端口,确认是否有必要开放,若无必要,则应关闭。 113 | 四、日志审计系统维护 114 | 1.日志文件列表: 115 | 系统管理员需要定期检查系统的日志信息 116 | 2.系统日志类别与等级 117 | 使用syslog记录系统日志。syslog能通过产生日志的类别(facility)和等级(level)对日志做分类处理,将日志写到文件或设备。它既可以记录本地日志,也可以通过网络记录另一个主机上的日志 118 | 3.检查系统日志 119 | 开启关闭系统日志 120 | 开启系统日志,使用命令#systemctl start rsyslog 121 | 关闭系统日志,使用命令:#systemctl stop rsyslog检查日志开关的状态 122 | 检查日志开关的状态,使用命令: 123 | #systemctl status rsyslog输出为active (running),则为开启状态。 124 | 输出为inactive (dead),则为关闭状态。 125 | 检查日志存储空间 126 | 建议系统管理员定期清理/var/log/中的日志文件,备份、删除旧的日志信息,释放空间。同时应检查日志是否有防爆功能。 127 | 4.开启关闭审计系统 128 | 开启:systemctl start auditd 129 | auditctl -e 1 130 | 关闭: systemctl stop auditd 131 | 5.检查审计开关的状态 132 | systemctl status auditd输出为active (running),则为开启状态。 133 | 输出为inactive (dead),则为关闭状态。 134 | 6.定制审计策略 135 | 审计系统可以使用auditctl命令来动态管理审计参数和审计规则,也可以将审计规则静态的写入到/etc/audit/audit.rules文件中。 136 | auditctl参数说明 参考博客:https://blog.csdn.net/newjueqi/article/details/9384981 137 | 链表名和规则说明 138 | 操作举例 139 | 查看所有不成功的open系统调用。 140 | auditctl -a entry,always -S open -F success!=0 141 | 监控/etc/audit/audit.rules的变化,将以下内容加入到audit.rules中即可实现。 142 | -w /etc/audit/audit.rules -k TEST_audit_rules -p rxwa 143 | 7.检查审计日志 144 | 工具ausearch用于查询审计后台的日志,它能基于不同搜索规则的时间查询审计后台日志。 145 | 操作说明 146 | ausearch [options] 说明: 147 | options参数说明请自行查阅相关man帮助信息。参考链接:https://blog.csdn.net/qwertyupoiuytr/article/details/58278349 148 | 特别指出的,每个系统调用进入内核空间运行时有个唯一的事件ID,系统调用在进入内核后的运行过程的审计事件共享这个ID。也就是说,一个审计事件,可能包含几条审计记录。 149 | 操作举例 150 | 查询操作/etc/audit/rules.d/audit.rules文件的审计日志。 151 | ausearch -k TEST_audit_rules 152 | 8.生成审计报告 153 | audit审计系统使用aureport工具分析审计日志,对分析结果做出总结,并生成审计报告。 154 | 系统管理员可以根据维护的需要定期生成审计报告,用于分析异常的审计信息。 155 | 操作说明 156 | aureport [options] 说明: 157 | options参数说明请自行查阅相关man帮助信息。 158 | 操作举例 159 | 报告失败事件。aureport --failed 160 | 五、认证与授权维护 161 | 1.维护PAM策略 162 | 本系统使用Linux-PAM实现用户的身份鉴别、口令复杂度控制、登录阈值设置等。PAM主要是由一组共享库文件(在/lib64/security/目录下)和一些配置文件(在/etc/pam.d/目录下)组成的。 163 | 系统管理员可以根据维护需要对PAM策略进行修改。 164 | 口令复杂度维护 165 | 系统默认的设置口令复杂度如下: 166 | (1)口令长度最短应不少于6位(管理员用户至少8位)。 167 | (2)口令至少包含“小写字母(a-z)、大写字母(A-Z)、数字(0-9)、特殊字符”中的3种。 168 | (3)口令不能和账户或者账户的倒写一样。 169 | (4)不能修改为过去5次使用过的旧口令。 170 | 根据维护需要,系统管理员通过修改/etc/pam.d/system-auth和/etc/pam.d/password-auth的pam_pwquality.so和pam_pwhistory.so配置来重新设置口令复杂度。 171 | 表1 pam_pwquality.so配置项说明 配置项说明 172 | minlen=8 口令长度至少包含8个字符 173 | minclass=3 口令至少包含大写字母、小写字母、数字任意两种和特殊字符中的任意3个 174 | ucredit=0口令包含任意个大写字母 175 | lcredit=0口令包含任意个小写字母 176 | dcredit=0口令包含任意个数字 177 | ocredit=0口令包含任意个特殊字符 178 | retry=3每次修改最多可以尝试3次 179 | enforce_for_root本设置对root用户同样有效 180 | 表2 pam_pwhistory.so配置项说明 配置项说明 181 | remember=5口令不能修改为过去5次使用过的旧口令 182 | enforce_for_root本设置对root用户同样有效 183 | 口令复杂度维护操作说明 184 | 以修改口令长度为例,操作步骤如下 185 | 修改/etc/pam.d/system-auth和/etc/pam.d/password-auth文件的pam_pwquality.so后的minlen字段的值,如下: 186 | minlen=10口令长度至少为10位。 187 | 保存并退出/etc/pam.d/system-auth和/etc/pam.d/password-auth文件。 188 | 189 | 登录出错阈值维护 190 | 系统设置默认的登录出错阈值为3次(若连续登录出错次数超过3次,则账户被锁定5分钟)。用户锁定期间,任何输入被判定为无效,锁定时间不因用户的再次输入而刷新;解锁后,用户的错误输入记录被清空。 191 | 根据维护需要,系统管理员通过修改/etc/pam.d/system-auth和/etc/pam.d/password-auth的pam_faillock.so配置来重新设置登录出错阈值,pam_faillock.so配置项如下。 192 | 表3 pam_faillock.so配置项说明 配置项说明 193 | authfail捕获用户登录失败的事件。 194 | deny=3用户连续登录失败次数超过3次即被锁定。 195 | unlock_time=300普通用户自动解锁时间为300秒(即5分钟)。 196 | even_deny_root同样限制root用户。 197 | 系统管理员在登录系统后可以通过执行“faillock --user XXXX --reset”命令来清空用户登录出错的次数记录(XXXX是对应的用户名)。 198 | 登录出错阈值维护操作说明 199 | 口令输错次数记录清空操作步骤如下: 200 | 使用root用户登录系统。 201 | 执行如下命令,清空口令输错次数记录。也可以清除指定用户的错误次数记录。 202 | faillock --user XXXX --reset 说明: 203 | 如果root用户因为登录口令输错3次被锁定,必须等待300秒才能再次登录系统,登录成功后pam_faillock会清空root用户的登录出错信息。 204 | 修改出错阈值的操作步骤如下: 205 | 修改/etc/pam.d/system-auth和/etc/pam.d/password-auth文件的pam_faillock.so后的deny字段的值,如下: 206 | deny=5设置出错阈值为5次,即连续登录出错次数超过5次后账户被锁定300秒。 207 | 保存并退出/etc/pam.d/system-auth和/etc/pam.d/password-auth文件。 208 | 209 | su权限维护 210 | 系统默认只允许root和wheel群组的用户使用su命令,限制其他用户使用su命令。 211 | 根据维护需要,系统管理员可以授予、回收其他用户使用su命令的权限,操作如下: 212 | 查看当前具有su权限的用户。 213 | cat /etc/group | grep wheel | cut -d : -f 4各用户间以“,”分隔。 214 | 授予su权限。 215 | groupmems -g wheel -a useruser为允许使用su命令的用户。 216 | 回收su权限。 217 | groupmems -g wheel -d user 218 | 2.维护SSH 219 | SSH是安全shell的简写。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。 220 | 透过SSH可以对所有传输的数据进行加密,也防止DNS欺骗和IP。加固SSH服务,是指修改SSH服务中的一些配置,来提高系统的安全性。 221 | 操作说明 222 | 打开SSH配置文件/etc/ssh/sshd_config,查看文件中的字段值与安全加固设定的默认值是否一致。若不一致,查明原因,并修改。 223 | 重启SSH服务: 224 | systemctl restart sshd.service 225 | 六、文件权限维护 226 | 检查文件权限 227 | 系统管理员必须保证系统配置文件,信息文件,系统设备文件和系统二进制文件不能被非系统管理员修改。所有文件都是在特定条件下作为通用可写被创建出来的。 228 | 操作说明 229 | 使用系统命令“ls -al [filename | path]”查看指定文件的权限。 230 | 七、内核参数维护 231 | 检查与修改内核参数 232 | 内核参数决定配置和应用特权的状态,管理员应定期查看系统中的内核参数的值是否有变更。内核提供用户可配置的系统控制,这一系统控制可微调至提高系统的安全性。 233 | 操作说明 234 | 通过系统命令“sysctl -a”列出当前系统中的所有内核参数。 235 | 将当前系统参数值与安全加固中的设置一一比较,观察其值有无更改。 236 | 若有更改,则打开内核参数配置文件/etc/sysctl.conf,查看有无参数在文件中配置。 237 | 若有,则确定参数值是否与表格中一致。 238 | 若不存在,则按配置文件中的格式添加对参数的配置。 239 | 执行系统命令“sysctl -p”使配置的参数值立即生效。 240 | 241 | -------------------------------------------------------------------------------- /ManagementTechnology/SystemServiceSecurity.txt: -------------------------------------------------------------------------------- 1 | 用户访问管理控制对机构管理员来说是个重要问题,但监控哪些网络处于活跃状态对任何一位管理员以及Linux系统操作者来说都更为重要. 2 | 系统上很多服务都类似网络服务器,如果在一个机器上运行网络服务,那么服务器应用程序(亦称为daemon),就会侦听一个或者多个网络端口的连接。 3 | 这些服务器被视为潜在的攻击手段。 4 | 1.服务的风险: 5 | 网络服务可对Linux系统造成很多危险。以下是一些主要问题列表: 6 | 拒绝服务攻击(DoS):通过向服务发出大量请求,拒绝服务攻击可让系统无法使用,因为它会尝试记录并回应每个请求。 7 | 分布的拒绝服务攻击(DDoS):一种DoS攻击类型,可使用多台被入侵的机器(经常是几千台或者更多)对某个服务执行联合攻击,向其发送海量请求并使其无法使用。 8 | 脚本漏洞攻击:网页服务器通常使用脚本执行服务器端动作,破解者就可以攻击没有正确编写的脚本。这些脚本漏洞攻击导致缓存溢出, 9 | 或者允许攻击者更改系统中的文件。 10 | 缓存溢出攻击:连接到特权端口为1023的服务器必须作为管理用户来运行。如果应用程序有可利用的缓存溢出,那么攻击者就可作为运行该应用程序的用户访问系统。因为有可利用的缓存溢出存在,破解者可使用自动工具来识别有漏洞的系统,并在获得访问后,使用自动工具套件保持其对该系统的访问。 11 | 说明: 要限制通过网络进行攻击,应该将所有不使用的服务关闭。 12 | 2.识别并配置服务 13 | 3.不安全的服务 14 | 任何网络服务都是不安全的,所以需要关闭不使用的服务。管理员发现并修补服务漏洞,这些工作对更新与网络服务有关的软件包非常重要。 15 | 以下为安全级别较低的网络协议包含的服务: 16 | 以不加密的方式在网络中传输用户名和密码。很多老的协议,比如Telnet和FTP,它们对认证会话都不加密,应尽量避免使用。 17 | 以不加密方式传输敏感数据。很多协议在网络间传输数据时不加密,这些协议包括Telent、FTP、HTTP和SMTP。很多网络文件系统,比如NFS和SMB也以不加密的方式在网络间传输信息。用户在使用这些协议时有责任限制要传输的数据类型。 18 | 本身就不安全的服务示例包括rlogin、rsh、telnet、以及vsftpd。 19 | 所有远程登录和shell程序(rlogin、rsh、以及telnet)应避免使用以支持SSH。详情请参阅第3.5.10节“保障SSH”有关sshd。 20 | FTP并不象远程shell那样天生对系统安全有威胁,但需要小心配置并监控FTP服务器以免出问题。有关保障FTP服务器安全的详情请参阅“保障FTP安全”。 21 | 应小心使用并在开启防火墙后使用的服务包括: 22 | auth 23 | nfs-server 24 | smb以及nbm(Samba) 25 | yppasswdd 26 | ypserv 27 | ypxfrd 28 | 4.保障rpcbind 29 | 5.保障NIS安全 30 | 6.保障NFS安全 31 | 7.保障Apache HTTP服务器安全 32 | 8.保障FTP安全 33 | 9.保障Postfix的安全 34 | 10.保障SSH 35 | -------------------------------------------------------------------------------- /ManagementTechnology/readme.txt: -------------------------------------------------------------------------------- 1 | 2 | Linux安全管理技术主要分为三个层面 3 | 一、管理层安全 4 | 管理层主要描述如何通过管理制度确保人员正确并安全的使用产品,降低人为因素给产品带来的安全威胁。 5 | 分为组织和过程、账户和权限管理、日志检查和稽核、补丁管理、系统备份。 6 | 二、系统层安全 7 | 系统层安全是Linux安全的核心,主要包括操作系统层面采用的各种安全技术。 8 | 分为七大模块: 9 | 1.系统层安全架构 10 | 2.身份标识与鉴别 11 | 3.安全协议 12 | 4.自主访问控制 13 | 5.强制访问控制 14 | 6.内存客体重用 15 | 7.主机防火墙 16 | 系统层安全维护分为: 17 | 1、系统层账户清单 18 | 2、账户口令维护 19 | 3、系统服务安全维护 20 | 4、日志审计系统维护 21 | 5、认证与授权维护 22 | 6、文件权限维护 23 | 7、内核参数维护 24 | 三、网络层安全 25 | 网络层安全分为防火墙规则配置、远程接入控制两个模块;远程接入控制主要是SSH远程接入的安全维护 26 | -------------------------------------------------------------------------------- /README.txt: -------------------------------------------------------------------------------- 1 | # LinuxSafty 2 | 3 | Linux安全管理技术(目录:ManagementTechnology)主要分为三个层面 4 | 一、管理层安全 5 | 管理层主要描述如何通过管理制度确保人员正确并安全的使用产品,降低人为因素给产品带来的安全威胁。 6 | 分为组织和过程、账户和权限管理、日志检查和稽核、补丁管理、系统备份。 7 | 二、系统层安全 8 | 系统层安全是Linux安全的核心,主要包括操作系统层面采用的各种安全技术。 9 | 分为七大模块: 10 | 1.系统层安全架构 11 | 2.身份标识与鉴别 12 | 3.安全协议 13 | 4.自主访问控制 14 | 5.强制访问控制 15 | 6.内存客体重用 16 | 7.主机防火墙 17 | 系统层安全维护分为: 18 | 1、系统层账户清单 19 | 2、账户口令维护 20 | 3、系统服务安全维护 21 | 4、日志审计系统维护 22 | 5、认证与授权维护 23 | 6、文件权限维护 24 | 7、内核参数维护 25 | 三、网络层安全 26 | 网络层安全分为防火墙规则配置、远程接入控制两个模块;远程接入控制主要是SSH远程接入的安全维护 27 | 28 | Linux安全配置规则(目录:Linux-Safe-configuration)内有两个指导文档、一个文件权限列表与sudo安全配置规范(防止越权): 29 | Linux安全配置规范 30 | Linux安全应用指导规范 31 | 文件权限列表(Linux_File_Permission_List.txt) 32 | sudo安全配置规范 33 | 34 | 防火墙配置与维护(目录:iptables) 35 | 36 | Linux主机本地信息自动采集工具LinEnum 37 | copy from GItHub: 38 | https://github.com/rebootuser/LinEnum 39 | Example: ./LinEnum.sh -s -k keyword -r report -e /tmp/ -t 40 | 主要功能: 41 | 1.内核和发行版本 42 | 2.系统信息: 43 | 主机名 44 | 3.网络信息: 45 | IP 46 | 路由信息 47 | DNS服务器信息 48 | 4.用户信息: 49 | 当前用户信息 50 | 最近登录用户 51 | 枚举所有用户,包括uid/gid信息 52 | 列举root账号 53 | 检查/etc/passwd中的hash 54 | 当前用户操作记录 (i.e .bash_history, .nano_history etc.) 55 | 5.版本信息:Sudo/MYSQL/Postgres/Apache 56 | -------------------------------------------------------------------------------- /Rootkit/chkrootkit/readme.txt: -------------------------------------------------------------------------------- 1 | chkrootkit 2 | -------------------------------------------------------------------------------- /Rootkit/readme.txt: -------------------------------------------------------------------------------- 1 | Rootkit是一种特殊的恶意软件, 2 | 功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息, 3 | 比较常见的是Rootkit一般和木马、后门等其他恶意程序结合使用。 4 | Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。 5 | 一般Rootkit的使用方式: 6 | 攻击者通过远程攻击获得root访问权限,或者通过密码猜测或密码强制破译的方式获得系统访问权限。 7 | 进入系统后,如果他还没有获得root权限,就通过某些安全漏洞获得系统的root权限。接着,攻击者会在侵入的主机中安装Rootkit, 8 | 然后通过Rootkit的后门检查系统是否有其他用户登录,如果只有攻击者自己,攻击者就开始着手清理日志中的有关信息。 9 | 通过Rootkit嗅探器获得其他系统的用户和密码之后,攻击者就会利用这些信息入侵其他系统。 10 | 11 | 检查Linux系统的Rootkit: 12 | 常见有两种软件可以检查: 13 | 1)chkrootkit 14 | 2)rkhunter 15 | -------------------------------------------------------------------------------- /Rootkit/rkhunter/readme.txt: -------------------------------------------------------------------------------- 1 | rkhunter 2 | 3 | 使用教程: 4 | https://www.tecmint.com/install-rootkit-hunter-scan-for-rootkits-backdoors-in-linux/ 5 | -------------------------------------------------------------------------------- /Snort/readme.txt: -------------------------------------------------------------------------------- 1 | 入侵检测系统 2 | 3 | 下载地址: 4 | https://www.snort.org/downloads 5 | -------------------------------------------------------------------------------- /tcmdump/readme.txt: -------------------------------------------------------------------------------- 1 | 网络流量分析 2 | -------------------------------------------------------------------------------- /zabbix/readme.txt: -------------------------------------------------------------------------------- 1 | zabbix监控教程 2 | 非常全面 3 | https://www.cnblogs.com/clsn/p/7885990.html#auto_id_0 4 | --------------------------------------------------------------------------------