我正在做一个保护Linux系统安全的项目。我们将进入VI,以更改系统允许的脚本。它已部分完成。
在下面的屏幕截图中,您可以看到它已经被填充以允许端口22,但是该行以$ip
开头。我们使用的语句以iptables
开头。这些是相同的命令吗?还是它们的含义完全不同?
我无法在网上找到太多解释这些差异的原因。
答案 0 :(得分:0)
iptables
是命令。脚本中以iptables
开头的每一行都运行iptables
命令。
$ip
是一个环境变量,大概包含要运行的命令的名称。脚本中以$ip
开头的每一行都运行命令,其名称包含在$ip
变量中。
您要我们告诉您变量设置为什么。我们不知道。
答案 1 :(得分:0)
检查提供的文件片段,您正在编辑的文件可能是Shell脚本(bash,sh等)。由于iptables
是有效的linux命令,因此可能是这种情况。该文件也可以是perl,php或其他支持$ variable语法的语言。
看看文件的第一行,它是否以#!
(sh-bang)开头?例如:
#!/bin/bash
取决于用于解释文件的脚本语言,$ip
令牌可以解析为$ ip当前值所包含的内容。假设ip=iptables
。然后,您给提供的文件片段应该等效于以下内容:
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# put your dport ACCEPT rules here
iptables -A INPUT -p tcp -m tcp --dport 3398 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
这似乎是多余的,因为第四行重复了第一行。
由于必须以root用户身份运行命令iptables
才能更改系统防火墙,因此iptables
与$ip
的区别是很大的。安全。
如果该文件可由恶意行为者写入,则恶意行为者可以修改该文件以产生恶意行为。但是这些变化将被检测到。
假设不良行为者能够更改$ ip变量的值?不良行为者可以将恶意行为注入该脚本。
例如,假设将变量设置为命令,
export ip='echo beat me bad ||iptables'
然后用户天真地将sudo root并执行脚本(文件)
$ sudo -u root
$ $ip
beat me || <iptables runs here>
您可以阅读有关编辑iptables规则here
的信息。政策规则:对于需要root特权(或可以以root用户身份运行的脚本)(例如上述脚本(文件))之类的安全敏感文件,切勿使用命令插值。
假设错误的参与者可以更改您的PATH环境变量,并在路径中注入另一个名为iptables
的可执行文件。当以根用户身份运行命令和脚本时,需要注意路径。考虑对命令使用完整的路径名(或检查PATH是否未损坏);例如:
/usr/sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# put your dport ACCEPT rules here
/usr/sbin/iptables -A INPUT -p tcp -m tcp --dport 3398 -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
策略规则:要么以root身份运行时显式检查PATH,要么使用命令的完整路径来确保命令不被重定向。