扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
5.1.1.7 log_in_vain
你也可以透过 sysctl 命令, 来改变一些有用的系统变量:
# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1
这会把尝试向你的机器要求你没有的服务的 connections log 起来。例如, 如果你在你的机器没有跑 DNS server, 而又有个人想要向你的机器要求 DNS 服务, 这时候你就会看到Connection attempt to UDP yourIP:53 from otherIP:X
(X 是某个 high port #) 用 \"dmesg\" 命令就可以看到这一行。Dmesg 秀出的是系统的 kernel messagebuffer。
然而, 这个 buffer 的空间是有限的, 所以系统也会把这些讯息写入到/var/log/messages 里面去:
# tail -1 /var/log/messages
Jun 12 19:36:03 ugh /kernel: Connection attempt to UDP yourIP:53 from otherIP:X
5.1.1.8 final notes
理论上呢, 你的系统现在已经比你装好它时更安全些了。你现在可以做一些事来确定你目前的更动:
$ netstat -na | grep LISTEN
这会告诉你那些 service 在那些 port 跑。越少越好 又, 再跑一些其它的 port scanners (strobe, nmap) 来找出你开了那些 port。
而要确要你的 syslogd 已经开始纪下你刚刚想要 log 的事件, 可以这么做:
# cd /var/log
# tail -10 fingerd ftpd messages
在 log 档里面没看到任何东西的话, 记得重新激活 inetd 和 syslogd:
# kill -HUP `cat /var/run/syslog.pig` `cat /var/run/inetd.pid`
5.1.1.9 Filesystem
既然 Unix 把什么东西都当作档案来看待, 好好的保护你的档案系统便是很重要的事。有件事是在你安装操作系统前便要完成的: 必须要计划并设计好你的 partition 该怎么切割。有几个很重要的原因让你要这么做: 一个是你可以 mount 不同的档案系统以赋与不同的选项(下面有几个例子)。别一个是,如果你想要把你的 filesystem export出去, 你须要更加细微的控制。如果你是一个从 Linux 转入 FreeBSD 的使用者, 你会发现 Linux 是把任何东西都往 root partition \"/\" 塞, 而 FreeBSD 预设便要 \"/\",\"/usr\", 和 \"/var\"。这也使得要使用如 dump 般的工具较容易。且让我们来讨论 security 吧! 有一件事我通常会做的是, 我会把一般 users 可以写入的 partition 分开来割, 而这些 partitons 便可以用 \"nosuid\" 的方式来 mount。从 mount 的 man page 可以知道:让 suid 或 sgid bit 失效。对于像 suidperl 这些公开使用的程序, 设这个选项便没用。
因此你会有个 partition 给一般使用者使用: /home 或 /usr/home。然后你可以另外开个 partion 给 /var/tmp 然后再把你的 /tmp 指到这里:
# rm -rf /tmp
# ln -s /var/tmp /tmp
你可以参考这个例子:
# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/sd0s1b none swap sw 0 0
/dev/sd0s1a / ufs rw 1 1
/dev/sd0s1g /usr ufs rw 2 2
/dev/sd0s1h /usr/home ufs rw 2 2
/dev/sd0s1f /var ufs rw 2 2
/dev/sd0s1e /var/tmp ufs rw,nosuid 2 2
proc /proc procfs rw 0 0
现在你可以确定一般 users 可以写入的目录不是以 \"-nosuid\" 的方式被 mount, 就是没有可以写入。现在你还要关心的就是 /var/spool/uucppublic\"。
你可以把 \"/var\" 以 \"-nosuid\" 的方式来 mount , 或下这个命令:
# chmod o-w /var/spool/uucppublic
如果你想要找出你所有的可写入目录, 下这个命令:
# find / -perm -0777 -type d -ls
如同 man page 指出的, 具有 suid/sgid 的程序会让你的 nosuid 失效。找出那些程式是 suid 或 sgid 的吧:
# find / -perm -2000 -ls
# find / -perm -4000 -ls
同时你不止可以用 \"-ls\" 而只是知道有那些程序。你可以把不是很有用的程序 \"chmod 000\"。像是 uustat, uucico 等, 如果你从来不碰 uucp 的话。或是 ppp 和 pppd, 如果你绝不会用到他们。又, 你不会去用到打印机的话, 把 lpr lprd 也 chmod 000 吧!也许改天会有个人写个 shell script 来问你那些东西要 chmod 000 掉。
现在你也许想问, 有什么方式可以防止攻击者重新以非 \"-nosuid\" 的方式 mount 你的filesystem ? Well, 没有, 除非你改变你的 securelevel。
5.1.1.10 securelevel
FreeBSD kernel 有个观念叫 securelevel。当还有人在争论这是不是够完美时,这个机制已经够防止大部份的 \"script kiddiez\"。Securelevel 是指你的 kernel 在执行时的安全等级。每一个等级具有不同的保护和检查机制。这些是 init(8) 的 man page:
Kernel 可以以四种不同的安全等级来执行。任何 superuser process 可以提高安全等级,但是只有 init 可以降低它。
这四种等级分别是:
-1 永远不安全模式 - 切换到 level 0 吧!
0 不安全模式 - \"不可更动\"和\"只能附加\"这两个旗标(flag)可以被改变。所有的devices 可以照着它们的读写权限被读写。
1 安全模式 - \"不可更动\"和\"只能附加\" 的旗标不能被取消; mount 上来的档案系统, /dev/mem, 和 /dev/kmem 不能写入。
2 高安全模式 - 和安全模式一样, 又多加了不管硬盘有没有被 mount 起来,除了mount(2) 之外都不能写入。它防止一个档案系统在 umount 的时候被搞乱。而且在这个等级也禁止在 multi-user 时执行 newfs(8)。
如果安全等级最初是 -1, 那么 init 就会保持原状。否则在 single user mode 时,init 会把安全等级调到 0, 而在 multiuser mode 时会以 1 来跑。如果你希望在multiuser模式是以等级 2 在跑, 你可以先进入 single user mode, 编辑 /etc/rc,使用 sysctl 来更动。
若是你的系统只拿来跑 web server 之类的, 你可以放心的将 securelevel调高到2。但若是你要跑 X server, 把你的 securelevel 调至 1 或更高会导致一些问题。因为X server 必须要写入 /dev/mem 和 /dev/kmem, 而 securelevel 1 不允许你这么做。有一个解决的方法是, 在激活 X server 后再调高 securelevel。但我的意见是, 如果你跑 X server 的
话, 你已经有了其它的安全问题须要考量, 而不止是 securelevel。以下这个指令会显示出你目前的 securelevel 设定值。
# sysctl kern.securelevel
如果要提高你的 securelevel:
# sysctl -w kern.securelevel=X
X 可以是 0, 1 或 2。
又在 securelevel 是 1 的话, 你在 \"make world\" 时也会有些问题。因为 \"make install\" 时会在 kernel 上加上 immutable flag:
# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
\"schg\" flag 会防止你安装新的 kernel:
nfr# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)
nfr# sysctl kern.securelevel
kern.securelevel: 2
nfr# rm -rf /kernel
rm: /kernel: Operation not permitted
nfr# mv /kernel /tmp/
mv: rename /kernel to /tmp//kernel: Operation not permitted
如果你在 securelevel 1 或 2, 那么 schg flag 是不能被改变的。
# chflags noschg /kernel
chflags: /kernel: Operation not permitted
值得留意的是, /boot.config 可以改变你开机时的系统设定,要预防有心人篡改你应该这么做:
# touch /boot.config
# chflags schg /boot.config
你可以看看系统预设还有那些执行档是有 schg flag 的。
# ls -lo /sbin | grep schg
-r-x------ 1 bin bin schg 204800 Jul 19 20:38 init
# ls -lo /bin | grep schg
-r-sr-xr-x 1 root bin schg 192512 Jul 19 20:36 rcp
再回过头来谈谈锁定系统这件事吧! 既然刚刚谈到了 immutable flags, 何不试着把整个 /sbin 和 /bin 都设成 schg flag 呢 !? 这会给想 crack你系统的人一点小挫折。(假设你的系统也正以适当的 securelevel 运作中)
# chflags schg /bin/*
# chflags schg /sbin/*
不过 /sbin 可能被改成别的名字,再重新创造一份新的 /sbin ,所以改变 /sbin 与/bin 的 schg flag 是很合理的想法,我们可以依照以下的方式改变 /sbin 和 /bin 的 schg flag:
# chflags schg /bin/*
# chflags schg /sbin/*
这些 schg flag 的档案会让你在 \"make world\" 时有问题。
(\"make installworld\" 也是)
无论如何 ,最好是以 single user 模式来 \"make world\"。有关 \"makr world\" 的相信息, 还有为什么要这么做, 到下面这个网页来看看:
http://www.nothing-going-on.demo ... rld/make-world.html
现在你已经适当的锁定你的系统, 也以只跑必要的的 service, 而档案系统也适当的mount 上来, 且也以适合的 kernel securelevel 运作中。
与以上所述的相关 man pages 有: init(8), chflags(1), sysctl(8)。
5.1.1.11 Logging
系统纪录是很重要的。如果你的统被人攻击, 透过它你可以找到一些蛛丝马迹。Unix的标准 log 动作是透过 syslogd(8) 来达成的。它从 /etc/rc 中被激活, 一直执行到系统关机为止。你可以用以下的方式确定你的系统上是否正在执行 syslogd:
$ ps -axu | grep syslogd
Syslogd 会在激活时读取 /etc/syslogd.conf。这个档案很重要, 因为它告诉 syslogd要纪录那些东西, 而这些东西又该放在那里。你也许想看看 syslod 和 syslod.conf的 man pages:
$ man syslogd ; man 5 syslog.conf
既然 Unix 当初就是设计作为网络操作系统, syslogd 可以而且默认值也接受其它系统的纪录。它自己也是可以把纪录透过网络送到其它的计算机去。想当然耳, 它可以纪录下 自己系统发生的每件事 - 而这也正是默认值。因为 syslogd 使用 UDP - 所以资料是可以被伪造的。你至少可以作一件事: 不要让你的 syslogd 接受来自其它计算机的纪录讯息。在 /etc/rc.conf 加个 \"-s\" 就可以了:
syslogd_flags=\"-s\" # Flags to syslogd (if enabled).
如果你有接受特定机器之纪录的必要 (像是你的 router, 或是 web server), 使用\"-a\" 来指定特定的 hosts, domains, 或 subnets。
下次你重新激活你的系统时, syslogd便会拒绝来自其它地方的纪录讯息。如果有人尝试送资料进来, syslogd 将会加以纪录。
如果你不想重新激活你的系统, 那么只要把 syslogd kill -9, 然后再以 root 的身份激活 syslogd 便可以了。记得加上 \"-s\"这个参数。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。