标签归档:freeBSD

Freebsd安全设置

FreeBSD 是一个非常安全的操作系统。也正因为它的 source code 是可以免费的取得,这个 OS 长久以来不断的有人改进加强。尽管 FreeBSD 一出厂就非常安全, 但是仍然有更多加强安全性的措施,这份 HOW-TO 会教你一些步骤, 以更加强你机器的整体安全。

5.1.1 网络

5.1.1.1 inetd (Inet Daemon)
网络在系统安全上扮演了一个很重要的角色。FreeBSD 的根基是有着内建网络功能, 且具有最稳最快的 TCP/IP stacks 的 4.4BSD。这个 stack 支持了非常多的协议像是telnet, ftp, talk, rsh 等… 这些 service 的的主设定档便是 /etc/inetd.conf。要编辑这个档, 请输入 \"vi /etc/inetd.conf\" (在这个例子里, 我使用 vi 。你可以使用其它你较为上手的编
辑器。或许你可以试试 pico)。如果你要使用 pico, 请在启动它时加上 -w 选项:

-w 关掉自动断行。(因此可以容许超过 80 字符的行存在)

这选项在编辑 /etc/inetd.conf 时非常有用。

当然了, 你也可以使用 ee – 它随着 FreeBSD 一起 \"出厂\" 的, 而且也是 root 预设的编辑器。不过, 请再 \"echo $EDITOR\" 确认一次。 开启了这个档案后, 你可以看到里面怎么描述每个 service 怎么激活, 要以那位使用者执行等等的信息。(man 5 inetd.conf)既然这个档案是许多 internet service 的主要设定档, 好好的设定它便是一件十分重要的事。你要关掉一个 service的话,只消在那一行前面加个 \"#\" 符号。基本的概念是, 关掉些你不熟悉的 services – 如果你不知道那个 service 是啥, 或者不知道它可以干啥。理想状态下, 你不须要把所有的 service 都打开。例如, 你的器只是要跑 web server。这种情况下, 你只要激活 ssh 和 httpd 便够了。关于啥是ssh, 下面会说明。如果你啥 service 都不想跑,最直接干脆的方法是-关掉 inetd。做法很简单, 只要编辑 /etc/rc.conf 并且把inetd_enable=\"YES\"改成inetd_enable=\"NO\"就可以了。

如此一来没人可以 telnet, rlogin, 或 ftp 到计算机中。如果你决定要激活你的 inetd 的话, 记得激活 log 选项, 并提高一个 service 每分钟激活的上限数目。(默认值是 256, 我建议提高到 1024-自行参照下面解说调整吧!)为什么要这么做呢…? 就 modem user 或是低速专线用户是没什么差别。但高速线路的人, 上限值太低会蹦出一个 DoS attack(Denial of Service)。某个坏心的人可以简单的用一个 shell script 同时搞出超过 256 个 connections, 这么一来你的 inetd会很不幸的阵亡。换句话说, 如果你想让每分钟每个 service可接受的connection 数多点, 记得做如下的设定, 不然来个坏心的人就可以搞垮你的计算机。因此, 在这行inetd_enable=\"YES\"

下面的:
inetd_flags=\"\"
要改成:
inetd_flags=\"-l -R 1024\"

这会将联机的动作都 log 下来(-l 参数)而且将同时最大联机数从预设的 256 增加到1024。你还须要对你的 /etc/syslog.conf 作些修改, 这些等会儿会提到。

5.1.1.2 SSH
在以下提到的案例中, 你完全不须要 run inetd。例如, 如果你只有跑 web, news, 或是 nfs server, 那么就没有必要在你的机器上再跑其它的services。但是你一定会问,\"我要怎么控制我的机器啊!?\" 嗯嗯, 所以现在要介绍 SSH。你可以透过 SSH (SecureShell) 来登入你的机器。Secure Shell 当初便是设计来取代 rsh, rlogin 等其它的Berkeley r* 命令。相信你很快就会了解 SSH 是如何有用,而且开始使用它,来代替其它的程序像是 telnet 和 ftp。SSH 具有很多功能,但是最为人知的是, 它的加密通讯方式, 也就是防止你的密码和资料以明码的方式在网络上传输。如果你使用 telnet,你的通讯内容可能会被\"窃听\": 传输中的资料被改变, 通讯内容被看到。(不是有 S/Key可以解决吗? 很不幸的, 它还是有着插入资料和连接时被破解的问题) 我希望你可以完全的关掉 inetd 而使用 SSH。如果你认为完全不靠
inetd 来激活某些 services,是完完全全不可能的事, 那么希望你至少激活 log 功能, 而且要增加每分钟同一个 servi-ce 可激活的次数。 (原因上面有提到)

你可以从 ftp://ftp.funet.fi/pub/unix/security/login/ssh 下载 SSH。

若你想要更简单的方法:

# cd /usr/ports/security/ssh
# make install

5.1.1.3 inetd (part II)

好吧, 你仍然执意要使用 inetd。那么我们来看看在 inetd.conf 有那些选项, 可以增进你的系统安全。在攻击某系统之前, 攻击者都会先收集该系统的相关信息。就 telnetd 而言, 你可以试试在 telnetd 那行后面加个 -h:

telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h
从 telnetd 的 man page 可以知道:
-h Disable the printing of host-specific information before login
has been completed.

当有很多管道可以获得系统信息的同时, 这招和下面的那招是个不错的解决方案。如果你认为跑 telnet daemon 是没有必要的, 那么只消加个 \"#\" 在该行的最前面就行了:

#telnet stream tcp nowait root /usr/libexec/telnetd telnetd

有个极不错的措施是, 你可以拒绝没有完整 FQDN 的人来联机。要做到这点, 也只要加个 -U 选项到 telnetd 后面:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U

这是个小动作, 但是对你的系统安全有莫大的助益。

5.1.1.4 ftpd
现在来看看 ftp。 对于 ftp FreeBSD 已经做了一些 log 的动作 。 可以看到在/etc/inetd.conf 里面 ftpd 那一行已经加了 \"-l\"。然而, 你还是要设定你的syslogd, 使它可以接受 ftp daemon 产生的 log。从 man page 可以得知:

每个成功或是失败的 ftp 登入尝试, 都会以 LOG_FTP 机制纪录起来。如果这个选项被指定了两次, 所有的下载 (get), 上载(put), 新增, 删除,建立目录, 及更名的动作和文件名字都会被纪录下来。 又: LOG_FTP 讯息预设是不会被 syslogd(8) 纪录下来的。你还要在 syslogd(8) 的设定文件里面激活这个功能才行。

让我们开启 syslogd 纪录 ftpd log 的功能吧~ 这个档案是 /etc/syslog.conf (别忘了顺便看看 man 5 syslog.conf)。把下面这一行加到这个设定档里:

ftp.* /var/log/ftpd

也不要忘了执行这个指令 \"touch /var/log/ftpdlog\", 因为 syslogd 不能写入到一个没有被开启过的档案。如果你想要你的 ftpd 提供你更多的 log 讯息, 那么就在 ftp那一行多加个 \"-l\" 吧:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l

如果你想要确定你的使用者们都用 scp (Secure Copy, 附属在 SSH 里面), 但是又想要提供 anonymous ftp 服务, 也只消加个 \"-A\" 在 ftp 那行后面就行了:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -A

你也可以编辑 /etc/ftpwelcome, 说明目前接受 anonymous ftp 登入, 但是系统内的使用者就得使用 rcp 了。如果你有提供 anonymous ftp, 你可以使用 -S 选项来记录传输的情形:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -A -S

5.1.1.5 fingerd
Finger 服务默认值还算安全: 它不容许不带 user name 的 query。这是一件不错的事(tm)。然而, 就是有些人无论如何也不想 run fingerd。这种情形下, 你只要简单的给它加个 \" #\" 在这行的最前面就可以了。又, 你想要 log 住谁来 finger 的话, 加个\"-l\" 也就行了:

finger stream tcp nowait nobody /usr/libexec/fingerd fingerd -s -l

Fingerd 产生的 log 信息预设是写到 /var/log/messages。如果你想要这些信息写入到特定的档案里去, 那么就在 /etc/syslog.conf 加入这一行:

daemon.notice /var/log/fingerd
/* !fingerd anyone? */
$ man 5 syslog.conf

除了 ftp, telnet 和 finger 之外, 你实在不须要在 /etc/inetd.conf 中再多激活任何东西了。通常我都会关掉 talk 及 comsat等我个人不须要的东西。如同我之前讲的,如果你不知到某个 servcie 是干嘛用的, 而且你也不须要它, 那么就关掉它。一些和网络有关而且很有用的 man page 是: inetd, ftpd, telnetd, fingerd, syslogd,comsat, talkd, rshd, rlogind, inetd.conf。并且记得要看 man page 的\"SEE ALSO\"部份, 以获得更多的相关信息。

5.1.1.6 ipfw (IP FrewWall)
IP FireWall 做的是 packet 过滤的工作。没错, 就是只有这样。然而, 你要考虑的事是,你的 kernel 要有支持 ipfw。 通常在我管的机器上, 我都会重编核心使其支持ipfw。大概看起来是这样:

options IPFIREWALL #finger the net
options IPFIREWALL_VERBOSE #log the net
options IPFIREWALL_DEFAULT_TO_ACCEPT

第一行表示最其本的 IP FireWall 支持。第二行让 ipfw 可以把接受或拒绝 packets的纪录 log 起来。第三行非常重要, 让 ipfw 默认值是接受任何地方来的 packets 。如果你不这样做, 默认值拒绝任何地方来的 packets。我个比比较喜欢后者, 但我又认为在我自己的工作站上, 或一个让人登入的工作站, 预设拒绝任何 packets 不是一件太好的事。如果你搞不清楚自己在做啥事, 那就不要用这个选项。

就设定 firewall 而言, 这是不甚正确的。预设任何东西都该被挡掉才是正确的。如果你是要建置一台高安全性的系统, 或一台 firewall 的话,那就千万不要加入这个选项:

options IPFIREWALL_DEFAULT_TO_ACCEPT

记住一件事: 要预设拒绝任接受任何 packets, 然后再加入 rule 来设定你想要 接受那些 packets。查看 /etc/rc.firewall 以得到更多的信息。再一次提醒你, 不要使用这个 option, 除非你只是想要防止 DoS attacks 或暂时把某些 port/network ban掉。

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 3001: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\"这个参数。

如果有人尝试攻击你的系统而且失败了, 你的系统纪录便不会被伪造。但如果你的系统己经被攻陷了, 而且 /var/log 整个被干掉了呢 !?还是有方法可以防止的。 其一便是在你的网络系统中再架一台机器拿来纪录整个网络中发生的事, 而且也不要再干其它的事了。除了 UDP port 514 之外, 其它的也都不用再开了。这样子一来你便可以纪录下所有机器 (routers, firewalls, serves, workstations) 发生的所有事。你可以只送敏感的讯息给它, 或者任何你觉得重要的。这台机器可以是老旧 486, 但有颗大大的硬碟。记得要设定好正确的 \"-a\" 选项, 免得搞出没收到纪录的乌龙事。你也可以接台老旧的点阵打印机给它, 以印出敏感的事件(像是失败的登入尝试)。如果你把系统纪录印到纸上, 一位攻击者要清除它是很困难的。还有其它的方法,例如透过 serial port (cuaaN) 或是 parallel port (lpN) 送
出纪录到别台机器上。

每个人都有不同的记录需求。但是有一件事我通常会做的是在 /etc/syslog.conf 加入这一行:
auth.* /var/log/authlog

FreeBSD 出厂时便包含了 newsyslog。这玩意会定时压缩纪录文件并清除掉旧的纪录。

设定档位于 /etc/newsyslog.conf – 请看一下 man page 以得到更多的信息:
% man newsyslog
不像 syslogd, newsyslog 不是一直都在执行的。它是从 crontab 激活的:
% grep newsyslog /etc/crontab
0 * * * * root /usr/sbin/newsyslog
%

你可以修改 /etc/newsyslog.conf 以符合你的需求。我通常会改变它预设的档案模式, 从 664 改成 660 – 因为没有必要让一般的使用者去查看你的系统纪录。你应该这么做:

# cd /var/log
# chmod g-w,o-r * ; chmod a+r wtmp

这会防止一般使用者读取纪录文件, 除非它们在适当的 group (wheel 或之类的)。还有,记得把记录文件的 group 都改成 wheel — 这纯粹只是为了方便: 如果你是在 wheel 这个 group; 你当然是可以 su(1) 到 root 然后读记录文件。但是这么做以后你便可以直接读记录文件了, 岂不方便乎!?你还要在 /etc /newsyslog.conf 中加入 \"root.wheel\":

/var/log/maillog root.wheel 640 7 100 * Z
/var/log/authlog root.wheel 640 7 100 * Z
/var/log/messages root.wheel 640 7 100 * Z

这会在记录文件达到 100K 时将它压缩并加以编号, 将 mode 改成 640, chown成root.wheel, 并将旧的记录文件干掉 – 这就是我们要的。

当然,标准的 Unix 还有其它不同的 syslog 程序可供选择,其中之一是 CORE EDI 的ssyslog (secure syslog). 可以在以下的地方找到:

http://www.core-sdi.com/ENGLISH/CoreLabs/ssyslog/download.html

另外还有 nsyslog (new syslog),这是写 bpfilter 那一伙人写出来的,你可以在 http://cheops.anu.edu.au/~avalon/nsyslog.html 找到这个程序。

不管你选用那一种程序 (标准的 syslog , ssyslog ,或 nsyslog),你应该也去看看一些帮你分析系统 log 的程序,帮你省下去用 grep 查询 log file 的麻烦。

其中之一是 logcheck , 可以在这个地方下载: http://www.psionic.com/abacus/abacus_logcheck.html

另外一个类似的程序叫做 logsurfer , 你可以从这个网页下载: http://www.cert.dfn.de/eng/team/wl/logsurf/

5.1.2 Misc. hints and tips

5.1.2.1 LKM
在正式提供服务的系统上, 也许该关掉 LKM。为什么? 请看:

Phrack Magazine Volume 7, Issue 51 September 01, 1997, article 09

要关掉 LKMs, 在 kernel 设定档中加入这一行:
options NOLKM

5.1.2.2 Portmap
FreeBSD 出厂的默认值会将 portmap 这项功能打开。如果你不需要它的话,把它关掉。如果你没有跑任何需要呼叫 RPC 的程序的话,你就不需要跑这个程序。如果要关掉portmap这个程序,你可以去修改 /etc/rc.conf , 把

portmap_enable=\"YES\" # Run the portmapper service (or NO).
改成
portmap_enable=\"NO\" # Run the portmapper service (or NO).

5.1.2.3 Sendmail
FreeBSD 出厂的默认值也会执行 sendmail 的功能。从很久以前 sendmail 就以不安全且漏洞百出闻名。最近人们努力的将 sendmail 中的错误清除,但是由于 sendmail是一个很肥大的程序,要将所有的错误都抓出来相当的困难。换句话说:如果你不需要它的话,最好把它关掉。如果你真的需要它的话,最好到 sendmail 的网站去看看有没有新的patches 或是 hacks, sendmail 的网站在 http://www.sendmail.org

此外,如果你的 sendmail 版本是 8.8 以后的版本,请设定好你的系统,以防止 spammer利用你的系统去干坏事。设定 anti-spam 的信息可以在 http://www.sendmail.org/antispam.html 下找到。

如果你决定要把 sendmail 关掉的话,只要去修改 /etc/rc.conf (没错,又是它)中的:
sendmail_enable=\"YES\" # Run the sendmail daemon (or NO).
改成
sendmail_enable=\"NO\" # Run the sendmail daemon (or NO).

5.1.2.4 Ports and Packages
在一台高安全性的系统上, 最好不要使用 ports 或 packakges。 你不会真正知道是不是安装 suid 的程序进你的系统 — 而且你不会想再多这些 suid 的东西了, 相信我。尽管你在 pkg_add 时可以使用不同的选项(如 \"-v\" 或 \"-n\"), 最好还是自己来: 抓回它的 source code, 自己 compile, 再手动安装完成。

5.1.2.5 Filesystem quota
如果你的系统是 \"shell\" type server,你可能希望设定使用者的 quota (可用空间)。

如此一来可以保护你的系统免受 Denial of Service 攻击方式的侵扰(不论是有意或是无意的)。在未设定 quota 的系统上使用者可以随意的灌爆你的硬盘。要把 quota这项功能打开,你可以修改 /etc/rc.conf 中的这项设定:

check_quotas=\"NO\" # Check quotas (or NO).
改成
check_quotas=\"YES\" # Check quotas (or NO).

请先看看以下的 man page,这些文件说明如何使用 quota 的各项设定,并且有一些设定的范例: quotaon, edquota, repquota, quota 请确定在 /etc/fstab 中有加入 \"userquota\" , 详见 man 5 fstab。

5.1.2.6 Crontab
如果你使用了 /etc/crontab 的话,这项功能有可能提供入侵者一些额外的信息。
请确定你做过 \"chmod 640 /etc/crontab\"

5.1.2.7 BPF
BPF 是 berkeley packet filter 的缩写,要使用这项功能前你必须修改 kernel,以达成监听网络的目的。像 tcpdump 和 NFR 这些程序都使用 BPF。然而 BSD的监听程序也都透过 BPF 来达成,如果有人拿到你系统的 root 权限的话,在系统上设定 BPF 功能反而帮助他们更容易的监听你的网络。如果没有必要的话,不要设定 kernel 中 BPF的功能。 FreeBSD 出厂的设定值是将这个功能关闭起来的。

5.1.2.8 CVSup, CVS, 等等
如果你是使用 CD-ROM 安装你的系统的话,很有可能当你拿到你的 CD-ROM时,已经发现某些程序有错误存在了。在大部份的情况下(我们希望如此),这些错误与系统安全无关。然而,我建议你将你的系统升级到最新的 -current (或是 -stable,视你的喜好而定) 版本。如此你可以确定你系统上的的是最新版本的系统原始码。

你需要的信息在这边可以找到:
http://www.freebsd.org/handbook/handbook264.html#508

在更新你操作系统的原始码后你必须去 \"make world\",详细的文件在:
http://www.nothing-going-on.demo … rld/make-world.html

5.1.2.9 SSH
使用 ssh 以代替 telnet, ftp, rlogin, rsh 等的重要性, 再怎么强调都是不够的。对于使用慢速线路的人 (dial-up, 56K frame), ssh 有 -C 选项:
-C 将数据压缩后再传出去, 包括了 stdin, stdout, stderr还有透过 X11 还有TCP/IP。压缩的算法同 gzip, 而且可以指定压缩的 level。对于 moden users 和使用慢速线路的人, 这功能是不错的。 但有高速线路的人, 这么搞只会拖慢速度。在主机对连时可以设默认值, 请再参照文件。

这会让你用起来快一点 总之就是用 SSH 就对了啦! 拜托, 拜托, 使用 ssh。 如果你硬是不信邪, 再也没什么安全措施可以帮助你了 !!

5.1.2.10 Related URLs

1) FreeBSD Hardening Project:
http://www.watson.org/fbsd-hardening/
2) FreeBSD ipfw Configuration Page:
http://www.metronet.com/~pgilley/freebsd/ipfw
3) FreeBSD Security advisories:
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/
4) FreeBSD Security web page:
http://www.freebsd.org/security/security.html
5) Security tools in FreeBSD:
http://www.samag.com/archive/0705/feature.html

5.2 sco 系列

5.2.1 抓好网内主机的管理是网络安全管理的前提

用户名和密码管理永远是系统安全管理中最重要的环节之一,对网络的任何攻击,都不可能没有合法的用户名和密码(后台网络应用程序开后门例外)。但目前绝大部分系统管理员只注重对特权用户的管理,而忽视对普通用户的管理。主要表现在设置用户时图省事方便,胡乱设置用户的权限(id)、组别(group)和文件权限,为非法用户窃取信息和破坏系统留下了空隙。

金融系统UNIX的用户都是最终用户,他们只需在具体的应用系统中工作,完成某些固定的任务,一般情况下不需执行系统命令(shell)。以农业银行全国电子汇兑为例,用户名为dzhd,它在/etc/passwd文件中描述如下:

dzhd:x:200:50: :/usr/dzhd:/bin/sh
它的.profile内容大致如下:
COBSW=+R+N+Q-10
DD_PRINTER=“1p-s”
PATH=/etc:/bin:/usr/binHOME/bin:/usr/dzhd/obj:
MAIL=/usr/spool/mail/logname
umask 007
eval`test -m ansi:ansi -m:?ansi -c -s -Q`
export PATH MAIL COBSW DD_PRINTER
cd usr/dzhd/obj
runx hdg
exit

用户正常登录后,如果按下中断键“delete”,关掉终端电源,或同时键入“Ctrl”“ ”,那么用户将进入shell命令状态。例如他可以在自己的目录不断创建子目录而耗尽系统的I节点号、或用yes>aa创建一个其大无比的垃圾文件而耗尽硬盘空间等导致系统的崩溃、瘫痪;如果文件系统的权限设置不严密,他可运行、窥视甚至修改它;还可通过su等命令窃取更高的权限;还可登录到其它主机上去捣乱……令你防不胜防,危险性可想而知。这一些问
题都与用户设置有关。所以,尽量不要把用户设置成上述形式。如果必须这样,可根据实际需要,看看能否把用户的sh变成受限sh,如rsh等,变成如下形式:

dzhd:x:200:50: :/usr/dzhd/obj:/bin/rsh
或如下形式:
dzhd:x:200:50: :/usr/dzhd:./main
在main(.porfile)首部增加如下一行:
trap’ ‘ 0 1 2 3 5 15

那么上述一切问题都可避免。

此外定期检查你的/etc/passwd文件,看看是否有来历不明的用户和用户的权限;定期修改用户密码,特别是uucp、bin等不常用的用户的密码,以防有人在此开个活动的天窗–一个可自由进出的用户;删除所有睡眠用户等。

5.2.2设置好自己的网络环境是阻止非法访问的有效途径
网上访问的常用工具有telnet、ftp、rlogin、rcp、rcmd等网络操作命令,对它们的使用必须加以限制。最简单的方法是修改/etc/services中相应的服务端口号。但这样做会使网外的一切访问都被拒绝,即使是否法访问也不例外。这种闭关自守的做法不值得提倡,因为这样会使本网和网外隔绝开,也会给自己带来不便。通过对UNIXt系统的分析,我们认为有可能做到有条件限制(允许)网上访问。

5.2.2.1 建立etc/ftpusers文件(不受欢迎的ftp用户表)。

与之相关的命令是ftp。配置如下:
#用户名
dgxt
dzhd

以上都是本机内的一些用户,侵入者使用以上用户名ftp访问本网会被拒之门外。

5.2.2.2 保存.netrc文件
注意保存好.netrc文件(远程注册数据文件)。与之有关的命令是ftp。.netrc包含注册到网络上用ftp作文件转移的远程主机的数据。通常驻留在用户当前目录中,文件权限必须为0600。格式如下:

machine对方主机名login对方主机内用户名password对方用户密码macdef init ftp的操
作命令集。

5.2.2.3 创建匿名ftp
所谓匿名ftp,是指其他主机的用户能以ftp或anonymous用户进行数据收发而不要任何密码。

建立方法如下:

1) 用sysadmsh创建ftp用户,在passwd文件表示为:
ftp:x:210:50: :/usr/ftp:/bin/sh
.profile中的路径为:
PATH=$HOME/binHOME/etc
2) 在/usr/ftp目录:
#创建匿名ftp所用的目录
#mkdir bin etc dev pub shlib
#改变pub以外所有目录权限
#chmod 0555 bin etc dev shlib
#改变pub目录的所有者和同组者
#chown ftp pub
#chgrp ftp pub
#复制匿名ftp所执行文件
#cp/bin/rsh/bin/pwd/bin/1s bin
#改变所需执行文件权限
#chmod 011 bin/*
#查看所需伪设备的情况
#1/dev/socksys
#1/dev/null
#建立所需伪设备的驱动程度
#cd/usr/ftp/dev
#mkond null c 4 2
#mkond socksys c 26 0
#改变伪设备驱动程序的所有者、同组者
#chown ftp ftp/*
#chgrp ftp ftp/*
#复制共享文件
#cp/shlib/ilbe_s shlib
注意不要复制/etc/passwd、/etc/proup到etc下,这样对安全具有潜在的威胁。此外给ftp用户加上密码,不要告诉其他任何人。

5.2.2.4 限制.rhosts用户等价文件(又叫受托用户文件)

与之有关命令有rlogin、rcp、rcmd等。
所谓用户等价,就是用户不用输入密码,即可以相同的用户信息登录到另一台主机中。用户等价的文件名为.rhosts,存放在根下或用户主目录下。它的形式如下:

#主机名 用户名
ash020000 root
ash020001 dgxt

如果用户名为空,是所有用户均等价。

5.2.2.5 限制hosts.equiv主机等价文件,(又叫受托主机文件)
有关的命令为rlogin、rcp、rcmd等。主机等价类似于用户等价,在两台计算机除根目录外的所有区域有效,主机等价文件为hosts.equiv,存放在/etc下,它的形式如下:

#主机名 用户名
ash020000
ash020001

当远程使用ftp访问本系统时,UNIX系统首先验证用户名和密码,无误后查看ftpusers文件,一旦其中包含登录所用用户名则自动拒绝连接,从而达到限制作用。因此我们只要把本机内除匿名ftp以外的所有用户列入ftpusers文件中,即使入者获得本机内正确的用户信息,无法登录系统。需对外发布的信息,放到/usr/ftp/bub下,让远方通过匿名ftp获取。使用匿名ftp,不需密码,不会对本机系统的安全构成威胁,因为它无法改变目录,也就无法获得本机内的其他信息。使用.netrc配置,需注意保密,防止泄露其他相关主机的信息。

使用用户等价和主机等机这类访问,用户可以不用口令而像其他有效用户一样登录到远程系统,远程用户可使用rlogin直接登录而不需密码,还可使用rcp命令向或从本地主机复制文件,也可使用rcmd远程执行本机的命令等。因此主种访问具有严重的不安全性,必须严格控制或在非常可靠的环境下使用。1998年美国发现的著名的“蠕虫”病毒,由一个叫英尔(morris)的年青人编写的,在Internet网上流传开,造成许多UNIX系统的瘫痪,损失达数亿美元,其重要的传播手段之一就是利用了用户等价和主机等价的配置。慎重使用(最好不用)和经常检查上述文件,会有效加强系统安全。

UNIX系统没有直接提供对telnet的控制。但我们知道,/etc/profile是系统默认shell变量文件,所有用户登录时必须首先执行它。如果我们在该文件首部增加如下几条shell命令:

#设置中断变量
trap’ ‘ 0 1 2 3 4 5 15
umask 022
#获取登录终端名
dc=“’who am i |awk‘[prin $2]’`”
#检查是否受限
grep $de /etc default/aaa >dev/null 2>&1
#如果受限
if [$?=“0”]
then
echo“请输入密码:c”
read abc
#获取正确密码
dd=“grep root /etc/edfault/aaa|awk’[pint $2]’`”
#非法用户发出警告信息到主控台
法[“$abc”!=$dd]
then
echo “非法用户!”
echo“有非法用户试图登录!”>tev/tty01
logname>/dev/tty01
#同时记载日记文件
echo“有非法用户试图登录!c”> >/usr/tmp/err
echo $dc> >/usr/tmp/err
logname > >/usr/tmp/err
exit;
fi;
fi

其中/etc/default/aaa是受限终端名的一个文本文件,root后为密码,它的内容如下:

root qwerty
ttyp0
ttyp1
ttyp2
ttyp3
ttypa
ttypb

这样非法用户即例获得了合法的用户名和密码,也无法远程使用。系统管理员定时阅读日记文件,注意控制台信息,就能获得被非法访问的情况,及时采取措施。如果用c语言实现上述过程,把接受爱变成不可显示,效果更佳。

5.2.3 加强对重要资料的保密
它主要包括hosts表、X.25地址、路由、连接调制解调器的电脑号码及所用的通信软件的种类、网内的用户名等,这些资料都应采取一些保密措施,防止随意扩散。如可向电信部门申请通信专用的电话号码不刊登、不供查询等。由于公共的或普通邮电交换设备的介入,信息通过它们后可能被篡改或泄露。

5.2.4 加强对重要网络设备的管理
路由器在网络安全计划中是很重要的一环。现在大多数路由器已具备防火墙的一些功能,如禁止telnet的访问、禁示非法的网段访问等。通过网络路由器进行正确的存取过滤是限制外部访问简单而有效的手段。
有条件的地方还可设置网关机,将本网和其他网隔离,网关机上不存放任何业务数据,删除除系统正常运行所必须的用户外所用的用户,也能增强网络的安全性。

FreeBSD防火墙的安装和设置

FreeBSD自带有一个基于包过滤的防火墙——ipfw,虽然功能没有专业防火墙那么强大,但是应付一个Web站点的安全还是足够的,所以我们决定选用该防火墙来保护我们的Web服务器。

1. 安装ipfw
IPFW 的主要部分是在内核中运行的, 因此会需要在FreeBSD内核配置文件中添加部分选项。(注意,如果你没有安装FreeBSD核心源代码,是无法进入以下目录的,所以运行之前一定要先安装内核源代码)我们先进入内核配置文件:

  # cd /sys/i386/conf

  # cp GENERIC ./kernel_fw

  打开内核配置文件:

  # ee ./kernel_fw

  添加四个选项,不需要后面的注释信息:

  options IPFIREWALL # 将包过滤部分的代码编译进内核。

  options IPFIREWALL_VERBOSE

  # 启用通过syslogd记录的日志。如果没有指定这个选项,即使您在过滤规则中指定记录包, 也不会真的记录它们

  options IPFIREWALL_VERBOSE_LIMIT=10

  # 限制通过 syslogd( 记录的每项包规则的记录条数。在恶劣的环境中如果您想记录防火墙的活动, 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击, 那么这个选项将会很有用。

  options IPFIREWALL_DEFAULT_TO_ACCEPT

  # 这将把默认的规则动作从 “deny 改为 “allow.这可以防止在没有配置防火墙之前使用启用过 IPFIREWALL 支持的内核重启时把自己锁在外面。 另外, 如果您经常使用 ipfw( 来解决一些问题时它也非常有用。 尽管如此,在使用时应该小心,因为这将使防火墙敞开, 并改变它的行为。

  编译内核:

  # /usr/sbin/config kernel_fw

  # cd ……/compile/kernel_fw (注意你的版本,如果是低于5.0的版本用……/……/compile/kernel_fw)

  # make depend

  # make

  # make install

重启系统。注意,我们没有选择options IPFIREWALL_DEFAULT_TO_ACCEPT该选项,就是说默认系统启动后是打开防火墙的,并且防火墙默认是不允许任何连接的(deny from any to any),所以一定要在本地操作,否则你将被“锁在门外”,如果你选择了该选项则可以使用ssh等连接不受影响,不过这相对不安全。

2. 配置ipfw
如果配置普通情况下的规则,使用命令配置的模式:

  ipfw的配置命令:ipfw [-N] 命令 [编号] 动作 [log(日志)] 协议 地址 [其它选项]

  例如:

  # ipfw add allow tcp from any to 10.10.10.1 80 #允许外界访问我的web服务

  # ipfw add allow tcp from any to 10.10.10.1 21 #允许外面访问我的ftp服务

  # ipfw add allow tcp from any to 10.10.10.1 22 #允许外界访问我的ssh服务

  如果使用规则包的形式,那么查看下面内容。

  系统启动后,我们还要配置rc.conf文件来运行我们的防火墙:

  # ee /etc/rc.conf

  加入如下内容:

  gateway_enable="YES" # 启动网关

  firewall_enable="YES" # 激活firewall防火墙

  firewall_script="/etc/rc.firewall" # firewall防火墙的默认脚本

  firewall_type="/etc/ipfw.conf" # firewall自定义脚本

  firewall_quiet="NO" # 起用脚本时,是否显示规则信息。现在为“NO”假如你的防火墙脚本已经定型,那么就可以把这里设置成“YES”了。

  firewall_logging_enable="YES" # 启用firewall的log记录。

  设置完成后我们再编辑/etc/syslog.conf文件:

  # ee /etc/syslog.conf

  加入以下行:

  !ipfw

  *.* /var/log/ipfw.log

  现在到了最重要的编辑规则包了:

  # ee /etc/ipfw.conf

  我们添加一下规则:(注意 10.10.10.1是我们服务器的IP)

  ######### TCP ##########

  add 00001 deny log ip from any to any ipopt rr

  add 00002 deny log ip from any to any ipopt ts

  add 00003 deny log ip from any to any ipopt ssrr

  add 00004 deny log ip from any to any ipopt lsrr

  add 00005 deny tcp from any to any in tcpflags syn,fin

  # 这5行是过滤各种扫描包

  add 10001 allow tcp from any to 10.10.10.1 80 in # 向整个Internet开放http服务。

  add 10002 allow tcp from any to 10.10.10.1 21 in # 向整个Internet开放ftp服务。

  add 10000 allow tcp from 1.2.3.4 to 10.10.10.1 22 in

  # 向Internet的xx.xx.xx.xx这个IP开放SSH服务。也就是只信任这个IP的SSH登陆。

  # 如果你登陆服务器的IP不固定,那么就要设为:add 10000 allow tcp from any to 10.10.10.1 22 in

  add 19997 check-state

  add 19998 allow tcp from any to any out keep-state setup

  add 19999 allow tcp from any to any out #这三个组合起来是允许内部网络访问出去,如果想服务器自己不和Internet进行tcp连接出去,可以把19997和19998去掉。(不影响Internet对服务器的访问)

  ########## UDP ##########

  add 20001 allow udp from any 53 to 10.10.10.1 # 允许其他DNS服务器的信息进入该服务器,因为自己要进行DNS解析嘛~

  add 29999 allow udp from any to any out # 允许自己的UDP包往外发送。

  ########## ICMP #########

  add 30000 allow icmp from any to any icmptypes 3

  add 30001 allow icmp from any to any icmptypes 4

  add 30002 allow icmp from any to any icmptypes 8 out

  add 30003 allow icmp from any to any icmptypes 0 in

  add 30004 allow icmp from any to any icmptypes 11 in

  #允许自己ping别人的服务器。也允许内部网络用router命令进行路由跟踪。

 

FreeBSD服务程序的安全设置

目录 [隐藏]
1 服务程序的安全设置
1.1 Apache的安全设置
1.2 PHP安全设置
1.3 Mysql的安全设置
1.4 vsFTPd安全设置
1.5 SSH安全设置
2 操作系统FreeBSD所有条目
3 参见 
 
[编辑]服务程序的安全设置
到这里就是本文的重点所在了,我们将花费比较多的文字进行描述,当然,所以描述不一定是非常正确的,也希望能够对你有一些帮助。我们系统默认是运行了包括Apache、Mysql、vsFTPd,SSH等服务,我们以下进行一一讲解。

[编辑]Apache的安全设置
Apache的核心设置就是在 httpd.conf 里面,我们安装的Apache的目录是在 /usr/local/2/ 下,那么我们的配置文件就是在 /usr/local/2/conf/httpd.conf ,如果你是使用ports等安装的,配置文件应该是在/etc或/usr/local/etc目录下。使用ee或者vi打开配置文件:

  # ee /usr/local/apache2/conf/httpd.conf

下面我们就要进行比较多的安全设置了,基本的服务、端口、主目录等等设置就不说了,只讲与安全有关的设置。

(1)指定运行Apache服务的用户和组
这是比较重要的,因为权限是继承的,如果运行Apache服务的用户权限太高,那么很可能使得入侵者通过WebShell等就会对系统构成严重威胁。一般我们运行Apache的是nobody用户和nobody组。在httpd.conf的250-275行之间找到User和Group选项,比如我们默认设置如下(去掉了注释信息):

  <IfModule !mpm_winnt.c>;

  <IfModule !mpm_netware.c>;

  User nobody

  Group #-1

  </IfModule>;

  </IfModule>;

(2) Apache的日志文件
  Apache的日志文件是非常重要的,可以发现apache的运行状况和访问情况,对于判断入侵等有重要帮助。它的默认选项是:

  # 错误日志存放目录,默认是存放在apache安装目录的logs下

  ErrorLog logs/error_log

  # 日志记录的级别,级别有debug, info, notice, warn, error, crit等,默认是“warn”级别

  LogLevel warn

  # 访问日志记录的格式,每一种格式都有不同的内容,根据你的需要进行定制,以获取最多访问信息

  LogFormat "%h %l %u %t \"%r\" %>;s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

  LogFormat "%h %l %u %t \"%r\" %>;s %b" common

  LogFormat "%{Referer}i ->; %U" referer

  LogFormat "%{User-agent}i" agent

  # 使用上面格式的那一种,默认是使用common

  CustomLog logs/access_log common

  文件格式预定义的格式内容:

  %a 远程用户IP

  %A 本地httpd服务器的ip

  %f 传送的文件名

  %h 远程主机

  %m 请求方式

  %l identd给出的远程名

  %p 连接的httpd端口号

  %P 请求的httpd进程

  %t 时间

  %T 服务请求时间

你可以定制自己的日志格式,然后通过CustomLog logs/access_log common来进行调用。

注意,日志文件是由运行Apache的用户进行打开的,要注意该文件的安全,防止被黑客改写或者删除。

(3) Apache服务信息显示控制
在配置文件中有个选项是控制是否显示apache版本信息、主机名称、端口、支持的cgi等信息的:

  ServerSignature On

默认为On,那么将显示所有信息:

  我故意访问一个不存在的文件:http://www.target.com/404.html

  那么就会在给的错误提示中显示如下信息:

  Apache/2.0.53 (Unix) PHP/4.3.11 Server at target.com Port 80

所有Apache和PHP的信息暴露无遗,这是很不安全的。当然同时还有Off和EMail选项,Off将不显示任何信息,EMail将显示管理员的邮箱地址,建议设为Off或者EMail,这样能够避免泄漏Apache服务器的信息给黑客。

(4) 目录浏览
  在httpd.conf中可以设置apache能够对一些没有索引文件的网页目录进行目录浏览:

  <Directory />;

  Options Indexes FollowSymLinks

  AllowOverride None

  </Directory>;

  这是不合适也不安全的,建议不需要目录浏览:

  <Directory />;

  Options FollowSymLinks

  AllowOverride None

  </Directory>;

(5) 用户主页
  设置httpd.conf中的:

  UserDir public_html

  能够使得每个使用系统的用户在自己的主目录下建立 public_html 目录后就能够把自己的网页放进该目录,然后通过:

  http://www.target.com/~用户名/网页 就能够显示自己的网页,这是不安全的,而且对于我们服务器来讲,这没有必要,所以我们直接关闭该功能:

  UserDir disabled

  或者把该内容改名,改成 一个黑客比较不容易猜到的文件名,比如:

  UserDir webserver_public_htmlpath

  也可以只允许部分用户具有该功能:

  UserDir enabled user1 user2 user3

(6) CGI执行目录
  如果你的apache要执行一些perl等cgi程序,那么就要设置一下选项:

  ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

  但是这也给了黑客利用一些不安全的cgi程序来进行破坏,所以如果你不需要cgi的话,建议关闭该选项:

  #ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

(7) 控制PHP脚本只能访问指定目录
  在httpd.conf添加如下内容:

  php_admin_value open_basedir /usr/www

  后面的路径是你需要PHP脚本能够访问的目录,如果PHP脚本想要访问其他目录将出项错误提示。

  ( 目录访问控制 (未完)

  这项内容最复杂,同时涉及的东西也比较多,我只能简单说一下,不清楚请参考其他文章。

  比如下面的内容:

  <Directory />;

  Options FollowSymLinks

  AllowOverride None

  </Directory>;

  就是允许访问每一个目录,里面设置的是允许执行的动作,一般包含的动作有:Options、AllowOverride、Order、Allow、Deny.

  Options是只对指定目录及其子目录能够执行的操作,Indexes、Includes、FollowSymLinks、ExecCGI、MultiViews、None、All等操作。

  AllowOverride是指定目录访问的权限,当然也可以通过 AccessFileName文件指定的 .htaccess 来控制。它的操作有:None、All、Options、FileInfo、AuthConfit、Limit等。

  Order、Allow、Deny三个指令必须配合来控制目录访问权限。Order指定检查次序的规则,比如Order Allow, Deny,表示先按Allow检查,如果不匹配再按Deny进行检查。Order Deny, Allow ,表示先按Deny规则检查,如果不满足条件,再按Allow进行检查。

  [NextPage]

  控制目录访问权限的文件

  默认在Unix平台下能够使用 .htaccess 来对目录权限进行规则定义,但是这是不安全的,建议关闭,默认的选项:

  AccessFileName .htaccess

  建议设成:

  #AccessFileName .htaccess

  全部目录权限定义使用httpd.conf中的定义,不使用 .htaccess.

(9) 用户访问认证
  这个技术非常重要,能够控制一些非法用户访问本内容。假设我们的网站: http://www.target.com/admin 是我们的后台管理目录,我不允许一些非法用户进行访问,那么我就必须设定对该目录访问是需要验证的。

  先在httpd.conf中加入要进行访问认证的目录:

  <Directory "/usr/www/admin">;

  authtype basic

  authname "rivate"

  authuserfile /usr/local/apache/bin/admin.dat

  require user login_user

  Options Indexes FollowSymlinks MultiViews

  AllowOverride None

  </Directory>;

  上面我们就设置了我们的 /usr/www/admin目录是必须进行认证才能访问的,接着我们设置访问密码:

  # /usr/local/apahche/bin/htpasswd -c /usr/local/apache/bin/admin.dat login_name

  New password: *****

  Re-type new password: *****

  Adding password for user login_name

  那么下次任何用户访问http://www.target.com/admin目录的时候就需要输入用户名login_name和你设置的密码。

[编辑]PHP安全设置
PHP本身再老版本有一些问题,比如在 php4.3.10和php5.0.3以前有一些比较严重的bug,所以推荐使用新版。另外,目前闹的轰轰烈烈的SQL Injection也是在PHP上有很多利用方式,所以要保证安全,PHP代码编写是一方面,PHP的配置更是非常关键。

我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行php能够更安全。

整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨。我们先使用任何编辑工具打开/etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件可能不在该目录。

(1) 打开php的安全模式
  php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的,我们把它打开:

  safe_mode = on

(2) 用户组安全
  当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。

  建议设置为:

  safe_mode_gid = off

  如果不进行设置,可能我们无法对我们服务器网站目录下的文件进行操作了,比如我们需要对文件进行操作的时候。

(3) 安全模式下执行程序主目录
  如果安全模式打开了,但是却是要执行某些程序的时候,可以指定要执行程序的主目录:

  safe_mode_exec_dir = /usr/bin

  一般情况下是不需要执行什么程序的,所以推荐不要执行系统程序目录,可以指向一个目录,然后把需要执行的程序拷贝过去,比如:

  safe_mode_exec_dir = /tmp/cmd

  但是,我更推荐不要执行任何程序,那么就可以指向我们网页目录:

  safe_mode_exec_dir = /usr/www

(4) 安全模式下包含文件
  如果要在安全模式下包含某些公共文件,那么就修改一下选项:

  safe_mode_include_dir = /usr/www/include/

  其实一般php脚本中包含文件都是在程序自己已经写好了,这个可以根据具体需要设置。

(5) 控制php脚本能访问的目录
  使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问/etc/passwd等文件,一定程度上限制了phpshell的危害,我们一般可以设置为只能访问网站目录:

  open_basedir = /usr/www

(6) 关闭危险函数
  如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得不希望执行包括system()等在那的能够执行命令的php函数,或者能够查看php信息的phpinfo()等函数,那么我们就可以禁止它们:

  disable_functions = system,passthru,exec,shell_exec,popen,phpinfo

  如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作

  disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown

  以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,就能够抵制大部分的phpshell了。

  [NextPage]

(7) 关闭PHP版本信息在http头中的泄漏
  我们为了防止黑客获取服务器中php版本的信息,可以关闭该信息斜路在http头中:

  expose_php = Off

  比如黑客在 telnet www.target.com 80 的时候,那么将无法看到PHP的信息。

(8) 关闭注册全局变量
  在PHP中提交的变量,包括使用POST或者GET提交的变量,都将自动注册为全局变量,能够直接访问,这是对服务器非常不安全的,所以我们不能让它注册为全局变量,就把注册全局变量选项关闭:

  register_globals = Off

  当然,如果这样设置了,那么获取对应变量的时候就要采用合理方式,比如获取GET提交的变量var,那么就要用$_GET[‘var’]来进行获取,这个php程序员要注意。

(9) 打开magic_quotes_gpc来防止SQL注入
  SQL注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。php.ini中有一个设置:

  magic_quotes_gpc = Off

  这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,比如把 ‘ 转为 \’等,这对防止sql注射有重大作用。所以我们推荐设置为:

  magic_quotes_gpc = On

(10) 错误信息控制
  一般php在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建议禁止错误提示:

  display_errors = Off

  如果你却是是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息:

  error_reporting = E_WARNING & E_ERROR

  当然,我还是建议关闭错误提示。

(11) 错误日志
  建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因:

  log_errors = On

  同时也要设置错误日志存放的目录,建议根apache的日志存在一起:

  error_log = /usr/local/apache2/logs/php_error.log

注意:给文件必须允许apache用户的和组具有写的权限。
[编辑]Mysql的安全设置
  我们把Mysql安装在 /usr/local/mysql目录下,我们必须建立一个用户名为mysql,组为mysql的用户来运行我们的mysql,同时我们把它的配置文件拷贝到 /etc目录下:

  # cp suport-files/my-medium.cnf /etc/my.cnf

  chown root:sys /etc/my.cnf

  chmod 644 /etc/my.cnf

  使用用户mysql来启动我们的mysql:

  # /usr/local/mysql/bin/mysqld_safe -user=mysql &

(1) 修改root用户的的口令
  缺省安装的mysql是没有密码的,所以我们要修改,以防万一。下面采用三种方式来修改root的口令。

  * 用mysqladmin命令来改root用户口令

  # mysqladmin -uroot password test

  这样,MySQL数据库root用户的口令就被改成test了。(test只是举例,我们实际使用的口令一定不能使用这种易猜的弱口令)

  * 用set password修改口令:

  mysql>; set password for root@localhost=password(’test’);

  这时root用户的口令就被改成test了。

  * 直接修改user表的root用户口令

  mysql>; use mysql;

  mysql>; update user set password=password(’test’) where user=’root’;

  mysql>; flush privileges;

  这样,MySQL数据库root用户的口令也被改成test了。其中最后一句命令flush privileges的意思是强制刷新内存授权表,否则用的还是缓冲中的口令,这时非法用户还可以用root用户及空口令登陆,直到重启MySQL服务器。

(2) 删除默认的数据库和用户
  我们的数据库是在本地,并且也只需要本地的php脚本对mysql进行读取,所以很多用户不需要。mysql初始化后会自动生成空用户和test库,这会对数据库构成威胁,我们全部删除。

  我们使用mysql客户端程序连接到本地的mysql服务器后出现如下提示:

  mysql>; drop database test;

  mysql>; use mysql;

  mysql>; delete from db;

  mysql>; delete from user where not(host="localhost" and user="root";

  mysql>; flush privileges;

(3) 改变默认mysql管理员的名称
  这个工作是可以选择的,根据个人习惯,因为默认的mysql的管理员名称是root,所以如果能够修改的话,能够防止一些脚本小子对系统的穷举。我们可以直接修改数据库,把root用户改为"admin"

  mysql>; use mysql;

  mysql>; update user set user="admin" where user="root";

  mysql>; flush privileges;

(4) 提高本地安全性
  提高本地安全性,主要是防止mysql对本地文件的存取,比如黑客通过mysql把/etc/passwd获取了,会对系统构成威胁。mysql对本地文件的存取是通过SQL语句来实现,主要是通过Load DATA LOCAL INFILE来实现,我们能够通过禁用该功能来防止黑客通过SQL注射等获取系统核心文件。

  禁用该功能必须在 my.cnf 的[mysqld]部分加上一个参数:

  set-variable=local-infile=0

(5) 禁止远程连接mysql
  因为我们的mysql只需要本地的php脚本进行连接,所以我们无需开socket进行监听,那么我们完全可以关闭监听的功能。

  有两个方法实现:

  * 配置my.cnf文件,在[mysqld]部分添加 skip-networking 参数

  * mysqld服务器中参数中添加 ——skip-networking 启动参数来使mysql不监听任何TCP/IP连接,增加安全性。如果要进行mysql的管理的话,可以在服务器本地安装一个phpMyadmin来进行管理。

(6) 控制数据库访问权限
  对于使用php脚本来进行交互,最好建立一个用户只针对某个库有 update、select、delete、insert、drop table、create table等权限,这样就很好避免了数据库用户名和密码被黑客查看后最小损失。

  比如下面我们创建一个数据库为db1,同时建立一个用户test1能够访问该数据库。

  mysql>; create database db1;

  mysql>; grant select,insert,update,delete,create,drop privileges on db1.* to test1@localhost identified by ‘admindb’;

  以上SQL是创建一个数据库db1,同时增加了一个test1用户,口令是admindb,但是它只能从本地连接mysql,对db1库有select,insert,update,delete,create,drop操作权限。

(7) 限制一般用户浏览其他用户数据库
  如果有多个数据库,每个数据库有一个用户,那么必须限制用户浏览其他数据库内容,可以在启动MySQL服务器时加——skip-show-database 启动参数就能够达到目的。

(8) 忘记mysql密码的解决办法
  如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器时加上参数——skip-grant-tables来跳过授权表的验证 (。/safe_mysqld ——skip-grant-tables &,这样我们就可以直接登陆MySQL服务器,然后再修改root用户的口令,重启MySQL就可以用新口令登陆了。

(9) 数据库文件的安全
  我们默认的mysql是安装在/usr/local/mysql目录下的,那么对应的数据库文件就是在/usr/local/mysql/var目录下,那么我们要保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,所以要限制对该目录的访问。

  我们修改该目录的所属用户和组是mysql,同时改变访问权限:

  # chown -R mysql.mysql /usr/local/mysql/var

  # chmod -R go-rwx /usr/local/mysql/var

(10) 删除历史记录
  执行以上的命令会被shell记录在历史文件里,比如bash会写入用户目录的。bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的。mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码,也会因。mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。

  另外这两个文件我们也应该不让它记录我们的操作,以防万一。

  # rm .bash_history .mysql_history

  # ln -s /dev/null .bash_history

  # ln -s /dev/null .mysql_history

  (11) 其他

  另外还可以考虑使用chroot等方式来控制mysql的运行目录,更好的控制权限,具体可以参考相关文章。

  [NextPage]

[编辑]vsFTPd安全设置
  vsFTPd是一款非常着名的ftp daemon程序,目前包括Redhat.com在内很多大公司都在使用,它是一款非常安全的程序,因为它的名字就叫:Very Secure FTP Daemon (非常安全的FTP服务器)。

  vsftpd设置选项比较多,涉及方方面面,我们下面主要是针对安全方面进行设置。

  目前我们的需求就是使用系统帐户同时也作为是我们的FTP帐户来进行我们文件的管理,目前假设我只需要一个帐户来更新我的网站,并且我不希望该帐户能够登陆我们的系统,比如我们的网站的目录是在/usr/www下面,那么我们新建一个用户ftp,它的主目录是/usr/www,并且它的shell是 /usr/sbin/nologin,就是没有shell,防止该用户通过ssh等登陆到系统。

  下面在进行系统详尽的设置,主要就是针对vsftpd的配置文件vsftpd.conf文件的配置。

(1) 禁止匿名用户访问, 我们不需要什么匿名用户,直接禁止掉:
  anonymous_enable=NO

(2) 允许本地用户登陆,因为我们需要使用ftp用户来对我们网站进行管理:
  local_enable=YES

(3) 只允许系统中的ftp用户或者某些指定的用户访问ftp,因为系统中帐户众多,不可能让谁都访问。
  打开用户文件列表功能:

  userlist_enable=YES

  只允许用户文件列表中的用户访问ftp:

  userlist_deny=NO

  用户名文件列表路径:

  userlist_file=/etc/vsftpd.user_list

  然后在/etc下建立文件 vsftpd.user_list 文件,一行一个,把用户ftp加进去,同时也可以加上你允许访问的系统帐户名。

(4) 禁止某些用户登陆ftp:
  pam_service_name=vsftpd

  指出VSFTPD进行PAM认证时所使用的PAM配置文件名,默认值是vsftpd,默认PAM配置文件是/etc/pam.d/vsftpd.

  /etc/vsftpd.ftpusers

  VSFTPD禁止列在此文件中的用户登录FTP服务器,用户名是一行一个。这个机制是在/etc/pam.d/vsftpd中默认设置的。

  这个功能和(3)里的功能有点类似,他们俩能结合使用,那样就最好了。

(5) 把本地用户锁定在自己的主目录,防止转到其他目录,比如把/etc/passwd给下载了:
  chroot_local_users=NO

  chroot_list_enable=YES

  chroot_list_file=/etc/vsftpd.chroot_list

  然后在/etc下建立vsftpd.chroot_list文件,里面把我们要限制的本地帐户加进去,一行一个,我们加上ftp,防止它登陆到系统。

(6) 隐藏文件真实的所有用户和组信息,防止黑客拿下ftp后查看更多系统用户信息:
  hide_ids=YES

(7) 取消ls -R命令,节省资源,因为使用该命令,在文件列表很多的时候将浪费大量系统资源:
  ls_recurse_enable=NO

(8) 上传文件的默认权限,设置为022:
  local_umask=022

  如果要覆盖删除等,还要打开:

  write_enable=YES

(9) ftp的banner信息,为了防止黑客获取更多服务器的信息,设置该项:
  ftpd_banner=banner string

  把后面的banner string设为你需要的banner提示信息,为了安全,建议不要暴露关于vsFTPd的任何信息。

  另外,如果你的信息比较多的话,可以设置为提示信息是读取一个文件中的信息:

  banner_file=/directory/vsftpd_banner_file

(10) 打开日志功能:
  xferlog_enable=YES

  同时设置日志的目录:

  xferlog_file=/var/log/vsftpd.log

  启用详细的日志记录格式:

  xferlog_enable=YES

(11) 如果打开虚用户功能等,那么建议关闭本地用户登陆:
  local_enable=NO

  vsFTPd还有很多安全设置,毕竟人家的名字就是:Very Secure FTP Daemon,反正它的溢出漏洞什么的是很少的,如果要更安全,建议按照自己的需要设置vsftpd,设置的好,它绝对是最安全的。

[编辑]SSH安全设置
  SSH是一个基于SSL的安全连接远程管理的服务程序,主要出现就是为了解决telnet、rlogin、rsh等程序在程序交互过程中存在明文传输易被监听的问题而产生的,目前基本上是推荐使用ssh来代替telnet、rlogin、rsh等远程管理服务。

  ssh能够直接在windows平台下通过Secure SSH Client等客户端工具进行连接管理,目前最流行的服务器端就是OpenSSH程序,目前最新版本是OpenSSH4.0版,详细可以参考www.openssh.com网站。

  OpenSSH在FreeBSD下已经集成安装了,FreeBSD5.3下的OpenSSH版本是3.8.1,建议ports升级到4.0.

  主要的安全配置文件是/etc/ssh/sshd_config文件,我们编辑该文件。

(1) 使用protocol 2代替protocol 1,SSH2更加安全,可以防止攻击者通过修改携带的版本banner来劫持(hijacking)启动会话进程并降低到protocol 1.注释掉protocol 2,1 改用下面语句代替:

  protocol 2

(2) 合理设置最大连接数量, 防止DOS攻击

  MaxStartups 5:50:10

(3)关闭X11forwording ,防止会话劫持

  X11Forwarding no

(4)建议不使用静态密码,而使用DSA 或RSA KEY,修改如下内容可以关闭使用密码认证:

  PasswordAuthentication no

(5)可以限制某个组或光是单个用户访问shell

  AllowGroups wheel

  或者

  AllowUsers heiyeluren

  (6) 限制root用户登陆,主要是为了防止暴力破解

  PermitRootLogin no

(7) 不允许口令为空的用户登陆

  PermitEmptyPasswords no

(8)使用TCP wrappers来限制一些访问,修改/etc/hosts.allow文件,注释掉"ALL : ALL : allow",增加如下内容:

  sshd:localhost:allow

  sshd:friendlcomputer:allow

  sshd:all : deny

  #相关命令:

  #chsh -s /sbin/nologin user

 

FreeBSD系统安全设置

系统安全设置
1. 用户控制
尽量少的用户,我们的FTP帐户是和系统帐户绑定在一起的,所以我们添加用户的时候先建立一个目录,然后把新建的用户主目录指向到该目录下。假设我需要一个用户能够管理我的网站,而我网站的目录是在 /usr/www 目录下,那么我们新建立的用户 www_user 的主目录就指向 /usr/www 目录,同时它的shell是没有的:/usr/sbin/nologin ,主要是为了防止它通过ssh登陆到系统。同时FTP的密码也要设置的非常复杂,防止黑客通过暴力破解获得FTP权限。另外还要说道我们的root用户的密码,我想最少应该不要少于10位的数字+字母+字符的密码(我的密码是18位),否则是非常不安全的,如果密码简单,那么黑客通过短时间的暴力破解 SSH中的root帐户,不用几天,系统就可能被攻破了,同时也建议最少一个月更改一次root用户的密码。(强烈建议一般帐户不要有登陆系统的权限,就是把shell设为/usr/sbin/nologin)

一般如果要使用root权限建议建立一个属于wheel组的小用户,然后登陆后通过su命令提升为root用户进行管理,如果黑客通过破解了我们普通用户的权限后登陆系统,也不能直接通过root权限进行管理,这是一种安全防范的简单方法。

2. 文件访问控制
有时候被黑客入侵后拿到了小权限用户,比如传了一个WebShell到系统中,那么对方很可能会把 /etc/passwd 等内容直接读取出来,同时查看/etc/master.passwd中对加密后的root用户的密码hash进行破解,最后拿到密码进行登陆系统。那么我们就要控制部分文件只有root能够访问,其他用户无权访问。比如uname,gcc等,如果黑客拿到小权限用户后就会查看系统版本,然后找到该版本系统对应的溢出程序,使用gcc来进行编译,如果我们能够限制黑客访问uname和gcc等程序,能在一定程度上减缓黑客入侵的脚步。

使用chmod来改变某个文件的权限信息,比如我要 /etc/passwd 和 /etc/master.passwd 文件只能允许root访问:

使用八进制数字来设置

  # chmod 700 /etc/passwd

  # chmod 700 /etc/master.passwd

使用字符标记来进行设置

  # chmod u+w+r+x,go-w-r-x /etc/passwd

  # chmod u+w+r+x,go-w-r-x /etc/master.passwd

系统中有多个重要文件需要设置控制访问权限,一定要控制好,否则将会构成重要威胁。

3. 系统服务和端口控制
端口开的越多就越给黑客多一个入侵的机会,服务越多,危险越大,因为你不知道那些服务是不是有潜在的漏洞或者又发现了新的漏洞,所以尽量少的服务,比如sendmail默认是打开的,那么些建议你把sendmail关闭,关闭防范是在 /etc/rc.conf中加上:

  sendmail_enable = "NONE",如果设为"NO"那么只能够关闭掉pop3服务,不能关闭smtp的服务,所以要设置为"NONE".

系统中最好除了我们能够看到的Apache、Mysql、vsFTPd、SSH之外不要打开其他任何端口和服务。基本的方式是使用netstat -a 查看打开的端口,然后从对应的端口来找相关的服务,比如我们这里应该只允许开的端口有 21, 22, 80, 3306等,如果有其他端口,那么一定要仔细检查,很可能是黑客的后门或者是会对系统安全构成威胁的服务。同时有些服务不需要监听网络连接的话,只是需要本地的连接,比如Mysql,那么就可以关闭Socket监听,这个将在Mysql安全设置中讲解,另外,可以通过防火墙来控制部分端口访问和连接状况,比如Mysql的3306端口只允许192.168.0.1访问,那么我们就在ipfw里添加规则:

  ipfw add 10001 allow tcp from 192.168.0.1 to 10.10.10.1 80 in

  这样就能够防止黑客来访问服务器上的Mysql服务。具体防火墙的设置将在下面“防火墙设置”中详细讲解。

4. 日志管理和控制 (略)
  [NextPage]

5. 文件指纹检测
文件指纹就是我们文件的基本信息,比如文件权限、文件所属用户/组、文件最后修改日期、文件大小等等,这些都是重要信息,一般[[[黑客]]入侵后都可能修改文件,那么文件指纹就不一样了。另外,文件的md5校验值也属于文件的指纹的一种。

为了防止黑客篡改系统中的部分核心文件,比如 /etc/passwd, /etc/shadow, /etc/inetd.conf 等等,那么我们就可以考虑把部分重要文件进行备份,同时做一份目前有的文件的一个指纹保留,比如把 /etc,/bin, /usr/bin 目录下的文件进行指纹保留:

# ls -l /etc >; /var/back/etc.txt
# ls -l /bin >; /var/back/bin.txt
# ls -l /bin >; /var/back/usrbin.txt

当然,还有就是给每个重要的文件加上md5校验值,如果觉得不对劲的时候就进行匹配,保证文件的安全。

你可以给你觉得需要做指纹备份的目录进行备份,一般这是为了以后被黑客入侵后的系统检测和系统恢复。比如可以通过文件被修改的时间来确定是不是被入侵,比如可以对比看 /etc/inetc.conf文件和备份的文件有什么不同来确定是不是安装了服务型后门等。

6. 系统指纹泄漏和防范
一般黑客为了入侵某个系统,一定会先进行扫描等工作,扫描包括目标系统的端口开放情况和服务器使用服务程序和操作系统情况。比如很简单的手工检测Web服务的指纹:

# telnet target.com 80

那么就很可能返回Apache和PHP的版本信息,那么同时也可能使用扫描工具对Mysql、vsFTPd、SSH等服务的端口进行扫描,获取这些服务的指纹。多暴露一份系统信息,那么系统就多一份危险。那么解决办法就是把服务器上服务程序的Banner全部修改掉,从而能够迷惑黑客。

下面简单的说一些修改那些服务Banner的方法。

  *

  修改httpd.conf文件,设置以下选项:

  ServerSignature Off

  ServerTokens Prod

上面的适用apache1***, apache 2.0这些都是默认 , 不过还是有server=Apache字样, 若要完全去掉需重新编译。

彻底地去掉banner, 修改httpd.h:

  Include/httpd.h

  Define SERVER_BASEVENDOR "Apache Group"

  Define SERVER_PRODUCTVENDOR "Apache"

  Define SERVER_BASEVERSION "1.3.27"

后从新编译Apache就能够完全去掉了。

  * PHP

  在php.ini中设置 expose_php = Off ,那么将无法在 http头信息中看到php的版本信息。

  * Mysql

  * vsFTPd

vsFTPd基本上是无法获取到一些关于vsFTPd的banner信息的,不过因为vsFTPd默认的banner信息是"Welcome to FTP Server!"对于高手来说,还是能够猜测到一点,所以我们要彻底改掉。修改vsFTPd的配置文件 vsftpd.conf 中的下面选项:

Ftpd_banner=xxxxx

把后面的xxxxx改为你想要的banner信息。

  * SSH

好象FreeBSD下默认安装的SSH被telnet target.com 22 的时候会显示SSH和FreeBSD的信息,简直是个大祸害,什么都告诉别人了,但是目前为止我还不知道怎么修改,知道的高手请指点。

7. 系统内核安全
FreeBSD有个比较强的功能,就是能够定义系统内核的安全等级,主要是为了防止内核后门专门定制的,能通过不同的等级限制对内核的访问和对防火墙等的修改。我们首先要开启系统的安全等级,然后设定安全等级,我们打开 /etc/rc.conf:

  # ee /etc/rc.conf

加入下面的内容:

  kern_securelevel_enable="YES"

  kern_securelevel="-1"

第一句是打开安全等级,第二句是定义等级。它一共五个等级,下面说说不同之处。

  * kern_securelevel -1:这是系统默认级别,没有提供任何内核的保护错误;

  * kern_securelevel 0:基本上作用不多,当你的系统刚启动就是0级别的,当进入多用户模式的时候就自动变成1级了。

  * kern_securelevel 1:在这个级别上,有如下几个限制:

  a. 不能通过kldload或者kldunload加载或者卸载可加载内核模块;

  b. 应用程序不能通过/dev/mem或者/dev/kmem直接写内存;

  c. 不能直接往已经装在(mounted)的磁盘写东西,也就是不能格式化磁盘,但是可以通过标准的内核接口执行写操作;

  d. 不能启动X-windows,同时不能使用chflags来修改文件属性;

  * kern_securelevel 2:在 1 级别的基础上还不能写没装载的磁盘,而且不能在1秒之内制造多次警告,这个是防止DoS控制台的;

  * kern_securelevel 3:在 2 级别的级别上不允许修改IPFW防火墙的规则。

如果你已经装了防火墙,并且把规则设好了,不轻易改动,那么建议使用3级别,如果你没有装防火墙,而且还准备装防火墙的话,不建议使用。我们这里推荐使用 2 级别,能够避免比较多对内核攻击。

8. 系统安全优化
一般优化系统主要是重新编译内核,去掉一些不要的驱动等等,你可以参考我在我Blog上写的关于编译内核的文章。我们这里对网络和内核一些选项进行优化和安全设置。编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释)

  #最大的待发送TCP数据缓冲区空间

  net.inet.tcp.sendspace=65536

  #最大的接受TCP缓冲区空间

  net.inet.tcp.recvspace=65536

  #最大的接受UDP缓冲区大小

  net.inet.udp.sendspace=65535

  #最大的发送UDP数据缓冲区大小

  net.inet.udp.maxdgram=65535

  #本地套接字连接的数据发送空间

  net.local.stream.sendspace=65535

  #加快网络性能的协议

  net.inet.tcp.rfc1323=1

  net.inet.tcp.rfc1644=1

  net.inet.tcp.rfc3042=1

  net.inet.tcp.rfc3390=1

  #最大的套接字缓冲区

  kern.ipc.maxsockbuf=2097152

  #系统中允许的最多文件数量

  kern.maxfiles=65536

  #每个进程能够同时打开的最大文件数量

  kern.maxfilesperproc=32768

  #当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。

  net.inet.tcp.delayed_ack=0

  #屏蔽ICMP重定向功能

  net.inet.icmp.drop_redirect=1

  net.inet.icmp.log_redirect=1

  net.inet.ip.redirect=0

  net.inet6.ip6.redirect=0

  #防止ICMP广播风暴

  net.inet.icmp.bmcastecho=0

  net.inet.icmp.maskrepl=0

  #限制系统发送ICMP速率

  net.inet.icmp.icmplim=100

  #安全参数,编译内核的时候加了options TCP_DROP_SYNFIN才可以用

  net.inet.icmp.icmplim_output=0

  net.inet.tcp.drop_synfin=1

  #设置为1会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接

  net.inet.tcp.always_keepalive=1

  #若看到net.inet.ip.intr_queue_drops这个在增加,就要调大net.inet.ip.intr_queue_maxlen,为0最好

  net.inet.ip.intr_queue_maxlen=1000

  #防止DOS攻击,默认为30000

  net.inet.tcp.msl=7500

  #接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包

  net.inet.tcp.blackhole=2

  #接收到一个已经关闭的端口发来的所有UDP包直接drop

  net.inet.udp.blackhole=1

  #为网络数据连接时提供缓冲

  net.inet.tcp.inflight.enable=1

  #如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表

  net.inet.ip.fastforwarding=0

  #kernel编译打开options POLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用

  #kern.polling.enable=1

  #并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大

  kern.ipc.somaxconn=32768

  #禁止用户查看其他用户的进程

  security.bsd.see_other_uids=0

  #设置kernel安全级别

  kern.securelevel=0

  #记录下任何TCP连接

  net.inet.tcp.log_in_vain=1

  #记录下任何UDP连接

  net.inet.udp.log_in_vain=1

  #防止不正确的udp包的攻击

  net.inet.udp.checksum=1

  #防止DOS攻击

  net.inet.tcp.syncookies=1

  #仅为线程提供物理内存支持,需要256兆以上内存

  kern.ipc.shm_use_phys=1

  # 线程可使用的最大共享内存

  kern.ipc.shmmax=67108864

  # 最大线程数量

  kern.ipc.shmall=32768

  # 程序崩溃时不记录

  kern.coredump=0

  # lo本地数据流接收和发送空间

  net.local.stream.recvspace=65536

  net.local.dgram.maxdgram=16384

  net.local.dgram.recvspace=65536

  # 数据包数据段大小,ADSL为1452.

  net.inet.tcp.mssdflt=1460

  # 为网络数据连接时提供缓冲

  net.inet.tcp.inflight_enable=1

  # 数据包数据段最小值,ADSL为1452

  net.inet.tcp.minmss=1460

  # 本地数据最大数量

  net.inet.raw.maxdgram=65536

  # 本地数据流接收空间

  net.inet.raw.recvspace=65536

  #ipfw防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接

  net.inet.ip.fw.dyn_max=65535

  #设置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时)

  net.inet.ipf.fr_tcpidletimeout=864000

 

freeBSD自己编译安装

■ MySQL5 的安装
源代码:mysql-5.0.18.tar.gz
下载地址:
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.18.tar.gz/from/http://mirror.vmmatrix.net/mysql/
安装
# tar -zxvf mysql-5.0.18.tar.gz
# cd mysql-5.0.18
# ./configure –prefix=/usr/local/mysql
# make
# make install
建立用户
# pw group add mysql
# pw user add mysql -g mysql
初始化表
# ./scripts/mysql_install_db –user=mysql
设置目录访问权限
# cd /usr/local/mysql
# chown -R root . (设定root可以访问/usr/local/mysql目录)
# chown -R mysql var (设定mysql用户能访问/usr/local/mysql/var目录,该目录中存放mysql的数据库文件)
# chown -R mysql var/. (设定mysql用户能访问/usr/local/mysql/var目录下的所有文件)
# chown -R mysql var/mysql/. (设定mysql用户能访问/usr/local/mysql/var/mysql目录下的所有文件)
# chgrp -R mysql . (设定mysql组能访问/usr/local/mysql目录)
运行
使用命令 # /usr/local/mysql/bin/mysqld_safe –user=mysql & 测试安装是否成功
如果显示
[1]
# Starting mysqld daemon with database from /usr/local/mysql/var
表示安装成功
操控命令
启动mysql #/usr/local/mysql/libexec/mysqld start
停止mysql #/usr/local/mysql/libexec/mysqld stop
重启mysql #/usr/local/mysql/libexec/mysqld restart
开机自动加载mysql服务
在/usr/local/etc/rc.d目录中编辑文件 mysql_start.sh ,内容如下
#! /bin/sh
/usr/local/mysql/bin/mysqld_safe &
设置文件权限为可执行
# chmod +x mysql_start.sh
2 的安装
源代码:httpd-2.0.55.tar.gz
下载地址:
http://cn2.php.net/get/php-5.1.2.tar.gz/from/cn.php.net/mirror
安装
# tar -zxvf httpd-2.0.55.tar.gz
# cd httpd-2.0.55
# ./configure 
? –prefix=/usr/local/apache2
? –enable-shared=max
? –enable-module=rewrite
? –enable-module=so
# make
# make install
操控命令
启动apache #/usr/local/apache2/bin/httpd -k start
停止apache #/usr/local/apache2/bin/httpd -k stop
重启apache #/usr/local/apache2/bin/httpd -k restart
开机自动加载apache服务
在/usr/local/etc/rc.d目录中编辑文件 apache_start.sh
#! /bin/sh
/usr/local/apache2/bin/httpd -k start
设置文件权限
# chmod +x apache_start.sh
■ PHP5 的安装
PHP5安装前需要先安装好需要使用的各类模块
libxml2安装
源代码:libxml2-2.6.22.tar.gz
安装
# tar -zxvf libxml2-2.6.22.tar.gz
# cd libxml2-2.6.22
# ./configure
# make
# make install
zlib安装
源代码:zlib-1.2.2.tar.gz
安装
# tar -zxvf zlib-1.2.2.tar.gz
# cd zlib-1.2.2
# ./configure
# make
# make install
libpng安装
源代码:libpng-1.2.8.tar.gz
安装
# tar -zxvf libpng-1.2.8.tar.gz
# cd libpng-1.2.8
# cp scripts/makefile.std makefile
编辑 makefile 将 prefix 改为 prefix=/usr/local/libpng2
# make
# mkdir /usr/local/libpng2
# make install
jpeg安装
源代码:jpegsrc.v6b.tar.gz
安装
# tar -zxvf jpegsrc.v6b.tar.gz
# cd jpeg-6b
# ./configure –prefix=/usr/local/jpeg6 –enable-shared
# make
# mkdir /usr/local/jpeg6
# mkdir /usr/local/jpeg6/include
# mkdir /usr/local/jpeg6/lib
# mkdir /usr/local/jpeg6/bin
# mkdir /usr/local/jpeg6/man
# mkdir /usr/local/jpeg6/man/man1
# make install-lib
# make install
GD安装
源代码:gd-2.0.33.tar.gz
安装
# tar -zxvf gd-2.0.33.tar.gz
# cd gd-2.0.33
# ./configure 
? –prefix=/usr/local/gd2
? –with-zlib
? –with-png=/usr/local/libpng2
? –with-jpeg=/usr/local/jpeg6
编辑 Makefile 231行左右 将
CPPFLAGS = -I/usr/local/jpeg6/include
改为
CPPFLAGS = -I/usr/local/jpeg6/include -I/usr/local/libpng2/include
# make
# make install
libiconv安装
源代码:libiconv-1.10.tar.gz
http://ftp.gnu.org/pub/gnu
安装
# tar -zxvf libiconv-1.10.tar.gz
# cd libiconv-1.10
# ./configure –prefix=/usr/local/libiconv
# make
# make install
将iconv.h连接到php的安装源程序中,否则会php make会出错,不知道为什么
# cd /usr/src/php-5.1.2/ext/iconv/
# link /usr/local/libiconv/include/iconv.h iconv.h
开始安装PHP5
源代码:php-5.1.2.tar.gz
安装
# tar -zxvf php-5.1.2.tar.gz
# cd php-5.1.2
# ./configure
? –prefix=/usr/local/php
? –with-apxs2=/usr/local/apache2/bin/apxs
? –with-xml
? –with-mysql=/usr/local/mysql
? –with-gd=/usr/local/gd2
? –with-zlib
? –with-jpeg-dir=/usr/local/jpeg6
? –with-png-dir=/usr/local/libpng2
? –with-iconv=/usr/local/libiconv
? –with-config-file-path=/usr/local/lib
? –disable-debug
? –enable-safe-mode
? –enable-trans-sid
? –enable-memory-limit
? –enable-short-tags
? –disable-posix
? –enable-exif
? –enable-ftp
? –enable-sockets
# make
# make install
# cp /usr/src/php-5.1.2/php.ini-dist /usr/local/lib/php.ini
整合apache与php
# vi /usr/local/apache2/conf/httpd.conf
添加
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php

freeBSD卸载 apache

如果从ports安装,那cd到apache的目录,并make deinstall clean就行,如果是用别的方法安装,那 pkg_info | grep ,查到对应的版本后就 pkg_delete -version就行

make deinstall以后再rm -rf /usr/local/etc/apache2

cd /usr/ports/net/cvsup-without-gui
make install clean;

port安装不上MYSQL的解决办法!

解决办法:
portsnap fetch
portsnap extract -p /usr/ports/
portsnap update

另:使用ports下载时可更改/etc/make.conf文件加快下载速度
ee /etc/make.conf
并加入如下内容
MASTER_SITE_OVERRIDE?=http://ports.hshh.org/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?=http://ports.cn.freebsd.org/${DIST_SUBDIR}/

FreeBSD更新ports

1、安装cvsup
如果还没安装过cvsup,那么请执行以下命令安装:
cd /usr/ports/net/cvsup
make install clean

2、然后拷贝ports的配置文件到/etc/ports-supfile
cp /usr/share/examples/cvsup/ports-supfile /etc/ports-supfile
ee /etc/ports-supfile
将其中的# host=CHANGE_THIS.FreeBSD.org一行改为host=cvsup.freebsdchina.org
cvsup.freebsdchina.org这个是中国的镜像服务器执行速度很快,不会连接过多

3、更新ports
/usr/local/bin/cvsup -g -L 2 /etc/ports-supfile

4、修改/etc/make.conf文件
如果不存在则可以参考/etc/defaults/make.conf文件新建一个,该文件主要是编译的时候需要用到。
如果要中文支持,就要加入这一段在make.conf中

下面是我的make.conf文件内容
引用SUP_UPDATE= yes
SUP= /usr/local/bin/cvsup
SUPFLAGS= -g -L 2
SUPHOST= cvsup.cn.FreeBSD.org
PORTSUPFILE= /etc/ports-supfile
WITH_CJK= yes

好了,这样Ports就更新完了。