Unix高级安全设置(2)

http://www.sina.com.cn 2006年11月18日 21:36  ChinaByte

  3.2.2.13 特殊的帐号

  禁止操作系统中不必要的预置帐号(每次升级或安装完都要检查一下)。Linux系统中就提供这

  样一些你可能不需要的预置帐号。如果确实不需要这些帐号,就把它们删掉。系统中有越多

  的帐号,就越容易受到攻击。

  我们假定你已经在系统中使用shadow口令。如果不是这样,最好在系统中加上shadow口令的

  支持,因为这样系统会更安全。如果你是按照上一章介绍的方法安装服务器,那么在“安全

  验证配置”这一步就已经选上“Enable Shaow Passwords”这个选项了。

  在系统中删除一个用户可以用这个命令:

  [root@cnns]# userdel username

  在系统中删除一个组可以用这个命令:

  [root@cnns]# groupdel username

  第一步 用下面的命令删除一些不必要的用户:

  [root@cnns]# userdel adm

  [root@cnns]# userdel lp

  [root@cnns]# userdel sync

  [root@cnns]# userdel shutdown

  [root@cnns]# userdel halt

  [root@cnns]# userdel news

  [root@cnns]# userdel uucp

  [root@cnns]# userdel operator

  [root@cnns]# userdel games (如果不用X Window服务器,可以删除这个用户)

  [root@cnns]# userdel gopher

  [root@cnns]# userdel ftp (如果没安装匿名ftp服务器,可以删除这个用户)

  第二步 输入下面的命令删除一些不必要的组:

  [root@cnns]# groupdel adm

  [root@cnns]# groupdel lp

  [root@cnns]# groupdel news

  [root@cnns]# groupdel uucp

  [root@cnns]# groupdel games (delete this group if you don’t use X Window Server

  ).

  [root@cnns]# groupdel dip

  [root@cnns]# groupdel pppusers

  [root@cnns]# groupdel popusers (delete this group if you don’t use pop server f

  or email).

  [root@cnns]# groupdel slipusers

  第三步 在系统中加入必要的用户:

  在系统中添加用户,用这个命令:

  [root@cnns]# useradd username

  给系统中的用户添加或改变口令,用这个命令:

  [root@cnns]# passwd username

  例如:

  [root@cnns]# useradd admin

  [root@cnns]# passwd admin

  这些命令的输出是这样的:

  Changing password for user admin

  New UNIX password: somepasswd

  passwd: all authentication tokens updated successfully

  第四步 “不许改变”位可以用来保护文件使其不被意外地删除或重写,也可以防止有些人

  创建这个文件的符号连接。删除“/etc/passwd”、“/etc/shadow”、“/etc/group”或“

  /etc/gshadow”都是黑客的攻击方法。

  给口令文件和组文件设置不可改变位,可以用下面的命令:

  [root@cnns]# chattr +i /etc/passwd

  [root@cnns]# chattr +i /etc/shadow

  [root@cnns]# chattr +i /etc/group

  [root@cnns]# chattr +i /etc/gshadow

  注意:如果将来要在口令或组文件中增加或删除用户,就必须先清除这些文件的不可改变位

  ,否则就不能做任何改变。如果没有清除这些文件的不可改变位,安装那些会自动在口令文

  件和组文件中加入新用户的rpm软件包的时候,在安装过程中就会出现出错的提示。

  3.2.2.14 防止任何人都可以用su命令成为root

  如果不想任何人都可以用“su”命令成为root或只让某些用户有权使用“su”命令,那么在

  “/etc/pam.d/su”文件中加入下面两行。我建议尽量限制用户通过“su”命令成为root。

  第一步:

  编辑su文件(vi /etc/pam.d/su)在文件的头部加入下面两行:

  auth sufficient /lib/security/pam_rootok.so debug

  auth required /lib/security/pam_wheel.so group=wheel

  加入这两行之后,“/etc/pam.d/su”文件变为:

  #%PAM-1.0

  auth sufficient /lib/security/pam_rootok.so debug

  auth required /lib/security/pam_wheel.so group=wheel

  auth required /lib/security/pam_pwdb.so shadow nullok

  account required /lib/security/pam_pwdb.so

  password required /lib/security/pam_cracklib.so

  password required /lib/security/pam_pwdb.so shadow use_authtok nullok

  session required /lib/security/pam_pwdb.so

  session optional /lib/security/pam_xauth.so

  这两行的意思是只有“wheel”组的成员才能用su命令成为root。注意,“wheel”组是系统

  中用于这个目的的特殊帐号。不能用别的组名。把这节介绍的方法和《22. “/etc/securet

  ty”文件》中介绍的方法结合起来,可以更好地加强系统的安全性。

  第二步:如果在“/etc/pam.d/su”配置文件中定义了“wheel”组,现在介绍一下怎样让一

  些用户可以用“su”命令成为“root”。下面是一个例子,让admin用户成为“wheel”组的

  成员,这样就可以用“su”命令成为“root”:[root@cnns]# usermod -G10 admin

  “G”是表示用户所在的其它组。“10”是“wheel”组的ID值,“admin”是我们加到“whe

  el”组的用户。用同样的命令可以让其他的用户可以用su命令成为root。

  3.2.2.15 资源限制

  限制用户对系统资源的使用,可以避免拒绝服务(如:创建很多进程、消耗系统的内存,等等

  )这种攻击方式。这些限制必须在用户登录之前设定。例如,可以用下面的方法对系统中用户

  加以。

  第一步:

  编辑limits.conf文件(vi /etc/security/limits.conf),加入或改变下面这些行:

  * hard core 0

  * hard rss 5000

  * hard nproc 20

  这些行的的意思是:“core 0”表示禁止创?ore文件;“nproc 20”把最多进程数限制到20

  ;“rss 5000”表示除了root之外,其他用户都最多只能用5M内存。上面这些都只对登录到

  系统中的用户有效。通过上面这些限制,就能更好地控制系统中的用户对进程、core文件和

  内存的使用情况。星号“*”表示的是所有登录到系统中的用户。

  第二步

  必须编辑“/etc/pam.d/login”文件,在文件末尾加入下面这一行:

  session required /lib/security/pam_limits.so

  加入这一行后“/etc/pam.d/login”文件是这样的:

  #%PAM-1.0

  auth required /lib/security/pam_securetty.so

  auth required /lib/security/pam_pwdb.so shadow nullok

  auth required /lib/security/pam_nologin.so

  account required /lib/security/pam_pwdb.so

  password required /lib/security/pam_cracklib.so

  password required /lib/security/pam_pwdb.so nullok use_authtok md5 shadow

  session required /lib/security/pam_pwdb.so

  session required /lib/security/pam_limits.so

  #session optional /lib/security/pam_console.so

  3.2.2.16 更好地控制mount上的文件系统

  可以用一些选项,如:noexec、nodev和nosuid,更好地控制mount上的文件系统,如:“/h

  ome”和“/tmp”。这些都在“/etc/fstab”文件中设定。fstab文件包含了各个文件系统的

  描述信息。如果想知道在这个文件中可以设定哪些选项,请用man命令查看关于mount的帮助

  。

  编辑fstab文件(vi /etc/fstab),并根据需要把这两行:

  /dev/sda11 /tmp ext2 defaults 1 2

  /dev/sda6 /home ext2 defaults 1 2

  改变成:

  /dev/sda11 /tmp ext2 nosuid,nodev,noexec 1 2

  /dev/sda6 /home ext2 nosuid,nodev 1 2

  “nodev”表示不允许在这个文件系统上有字符或特殊的块设备。“nosuid”表示不允许设定

  文件的suid(set-user-identifier)和sgid(set-group-identifier)许可位。“noexec”表示

  不允许文件系统上有任何可执行的二进制文件。

  注意:上面的例子中,“/dev/sda11”mount到“/tmp”目录上,而“/dev/sd6”mount到“

  /home”目录上。当然这和你的实际情况会有所不同,这些取决于你是怎么分区的以及用什么

  样的硬盘,例如:IDE硬盘是hda、hdb,等等,而SCSI硬盘是sda、sdb,等等。

  3.2.2.17 把rpm程序转移到一个安全的地方,并改变默认的访问许可

  一旦在Linux服务器上用rpm命令安装完所有需要的软件,最好把rpm程序转移到一个安全的地

  方,如:软盘或其它你认为安全的地方。因为如果有人入侵了你的服务器,他就不能用rpm命

  令安装那些有害的软件。当然,如果将来要用rpm安装新的软件,你就要把rpm程序拷回原来

  的目录。

  把rpm程序移到软盘上,用下面的命令:

  [root@cnns]# mount /dev/fd0 /mnt/floppy/

  [root@cnns]# mv /bin/rpm /mnt/floppy/

  [root@cnns]# umount /mnt/floppy

  注意:千万不要把rpm程序从系统中卸载掉,否则以后就不能重新安装它,因为安装rpm程序

  或其它软件包本身就要用rpm命令。

  还有一点要注意的是,把rpm命令的访问许可从默认的755改成700。这样非root用户就不能使

  用rpm命令了。特别是考虑到万一在安装完新软件之后忘了把rpm程序移到一个安全的地方,

  这样做就更有必要了。

  改变“/bin/rpm”默认的访问权限,用下面这个命令:

  [root@cnns]# chmod 700 /bin/rpm

  3.2.2.18 登录shell

  为了方便重复输入很长的命令,bash shell可以在“~/.bash_history”文件(“~/”是家目

  录,每个用户都是不一样的)中存500个曾经输入过的命令。每一个有自己帐号的用户,在自

  己的家目录中,都会有“.bash_history”文件。可能会有这种情况,用户在不该输入口令的

  地方输入了口令,而输入的口令会在“.bash_history”文件中保存下来。而且“.bash_his

  tory”文件越大这种可能性也越大。

  在“/etc/profile”文件中HISTFILESIZE和HISTSIZE这两行决定了系统中所有用户的“.bas

  h_history”文件可以保存多少命令。我建议把“/etc/profile”文件中的HISTFILESIZE和H

  ISTSIZE都设成一个比较小的值,如:20。

  编辑profile文件(vi /etc/profile),把这些行改成:

  HISTFILESIZE=20

  HISTSIZE=20

  这样每个用户家目录下的“.bash_history”就最多只能存20个命令。如果黑客试图在用户的

  “~/.bash_history”文件中发现一些口令,他就没有什么机会了。

  3.2.2.19 “/etc/lilo.conf”文件

  LILO是Linux上一个多功能的引导程序。它可以用于多种文件系统,也可以从软盘或硬盘上引

  导Linux并装入内核,还可以做为其它操作系统的“引导管理器”。根(/)文件系统对LILO来

  说很重要,有下面这两个原因:第一:LILO要告诉内核到那里去找根文件系统;第二:LILO

  要用到的一些东西,如:引导扇区、“/boot”目录和内核就存放在根文件系统中。引导扇区

  包括LILO引导程序的第一部分,这个部分在引导阶段的后半部分还要装入更大的引导程序。

  这两个引导程序通常存在“/boot/boot.b”文件中。内核是由引导程序装入并启动的。在Re

  dHat Linux系统中,内核通常在根目录或“/boot”目录下。

  因为LILO对Linux系统非常重要,所以我们要尽可能地保护好它。LILO最重要的配置文件是“

  /etc”目录下的“lilo.conf”文件。用这个文件我们可以配置或提高LILO程序以及Linux系

  统的安全性。下面是LILO程序的三个重要的选项设置。

  1)加入:timeout=00

  这项设置设定LILO在引导默认的系统之前,等候用户输入的时间。C2安全等级规定这个时间

  间隔必须设成0,因为多重引导会使系统的安全措施形同虚设。除非想用多重引导,否则最好

  把这项设成0。

  2)加入:restricted

  当LILO引导的时候,输入参数linux single,进入单用户(single)模式。因为单用户模式没

  有口令验证,所以可以在LILO引导时,加上口令保护。“restricted”选项只能和“passwo

  rd”合起来用。注意要给每个内核都要加上口令保护。

  3)加入:password=

  用单用户模式启动Linux系统的时候,系统要求用户输入这个口令。口令是大小写敏感的,而

  且要注意,要让“/etc/lilo.conf”文件,除了root之外,其他用户没有读的权限,这样也

  就看不到口令了。下面是用“lilo.conf”文件保护LILO的一个具体例子。

  第一步:

  编辑lilo.conf文件(vi /etc/lilo.conf),加上或改变下面介绍的三个设置:

  boot=/dev/sda

  map=/boot/map

  install=/boot/boot.b

  prompt

  timeout=00 ? change this line to 00.

  Default=linux

  restricted ? add this line.

  password= ? add this line and put your password.

  image=/boot/vmlinuz-2.2.12-20

  label=linux

  initrd=/boot/initrd-2.2.12-10.img

  root=/dev/sda6

  read-only

  第二步

  因为“/etc/lilo.conf”配置文件里,存在没有经过加密的口令,所以只有root才能有读的

  权限。用下面的命令改变文件的权限:

  [root@cnns]# chmod 600 /etc/lilo.conf (will be no longer world readable).

  第三步

  使改变后的“/etc/lilo.conf”配置文件生效:

  [root@cnns]# /sbin/lilo -v (to update the lilo.conf file).

  第四步

  为了更安全一点,可以用chattr命令给“lilo.conf”文件加上不可改变的权限。让文件不可

  改变用下面的命令:

  [root@cnns]# chattr +i /etc/lilo.conf

  这样可以避免“lilo.conf”文件因为意外或其它原因而被改变。如果想要改变“lilo.conf

  ”文件,必须先清除它的不可改变标志。

  清除不可改变的标记用下面的命令:

  [root@cnns]# chattr -i /etc/lilo.conf

  3.2.2.20 使Control-Alt-Delete关机键无效

  把“/etc/inittab”文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果

  服务器不是放在一个安全的地方,这非常重要。

  编辑inittab文件(vi /etc/inittab)把这一行:

  ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  改为:

  #ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  用下面的命令使改变生效:

  [root@cnns]# /sbin/init q

  3.2.2.21 改变“/etc/rc.d/init.d/”目录下的脚本文件的访问许可

  改变启动和停止daemon的脚本文件的权限。

  [root@cnns]# chmod -R 700 /etc/rc.d/init.d/*

  这样只有root可以读、写和执行这个目录下的脚本。我想一般用户没有什么必要知道脚本文

  件的内容。

  注意:如果你安装或升级了一个程序,要用到“/etc/rc.d/init.d/”中system V脚本,不要

  忘记再检查一下改变和检查这个脚本文件的许可。

  3.2.2.22 “/etc/rc.d/rc.local”文件

  在默认情况下,当登录装有Linux系统的计算机时,系统会告诉你Linux发行版的名字、版本

  号、内核版本和服务器名称。这泄露了太多的系统信息。最好只显示一个“Login:”的提示

  信息。

  第一步

  编辑“/ect/rc.d/rc.local”文件,在下面这些行的前面加上“#”:

  --

  # This will overwrite /etc/issue at every boot. So, make any changes you

  # want to make to /etc/issue here or you will lose them when you reboot.

  #echo "" > /etc/issue

  #echo "$R" >> /etc/issue

  #echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue

  #

  #cp -f /etc/issue /etc/issue.net

  #echo >> /etc/issue

  --

  第二步

  删除“/etc”目录下的“issue.net”和“issue”文件:

  [root@cnns]# rm -f /etc/issue

  [root@cnns]# rm -f /etc/issue.net

  注意:“/etc/issue.net”文件是用户从网络登录计算机时(例如:telnet、SSH),看到的登

  录提示。同样在“/etc”目录下还有一个“issue”文件,是用户从本地登录时看到的提示。

  这两个文件都是文本文件,可以根据需要改变。但是,如果想删掉这两个文件,必须向上面

  介绍的那样把“/etc/rc.d/rc.local”脚本中的那些行注释掉,否则每次重新启动的时候,

  系统又会重新创建这两个文件。

  3.2.2.23 带“s”位的程序

  用ls -l命令列出来的文件,如果文件的权限位中出现“s”,则这些文件的SUID(-rwsr-xr-

  x)或SGID(-r-xr-sr-x)位被设定了。因为这些程序给执行它的用户一些特权,所以如果不需

  要用到这些特权,最好把这些程序的“s”位移去。可以用下面这个命令“chmod a-s <文件

  名>”移去相应文件的“s”位。

  可以清除“s”位的程序包括但不限于:

  1)从来不用的程序

  2)不希望非root用户运行的程序

  3)偶尔用用,但是不介意先用su命令变为root后再运行。

  下面加了星号(*)的程序,我个人认为有必要移去“s”位。注意,系统可能需要一些SUID的

  程序才能正常运行,所以要千万小心。

  用下面的命令查找所有带“s”位的程序:

  [root@cnns]#find / -type f \( -perm -04000 -o -perm -02000 \) \-exec

  ls -lg {} \;

  *-rwsr-xr-x 1 root root 35168 Sep 22 23:35 /usr/bin/chage

  *-rwsr-xr-x 1 root root 36756 Sep 22 23:35 /usr/bin/gpasswd

  *-r-xr-sr-x 1 root tty 6788 Sep 6 18:17 /usr/bin/wall

  -rwsr-xr-x 1 root root 33152 Aug 16 16:35 /usr/bin/at

  -rwxr-sr-x 1 root man 34656 Sep 13 20:26 /usr/bin/man

  -r-s--x--x 1 root root 22312 Sep 25 11:52 /usr/bin/passwd

  -rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/suidperl

  -rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/sperl5.0050

  3

  -rwxr-sr-x 1 root slocate 24744 Sep 20 10:29 /usr/bin/slocate

  *-rws--x--x 1 root root 14024 Sep 9 01:01 /usr/bin/chfn

  *-rws--x--x 1 root root 13768 Sep 9 01:01 /usr/bin/chsh

  *-rws--x--x 1 root root 5576 Sep 9 01:01 /usr/bin/newgrp

  *-rwxr-sr-x 1 root tty 8328 Sep 9 01:01 /usr/bin/write

  -rwsr-xr-x 1 root root 21816 Sep 10 16:03 /usr/bin/crontab

  *-rwsr-xr-x 1 root root 5896 Nov 23 21:59 /usr/sbin/usernetctl

  *-rwsr-xr-x 1 root bin 16488 Jul 2 10:21 /usr/sbin/traceroute

  -rwxr-sr-x 1 root utmp 6096 Sep 13 20:11 /usr/sbin/utempter

  -rwsr-xr-x 1 root root 14124 Aug 17 22:31 /bin/su

  *-rwsr-xr-x 1 root root 53620 Sep 13 20:26 /bin/mount

  *-rwsr-xr-x 1 root root 26700 Sep 13 20:26 /bin/umount

  *-rwsr-xr-x 1 root root 18228 Sep 10 16:04 /bin/ping

  *-rwxr-sr-x 1 root root 3860 Nov 23 21:59 /sbin/netreport

  -r-sr-xr-x 1 root root 26309 Oct 11 20:48 /sbin/pwdb_chkpwd

  用下面的命令禁止上面选出来的SUID的程序:

  [root@cnns]# chmod a-s /usr/bin/chage

  [root@cnns]# chmod a-s /usr/bin/gpasswd

  [root@cnns]# chmod a-s /usr/bin/wall

  [root@cnns]# chmod a-s /usr/bin/chfn

  [root@cnns]# chmod a-s /usr/bin/chsh

  [root@cnns]# chmod a-s /usr/bin/newgrp

  [root@cnns]# chmod a-s /usr/bin/write

  [root@cnns]# chmod a-s /usr/sbin/usernetctl

  [root@cnns]# chmod a-s /usr/sbin/traceroute

  [root@cnns]# chmod a-s /bin/mount

  [root@cnns]# chmod a-s /bin/umount

  [root@cnns]# chmod a-s /bin/ping

  [root@cnns]# chmod a-s /sbin/netreport

  如果你想知道这些程序到底有什么用,可以用man命令查看帮助。

  例如:[root@cnns]# man netreport

  3.2.3 高级安全

  3.2.3.1 使系统对ping没有反应

  防止你的系统对ping请求做出反应,对于网络安全很有好处,因为没人能够ping你的服务器

  并得到任何反应。TCP/IP协议本身有很多的弱点,黑客可以利用一些技术,把传输正常数据

  包的通道用来偷偷地传送数据。使你的系统对ping请求没有反应可以把这个危险减到最小。

  用下面的命令:

  echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

  运行完这个命令后,系统对ping就没有反应了。可以把这一行加到“/etc/rc.d/rc.local”

  文件中去,这样当系统重新启动的时候,该命令就会自动运行。对ping命令没有反应,至少

  可以把绝大多数的黑客排除到系统之外,因为黑客不可能知道你的服务器在哪里。重新恢复

  对ping的响应,可以用下面的命令:

  echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all"

  3.2.3.2 禁止使用控制台程序

  一个最简单而且最常用的保证系统安全的方法就是禁止使用所有的控制台程序,如:shutdo

  wn和halt。可以运行下面的命令来实现:

  [root@cnns]# rm -f /etc/security/console.apps/servicename

  这里servicename是你要禁止的控制台程序名。除非你使用xdm,否则不要把xserver文件删掉

  ,如果这样除了root之外,没有人可以启动X服务器了。(如果使用xdm启动X服务器,这时ro

  ot是唯一需要启动X服务器的用户,这才有必要把xserver文件删掉)。例如:

  [root@cnns]# rm -f /etc/security/console.apps/halt

  [root@cnns]# rm -f /etc/security/console.apps/poweroff

  [root@cnns]# rm -f /etc/security/console.apps/reboot

  [root@cnns]# rm -f /etc/security/console.apps/shutdown

  [root@cnns]# rm -f /etc/security/console.apps/xserver (如果删除,只有root可以启动

  X).

  这些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。记住,只有

  装了Xwindow,删除xerver文件才会有效果。

  注意:根据我们前一章的介绍安装服务器,Xwindow是没有安装上的,上面说的那些文件可能

  不会出现在“/etc/security”目录下的,如果这样就可以不管这一节介绍的方法。

  3.2.3.3 禁止控制台的访问

  为了禁止所有的控制台访问,包括程序和文件,请在“/etc/pam.d/”目录下的所有文件中,

  给那些包含pam_console.so的行加上注释。这一步是上一节《禁止使用控制台程序》的延续

  。下面的脚本可以自动完成这项工作。转成root身份,创建disabling.sh脚本文件(touch d

  isabling.sh),接着加入下面这些行:

  # !/bin/sh

  cd /etc/pam.d

  for i in * ; do

  sed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $I

  done

  用下面的命令使脚本有可执行的权限,并执行它:

  [root@cnns]# chmod 700 disabling.sh

  [root@cnns]# ./disabling.sh

  这样“/etc/pam.d”目录下所有文件中包含“pam_console.so”的行都被加上注释。这个脚

  本运行完之后,可以把它从系统中删掉。

  3.2.3.4 创建所有重要的日志文件的硬拷贝

  保证在“/var/log”目录下的不同日志文件的完整性是保证系统安全所要考虑的非常重要的

  一个方面。如果我们在服务器上已经加上了很多安全措施,黑客还是能够成功入侵,那么日

  志文件就是我们最后的防范措施。因此,很有必要考虑一下用什么方法才能保证日志文件的

  完整性。如果服务器上或网络中的其它服务器上已经安装了打印机,就可以把重要的日志文

  件打印出来。这要求有一个可以连续打印的打印机,并用syslog把所有重要的日志文件传到

  “/dev/lp0”(打印设备)。黑客可以改变服务器上的文件、程序,等等,但是,把重要的日

  志文件打印出来之后,他就无能为力了。

  例如:记录下服务器上所有的telnet、mail、引导信息和ssh连接,并打印到连接在这台服务

  器上的打印机。需要在“/etc/syslog.conf”文件中加入一行。

  编辑syslog.conf文件(vi /etc/syslog.conf),在文件末尾加入下面这一行:

  authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0

  重新启动syslog daemon使改动生效:

  [root@cnns]# /etc/rc.d/init.d/syslog restart

  又例如:

  记录下服务器上所有的telnet、mail、引导信息和ssh连接,并打印到本地网络中其它服务器

  上连接的打印机,要在这台接收日志文件的服务器的“/etc/syslog.conf”文件中加入一行

  。如果本地网中没有打印机,可以把所有的日志文件拷贝到别的服务器上,只要忽略下面第

  一步,把“/dev/lp0”加到其它服务器的“syslog.conf”文件中,直接跳到在其它服务器上

  设置“-r”参数那一步。把所有日志文件拷贝到其它计算机上,使你可以在一台计算机上管

  理多台计算机的日志文件,从而简化管理工作。

  编辑接收日志文件的服务器(例如:mail.openarch.com)上的syslog.conf文件(vi /etc/sys

  log.conf),在文件的末尾加入下面这一行:

  authpriv.*;mail.*;local7.*;auth.*;daemon.info/dev/lp0

  因为syslog daemon的默认配置是拒绝接收来自网络上的信息,我们必须使它能够接收来自网

  络上的信息,在syslog daemon的脚本文件(指的是接收日志文件的服务器上的脚本文件)中加

  入下面的“-r”参数。

  编辑syslog脚本文件(vi +24 /etc/rc.d/init.d/syslog),把这一行:

  daemon syslogd -m 0

  改为:

  daemon syslogd -r -m 0

  重新启动syslog daemon使改动生效:

  [root@mail]# /etc/rc.d/init.d/syslog restart

  如果接收日志文件的服务器上有防火墙,你可以检查一下防火墙的脚本文件中有没有下面几

  行(没有就加上):

  ipchains -A input -i $EXTERNAL_INTERFACE -p udp \

  -s $SYSLOG_CLIENT \

  -d $IPADDR 514 -j ACCEPT

  在这个例子中防火墙的脚本文件中定义了EXTERNAL_INTERFACE="eth0"。

  IPADDR="208.164.186.2";

  SYSLOG_CLIENT=”208.164.168.0/24"

  重新启动接收日志文件的服务器上的防火墙,使改动生效:

  [root@mail]# /etc/rc.d/init.d/firewall restart

  这个防火墙规则允许接收日志文件的服务器接收来自端口514(syslog的端口)的UDP包。

  最后,编辑一下发送日志文件的服务器上的“syslog.conf”文件(vi /etc/syslog.conf),

  在末尾加上这一行:

  authpriv.*;mail.*;local7.*;auth.*;daemon.info @mail

  “mail”是接收日志文件的计算机主机名。如果有人试图黑你的计算机并且威胁把所有重要

  的系统日志文件都删掉,你就不用怕了,因为你已经打印出来或者在别的地方还有一个拷贝

  。这样就可以根据这些日志文件分析出黑客在什么地方,然后出理这次入侵事件。

  重新启动syslog daemon,使改变生效:

  [root@cnns]# /etc/rc.d/init.d/syslog restart

  同样也要看看发送日志文件的服务器的防火墙的脚本文件中有没有这几行(没有加上)。

  ipchains -A output -i $EXTERNAL_INTERFACE -p udp \

  -s $IPADDR 514 \

  -d $SYSLOG_SERVER 514 -j ACCEPT

  这里防火墙的脚本文件中定义了:

  EXTERNAL_INTERFACE="eth0"

  IPADDR="208.164.186.1"

  SYSLOG_SERVER="mail.openarch.com"

  重新启动防火墙,使改变生效:

  [root@cnns]# /etc/rc.d/init.d/firewall restart

  这个防火墙的规则允许发送日志文件的服务器通过端口514(syslog端口)发送UDP包。

  注意:千万不要用网关服务器来收集和管理所有的系统日志信息。有关syslogd程序的其它一

  些参数和策略,可以用man命令查看帮助:syslogd(8)、syslog(2)和syslog.conf(5)。

  3.2.4 系统补丁

  http://www.redhat.com网站提供了最新的内核和应用程序的升级或补丁包。可以把.rpm包下

  载到服务器的/var/tmp里面然后用命令 rpm –ivh soft.pkg.rpm来升级软件包,或者用rpm ?CUvh soft.pkg.rpm 来修补系统里面带有漏洞的软件。

  3.2.5 附录 Linux上面各种常用软件的下载网址

  1)FTP:

  ftp://ftp.wu-ftpd.org/pub/wu-ftpd/

  2)SSH:

  ftp://ftp.ssh.com/pub/ssh/

  3)DNS:

  ftp://ftp.isc.org/isc/bind/

  4)dhcp:

  ftp://ftp.isc.org/isc/dhcp/dhcp-3.0b2pl18-solaris-2.6.tar.gz

  5)SMTP:

  ftp://ftp.sendmail.org/pub/sendmail/

  6)SSL:

  ftp://ftp.openssl.org/source/

  7)IMAP/POP:

  ftp://ftp.cac.washington.edu/imap/

  8)inn:

  ftp://ftp.isc.org/isc/inn/inn-2.3.1.tar.gz

  9)Linux MM:

  http://www.engelschall.com/sw/mm/

  10)pine:

  ftp://ftp.cac.washington.edu/pine/

  11)samba:

  http://us1.samba.org/samba/download.html

  12)openLDAP:

  http://www.openldap.org/software/download/

  13)PostgreSQL Db:

  ftp://ftp.postgresql.org/pub/

  14)Squid Proxy:

  http://www.squid-cache.org/Versions/

  15)Apache:

  http://httpd.apache.org/dist/

  16)Mod_ssl:

  http://www.modssl.org/source/

  17)Perl:

  http://perl.apache.org/dist/

  18)PHP:

  http://www.php.net/downloads.php

  19)MySQL

  http://www.mysql.com/Downloads/M ... nux-gnu-i686.tar.gz

  20)SXID

  ftp://marcus.seva.net/pub/sxid/

  21)tripwire:

  http://www.tripwiresecurity.com/downloads/index.cfml?dl=asr&

  22)GUN PG

  http://www.gnupg.org/download.html

  ? 第四部分 总结

  没有绝对安全的网络系统,网络信息对抗是一个长期的研究课题,安全问题是多种多样,且

  随着时间技术的变化而变化,而黑客的侵入手段也随之不断变化,所以安全防护也是非常重

  要的,保持清醒正确的认识,同时掌握最新的安全问题情况,再加上完善有效的安全策略,

  是可以阻止大部分的网络入侵,从而保持最小程度的经济损失。

  ? 第五部分 附录

  5.1 Free BSD系列

  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 o

  f Service)。某个坏心的人可以简单的用一个 shell script 同时搞出超过 256 个 connec

  tions, 这么一来你的 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, 或是 n

  fs server, 那么就没有必要在你的机器上再跑其它的services。但是你一定会问,"我要怎么

  控制我的机器啊!?" 嗯嗯, 所以现在要介绍 SSH。你可以透过 SSH (SecureShell) 来登入你

  的机器。Secure Shell 当初便是设计来取代 rsh, rlogin 等其它的Berkeley r* 命令。相

  信你很快就会了解 SSH 是如何有用,而且开始使用它,来代替其它的程序像是 telnet 和 ft

  p。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) 纪录下来的。你还要在 s

  yslogd(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 以得到更多的信息。再一次提醒你, 不要使用这个 o

  ption, 除非你只是想要防止 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/messa

  ges 里面去:

  # 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 scann

  ers (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 时,in

  it 会把安全等级调到 0, 而在 multiuser mode 时会以 1 来跑。如果你希望在multiuser

  模式是以等级 2 在跑, 你可以先进入 single user mode, 编辑 /etc/rc,使用 sysctl 来更

  动。

  若是你的系统只拿来跑 web server 之类的, 你可以放心的将 securelevel调高到2。但

  若是你要跑 X server, 把你的 securelevel 调至 1 或更高会导致一些问题。因为X serve

  r 必须要写入 /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 ins

  tall" 时会在 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 与/bi

  n 的 schg flag 是很合理的想法,我们可以依照以下的方式改变 /sbin 和 /bin 的 schg f

  lag:

  # 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, 而档案系统也适当的mo

  unt 上来, 且也以适合的 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的 m

  an 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 之外, 其它的也都不用再开了。这样子一来你便可以纪录下所有机器 (ro

  uters, 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 的ss

  yslog (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 或是 ha

  cks, 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"), 最好还是自己来: 抓回它的 sou

  rce 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/bin:$HOME/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作文件转移的远程主机的数据。通常驻留在用户当前目录中,文件权限必须为060

  0。格式如下:

  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/bin:$HOME/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的访问、禁示非法的网段访问等。通过网络路由器进行正确的存取过滤是限

  制外部访问简单而有效的手段。

  有条件的地方还可设置网关机,将本网和其他网隔离,网关机上不存放任何业务数据,

  删除除系统正常运行所必须的用户外所用的用户,也能增强网络的安全性。

  总之,只要我们从现在做起,培养网络安全意识,并注意经验的积累和学习,完全可能

  保证我们信息系统的安全、正常运行。

Powered By Google
不支持Flash
·城市对话改革30年 ·新浪城市同心联动 ·诚招合作伙伴 ·企业邮箱畅通无阻
不支持Flash