📄 0560daemons.htm
字号:
only_from = 140.116.0.0/16 <span class=term_note><==只允许 140.116.0.0 ~ 140.116.255.255
这个网段连线进来使用 telnet 的服务</span>
only_from += .edu.tw <span class=term_note><==累加设定,只有教务界才能连线!</span>
access_times = 1:00-9:00 20:00-23:59
<span class=term_note><==每天只有这两个时段开放服务</span>
umask = 022 <span class=term_note><==建立档案时的预设属性设定</span>
instances = 10 <span class=term_note><==同时只允许 10 个连线</span>
nice = 10 <span class=term_note><==使用的优先顺序较低</span>
flags = REUSE <span class=term_note><==额外使用的参数</span>
socket_type = stream <span class=term_note><==使用 tcp 封包常用的连线型态</span>
wait = no <span class=term_note><==不需等待,可以同时允许多个连线</span>
user = root <span class=term_note><==启动程序的使用者身份</span>
server = /usr/sbin/in.telnetd<span class=term_note><==服务启动的程式</span>
server_args = -a none <span class=term_note><==上面那个程式的参数</span>
log_on_failure += USERID <span class=term_note><==错误登入时,要记录下来的内容</span>
}</span>
</pre></td></tr></table>
在上面这个范例当中,我们用了很多的网路 IP 显示方式,包括 192.168.1.0/24 ,
以及 140.116.0.0/16 ,这代表『 192.168.1.0~192.168.1.255 的所有 IP 』以及
『 140.116.0.0 ~140.116.255.255 所有的 IP 』更详细的说明,我们会在伺服器篇内详谈的。
用了这个设定值之后,你会发现你的 telnet 针对两个网段来设计了!
设计完成之后,由于这是 xinetd 的设定档,所以启动的方式与观察的方式为∶<br>
<table class="term"><tr><td class="term"><pre>
<span class=term_say># 如果您的 telnet 本来就有启动的话,那么会发现有一个连线存在你的系统中</span>
[root@linux ~]# <span class=term_command>netstat -tulnp</span>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 19255/xinetd
<span class=term_say># 看到喔!是 xinetd 的 program name 呢!</span>
<span class=term_say># 重新修改 /etc/xinetd.d/telnet 之后,重新启动的方式与观察为∶</span>
[root@linux ~]# <span class=term_command>/etc/init.d/xinetd restart</span>
[root@linux ~]# <span class=term_command>netstat -tulnp</span>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 140.116.44.125:23 0.0.0.0:* LISTEN 19281/xinetd
tcp 0 0 192.168.1.100:23 0.0.0.0:* LISTEN 19281/xinetd
<span class=term_say># 有没有看到两个介面啊~而且, PID 会是同一个呢!</span>
</pre></td></tr></table>
呵呵!如上面的设定,我们可以将 telnet 的启动项目进行更多的限制!
如此一来,将有助于我们的安全防护呢!尤其如果可以针对不同的介面来设定,嘿嘿!
就更加的棒棉!不过,请注意喔!如果照上面的设定,那么您的主机上面将会开了两个
23 port 的介面,分别是给两个介面来使用的呢!嗯!真好玩?同样的,
你也可以针对自己的喜好来设定你的其他 daemon 使他挂在 xinetd 底下呢!
</div>
</div>
<hr><a NAME="tcp_wrappers"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class=text_h1>TCP_Wrappers</span>
<div class=block1>
事实上,除了使用 xinetd 的设定档来设定安全机制之外,
我们还可以利用额外的机制来抵挡某些不受欢迎的资料来源喔!
那就是 /etc/hosts.allow 以及 /etc/hosts.deny 这两个档案的功能啦!
这两个档案可以藉由分析∶<ul>
<li>启动的服务名称 (daemon 执行档档名);
<li>用户端的 IP 来源或网段来源。
</ul>
来进行用户端使用者是否能够登入的判断呢!不过,虽然这两个档案已经被整合到 xinetd 里面去了,
不过,要获得更多的功能,还是得要安装 tcp_wrappers 这个套件才行!
因为,这两个档案本身就是 tcp_wrappers ( 其实是 /usr/sbin/tcpd 那个档案而已啦! ) 的设定档啊!
而他也可以整合到整个系统的服务里头去,可以算是最最基础的一个防火墙架构啦! ^_^<br><br>
其实, /etc/hosts.allow 与 /etc/hosts.deny 是 /usr/sbin/tcpd 的设定档,
而这个 /usr/bin/tcpd 则是用来分析进入系统的 TCP 封包的一个软体,他是由 TCP Wrappers 所提供的。
那为什么叫做 TCP_Wrappers 呢?那么 wrappers 有包裹的意思,所以说,这个套件本身的功能就是在分析
TCP 网路资料封包啦!那么刚刚我们稍微提到我们网路的封包资料主要是以 TCP
封包为主,这个 TCP 封包的档头至少记录了来源与目主机的 IP 与 port ,因此,若藉由分析
TCP 封包,就可以比对看我要不要让这个资料进入到主机里面来棉!所以啦,我们要使用
TCP_Wrappers 来控管的,就是∶<ol><span class=text_import2>
<li>来源 IP
<li>port (就是服务啦)</ol></span>
TCP_Wrappers 设定 TCP 封包是否可以进入的设定档在 /etc/hosts.allow 与 /etc/hosts.deny
当中。因此,基本上,如果一个服务是受到 xinetd 或 TCP_Wrappers 的控制时,那么该服务就会受限于
hosts.allow 与 hosts.deny 的管理了!而如果你自己安装的套件当中( 亦即使用
Tarball 安装的方式之套件 ),除非有自行定义支援 TCP_Wrappers 的功能 ,否则就无法使用这个玩意棉!嘿嘿!
<br><br>
那么这两个档案是干嘛用的?刚刚不是提过哪!他主要是用来规范 TCP 封包的规则的,所以呢,
里面记录的当然就是∶『某些 IP 在特定服务中是否能够进入主机』!那么要怎么写?
这两个档案的内容基本的语法是∶<br>
<table class="term"><tr><td class="term"><pre>
<service(program_name)> : <IP, domain, hostname> : <action>
</pre></td></tr></table>
所以我们要先找出来那个 service_name 才行,例如以我们刚刚的 telnet 为例,那个
service_name 是什么呢?其实指的就是在 xinetd.conf 设定档中的 server 这个设定后面接的程式名称啦!所以,
telnet 在 FC4 底下的名称为 in.telnetd
因此,如果你不想让 140.116.44.202 这个位址及 140.116.32.0/255.255.255.0
这个 C class 的网域进入你的主机的话,那么可以这样在 /etc/hosts.deny 里面设定∶ (
<span class=text_vbird>关于 IP, 网域, 网段, 还有相关的网路知识,在这个基础篇当中我们不会谈到,
详细的资料请先自行参考伺服器架设篇的内容! </span>)<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi /etc/hosts.deny</span>
in.telnetd : 140.116.44.202 140.116.32.0/255.255.255.0 : deny
</pre></td></tr></table>
当然也可以写成两行,亦即是∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi /etc/hosts.deny</span>
in.telnetd : 140.116.44.202 : deny
in.telnetd : 140.116.32.0/255.255.255.0 : deny
</pre></td></tr></table>
这样一来,对方就无法以 telnet 进入你的主机啦!方便吧!不过,既然如此,为什么要设定成
/etc/hosts.allow 及 /etc/hosts.deny 两个档案呢?其实只要有一个档案存在就够了,
不过,为了设定方便起见,我们存在两个档案,其中需要注意的是∶
<ul><span class=text_import2><font face="细明体">
<li>写在 hosts.allow 当中的 IP 与网段,为预设『可通行』的意思,亦即最后一个栏位 allow 可以不用写;
<li>而写在 hosts.deny 当中的 IP 与网段则预设为 deny ,第三栏的 deny 亦可省略;
<li>这两个档案的判断依据是∶ (1) 以 /etc/hosts.allow 为优先,而
(2) 若分析到的 IP 或网段并没有纪录在 /etc/hosts.allow ,则以 /etc/hosts.deny 来判断。
</ul></span></font>
也就是说, /etc/hosts.allow 的设定优先于 /etc/hosts.deny 棉!了解了吗?基本上,只要
hosts.allow 也就够了,因为我们可以将 allow 与 deny 都写在同一个档案内,
只是这样一来似乎显得有点杂乱无章,因此,通常我们都是∶
<ol><span class=text_import2><font face="细明体">
<li>允许进入的写在 /etc/hosts.allow 当中;
<li>不许进入的则写在 /etc/hosts.deny 当中。</ol></span></font>
此外,我们还可以使用一些特殊参数在第一及第二个栏位喔!内容有∶
<ul><span class=text_import2><font face="细明体">
<li>ALL∶代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
<li>LOCAL∶代表来自本机的意思,例如∶ ALL: LOCAL: allow
<li>UNKNOWN∶代表不知道的 IP 或者是 domain 或者是服务时;
<li>KNOWN∶代表为可解析的 IP, domain 等等资讯时;
</ul></span></font>
再强调一次,那个 service_name 其实是启动该服务的程式,举例来说, /etc/init.d/ssh 这个 script 里面,
实际上启动 ssh 服务的是 sshd 这个程式,所以,你的 service_name 自然就是 sshd 棉!
而 /etc/xinetd.d/telnet 内有个 server 的设定项目,
那个项目指到 in.telnetd 这个程式来启动的喔!要注意的很!(请分别使用 vi 进这两支 scripts 查阅)
好了,我们还是以 telnet 为例子来说明好了,现在假设一个比较安全的流程来设定,就是∶
<ol><span class=text_import2><font face="细明体">
<li>只允许 140.116.44.0/255.255.255.0
与 140.116.79.0/255.255.255.0 这两个网域,及 140.116.141.99 这个主机可以进入我们的 telnet 伺服器;
<li>此外,其他的 IP 全部都挡掉!
</ol></span></font>
这样的话,我可以这样设定∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi /etc/hosts.allow</span>
<span class=term_write>in.telnetd: 140.116.44.0/255.255.255.0
in.telnetd: 140.116.79.0/255.255.255.0
in.telnetd: 140.116.141.99
in.telnetd: LOCAL</span>
[root@linux ~]# <span class=term_command>vi /etc/hosts.deny</span>
<span class=term_write>in.telnetd: ALL </span>
</pre></td></tr></table>
那么有没有更安全的设定,例如,当当有其他人扫瞄我的
telnet port 时,我就将他的 IP 记住!以做为未来的查询与认证之用!
是有的!只是,那就得要有额外的动作参数加在第三栏了。主要的动作有∶
<ul><span class=text_import2><font face="细明体">
<li><span class=text_import1>spawn (action)</span><br>
可以利用后续接的 shell 来进行额外的工作,且具有变数功能,主要的变数内容为∶
%h (hostname), %a (address), %d (daemon)等等;</li><br>
<li><span class=text_import1>twist (action)</span><br>
立刻以后续的指令进行,且执行完后终止该次连线的要求 (DENY)
</ul></span></font>
我们知道 finger 可以反向追踪网路封包的来源,所以,我希望这样∶<ol>
<li>利用 safe_finger 去追踪出对方主机的资讯;
<li>将该追踪到的结果以 email 的方式寄给 root ;
<li>在对方萤幕上面显示不可登入的讯息</ol>
此时可以利用 spwan (action1) | (action2) : twist (action3) 来进行,
也就是说,其实在 /etc/hosts.deny 的第三个栏位可以继续延伸下去的!整个资讯有如这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi /etc/hosts.deny</span>
<span class=term_write>in.telnetd: ALL: spawn (echo "security notice from host `/bin/hostname`" ;\
echo; /usr/sbin/safe_finger @%h ) | \
/bin/mail -s "%d-%h security" root & \
: twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" )</span>
</pre></td></tr></table>
在上面的例子中,第三行的 root 那个帐号,可以写成你的个人帐号或者其他
e-mail ,以免很少以 root 身份登入 Linux 主机时,容易造成不知道的情况,另外,最后几行,亦即
:twist 之后的那几行为同一行。如此一来,当未经允许的电脑尝试登入你的主机时,
对方的萤幕上就会显示
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -